Autor Thema: InternalTimer zum zeitverzögertem Auslösen eines set-Befehls  (Gelesen 1961 mal)

Offline klaus.schauer

  • Developer
  • Hero Member
  • ****
  • Beiträge: 1042
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.

Offline rudolfkoenig

  • Administrator
  • Hero Member
  • *****
  • Beiträge: 20782
Aw: InternalTimer zum zeitverzögertem Auslösen eines set-Befehls
« Antwort #1 am: 16 Mai 2013, 18:45:33 »
> 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.

Offline klaus.schauer

  • Developer
  • Hero Member
  • ****
  • Beiträge: 1042
Aw: InternalTimer zum zeitverzögertem Auslösen eines set-Befehls
« Antwort #2 am: 16 Mai 2013, 20:10:42 »
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.  

Offline rudolfkoenig

  • Administrator
  • Hero Member
  • *****
  • Beiträge: 20782
Aw: InternalTimer zum zeitverzögertem Auslösen eines set-Befehls
« Antwort #3 am: 16 Mai 2013, 22:02:30 »
> 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}});
}

Offline klaus.schauer

  • Developer
  • Hero Member
  • ****
  • Beiträge: 1042
Aw: InternalTimer zum zeitverzögertem Auslösen eines set-Befehls
« Antwort #4 am: 16 Mai 2013, 22:16:44 »
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.

Offline klaus.schauer

  • Developer
  • Hero Member
  • ****
  • Beiträge: 1042
Aw: InternalTimer zum zeitverzögertem Auslösen eines set-Befehls
« Antwort #5 am: 16 Mai 2013, 22:35:21 »
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.

 

decade-submarginal