InternalTimer zum zeitverzögertem Auslösen eines set-Befehls

Begonnen von klaus.schauer, 16 Mai 2013, 16:21:52

Vorheriges Thema - Nächstes Thema

klaus.schauer

Innerhalb eines Set-Befehl in sub EnOcean_Set($@) soll nach dem 1. Datentelegramm nach einer Zeit t/s ein zweites Datentelegramm gesendet werden. Ich habe deshalb die Funktion InternalTimer aus der Routine heraus aufgerufen:

Sub EnOcean_Set($@)
[...]
  my ($hash, @a) = @_;
  my $name = $hash->{NAME};
[...code 1. Datentelegramm]
$data = sprintf "F6%s", "09";
$header = "00070001";
[... code 2. Datentelegramm]
my @timerCmd = ($name, "RPS", "08");
InternalTimer(gettimeofday() + $a[1], "EnOcean_Set", "$hash@timerCmd", 0);
[... Ausgabe 1. Datentelegramm]
IOWrite ($hash, $header, $data);
[...]


Geht aber nicht?! Ich vermute schwer, dass die Übergabeparameter $hash oder @timerCmd irgendwie nicht passen oder der Übergabestring fehlerhaft.

rudolfkoenig

> Geht aber nicht?!

Was heisst das denn?

Der Parameter "$hash@timerCmd" schaut komisch aus, ich vermute es ist nicht das, was Du willst.
Beispiele fuer InternalTimer gibt es aber viele.

klaus.schauer

Zitat von: rudolfkoenig schrieb am Do, 16 Mai 2013 18:45> Geht aber nicht?!

> Was heisst das denn?


Der Parameter "$hash@timerCmd" schaut komisch aus, ich vermute es ist nicht das, was Du willst.
Beispiele fuer InternalTimer gibt es aber viele.
Die Routine scheint überhaupt nicht zu laufen.
Ja, ja Beispiele gibt es viele... nur kann ich sie auf Anhieb nicht auf meine Anforderungen umsetzen. Wahrscheinlich liegt bei "$hash@timerCmd" das Problem. Um Sub EnOcean_Set($@) aufzurufen, müssen wohl die Inhalte von $hash und @timerCmd übergeben werden, nur wie. Mein erster Versuch mit InternalTimer(gettimeofday() + $a[1], "EnOcean_Set", $hash @timerCmd, 0); liefert jedenfalls einen Fehler.

Der Ablauf sollte grundsätzlich sein:

1. Sub EnOcean_Set($@) wird aufgerufen, ein Sendebefehl versandt, InternalTimer wird mit einem Sub EnOcean_Set($@) gestart, Routine wird verlassen
2. InternalTimer startet EnOcean_Set($@) mit den in 1. hinterlegten Parametern $hash @timerCmd

$hash ist in beiden Aufrufen identisch, soll aus 1. übernommen werden.  

rudolfkoenig

> die Inhalte von $hash und @timerCmd übergeben werden, nur wie

my %par = ( hash => $hash, timerCmd => \@timerCmd );
InternalTimer(gettimeofday() + $a[1], "EnOcean_TimerSet", \%par, 0);

sub
EnOcean_TimerSet($)
{
  my ($par)=@_;
  EnOcean_Set($par->{hash}, @{$par->{timerCmd}});
}

klaus.schauer

Zitat von: rudolfkoenig schrieb am Do, 16 Mai 2013 22:02> die Inhalte von $hash und @timerCmd übergeben werden, nur wie

my %par = ( hash => $hash, timerCmd => \@timerCmd );
InternalTimer(gettimeofday() + $a[1], "EnOcean_TimerSet", \%par, 0);

sub
EnOcean_TimerSet($)
{
  my ($par)=@_;
  EnOcean_Set($par->{hash}, @{$par->{timerCmd}});
}
Da war ein Fachmann am Werk, danke. Ich werde es probieren.

klaus.schauer

Zitat von: rudolfkoenig schrieb am Do, 16 Mai 2013 22:02> die Inhalte von $hash und @timerCmd übergeben werden, nur wie

my %par = ( hash => $hash, timerCmd => \@timerCmd );
InternalTimer(gettimeofday() + $a[1], "EnOcean_TimerSet", \%par, 0);

sub
EnOcean_TimerSet($)
{
  my ($par)=@_;
  EnOcean_Set($par->{hash}, @{$par->{timerCmd}});
}
Es geht, aber das war ja nie fraglich. Nochmals danke.