Hallo zusammen,
ich arbeite mit einem Roboterprogramm, in welchem ein SplineBlock variabler Länge gefahren werden soll. Dies geschieht über ein großes Array, in welchem alle Positionen gespeichert werden:
SPLINE WITH <Options>
SPL SplinePositions[1]
SPL SplinePositions[2]
...
SPL SplinePositions[100]
ENDPSLINE
Selbst wenn ich nur die ersten 20 Stellen der SplinePositions befülle, dann wird die letzte Position in alle nachfolgenden Positionen des Arrays kopiert. Die Steuerung springt dann recht schnell über die leeren/kopierten Positionen hinweg. Dies funktioniert im Grunde ganz gut.
Nun möchte ich jedoch an jeder der SplinePositions einen Trigger ausführen. Dies habe ich mit viel Copy&Paste erstmal so gelöst:
SPLINE WITH <Options>
SPL SplinePositions[1]
TRIGGER WHEN PATH=0 ONSTART DELAY=0 DO Trigger() PRIO=-1
SPL SplinePositions[2]
TRIGGER WHEN PATH=0 ONSTART DELAY=0 DO Trigger() PRIO=-1
...
SPL SplinePositions[99]
TRIGGER WHEN PATH=0 ONSTART DELAY=0 DO Trigger() PRIO=-1
SPL SplinePositions[100]
ENDPSLINE
Jetzt kommt der Knackpunkt: Wenn ich diesen SplineBlock mit nur wenigen X Positionen starten möchte, dann bekomme ich einen Laufzeitfehler, dass die maximale Anzahl an Interrupts überschritten wird. Dies kommt daher, dass beim "Überspringen" der leeren SplinePositions die Trigger erstellt werden. Sobald mehr als 32 Interrupts angelegt wurden, steigt das Programm aus. Wenn ich dasselbe Programm jedoch mit 80-100 Positionen befülle, dann läuft es wunderbar...
Wie kann man ein solches Vorgehen am besten implementieren? Ich habe die SplineBlocks auch schon in einer FOR-Schleife angelegt, doch leider werden die einzelnen SplineBlocks dann nicht überschliffen, sodass der Roboter immer wieder stehen bleibt.
Kann ich irgendwie sicherstellen, dass die Trigger auch bei leeren/kopierten SplinePositions hintereinander ausgeführt werden, quasi als ob die Positionen vom User angegeben worden wären? Oder kann ich die Trigger über eine Variable deaktivieren sobald ich innerhalb der Trigger-Funktion die gewünschte Anzahl an Triggern erreicht habe? Ich kenne die Anzahl ja vor dem Start des Jobs und könnte somit mitzählen?
Schön wäre es, wenn man beim TRIGGER WHEN Befehl noch eine Bedingung über IF angeben könnte, aber das gibt es wohl nicht? Habt ihr noch bessere Ideen, wie man ein solches Vorhaben realisieren könnte?
Vielen Dank für jede Hilfe und ein schönes Wochenende!
EDIT: Mir fällt sonst als letzte Alternative nur ein, dass ich verschiedene Funktionen desselben Bewegungsablaufes mit gestaffelter Anzahl an Positionen implementiere, zum Beispiel so:
- Bahn_30: Implementiert SplineBlock mit 30 Positionen und wird gewählt, wenn der User weniger als 30 Positionen angibt
- Bahn_60: Implementiert SplineBlock mit 60 Positionen und wird gewählt, wenn der User mehr als 30, aber weniger als 60 Positionen angibt
- Bahn_90: Implementiert SplineBlock mit 90 Positionen und wird gewählt, wenn der User mehr als 60, aber weniger als 90 Positionen angibt
- [...]
Wäre aber meiner Meinung nach eine ziemlich hässliche Art das Problem zu lösen?