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?

    Einmal editiert, zuletzt von Lenneper ()

  • Schritt für Schritt zum Roboterprofi!
  • 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

  • Hallo zusammen.



    Mach doch zwei Interrupts die auf die selbe Bool reagieren nur halt der eine auf TRUE der andere auf FALSE


    im Interuppt programm schreibst du bTrig=NOT bTrig dann löst der eine den anderen aus und
    umgekehrt..... das im IPO takt.


    darin schreibst du dir

    IF Bedingung THEN

    Machwatt

    ENDIF


    damit bist du nicht limitiert mit trigger oder interruppts und kannst entweder alles x mal was machen oder weg bezogen in dem du dir die pos speicherst und mit pos int entsprechen deine Bedingung machst.


    musst zum Anstoßen des FlipFlop interrupts nur auf die erste Bewegungung nen Trigger machen bTrig=NOT bTrig


    Gruß Loipe

Erstelle ein Benutzerkonto oder melde dich an um zu kommentieren

Du musst ein Benutzerkonto haben um einen Kommentar hinterlassen zu können

Benutzerkonto erstellen
Neues Benutzerkonto für unsere Community erstellen. Geht einfach!
Neues Benutzerkonto erstellen
Anmelden
Du hast bereits ein Benutzerkonto? Melde dich hier an.
Jetzt anmelden