Homepos / Safepos abfragen

  • Hallo zusammen,



    ich möchte gerne die Roboterposition bei einem Neustart der Anlage oder zurücksetzen auf PZ-Main abfragen und anschließend in einer IF Bedingung vergleichen ob diese Position einer der Safe Positionen entspricht.



    Folgend bin ich hierzu vorgegangen:



    Var robtarget p1;

    VAR num merkerFreigabeSafepos:=0;

    CONST robtarget pSafepos:=[[1028.919,1002.525,1243.223],[0,0,0,1],[0,-1,-2,1],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];

    CONST robtarget pSafepos2:=[[1173.2,-489.549,1452.46],[0,-0.707107,0.707107,0],[-1,-1,0,1],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];

    CONST robtarget pSafepos3:=[[-678.919,-852.525,1543.223],[1,0,0,0],[-2,-1,-2,1],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];

    PROC CheckSafepos()

    p1:=CRobT();

    if p1 = pSafepos or p1 = pSafepos2 or p1 = pSafepos3 Then

    merkerFreigabeSafepos:=1;

    Else

    merkerFreigabeSafepos:=0;

    Endif

    Endproc




    Wenn ich das nun Robstudio schritt für schritt durchgehe und der Roboter auf einer Safepos steht, springt dieser nie in die Ja Bedingung.

    Unterschiedliche Werte habe ich in den Quaternion Q1 und Q4.

    Wenn ich jedoch im bewegen Fenster bin und die Quaternion anschaue sind diese wie im Robtarget, bzw. bei der Zuweisung p1:=CRobT() stimmt Q1 und Q4 nicht.

    Habt ihr mir hierfür einen Lösungsansatz, ggf. auch alternative Lösung?

  • ANZEIGE
  • Hallo,

    such mal im Forum/Doku nach dem Stichwort "Weltzone". Im Normalfall werden Achsbezogenen Weltzonen genau für so etwas verwendet.

    Dein Code funktioniert in der Theorie auch. In der Praxis erreicht der Roboter aber die programmierte Position oft nicht auf die letzte Nachkommastelle genau. Deshalb springt er auch nicht in deine " Ja Bedingung".

  • Kann mich beiden Vorrednern nur anschließen.


    Auf deinen Code bezogen kannst du höchstens bis auf die erste Nachkommastelle kürzen. Würde in vielen Fällen vermutlich funktionieren, hat aber mit "sicher" nicht viel zu tun. :)

  • Hi Kai S.

    wenn du eine wirklich "sichere" Position benötigt. Wirst du um die SafeMove Option nicht herum kommen.

    Hier würde ich dir dann die Pro Variante empfehlen. Hier kannst du eine sichere Position über einen sicheren Bereich festlegen in welchem du für jede Achse eine obere und untere Grenze definierst in welcher ein entsprechende Signal gesetzt wird.

    Eine Übereinstimmung bis auf die x-te Position wirst du nicht bekommen, da schließ ich mich meinen Vorgängern an.

    Die Frage ist für was die "Sichere" Position funktionell verwendet wird.

    Möglichkeit 1: Relevant für die Maschinensicherheit -> Umsetzung mit SafeMove

    Möglichkeit 2: Relevant im Programmablauf -> Umsetzung mit Weltzonen

  • Wobei für Maschinensicherheit im Sinne von Schutz der Ausrüstung bzw. zum Schutz vor Sachschäden auch Weltzonen genügen.


    Wobei ich, falls vorhanden, auch gerne SafeMove dafür verwende, weil sich die Überwachung von z.B. Arbeitsbereichen nicht nur auf den TCP bezieht und deshalb meiner Meinung nach die zuverlässigere Überwachungsfunktion darstellt.

  • Hallo,

    am einfachsten geht sowas mit Weltzonen (Softwareoption). Damit kannst du Achsbereiche oder Räume (Kugel, Quader, Zylinder) definieren und einen Ausgang vom System setzen lassen, wenn der Robi (TCP) im definierten Bereich ist. Dieser Ausgang wird dann im Programm abgefragt. Das ist der eleganteste Weg, man braucht aber Weltzonen als Option, immer unbedingt mitbestellen, sonst wird‘s kompliziert.

    Übrigens Merker bastelt man mit boolschen Datenelementen (1Bit) und nicht mit numerischen (16Bit). Du baust deinem Pony ja auch kein Schloss, wenn‘s ein Pferdestall auch tut.

  • Hallo zusammen, ich habe es folgend gelöst.


    MODULE CheckSafepos

    VAR shapedata shape1;

    VAR shapedata shape2;

    VAR shapedata shape3;

    VAR pos pos1:=[1000,950,1200];

    VAR pos pos2:=[1100,1050,1300];

    VAR pos pos3:=[1150,-500,1400];

    VAR pos pos4:=[1250,-400,1500];

    VAR pos pos5:=[-700,-900,1500];

    VAR pos pos6:=[-600,-800,1600];

    VAR num insafepos1:=0;

    VAR num insafepos2:=0;

    VAR num insafepos3:=0;

    VAR num RoboterSafe:=0;

    VAR wztemporary wztemp1:=[0];

    VAR wztemporary wztemp2:=[0];

    VAR wztemporary wztemp3:=[0];

    VAR robtarget p1;

    VAR robtarget p2;

    VAR robtarget p3;

    VAR num pz_mainRun:=0;

    PROC CheckSafeposition()

    WZBoxDef\Inside, shape1, pos1, pos2;

    WZBoxDef\Inside, shape2, pos3, pos4;

    WZBoxDef\Inside, shape3, pos5, pos6;

    WZDOSet\Temp, wztemp1\Before, shape1, VDO01_INSafepos1, 1;

    WZDOSet\Temp, wztemp2\Before, shape2, VDO02_INSafepos2, 1;

    WZDOSet\Temp, wztemp3\Before, shape3, VDO03_INSafepos3, 1;

    IF DOutput(VDO01_INSafepos1) = 1 THEN

    p1:=CRobT();

    IF p1.robconf = pSafepos.robconf THEN

    insafepos1 :=1;

    ENDIF

    ENDIF

    IF DOutput(VDO02_INSafepos2) = 1 THEN

    p2:=CRobT();

    IF p2.robconf = pSafepos2.robconf THEN

    insafepos2 :=1;

    ENDIF

    ENDIF

    IF DOutput(VDO03_INSafepos3) = 1 THEN

    p3:=CRobT();

    IF p3.robconf = pSafepos3.robconf THEN

    insafepos3 :=1;

    ENDIF

    ENDIF

    !

    IF insafepos1 + insafepos2 + insafepos3 = 1 THEN


    ELSE


    TPWrite (" Roboter ist auf keiner Safepos");

    PulseDO \High \PLength:=2 ,DO12_Störung;

    SystemStopAction\StopBlock;


    ENDIF

    pz_mainRun := 1;



    Endproc

    ENDMODULE


    Ist vieleicht nicht die eleganteste Lösung.

  • Erstell dir für die Home-Pos eine Weltzone....


    !---Homezone---

    WZHomeJointDef\Inside,VolLocHome,j_HomePos,j_DeltaHPos;

    WZDOSet\Stat,wzR_HomeZone\Inside,VolLocHome,doSIM_Home,1;


    Der Ausgang doSIM_Home wird 1 gesetzt, wenn sich der Roboter in der Pos: j_HomePos befindet.

Hilfe und Support für ABB Roboter Programmierung, Konfiguration, Inbetriebnahme finden Sie hier im ABB Roboter Forum. ABB Rapid Programmierung ist einfach, die Roboterforum Community hilft sehr gerne.

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