Ungefähr so (verzeih mir Syntaxfehler, bin gerade voll verKUKAt.)
pers jointtarget testjoint := [ [ 0, 0, 0, 0, 0, 0], [ 0, 9E9, 9E9, 9E9, 9E9, 9E9] ];
pers jointtarget lastjoint := [ [ 0, 0, 0, 0, 0, 0], [ 0, 9E9, 9E9, 9E9, 9E9, 9E9] ];
pers bool achse_dreht_noch:=FALSE;
lastjoint:=CJointT(\TaskName:="T_ROB1");
!Endlosschleife
while (doutput(di_kill_task)=0) do
testjoint:=CJointT(\TaskName:="T_ROB1");
achse_dreht_noch:=(ABS(lastjoint.extax.eax_a - testjoint.extax.eax_a) > 0.01);
lastjoint:=testjoint;
waittime 0.1;
endwhile
exit;
Alles anzeigen
Erklärung:
Zwei Jointtarget permanent speichern. Eins neu einlesen, externe Achse 1 vergleichen, wenn Differenz > Minimalwert, dann Bingo. Anschließend den eben eingelesenen Wert als Altwert speichern, eine Winzigkeit warten und dann dasselbe von vorn.
Im boolschen Merker steht dann das Ergebnis, was Du sosntwo auswerten kannst, oder meinetwegen auch direkt dahinter einen Ausgang schaltet oder so.
Guck mal in der Doku bei Datentypen Jointtarget.
Der Vergleich auf 0 (also wenn Du versuchst zu vergleichen ob (lastjoint.extax.eax_a = testjoint.extax.eax_a) ) könnte fehlschlagen. Eine exakt identische Achsposition ist eher selten, daher besser auf eine gewisse kleine Mindestdifferenz testen wie im Beispiel.
Die Bedingung in "while" sollte Dir helfen, die Task zu beenden, falls nötig, dazu muss ein entsprechender (virtueller) Ausgang konfiguriert werden.
Die Task als semistatisch anlegen, und zu Testzwecken erst ohne Fehlerauswirkung konfigurieren. Später kann man dann die Bedingung verschärfen, wenn alles läuft.
Semistatische Tasks laufen immer von vorn an bei Neustart, oder wenn Du ein Programm im Haupttask auch nur einen Schritt weit ausführst. Anhalten zu Umprogrammierzwecken kannst Du sie dann immer mal mit dem Ausgang.
Grüße,
Michael