Rückzug bei Kollision mittels $TORQ_DIFF

  • Hej,


    Steuerung KR C1
    SW 2.34


    Ich versuche mich gerade daran einen Kollisionsüberwachung mittels $TORQ_DIFF hin zu bekommen.
    Mein Gedanke war, die Werte in der SPS.sub zu überwachen und mir da bei Überschreiten eine Variable auf 1 setzen zu lassen.


    Im eigentlichen Programm soll dann mittel. Interrupt die Bewegung unterbrochen und zurück Positioniert werden.


    Code in der SPS.sub:


    IF ($TORQ_DIFF[1]>15) THEN
    B_COLLISION=TRUE
    ENDIF
    IF ($TORQ_DIFF[2]>15) THEN
    B_COLLISION=TRUE
    ENDIF
    IF ($TORQ_DIFF[3]>15) THEN
    B_COLLISION=TRUE
    ENDIF
    IF ($TORQ_DIFF[4]>12) THEN
    B_COLLISION=TRUE
    ENDIF
    IF ($TORQ_DIFF[5]>15) THEN
    B_COLLISION=TRUE
    ENDIF
    IF ($TORQ_DIFF[6]>15) THEN
    B_COLLISION=TRUE
    ENDIF


    Die Interrupt Deklaration im HP sieht wie folgt aus:


    INTERRUPT DECL 10 WHEN B_COLLISION DO INT_KOL ( )



    Nun habe ich folgendes Problem. So wie es beschrieben ist klappt es nicht. Er fährt trotz Kollision seinen Weg.


    Wenn anstatt B_COLLISION nun ein Eingang abgefragt wird, und ich diesen setze wird die Rückpositionierung durchgeführt.


    Ich kann mir nicht erklären warum das so ist.


    Schöne Gruß


    Robotiker

    Wenn die Menschen Flügel hätten und schwarze Federn, wären die wenigsten schlau genug, um Krähen zu sein! Henry Ward Beecher

    Einmal editiert, zuletzt von Robotiker ()

  • Schritt für Schritt zum Roboterprofi!
  • un wo wird deine variable zurückgesetzt?

    Wolfram (Cat) Henkel

    never forget Asimov's Laws at the programming of robots...

    "Safety is an integral part of function. No safety, no production. I don't buy a car without brakes."


    Messages und Mails mit Anfragen wie "Wie geht das..." werden nicht beantwortet.

    Diese Fragen und die Antworten interessieren jeden hier im Forum.


    Messages and Mails with questions like "how to do..." will not be answered.

    These questions and the answers are interesting for everyone here in the forum.

  • Hej,


    die wird in der Interrupt Routine zurück gesetzt.


    Ich kann auch im Variablen Monitor sehen, dass sie gesetzt wird. Also dürfte die Bearbeitung in der SPS.sup ok sein.

    Wenn die Menschen Flügel hätten und schwarze Federn, wären die wenigsten schlau genug, um Krähen zu sein! Henry Ward Beecher

  • *g* Hatte nicht geschaut, wer fragte. Daher die etwas einfache Rückfrage... Sorry

    Wolfram (Cat) Henkel

    never forget Asimov's Laws at the programming of robots...

    "Safety is an integral part of function. No safety, no production. I don't buy a car without brakes."


    Messages und Mails mit Anfragen wie "Wie geht das..." werden nicht beantwortet.

    Diese Fragen und die Antworten interessieren jeden hier im Forum.


    Messages and Mails with questions like "how to do..." will not be answered.

    These questions and the answers are interesting for everyone here in the forum.

  • Ist ok. War halt kurz und schmerzlos ohne geplänkel :mrgreen:


    Aber einen Grund sehe ich trotzdem noch nicht.


    Die Variable habe ich global angelegt. Wird ja auch, wie gesagt, gesetzt, anscheinend erkennt sie die Interrupt Decl nicht an :denk:


    Evtl. ist besteht die Möglichkeit $Torq_Diff direkt in der Interrupt Declaration ein zu binden, ohne über die SPS.sub zu gehen!? Ich denke das werde ich mal versuchen.


    Aber falls jemand die Lösung weiß, immer her damit.


    Robotiker

    Wenn die Menschen Flügel hätten und schwarze Federn, wären die wenigsten schlau genug, um Krähen zu sein! Henry Ward Beecher

  • Hast du mal versucht den Interrupt via $CYCFLAG zu setzen?

    Code
    $CYCFLAG[1]=($TORQ_DIFF[1]>15) OR ($TORQ_DIFF[2]>15) .... usw.
    
    
    INTERRUPT DECL 10 WHEN $CYCFLAG[1] DO INT_KOL ( )
    
    
    WAIT FOR NOT $CYCFLAG[1]
    INTERRUPT ON 10

    Greetings, Irrer Polterer!

    Wie poste ich falsch? Nachdem ich die Suche und die FAQ erfolgreich ignoriert habe, erstelle ich das gleiche Thema in mehreren Unterforen, benutze einen sehr kreativen Titel wie "Hilfe", am Besten noch mit mehreren Ausrufezeichen, und veröffentliche einen so eindeutigen Text, dass sich jeder etwas Anderes darunter vorstellt.


    Life is a beta version. Full of bugs and no Manual.

  • Danke,


    wäre auch noch ein Versuch wert.


    Da aber noch eine Frage zum Verständnis und der Anwendung.


    $CYCFLAG kann ich im Roboter Programm setzen oder muss das in der SPS.sub gemacht werden, damit sie kontinuierlich kontrolliert werden. Habe ehrlicherweise damit noch nicht gearbeitet.

    Wenn die Menschen Flügel hätten und schwarze Federn, wären die wenigsten schlau genug, um Krähen zu sein! Henry Ward Beecher

  • $CYCFLAG wird zyklisch aktualisiert. Du brauchst das nur im Programm vor der Interrupt-Deklaration eintragen - Oder auch danach ist eigentlich egal. Die Definition ist im gesamten Programmablauf inkl. aufgerufen Unterprogrammen gültig. d.h. $CYCFLAG[1] enthält immer das Ergebnis der letzten Definition (und aktualisiert dieses im Interpolationstakt).
    Macht also im Submit dann keinen Sinn mehr.

    Greetings, Irrer Polterer!

    Wie poste ich falsch? Nachdem ich die Suche und die FAQ erfolgreich ignoriert habe, erstelle ich das gleiche Thema in mehreren Unterforen, benutze einen sehr kreativen Titel wie "Hilfe", am Besten noch mit mehreren Ausrufezeichen, und veröffentliche einen so eindeutigen Text, dass sich jeder etwas Anderes darunter vorstellt.


    Life is a beta version. Full of bugs and no Manual.

  • Hi,
    Ich hab schon mal sowas programmiert was du da vor hast. Allerdings habe ich nicht den SPS submit verwendet sondern einen globalen interrupt im Programm. Allerdings musste ich vor einer Bewegung den torque_diff vorher auf 0 zurück setzen damit es funktioniert.


    Gruss Matze


    Gesendet von meinem HTC One X mit Tapatalk 2

    Man muss nicht Verrückt sein, aber es hilft ungemein.<br />Meine Roboter verspeisen SPS-Programmierer zum Frühstück.<br />Lass niemals einen Dipl. Ing. an den Roboter, die machen immer alles kaputt und sind viel zu Banane im Kopf.

  • Danke an euch beide.


    Sind beides Möglichkeiten, die mir möglich erscheinen.


    Da ich zwar weiß, das B_COLLISION gesetzt wird, jedoch nicht weiß wann das geschieht, wäre das 0 Setzen von %Torq_Diff auch eine mögliche Lösung, da er dann während der "Suchefahrt" keinen Pegel mehr erkennt, weil die Variable evtl schon True ist....

    Wenn die Menschen Flügel hätten und schwarze Federn, wären die wenigsten schlau genug, um Krähen zu sein! Henry Ward Beecher

  • Logisch. Vorm Einschalten des Interrupts muss die Bedingung False sein.


    Deshalb:

    Code
    FOR I = 1 to 6
     $TORQ_DIFF[I]=0
    ENDFOR
    WAIT FOR NOT $CYCFLAG[1]
    INTERRUPT ON 10


    oder besser:

    Code
    REPEAT 
    FOR I = 1 to 6
     $TORQ_DIFF[I]=0
    ENDFOR
    UNTIL NOT $CYCFLAG[1]
    
    
    INTERRUPT ON 10

    Greetings, Irrer Polterer!

    Wie poste ich falsch? Nachdem ich die Suche und die FAQ erfolgreich ignoriert habe, erstelle ich das gleiche Thema in mehreren Unterforen, benutze einen sehr kreativen Titel wie "Hilfe", am Besten noch mit mehreren Ausrufezeichen, und veröffentliche einen so eindeutigen Text, dass sich jeder etwas Anderes darunter vorstellt.


    Life is a beta version. Full of bugs and no Manual.

    Einmal editiert, zuletzt von IrrerPolterer ()

  • Guten Tag
    Ich wärme diesen Thread wieder auf, da ich genau das gleiche versuche. Zur Zeit arbeite ich an einem LBR4+ und möchte eine Kollisionserkennung realisieren.
    Wenn ich mir die Systemvariable $TORQ_DIFF[n] anzeigen lasse enthält diese immer den Wert null. Was für eine Rolle spielt dabei die Variable $ADAP_ACC, muss in der mindestens #step1 oder #step2 enthalten? Zur Zeit steht #NONE darin.
    Wenn ich im Oszilloskop die Drehmoment Differenz aus den DSE Daten anzeigen lasse, sind dies die gleichen Werte wie in $TORQ_DIFF? Denn auffallend ist hier, dass ich unter der DSE Karte 1 auch keine Kraftverläufe messen kann, jedoch unter DSE2 schon.
    Desweiteren habe ich in einem alten Programm auf dem Roboter folgenden Code-Ausschnitt entdeckt. Der Code lässt sich jedoch nicht mehr ausführen, somit ist kein "Try and Error" möglich.


    Dieses Features scheint mir wieder einmal ein undokumentiertes zu sein. Die Kollisionserkennung mit diesem Motion-Driver Befehl funktioniert, jedoch lässt sie sich danach nicht mehr ausschalten. Erst nach einem Reboot ist sie wieder ausgeschaltet. Hat jemand damit bereits Erfahrungen sammeln können?
    Interessant finde ich den Kommentar bei dem die verschiedenen Moden beschrieben werden, Denn bei 0 sollte die Kollisionserkennung ausgeschaltet sein. Im weiteren Programm ist die Funktion collDetReset auch immer auskommentiert, als wäre dieses Problem bereits bekannt gewesen.
    Ich freue mich auf eure Antworten.

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