Skip to main content

Bahnschaltpunkte 1: Einfaches Beispiel

Das hier beschrieben Beispielprojekt Robotics_Trigger.project finden Sie im Installationsverzeichnis von CODESYS unter ..\CODESYS SoftMotion\Examples.

Bahnschaltpunkte dienen dazu zu erfahren, wann genau eine Achsgruppe einen bestimmten Punkt auf der kommandierten Bahn erreicht. Diese Information kann beispielsweise genutzt werden, um ein Werkzeug exakt zum richtigen Zeitpunkt ein- oder auszuschalten. Dieses Beispiel zeigt, wie ein einzelner Bahnschaltpunkt auf einer Bewegung kommandiert und im Anschluss zyklisch ausgelesen wird. Das Projekt Bahnschaltpunkte 2: Beispiel Klebeprozess zeigt darauf aufbauend ein realistisches Anwendungsbeispiel.

Struktur der Applikation

Die Applikation besteht aus zwei Programmen, einem Main_PRG, das in der Bustask läuft, und einem Planning_PRG, das in der Planungs-Task der Achsgruppe läuft. Außerdem gibt es einen Trace.

Main_PRG:

Das Programm Main_PRG enthält die Hauptzustandsmaschine der Applikation. Die ersten beiden Zustände dienen der Initialisierung und dem Einschalten der Antriebe und der Achsgruppe. Im Zustand STATE_COMMAND_MOVEMENT_WITH_TRIGGER wird zunächst mithilfe einer Instanz des Funktionsbausteins SMC_GroupPrepareTrigger ein Bahnschaltpunkt vorbereitet. Die Position wird relativ mit einem Wert von 0.6 angegeben. Somit wird der Bahnschaltpunkt an den Punkt gelegt, an dem 60% der zugewiesenen Bewegung abgeschlossen sind. Der vorbereitete Bahnschaltpunkt wird der nächsten kommandierten Bewegung zugewiesen. In diesem Beispiel ist das eine Linearbewegung zur Position (X=20, Y=10), die mittels eines MC_MoveLinearAbsolute kommandiert wird.

prepTrigger.PositionType := SMC_TriggerPositionType.MvtRelative;
prepTrigger.Position.MvtPosition := 0.6;
prepTrigger(AxisGroup:= AxisGroup, Execute:= TRUE);
 
moveLinear(AxisGroup:= AxisGroup, Execute:= prepTrigger.Prepared);

Im nächsten Zustand STATE_ENABLE_READ_TRIGGER wird eine Instanz von SMC_GroupReadTrigger gestartet, um den Status des kommandierten Bahnschaltpunkts auslesen zu können. Die Verknüpfung zum Bahnschaltpunkt wird über die von SMC_GroupPrepareTrigger zurückgegebene TriggerId hergestellt.

readTrigger.TriggerId := prepTrigger.TriggerId;
readTrigger.Enable := TRUE;

Im Zustand STATE_CHECK_TRIGGER wird schließlich zyklisch der Status des Bahnschaltpunkts überprüft. Sobald SMC_GroupReadTrigger als Status Active meldet, kann die Dauer bis zum Erreichen des Bahnschaltpunkts ausgelesen werden. Die Dauer bezieht sich immer auf den Anfang des aktuellen Zyklus. Der Bahnschaltpunkt wird also im aktuellen Zyklus erreicht, wenn die Dauer kleiner als die Zykluszeit, in diesem Beispiel 0.004 s, ist:

IF readTrigger.TriggerInfo.status = SMC_TRIGGER_STATUS.Active THEN
    IF readTrigger.TriggerInfo.triggerTime <= 0.004 THEN
        triggerFired := TRUE;
        ...
    END_IF
END_IF

Planning_PRG

Im Programm Planning_PRG wird mittels des Funktionsbausteins SMC_TuneCPKernel die Dauer der Vorausschau der Planung konfiguriert. Der Baustein SMC_GroupReadTrigger kann im Rahmen dieser Vorausschau ausgeben, wann ein Bahnschaltpunkt erreicht wird. Im Beispiel wird die Dauer der Vorausschau auf 0.1 s gesetzt. Der Status des Bausteins SMC_GroupReadTrigger wechselt deshalb 0.1 s bevor die Achsgruppe den Bahnschaltpunkt erreicht auf Active und gibt ab dann eine gültige Dauer aus.

tuneCpKernel(AxisGroup:= axisGroup, Execute:= TRUE, fPlanningForecastDuration:= 0.1);

Trace

Mithilfe des Trace kann das Verhalten des Bausteins SMC_GroupReadTrigger nachvollzogen werden.

Im ersten Diagramm ist zu sehen, dass eine Bewegung von (X=0, Y=0) zu (X=20, Y=10) ausgeführt wird. Der Bahnschaltpunkt liegt an der relativen Position 0.6 auf der Bewegung, also bei (X=12, Y=6).

Im zweiten Diagramm wird der Wert des Ausgangs triggerTime von SMC_GroupReadTrigger dargestellt. Der Wert springt auf 0.1 s, weil die Dauer der Vorausschau der Planung 0.1s ist, und fällt dann linear ab, bis an der Position (X=12, Y=6) der Wert 0 erreicht ist.

Im dritten Diagramm ist der Wert der Variablen triggerFired zu sehen, der im Zustand STATE_CHECK_TRIGGER des Main_PRG gesetzt wird, sobald die Achsgruppe noch weniger als 0.004 s vom Bahnschaltpunkt entfernt ist.