Implementierungsbeispiel einer FIFO-Strategie
Dieses Beispiel zeigt, wie Sie eine benutzerdefinierte Zielauswahlstrategie implementieren können.
Für dieses Beispiel wird Folgendes vorausgesetzt:
oDie Trackingrichtung ist immer auf ROB.ET_RobotComponent.CartesianX festgelegt.
oDer Ziel-Handler, auf den der Algorithmus angewendet wird, enthält keine Slots.
Erstellung der Implementierung der Zielauswahlstrategie
Zuerst müssen Sie einen neuen Funktionsbaustein erstellen, der die Bibliothekschnittstelle IF_TargetSelectionStrategy implementiert. In diesem Fall wird ein Funktionsbaustein mit der Bezeichnung FB_UserFIFOStrategy erstellt.
Innerhalb der Schnittstelle von FB_UserFIFOStrategy wurde eine neue interne Variable des Typs BOOL mit der Bezeichnung _xValidData definiert. Diese wird als Rückgabewert für die Schnittstelleneigenschaft xValidData verwendet.
FUNCTION_BLOCK FB_UserFIFOStrategy IMPLEMENTS SERT.IF_TargetSelectionStrategy
VAR
_xValidData : BOOL;
END_VAR
Der Unterstrich vor dem Namen der Variablen ist lediglich eine Namenskonvention zur Identifizierung der internen Variablen des Funktionsbausteins.
Es ist auch möglich, eine Implementierung für die Get-Methode der Eigenschaft xValidData hinzuzufügen.
xValidData := _xValidData;
Hinzufügen einer Konfigurationsmethode
Die Schnittstelle IF_TargetSelectionStrategy enthält keinerlei Konfigurationsmethode. Daher müssen Sie zu diesem Zweck eine eigene Methode erstellen.
In diesem Fall wurde eine Methode mit der Bezeichnung SetData mit der folgenden Schnittstelle erstellt:
VAR_INPUT
i_ifTargetsHandler : SERT.IF_TargetsHandler;
i_stTrackingConstraints : SERT.ST_TrackingConstraints;
END_VAR
Außerdem werden dem Funktionsbaustein zwei interne Variablen hinzugefügt, da diese erforderlich sind, um die über die Methode SetData übergebenen Werte zu speichern.
FUNCTION_BLOCK FB_UserFIFOStrategy IMPLEMENTS SERT.IF_TargetSelectionStrategy
VAR
_xValidData : BOOL;
_ifTargetsHandler : SERT.IF_TargetsHandler;
_stTrackingConstraints : SERT.ST_TrackingConstraints;
END_VAR
Der Hauptteil der Methode SetData kann wie folgt implementiert werden:
//clean the flag
_xValidData := FALSE;
//check that i_ifTargetsHandler contains a valid interface,
//otherwise return
IF i_ifTargetsHandler = 0 THEN
//add some diagnostics here
RETURN;
END_IF
//store the values inside the internal variables
_ifTargetsHandler := i_ifTargetsHandler;
_stTrackingConstraints := i_stTrackingConstraints;
//set the flag
_xValidData := TRUE;
Implementieren von GetRobotTarget
In diesem Fall muss eine FIFO-Strategie implementiert werden. Der Algorithmus sucht das Ziel mit der größten Position entlang der Trackingrichtung und innerhalb eines durch die Trackingeinschränkungen beschriebenen Arbeitsbereichs.
Zuerst müssen einige innerhalb der Methode GetRobotTarget verwendete zusätzliche Variablen definiert werden:
METHOD GetRobotTarget : SERT.ST_RobotTarget
VAR_INPUT
i_etRobotId : SERT.ET_SystemEntity;
END_VAR
VAR_OUTPUT
q_etDiag : GD.ET_Diag := GD.ET_Diag.Ok;
q_etDiagExt : SERT.ET_DiagExt := SERT.ET_DiagExt.Ok;
q_sMsg : STRING(80);
END_VAR
VAR
udiIndex : UDINT;
stTempTarget : SERT.ST_RobotTarget;
END_VAR
Der folgenden Code wird dem Hauptteil der Methode hinzugefügt:
IF NOT _xValidData THEN
//add diagnostics here
RETURN;
END_IF
//get the first index in the list
udiIndex := _ifTargetsHandler.udiFirstListIndex;
WHILE udiIndex <> SERT.Gc_udiTailListIndex DO
//get the target in the list at index udiIndex
stTempTarget := _ifTargetsHandler.GetTarget(
i_udiListIndex := udiIndex,
q_etDiag => q_etDiag,
q_etDiagExt => q_etDiagExt,
q_sMsg => q_sMsg
);
//there was an error while getting a target
IF q_etDiag <> GD.ET_Diag.Ok THEN
RETURN;
END_IF
//check if the target is inside the working area, if yes,
//the search ends here
IF stTempTarget.stCurrentPose.stPosition.lrX >= _stTrackingConstraints.stMinPosition.lrX AND stTempTarget.stCurrentPose.stPosition.lrX <= _stTrackingConstraints.stMaxPosition.lrX THEN
//return the current target as the selected one
GetRobotTarget := stTempTarget;
RETURN;
END_IF
//get the next index in the list
udiIndex := _ifTargetsHandler.GetNextListIndex(
i_udiListIndex := udiIndex,
q_etDiag => q_etDiag,
q_etDiagExt => q_etDiagExt,
q_sMsg => q_sMsg
);
//there was an error while getting the next list index
IF q_etDiag <> GD.ET_Diag.Ok THEN
RETURN;
END_IF
END_WHILE
Beschreibung des Codeinhalts:
oÜberprüfe, ob die internen Daten gültig sind, andernfalls brechen sie ab.
oRuft den ersten Index in der Liste in den Ziel-Handler ab. Da die Ziele im Ziel-Handler in absteigender Reihenfolge sortiert sind, hat das erste Element der Liste immer die größte Position entlang der Trackingrichtung (in diesem Fall positive X-Richtung).
oFür jeden Index wird der relative Parameter ST_RobotTarget in der Liste abgerufen, und es wird überprüft, ob seine Position innerhalb der minimalen und maximalen Positionen liegt, die innerhalb der Trackingeinschränkungen definiert sind.
oDa die Elemente in der Liste in absteigender Reihenfolge sortiert sind, kann der Algorithmus abgebrochen werden, sobald ein Ziel innerhalb des Arbeitsbereichs gefunden wird.
oWenn das aktuelle Ziel nicht gültig ist, ruft der Algorithmus den nächsten Zielindex aus dem Ziel-Handler ab und fährt mit dem nächsten Zyklus fort.