Flanken auswertung im Submit-Interpreter

  • Hallo Zusammen,
    wir haben an unserem Roboter ein Taktband. An diesem Band gibt es zwei Sensoren. einen für den Takt und einen für ein eventuelles Werkstück. Das Taktband soll über die sps.sub in unserem KRC4 Roboter gesteuert werden. Die Idee ist folgende:


    Wenn der Taktsensor den Takt erkennt (positive Flanke) soll das Taktband für 1 sek stehen bleiben und danach weiterfahren sofern ein Werkstück erkannt wurde.
    Das ganze habe ich wie folgt in der sps.sub Programmiert (gekürzt):




    Code
    di_CO_BT1 = SensorWerkstück erkennung
    
    
    di_CO_BE1 = Sensor Takt
    
    
    do_KC1 = Ansteuerung Schütz


    Alle Variablen sind in der config.dat deklariert.


    Unser Problem ist jetzt folgendes:
    Zu 95% funktioniert der Ablauf. Aber es kommt Proradich (aller 1-2h) dazu ,dass das Taktband nicht stoppt und durch fährt.
    Woran kann das liegen?
    Ein Hardware Fehler kann ausgeschlossen werden. Es muss an der Programmierung liegen.

    Einmal editiert, zuletzt von El Cattivo ()

  • Schritt für Schritt zum Roboterprofi!
  • Hi El CCattivo,
    dies ist ein Problem welches ich auch schon beobachtet und auch schon mehrfach zu erklären versucht habe.
    Du verwendest die Eingangsvariablen welche sich an einer beliebigen Stelle/Zeile im Submit von TRUE auf FALSE oder von FALSE auf TRUE ändern können. Der Submit ist nicht syncronisiert mit den EA-Treibern. Du solltest erst ein "Eingangsabbild" erstellen und mit diesem arbeiten.


    Dein Fehler mit dem Augenblick des Wechsels:
    ;Taktband in Position
    bPTRIG1 = di_CO_BE1 AND bPTRIG1HM
    ----> in diesem Augenblick wechselt im 5%-Fehlerfall der Eingang von FALSE auf TRUE
    bPTRIG1HM = NOT di_CO_BE1


    .................


    Die Lösung:
    DECL BOOL tmp_di_CO_BE1
    tmp_di_CO_BE1 = di_CO_BE1 ;Eingangsabbild
    bPTRIG1 = tmp_di_CO_BE1 AND bPTRIG1HM
    bPTRIG1HM = NOT tmp_di_CO_BE1


    Gruß
    Twister

    Kleinere Wunder werden sofort erledigt... größere nach der Mittagspause...

  • Zur Flankenerkennung nutze ich liebend gerne einen Interrupt. Auch in der Submit.
    Im Aufrufprogramm zum Interrupt, würde ich dann noch den Timer abfragen.
    Gruß Roland

  • Vielleicht hilft es auch, sich grundsätzlich einmal klarzumachen, was man eigentlich will. Man nähert sich dem Thema vielleicht statisch ("wenn der Eingang an ist, dann soll dies passieren") und macht dann den geistigen Klimmzug nach dynamisch ("wenn der Eingang an geht, dann soll dies passieren"), um dann festzustellen, dass man eigentlich die Flanke möchte ("nur einmal bei steigender Flanke dieses Eingangs soll dies passieren").
    Bei zyklischer Abarbeitung eines Hintergrundtasks ist im letzten Fall also nicht der Status des Eingangs gefragt, sondern nur der Vergleich zwischen altem und neuem Zustand. Das bedingt, zusammen mit dem, was Twister schrieb, dass das eigentliche Signal vergessen werden kann / muss, sobald man seinen Zustand gespeichert hat:

    Code
    alter_zustand = neuer_zustand
    neuer_zustand = signal
    flanke = neuer_zustand AND (NOT alter_zustand)


    Sinngemäß für fallende Flanken:

    Code
    alter_zustand = neuer_zustand
    neuer_zustand = signal
    flanke = alter_zustand AND (NOT neuer_zustand )


    Bei dieser Lösung kommt man nicht um die doppelte boolesche Variable mit systemweiten Geltungsbereich herum (ich mach' mir immer nen eigenen Datentyp dafür) welche an definierter Stelle im Zyklus beschrieben wird.
    Nachteil: sollte das Signal kürzer anstehen als ein Durchlauf der SPS.SUB, dann wird es möglicherweise ignoriert. Das ist bei Warteanweisungen im Task der Fall oder bei SEHR großen Submit-Programmen. Üblicherweise kommt man aber in einem Ipo-Takt von 12ms einmal rum.


    Grüße,
    Michael

  • Hallo,
    danke für eure Antworten. So etwas ähnliches hatte ich mir schon gedacht. Allerdings konnte ich mir nicht vorstellen, dass zwichen den beiden Zeilen:


    Code
    bPTRIG1 = di_CO_BE1 AND bPTRIG1HM
    
    
       bPTRIG1HM = NOT di_CO_BE1


    So viel Zeit vergeht das sich das Eingangssignal genau in diesem Zeitfenster ändert.


    Die Lösung mit dem Interrupt im Submit würde mich Interressieren. Könntet Ihr ein Beispiel posten?

  • Ist kein Hexenwerk:
    Erst Interrupt deklarieren. 16 für steigende Flanke, 17 für fallende Flanke.


    Code
    INTERRUPT DECL 16 WHEN $IN[1]==TRUE DO UP1( )
    INTERRUPT DECL 17 WHEN $IN[1]==FALSE DO UP2( )


    Dann Interrupt's scharf schalten


    Code
    INTERRUPT ON 16  
    INTERRUPT ON 17


    Am Ende der sps.sub dann noch die Unterprogramme einfügen die Abgearbeitet werden sollen bei den Flanken.
    DEF UP1()

    Code
    DEF UP1()
    ;hier Code einfügen
    END
    DEF UP2()
    ;hier Code einfügen
    END


    Kannst ja einfach das bestehende sps.sub öffnen. Dort ist ja schon einer angelegt. Einfach noch Deine Sachen an den entsprechenden Stellen dazuschreiben.
    Reagiert astrein auf Flanken ohne erst Merker mit den alten Werten anzulegen.
    Gruß Roland

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