SplineBlock variabler Länge mit Trigger

  • 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:


    Code
    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:

    Code
    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?

    Edited once, last by Lenneper ().

  • KUKA Handwerk
    Anzeige
  • trigger ist ein keyword und deshalb unerprogram namen Trigger() is nicht erlaubt... muss umbenant werden.

  • Sorry, dann habe ich meinen "Pseudo"-Code wohl etwas verfälscht vereinfacht. Die Funktion heißt eigentlich nicht Trigger, sondern anders. In dieser Funktion wird einfach nur ein Output gepulst und die aktuelle Position abgespeichert. Nichts Weltbewegendes also, sodass ich den Fehler auch nicht an dieser Stelle vermuten würde?


    Habt ihr denn noch andere Ideen parat als eine Vielzahl gestaffelter Jobs zu implementieren?

  • Uemmer Handbucher nachlesen... interrupt/Trigger sollen sparsam eingesaetzt...

    KSS erlaubt bis zu 8 TRIGGERs gleichzeiting. Nicht 30 oder 100. Auch 8 ist sehr verschwenderisch. Normalerweise mann strebt so was mit nur 1 interrupt/trigger erledigen.

  • Eigentlich könnte man sich - je nach Aufgabenstellung - sogar das Zählen sparen, denn man hat ja den gepulsten Ausgang. Wenn der im nächsten Ereignis noch ansteht, wäre das ein Kandidat für eine Abbruchbedingung. Außer, man nimmt die Überlappung des Signals sowieso in Kauf oder will sie. Man könnte ja gleichzeitig noch einen zweiten hernehmen.


    Interessehalber - was passiert eigentlich, wenn Du die Priorität auf einen Wert setzt (konstant)? Müsste dann ja zumindest einen anderen Fehler werfen...


    Grüße,

    Michael

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account
Sign up for a new account in our community. It's easy!
Register a new account
Sign in
Already have an account? Sign in here.
Sign in Now