Hi Odyssee,
ach so, nun habe auch ich es verstanden:
Wie schon vorher geschrieben, werden Fahrbefehle "einfach" an die Bahnplanung (den Motionstack) geschickt. Damit ist für den Programminterpreter der Fahrbefehl erledigt und er kann im Programm weitermachen.
Im einfachsten Falle könnte dein Programm so aussehen:
// warten, dass vorherige Fahrbefehle völlig abgearbeitet wurden
waitEndMove()
// Fahrbefehl absetzen
movel(pZiel,tGreifer,mSchnell)
// nun soll der Ausgang angesteuert werden
do
// digitalen Ausgang toggeln
doAusgang=!doAusgang
// 20Hz entsprechen 0.05 Sekunden
delay(0.05)
// so lange, bis der Roboter 'angekommen' ist
until isEmpty() == true
Alles anzeigen
Das obige Schnipsel ist nur zeitlich genau, wenn Du es in einem Echtzeittask aufrufst (also mit taskCreateSync ). Desweiteren wird im obigen Beispiel einfach angenommen, dass der Roboter dann auch fährt. Also Not-Aus, Antriebe Aus, falsche Betriebsart usw. würden den Ausgang endlos weiterblinken lassen.
Einen völlig anderen Ansatz bekommst Du, wenn Du mit dem Befehl
$getMoveId() - aus dem Expansion-AddOn, wenn das Betriebssystem < 7.0 ist
getMoveId() - im Standard-Befehlsumfang, wenn dein Betriebssystem >= 7.0 ist
arbeitest.
Damit könnte das Beispiel so aussehen:
movej(irgendwas)
movel(irgendwas)
// Fahrbefehl in den Motionstack, gleichzeitig bekommt man in nNummer eine eindeutige Kennung für diesen Fahrbefehl zurück
nNummer = movel(pZiel,tGreifer,mSchnell)
movel(irgendwas)
movej(irgendwas)
// darauf warten, dass dein "besonderer" Fahrbefehl ausgeführt wird - der Roboter also gerade in Richtung pZiel fährt
wait(getMoveId() >= nNummer)
// deinen Ausgang blinken lassen
do
// digitalen Ausgang toggeln
doAusgang=!doAusgang
// 20Hz entsprechen 0.05 Sekunden
delay(0.05)
// so lange, bis der Roboter 'angekommen' ist
until getMoveId() > nNummer + 1
Alles anzeigen
Bei diesem Beispiel könnten alle Zeilen beginnend mit wait(getMoveId() >= nNummer) auch in einem anderen Task laufen.
Die Fahrbefehle wären also in einem "normalen" Task (taskCreate), die Aktionen, die du bahnbegleitend machen möchtest, würden dann in einem Echtzeittask (taskCreateSync) stattfinden. Die Synchronisierung von Bahnausführung und Aktion geschieht dann über die eindeutige Kennung und getMoveId().
Viel Erfolg
Spielkind