-> Hier kostenlos registrieren
Hallo Zusammen,
ich habe mal eine relativ simple Frage zu Programmieroptimierungen.
Mir scheint mein angestrebter Weg mit dem doppelten Aufruf der gleichen CASE-Anweisung (eSelectAxis) doch eher unschön (Meiner Meinung nach läuft es hier auf ein "Henne-Ei-Problem" zw. _eSeq und eSelectAxis hinaus...), es gibt hier sicherlich eine schönere / Alternativ-Lösung aus der Programmierpraxis. Hat jemand Tipps?
Annahme (Pseudo Programmauszug):
Vielen Dank schonmal!
Gruß,
Biiebs
ich habe mal eine relativ simple Frage zu Programmieroptimierungen.
Mir scheint mein angestrebter Weg mit dem doppelten Aufruf der gleichen CASE-Anweisung (eSelectAxis) doch eher unschön (Meiner Meinung nach läuft es hier auf ein "Henne-Ei-Problem" zw. _eSeq und eSelectAxis hinaus...), es gibt hier sicherlich eine schönere / Alternativ-Lösung aus der Programmierpraxis. Hat jemand Tipps?
Annahme (Pseudo Programmauszug):
- 2 verschiedene Typen von Achsen -> Achse 1 und Achse 2
- Diese sollten, je nach Auswahl, entweder jeweils einzeln angesteuert oder beide zusammen angesteuert werden
- Aufgerufen werden diese in einer Methode, die mit Execute aktiviert wird.
- Die Ablaufsteuerung setzt sich wie folgt zusammen:
- Schritt 0 - Setzt einen angestrebten Wert über SDO's
- Schritt 1 - Aktiviert die Bewegung über PDO's
Code:
IF xExecute THEN
CASE _eSeq OF
(********************************************************************************************************)
E_Seq.SetSDO:
CASE eSelectAxis OF
(********************************************************************************************************)
E_Axis.None:
RETURN;
(********************************************************************************************************)
E_Axis.Axis_1:
_Axis_1_SetCtrlDataExecute := TRUE;
_eAxis_1_CtrlDataTypes := EControlDataTypes.SetIntermediatePosition;
_rAxis_1_CtrlDataPosition := _stAxis.stConfig.rBasePosition;
IF _Axis_1_SetCtrlDataDone THEN
_eSeq := E_Seq.SetPDO;
END_IF
(********************************************************************************************************)
E_Axis.Axis_2:
_Axis_2_SetCtrlDataExecute := TRUE;
_eAxis_2_CtrlDataTypes := EControlDataTypes.SetIntermediatePosition;
_rAxis_2_CtrlDataPosition := _stAxis.stConfig.rBasePosition;
IF _Axis_2_SetCtrlDataDone THEN
_eSeq := E_Seq.SetPDO;
END_IF
(********************************************************************************************************)
E_Axis.Both_Axes:
_Axis_1_SetCtrlDataExecute := TRUE;
_eAxis_1_CtrlDataTypes := EControlDataTypes.SetIntermediatePosition;
_rAxis_1_CtrlDataPosition := _stAxis.stConfig.rBasePosition;
_Axis_2_SetCtrlDataExecute := TRUE;
_eAxis_2_CtrlDataTypes := EControlDataTypes.SetIntermediatePosition;
_rAxis_2_CtrlDataPosition := _stAxis.stConfig.rBasePosition;
IF ( _Axis_1_SetCtrlDataDone AND _Axis_2_SetCtrlDataDone ) THEN
_eSeq := E_Seq.SetPDO;
END_IF
END_CASE
(********************************************************************************************************)
E_Seq.SetPDO: // Move to position
CASE eSelectAxis OF
(********************************************************************************************************)
E_Axis.None:
RETURN;
(********************************************************************************************************)
E_Axis.Axis_1:
_stAxis_1.stPDO.xMoveToPosIntermediate := TRUE;
IF _stAxis_1.stPDO.xIntermediatePosReached THEN
_stAxis_1.stPDO.xMoveToPosIntermediate := FALSE;
_eSeq := E_Seq.SetSDO;
END_IF
(********************************************************************************************************)
E_Axis.Axis_2:
_stAxis_2.stPDO.xMoveToPosIntermediate := TRUE;
IF _stAxis_2.stPDO.xIntermediatePosReached THEN
_stAxis_2.stPDO.xMoveToPosIntermediate := FALSE;
_eSeq := E_Seq.SetSDO;
END_IF
(********************************************************************************************************)
E_Axis.Both_Axes:
_stAxis_1.stPDO.xMoveToPosIntermediate := TRUE;
_stAxis_2.stPDO.xMoveToPosIntermediate := TRUE;
IF ( _stAxis_1.stPDO.xIntermediatePosReached AND _stAxis_2.stPDO.xIntermediatePosReached ) THEN
_stAxis_1.stPDO.xMoveToPosIntermediate := FALSE;
_stAxis_2.stPDO.xMoveToPosIntermediate := FALSE;
_eSeq := E_Seq.SetSDO;
END_IF
END_CASE
END_CASE
END_IF
Vielen Dank schonmal!
Gruß,
Biiebs