Ein Kollisionshandler dient der Darstellung eines bekannten Moduls und ermöglicht die Durchführung folgender Aufgaben:
Konfiguration einer Kollisionseinheit auf der Grundlage einer von Parametern, die das Modul beschreiben.
Automatische Aktualisierung der Position und Ausrichtung jedes das Modul modellierende Objekt auf der Grundlage der Achspositionen beispielsweise.
Die Bibliothek stellt verschiedene Implementierungen von Kollisionshandlern bereit, der Workflow ist jedoch für alle identisch.
Der Workflow folgt einem Beispiel mit Bezug auf die Konfiguration und Aktualisierung von FB_CollisionHandlerDelta3Ax:
Schritt |
Aktion |
---|---|
1 |
Definieren Sie eine Instanz des Funktionsbausteins und eine Struktur für die Speicherung der Parameter.
|
2 |
Bereiten Sie die Struktur stDelta3AxParameters mit gültigen Parametern vor. Weitere Informationen finden Sie unter ST_Delta3AxParameters – Allgemeine Informationen. |
3 |
Stellen Sie die Parameter für den Aufruf von fbCollisionHandlerDelta3Ax.SetParameters(…) wie folgt ein:
|
4 |
Wenn der Aufruf von SetParameters erfolgreich war, wird der Kollisionshandler konfiguriert. Um das zu prüfen, kann geprüft werden, ob fbCollisionHanlderDelta3Ax.xConfigured = TRUE. |
5 |
Der Kollisionshandler ist jetzt konfiguriert, aber um eine Verwendung mit den Kollisions- und Abstandsabfragen zu ermöglichen, führen Sie mindestens eine gültige Aktualisierung durch. Wenn fbCollisionHanlderDelta3Ax.xUpdated = TRUE, dann war die letzte Aktualisierung des Kollisionshandlers erfolgreich. |
Die Basisschnittstelle des Kollisionshandlers IF_CollisionHandler enthält keine Methoden für die Aktualisierung des Kollisionshandlers. Das liegt daran, dass jeder Kollisionshandler auf ein anderes Modul verweist, d. h. es könnten andere Informationen erforderlich sein, damit eine Aktualisierung durchgeführt werden kann.
Jeder Funktionsbaustein, der die generische Schnittstelle IF_CollisionHandler implementiert, implementiert ebenfalls eine zusätzliche Schnittstelle mit Eigenschaften und Methoden, die für ein spezifisches Modul erforderlich sind. FB_CollisionHandlerDelta3Ax beispielsweise implementiert die Schnittstelle IF_CollisionHandlerDelta3Ax, die Eigenschaften und Methoden enthält, die für die Interaktion mit dem Kollisionshandler eines Delta3Ax-Roboters benötigt werden.
FB_CollisionHandlerDelta3Ax stellt zwei Methoden für die Aktualisierung der zugehörigen Kollisionsobjekte bereit:
Die Methode erwartet als Eingang ein LREAL-Array mit den Gelenkposition des Roboters. Diese Methode verwendet die bereitgestellten Gelenkpositionen zur Aktualisierung der Position und Ausrichtung jedes Kollisionsobjekts in der vom Kollisionshandler verwalteten Einheit.
Given that fbCollisionHanlderDelta3Ax.xConfigured = TRUE, meaning that a successful call of SetParameters has been already performed, UpdateFromJointPositions can be used as follows:
//copy the current joint positions of the robot
FOR udiI := 1 TO COD.Gc_udiDelta3AxNumberOfJoints DO
alrRobotJointPositions[udiI] :=
ifFeedback.ifKinematic.ralrRefPositionJoint[ROB.ET_RobotComponent.AxisAll + udiI];
END_FOR
//update the collision handler for the robot based on the joint positions
fbCollisionHandlerDelta3Ax.UpdateFromJointPositions(
i_alrJointPositions := alrRobotJointPositions,
q_xError => xError,
q_etResult => etResult,
q_sResultMsg => sResultMsg
);
//check diagnostics here
IF xError THEN
//do something to handle the error
…
END_IF
In diesem Beispiel ist ifFeedback eine gültige Instanz von ROB.IF_RobotFeedback.
Nach einem erfolgreichen Aufruf von UpdateFromJointPositions muss fbCollisionHandlerDelta3Ax.xUpdated = TRUE sein. Dann kann die Einheit fbCollisionHandlerDelta3Ax.ifCollisionEntity mit den Kollisions- und Abstandsabfragefunktionen verwendet werden.
Die Methode erwartet eine Struktur des Typs ST_Delta3AxKinematicsResult mit einem gültigen Ergebnis für die Kinematik. Diese Methode verwendet das bereitgestellte Ergebnis der Kinematik zur Aktualisierung der Position und Ausrichtung jedes Kollisionsobjekts in der vom Kollisionshandler verwalteten Einheit.
In diesem Fall besteht der erste Schritt in der Ermittlung eines gültigen Ergebnisses für die Kinematik. Das kann mithilfe der Methoden erfolgen, die die direkte und inverse Kinematik implementieren, dieso genannte EvaluateDirectKinematics und EvaluateInverseKinematics.
Ein Beispiel für EvaluateDirectKinematics:
//copy the current joint positions of the robot
FOR udiI := 1 TO COD.Gc_udiDelta3AxNumberOfJoints DO
alrRobotJointPositions[udiI] :=
ifFeedback.ifKinematic.ralrRefPositionJoint[ROB.ET_RobotComponent.AxisAll + udiI];
END_FOR
//evaluate the direct kinematics providing the joint positions
fbCollisionHandlerDelta3Ax.EvaluateDirectKinematics(
i_alrJointPositions := alrRobotJointPositions,
q_xError => xError,
q_etResult => etResult,
q_sResultMsg => sResultMsg,
q_stResultLocal => stDelta3AxKinematicsResult
);
//check diagnostics here
IF xError THEN
//do something to handle the error
…
END_IF
In diesem Beispiel ist ifFeedback eine gültige Instanz von ROB.IF_RobotFeedback.
Bei einem erfolgreichen Aufruf von EvaluateDirectKinematics enthält stDelta3AxKinematicsResult ein gültiges Ergebnis für die Kinematik und kann als Eingang für UpdateFromKinematicsResult bereitgestellt werden. Für ein gültiges Ergebnis muss stDelta3AxKinematicsResult.xIsResultValid = TRUE sein.
Nach einem erfolgreichen Aufruf von EvaluateDirectKinematics oder EvaluateInverseKinematics kann das Ergebnis stDelta3AxKinematicsResult optional zur Aktualisierung einiger zusätzlicher, von Ihnen definierter Kollisionsobjekt verwendet werden, die mit der Bewegung des Roboters verknüpft sind, jedoch nicht direkt vom Kollisionshandler verwaltet werden. Detaillierte Informationen finden Sie hier: Hinzufügen von Benutzerobjekten oder -gruppen zu einem Kollisionshandler.
Nach diesem optionalen Schritt kann stDelta3AxKinematicsResult wie folgt zur Aktualisierung der vom Kollisionshandler verwalteten Kollisionsobjekte verwendet werden:
//update the collision handler for the robot based on the result of the kinematics
fbCollisionHandlerDelta3Ax.UpdateFromKinematicsResult(
i_stKinematicsResult := stDelta3AxKinematicsResult,
q_xError => xError,
q_etResult => etResult,
q_sResultMsg => sResultMsg
);
Nach einem erfolgreichen Aufruf von UpdateFromKinematicsResult muss fbCollisionHandlerDelta3Ax.xUpdated = TRUE sein. Dann kann die Einheit fbCollisionHandlerDelta3Ax.ifCollisionEntity mit den Kollisions- und Abstandsabfragefunktionen verwendet werden.