Forum: PC-Programmierung Überprüfen Sie die Antwort eines Steuergeräts, während ein Timer in CAPL (CANoe) läuft.


von Zeeshan K. (zee3010)


Lesenswert?

Hallo Zusammen

Ich leite ein Skript in CAPL, wo ich eine Änderung des Wertes eines
Signals (z. B. Signal B) bemerken soll, das vom Steuergerät kommt. Am
Anfang des Timers ändere ich den Wert eines anderen Signals (z. B.
Signal A) und sende es über CAN-Bus an das Steuergerät. Während der
Timer läuft, möchte ich den veränderten Wert des Signals B vom
Steuergerät als Antwort auf den veränderten Wert des Signals A sehen.
Nachdem der Timer abgelaufen ist, möchte ich das Signal A wieder auf
seinen ursprünglichen Wert zurücksetzen.

*Hinweis: Ich habe die verschiedenen Signale nur als Signal A und Signal
B bezeichnet, um die Frage klarer zu verstehen.

Signal A ändert den Wert von 2 auf 0.
Signal B hat einen Originalwert von 61, und der geänderte Wert kann eine
beliebige Zahl zwischen 0 und 60 sein.
Timer läuft für 4 Sekunden.
Ich verwende while loop und command (isTimerActive (timer) ==1), um die
Änderung des Wertes von Signal B zu überprüfen, wenn der Timer läuft.


//Unten ist der beigefügte Code ->

variables
{
 msTimer Execute;
}

on key 'c'
{
 setTimer(Execute,4000);
 Write("Test Gestartet");
 SetSignal(Signal A, 2);
while (isTimerActive(Execute)==1)
{
 if ($Signal B != 61)
    {
     Write("Test Erfolgreich");
     }
    else
    {
      Write("Test Gescheitert");
    }
}
}

on timer Execute
{
  write("Test Vorbei");
  setSignal(Signal A, 0);
}

Ich führe diesen Code aus und der Wert von Signal A ändert sich auf 2,
aber es gibt keine Änderung im Wert von Signal B. Ich benutze den
(isTimerActive (Timer) ==1) in der while-Schleife, ist das der richtige
Befehl für mein Problem? Auch wenn ich laufe (isTimerActive (timer) ==1)
in der while-Schleife, wird CANoe inaktiv und ich muss CANoe mit dem
Taskmanager stoppen.

Irgendwelche Ideen wie kann ich meinen Code korrigieren und die
gewünschte Antwort erhalten?

Danke und Gruß

von Dirk (Gast)


Lesenswert?

CAPL ist event basierend, deshalb solltest Du keine blockierende 
Schleifen nehmen.

Schau dir mal das ON signal oder ON SIGNAL UPDATE in der Anleitung von 
CAPL an.

von Honigmensch (Gast)


Lesenswert?

So eine while-Schleife blockiert die komplette Eventverarbeitung von 
CANoe, da dein CAPL Skript im gleichen Thread wie diese ausgeführt wird. 
Das sollte man also tunlichst unterlassen! :-)

Löse das am besten Event-basiert. D.h. du machst dir OnSignal-Handler, 
die den ankommenden Wert prüfen und ggf. ein Flag setzen. Wenn dein 
Timer durch ist, prüfst du die Flags und handelst entsprechend.

von Dirk (Gast)


Lesenswert?

Hier gibt es auch schöne Tipps und Tricks:

https://kb.vector.com/entry/875/

von Zeeshan K. (zee3010)


Lesenswert?

Danke für die Antwort.

Aber wie baue ich das Ereignis on signal und on timer zusammen, damit 
das Ereignis on signal ausgeführt wird, während der Timer läuft?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.