Tipps zur Laufzeitoptimierung
Bei größeren Applikationen mit vielen Achsen kann es notwendig werden, die Instanzen der Funktionsbausteine zeitoptimiert aufzurufen, d.h. die FB-Instanzen sollen nur dann ausgeführt werden, wenn sie auch benötigt werde.
Der folgende kurze Codeabschnitt in StructuredText soll die Technik verdeutlichen, mit der die Laufzeit einer Applikation verringert werden kann. Als Beispiel wird hier der Funktionsbaustein „MC_MoveVelocity“ verwendet.
Mit der Variablen „MC_MoveVelocity_Active“ wird der Funktionsbaustein gesteuert. Sie kann dabei die folgenden Werte annehmen:
Wert | Bedeutung |
0 | Funktionsbaustein wird nicht ausgeführt. |
1 | Funktionsbaustein wird ausgeführt, der Eingang „Execute“/„Enable“ ist TRUE. |
2 | Funktionbaustein wird ausgeführt, bis die entsprechend abgefragte Quittierung (z.B. „Done“, „CommandAborted“ etc.) gesetzt ist. „Execute“/„Enable“ ist FALSE. |
Zu Beginn wird „MC_MoveVelocity_Active“ in Abhängigkeit vom Eingang „Execute“/„Enable“ auf 1 gesetzt. Damit wird der Funktionsbaustein „MC_MoveVelocity“ ausgeführt. Solange der Eingang nicht zurück gesetzt wird, bleibt dieser Zustand erhalten.
IF ( Execute_MoveVelocity = TRUE ) AND
( MC_MoveVelocity_Active = 0 ) THEN
MC_MoveVelocity_Active := 1;
END_IF;
Erst, wenn der Eingang „Execute“/„Enable“ auf FALSE gesetzt wird, ändert sich der Wert von „MC_MoveVelocity_Active“ auf 2. Der Funktionsbaustein wird jetzt noch solange gerechnet, bis eine Quittierung am Ausgang anliegt (hier: „Done“ oder „CommandAborted“). Im Fehlerfall, der hier nicht berücksichtigt ist, ist entsprechend ähnlich zu vorzugehen.
IF MC_MoveVelocity_Active > 0 THEN
MC_MoveVelocity( Axis := AxisReference,
Execute := Execute_MoveVelocity,
Velocity := Velocity_MoveVelocity,
Acceleration := Acceleration_MoveVelocity,
Deceleration := Deceleration_MoveVelocity,
Jerk := Jerk_MoveVelocity,
Direction := Direction_MoveVelocity );
AxisReference := MC_MoveVelocity_0.Axis;
InVelocity_MoveVelocity := MC_MoveVelocity_0.InVelocity;
CommandAborted_MoveVelocity := MC_MoveVelocity_0.CommandAborted;
Error_MoveVelocity := MC_MoveVelocity_0.Error;
ErrorID_MoveVelocity := MC_MoveVelocity_0.ErrorID;
IF MC_MoveVelocity_Active = 2 AND
(InVelocity_MoveVelocity = TRUE OR
CommandAborted_MoveVelocity = TRUE ) THEN
MC_MoveVelocity_Active := 0;
ELSIF Execute_MoveVelocity = FALSE THEN
MC_MoveVelocity_Active := 2;
END_IF;
END_IF;