CAN ID | DLC | DB0 | Beschreibung |
---|---|---|---|
0x210 | 2 | 1 | TCP Position (Koordinaten Tool-Center-Point) |
2 | Joint Position (Winkel der 6 Gelenke) | ||
13 | Greifer Objektdetektion (Nicht fertig implementiert) | ||
101 | Roboter Betriebszustand (Runmode) |
CAN ID | DLC | CMD | DB0 | DB1 | DB2 - DB5 | Beschreibung |
---|---|---|---|---|---|---|
0x211 | 6 | Error | 0x00 | code | - | Siehe Fehlercodes |
TCP pos. | 0x01 | 0x01=X | 4 Byte Data (MSB=DB2) | TCP Koordinaten X-Achse als uint32 in um | ||
0x02=Y | 4 Byte Data (MSB=DB2) | TCP Koordinaten Y-Achse als uint32 in um | ||||
0x03=Z | 4 Byte Data (MSB=DB2) | TCP Koordinaten Y-Achse als uint32 in um | ||||
0x04=Rx | 4 Byte Data (MSB=DB2) | TCP Koordinaten Rx-Achse als uint32 in mRad | ||||
0x05=Ry | 4 Byte Data (MSB=DB2) | TCP Koordinaten Ry-Achse als uint32 in mRad | ||||
0x06=Rz | 4 Byte Data (MSB=DB2) | TCP Koordinaten Rz-Achse als uint32 in mRad | ||||
Joint angle | 0x02 | 0x01=Base | 4 Byte Data (MSB=DB2) | Gelenkwinkel Base als uint32 in mGrad | ||
0x02=Shoulder | 4 Byte Data (MSB=DB2) | Gelenkwinkel Shoulder als uint32 in mGrad | ||||
0x03=Elbow | 4 Byte Data (MSB=DB2) | Gelenkwinkel Elbow als uint32 in mGrad | ||||
0x04=Wrist1 | 4 Byte Data (MSB=DB2) | Gelenkwinkel Wrist1 als uint32 in mGrad | ||||
0x05=Wrist2 | 4 Byte Data (MSB=DB2) | Gelenkwinkel Wrist2 als uint32 in mGrad | ||||
0x06=Wrist3 | 4 Byte Data (MSB=DB2) | Gelenkwinkel Wrist3 als uint32 in mGrad | ||||
Gripper | 0x0D | Objekt | - | Greifer Objekterkennung 0=kein Objekt, 1=Objekt (Stand 2019 immer 1, modbus fehler auf CAN-GW) | ||
Runmode | 0x65 | runmode | DB2: Emergency Stop, DB3:Protective Stop | Betriebszustand des Roboterarms. Siehe Tabelle “Runmode” | ||
Event E | 0x66 | - | - | Emergency-Stop Event. Wird asynchron ohne Anfrage gesendet, sobald ein Emergency Stop eintritt. | ||
Event P | 0x67 | - | - | Protective-Stop Event. Wird asynchron ohne Anfrage gesendet, sobald ein Protective Stop eintritt. |
CAN ID | DLC | CMD | DB0 | DB1 | DB2 - DB5 | Beschreibung |
---|---|---|---|---|---|---|
0x212 | 6 | Cmd | 0x00 | 0x00 | - | Roboter stoppen, Bremsen aktivieren |
0x01 | - | Roboter starten, Bremsen deaktivieren | ||||
0x02 | - | Herunterfahren des Roboters | ||||
0x03 | - | Sicherheits-Stop zurücksetzen | ||||
0x04 | - | Popup schliessen | ||||
0x05 | - | Sicherheits Popup schliessen | ||||
0x53 'S' | - | Koordinaten anfahren | ||||
0x82 'R' | -………………………………………………… | Koordinaten zurücksetzen | ||||
TCP pos. | 0x01 | 0x01=X | 4 Byte Data (MSB=DB2) | TCP Koordinaten X-Achse als uint32 in um | ||
0x02=Y | 4 Byte Data (MSB=DB2) | TCP Koordinaten Y-Achse als uint32 in um | ||||
0x03=Z | 4 Byte Data (MSB=DB2) | TCP Koordinaten Y-Achse als uint32 in um | ||||
0x04=Rx | 4 Byte Data (MSB=DB2) | TCP Koordinaten Rx-Achse als uint32 in mRad | ||||
0x05=Ry | 4 Byte Data (MSB=DB2) | TCP Koordinaten Ry-Achse als uint32 in mRad | ||||
0x06=Rz | 4 Byte Data (MSB=DB2) | TCP Koordinaten Rz-Achse als uint32 in mRad | ||||
Joint angle | 0x02 | 0x01=Base | 4 Byte Data (MSB=DB2) | Gelenkwinkel Base als uint32 in mGrad | ||
0x02=Shoulder | 4 Byte Data (MSB=DB2) | Gelenkwinkel Shoulder als uint32 in mGrad | ||||
0x03=Elbow | 4 Byte Data (MSB=DB2) | Gelenkwinkel Elbow als uint32 in mGrad | ||||
0x04=Wrist1 | 4 Byte Data (MSB=DB2) | Gelenkwinkel Wrist1 als uint32 in mGrad | ||||
0x05=Wrist2 | 4 Byte Data (MSB=DB2) | Gelenkwinkel Wrist2 als uint32 in mGrad | ||||
0x06=Wrist3 | 4 Byte Data (MSB=DB2) | Gelenkwinkel Wrist3 als uint32 in mGrad | ||||
Move time | 0x03 | time | - | Ausführzeit für die Bewegung (Geschwindigkeit), in Sekunden, Range:1-10s, 0=Default | ||
Gripper | 0x0A | 0x53 'S' | - | Gripper “Activate” | ||
Gripper | 0x0B | 0x01 | position | Position des Grippers in 0-255 (0=open) | ||
Gripper | 0x0C | 0x01 | speed | Bewegungsgeschwindigkeit 0-255 (255=max) | ||
0x02 | force | Kraft 0-255 (255=max) |
CAN ID | DLC | CMD | Beschreibung |
---|---|---|---|
0x21F | 0 | RESET | Setzt den CAN node zurück (Neustart node-red) |
Runmode ist der Betriebszustand des Roboters. Dieser kann über folgende Codes aufgeschlüsselt werden
Runmode | Name | Beschreibung |
---|---|---|
0x03 | Power off | Roboter deaktiviert |
0x04 | Power On | Roboter wird aktiviert |
0x05 | Idle | Roboter wartet auf aktivierung |
0x06 | Backdrive | Safety-violation. Rückführung im Recovery mode |
0x07 | Running | Roboter im Normalbetrieb |
1) Der Gripper ist eine Komponente eines Drittherstellers und über ein Plugin in die Steuersoftware des Roboters integriert. Da jeweils nur das Gripper Plugin oder die Roboter Befehlsausführung funktioniert, kann der Gripper nur angesprochen werden, wenn der Roboter keine andere Aktion ausführt!
2) Nach einem Emergency-Stop kann es vorkommen, dass der Gripper auch in einen Emergency-Zustand wechselt. Dabei blinkt die LED des Grippers Rot/Blau. Er lässt sich nun nicht mehr über CAN fernsteuern und muss über das Bedienteil des Roboter Controllers (Schaltfläche “Gripper”) erneut aktiviert werden.
Beide hier erwähnten Einschränkungen könnte man lösen, indem der Gripper nicht weiters über den Roboter-Controller gesteuert wird, sondern direkt auf dem CAN-GW (Raspberry) über den RS485 Bus des Grippers.
Die Beispiele sind als Pseudocode geschrieben und sollen lediglich den Kommunikationsablauf erläutern. Sie sind sind nicht für eine direkte Implementation vorgesehen!
Der Roboter-Controller lässt sich nicht über CAN starten und muss von Hand auf dem bedienteil Aktiviert werden. Der CAN-Gateway des Roboters (industrial-raspberryPi) kann nach dem Aufstarten nicht direkt auf den Roboter verbinden, weshalb nach dem Start des Systems einmalig ein Reset des Can-GW durchgeführt werden muss. Am einfachsten ist, dies auszuführen sobald der Roboter nicht korrekt aufstartet.
RobotCloseAllPopup(); // Popups auf Roboter-Controller schliessen RobotStart(); // Einschalten des Roboterarms und lösen der Bremsen Delay(15s); // Einschalten abwarten if(RobotRunmode != Running) // Wenn der Roboter nicht startet, CAN-GW resetten und Startsequenz widerholen { RobotReset(); return; } GripperActivate(); // Gripper aktivieren Delay(1s);
Der Steuersoftware des Roboters ist Linuxbasiert und sollte vor ausschalten der Stromversorgung sauber heruntergefahren werden. Dies kann theoretisch über das Bedienteil geschehen. Da es sich aber bei dem CAN-Gateway um ein industrial RaspberryPi handelt, muss dieses zusätzlich auch heruntergefahren werden. Folgender Befehl führt beides aus:
id=0x212 DB0=0x00 DB1=0x01
Ist der CAN-GW (raspberry) einmal heruntergefahren, muss zum Neustart die Stromversorgung für einige Sekunden unterbrochen werden.
Der Roboter kann in TCP (Tool-Center-Point) Koordinaten oder in Gelenkwinkel(Joint angle) angesteuert werden. Bei TCP Koordinaten wird die inverse Kinematik im Controller des Roboters berechnet.
Um eine Bewegung auszulösen, müssen erst die Koordinaten aller Achsen(Joint angle) oder Dimensionen(TCP) über CAN gesendet werden. Da ein CAN-Telegramm nicht gross genug ist, wird jede Dimension einzeln versendet. Um die Zeit für die Bewegung (Geschwindigkeit) festzulegen, wird anschliessend ein “Move time” Kommando gesendet. Die Bewegung startet anschliessend mit einem einzelnen Kommando (id=0x212, DB0=0x00,DB1=0x53).
Die inverse Kinematik von TCP Koordinaten kann oftmals mehrere Lösungen erzeugen. Daher ist nicht mit sicherheit abschätzbar was der Roboter für eine Position einnehmen wird. Es wird empfohlen wo möglich mit Gelenkwinkel zu arbeiten! TCP Koordinaten eignen sich gut für relative Verschiebungen (z.b. 100mm nach links).
Koordinaten können über das Bedienteil des Roboters ausgelesen werden. Unter “MOVE” stehen die TCP Koordinaten sowie die Gelenkwinkel. Bei TCP sollte die Bezugsebene auf “Base” gestellt werden!
// Beispiel Gelenkwinkel RobotSetJoint(BASE, 0.0); // Alle Gelenkwinkel setzen (Achtung, Can Datenwort in Milligrad) RobotSetJoint(SHOULDER,-90.0); RobotSetJoint(ELBOW, -155.8); RobotSetJoint(WRIST1, -25.0); RobotSetJoint(WRIST2, -90.0); RobotSetJoint(WRIST3, 90.0); RobotSetMoveTime(2000); // Ausührzeit festlegen RobotStartMove(); // Bewegung starten
// Beispiel TCP Koordinaten (Achtung, CAN DDatenwort in um und mRAD! RobotSetTCP(X, 230); // Raumkoordinaten X Achse in mm RobotSetTCP(Y, -110); // Raumkoordinaten Y Achse in mm RobotSetTCP(Z, 670); // Raumkoordinaten Z Achse in mm RobotSetTCP(Rx, 0.0); // Rotation um X Achse in RAD RobotSetTCP(Ry, 0.0); // Rotation um Y Achse in RAD RobotSetTCP(Rz, 3.14); // Rotation um Z Achse in RAD RobotSetMoveTime(2000); // Ausührzeit festlegen RobotStartMove(); // Bewegung starten
Es existieren mehrere Befehle um den Roboter aus einem Emergency, Safety oder Protection Modus zu reaktivieren. Es wird empfohlen diese Ereignisse in einem ersten Schritt nur auf dem Bedienteil des Roboters zurückzusetzen. Sobald man vertrauter mit dem Roboter ist, können Reaktivierungen integriert werden.
Der Stop-Knopf des Bedienteils löst einen Emergency-Stop aus. Der Stop-Knopf des Modells löst eine Safety-violation aus. Diese müssen unterschiedlich gehandhabt werden!