Beispiel „Planar-Mover auf Track einkoppeln und mit DynamicsReductionMode verfahren“
Anhand dieser Anleitung werden Sie ein TwinCAT-Projekt anlegen, das einen Planar-Mover sowie einen Planar-Track mit einer Kurve enthält. Der Mover wird auf dem Track eingekoppelt und mit der Option „AccelerationLimitedVelocity“ des DynamicsReductionMode verfahren.
Planar-Mover anlegen
- Siehe Konfiguration.
- 1. Legen Sie einen Planar-Mover an.
- 2. Versetzen Sie „Parameter (Init)“ in den Simulationsmodus (TRUE). Der Parameter ist versteckt und wird nur sichtbar, wenn die Checkbox „Show Hidden Parameters“ aktiviert ist.
Planar-Track anlegen
- 3. Fügen Sie den Planar-Track über Groups > Add New Item… hinzu, siehe Konfiguration.
PLC anlegen
- Siehe Vorabschritte PLC anlegen.
- 1. Legen Sie über MAIN die gewünschte Anzahl an Movern („MC_PlanarMover“) und Tracks („MC_PlanarTrack“) an.
- Diese repräsentieren Mover und Tracks in der MC Configuration.

- 2. Legen Sie, wie nachfolgend gezeigt, einen Planar-Mover, einen Planar-Track, eine Zustandsvariable für eine Zustandsmaschine sowie zwei Hilfspositionen und eine Variable für den approximativen Kurvenradius des Tracks an.
Deklarieren Sie ein Feedback, um den Befehlsverlauf überwachen zu können und eine Optionsvariable, um den DynamicsReductionMode anzupassen.
Zudem legen Sie noch drei Hilfsvariablen an, um die benötigte Zeit zu messen und eine Hilfsvariable, um die maximale Geschwindigkeit in der Kurve zu überprüfen.
PROGRAM MAIN
VAR
mover : MC_PlanarMover;
track : MC_PlanarTrack;
state : UDINT := 0;
pos1, pos2 : PositionXYC;
approx_radius : LREAL := 10;
feedback : MC_PlanarFeedback;
options : ST_MoveOnTrackOptions;
max_velo_in_curve : LREAL := 0;
start_time, end_time, elapsed_time : TIME;
max_radial_acc : MC.DynamicLimits1D;
write_radial_limit : ADSWRITE;
END_VAR
- 3. Programmieren Sie anschließend in der MAIN einen Ablauf.
- Dieser Programmcode erstellt und aktiviert einen Track und beide Mover. Danach werden beide Mover auf dem Track eingekoppelt und verfahren.
CASE state OF
0:
pos1.SetValuesXY(0, 0);
pos2.SetValuesXY(400, 0);
track.AppendLine(0, pos1, pos2);
pos1.SetValuesXY(400 + approx_radius, approx_radius);
pos2.SetValuesXY(400 + approx_radius, 400 + approx_radius);
track.AppendLine(0, pos1, pos2);
track.Enable(0);
state := state + 1;
1:
IF track.MCTOPLC_STD.State = MC_PLANAR_STATE.Enabled THEN
state := state + 1;
END_IF
2:
max_radial_acc.V := MC_INVALID;
max_radial_acc.A := 200;
max_radial_acc.D := MC_INVALID;
max_radial_acc.J := MC_INVALID;
write_radial_limit(WRITE := FALSE);
state := state + 1;
3:
write_radial_limit(
PORT := 521,
IDXGRP := 16#05110010,
IDXOFFS := 16#05030188,
LEN := SIZEOF(max_radial_acc),
SRCADDR := ADR(max_radial_acc),
WRITE := TRUE);
IF NOT write_radial_limit.BUSY THEN
state := state + 1;
END_IF
4:
write_radial_limit(WRITE := FALSE);
state := state + 1;
5:
write_radial_limit(
PORT := 521,
IDXGRP := 16#05110010,
IDXOFFS := 16#05030189,
LEN := SIZEOF(max_radial_acc),
SRCADDR := ADR(max_radial_acc),
WRITE := TRUE);
IF NOT write_radial_limit.BUSY THEN
state := state + 1;
END_IF
6:
mover.Enable(0);
state := state + 1;
7:
mover.Enable(0);
state := state + 1;
8:
IF mover.MCTOPLC.STD.State = MC_PLANAR_STATE.Enabled THEN
state := state + 1;
END_IF
9:
mover.JoinTrack(0, track, 0, 0);
state := state + 1;
10:
IF mover.MCTOPLC.STD.CommandMode = MC_PLANAR_MOVER_COMMAND_MODE.OnTrack THEN
state := state + 1;
END_IF
11:
options.dynamicMode := MC.MC_DYNAMICS_REDUCTION_MODE.AccelerationLimitedVelocity;
mover.MoveOnTrack(feedback, 0, track.GetLength(), 0, options);
start_time := TIME();
state := state + 1;
12:
IF mover.MCTOPLC.SETONTRACK.SetPos >= 400.0
AND mover.MCTOPLC.SETONTRACK.SetPos <= 400.0 + PI*approx_radius/2
AND mover.MCTOPLC.SETONTRACK.SetVelo > max_velo_in_curve THEN
max_velo_in_curve := mover.MCTOPLC.SETONTRACK.SetVelo;
END_IF
IF mover.MCTOPLC.SETONTRACK.SetPos >= track.GetLength()-1.0
AND NOT mover.MCTOPLC.STD.Busy.busyMover THEN
state := state + 1;
END_IF
13:
end_time := TIME();
elapsed_time := end_time - start_time;
state := state + 1;
END_CASE
Befehl abschicken
- 4. Um den Befehl abzuschicken, müssen Sie die Mover und den Track nach dem END_CASE zyklisch mit ihrer Update-Methode aufrufen:
mover.Update();
track.Update();
feedback.Update();
Durch das Bauen der PLC werden Symbole des „PLC-Movers" und „-Tracks“ erzeugt, welche anschließend mit der Mover- bzw. Track-Instanz im MC-Projekt verknüpft werden können.
- 1. Verwenden Sie zum Bauen den Pfad PLC > Untitled1 > Untitled1 Project > Build.
- Anschließend können die Planar-Mover im „MC Project“ mit dem Button Link To PLC… im Reiter Settings verknüpft werden.
- Der Track muss separat über die folgenden Dialogfenster verlinkt werden.




Projekt aktivieren und starten
- 1. Aktivieren Sie die Konfiguration über den Button in der Menüleiste
.
- 2. Versetzen Sie das TwinCAT-System in den Zustand „Run“ über den Button
.
- 3. Loggen Sie die PLC über den Button in der Menüleiste ein
.
- 4. Starten Sie die PLC über den Play-Button in der Menüleiste.
In diesem Beispiel wird ein Track erstellt, der eine Kurve enthält, die durch den approximierten Radius „approx_radius“ parametrisiert wird. Der Mover bewegt sich entlang dieses Tracks, wobei die Dynamik auf eine Geschwindigkeit begrenzt wird, die sicherstellt, dass die maximale radiale Beschleunigung nicht überschritten wird.
Diese maximale radiale Beschleunigung „max_radial_acc“ wird in der Mover-Konfiguration über die „A“ Beschleunigungswerte der Parameter „Maximum Dynamic X/Y“ eingestell. Beide Werte müssen hierbei gleich sein, sonst wird das Kommando abgelehnt. Die Parameter können, wie im obigen Beispiel, mithilfe von ADSWRITE geschrieben werden.
Wie bisher wird die Tangentialbeschleunigung „max_total_acc“ direkt am Bewegungsbefehl parametriert. Aus den vorgegebenen maximalen Radial- und Tangentialbeschleunigungen ergibt sich die maximal Gesamtbeschleunigung „max_total_acc“. Diese kann größer sein als jede der beiden einzelnen Beschleunigungen.
Im Beispiel wird während der Bewegung die Höchstgeschwindigkeit innerhalb der Kurve überwacht und gespeichert. Sobald der Mover das Ende des Tracks erreicht, wird die verstrichene Zeit gemessen.
Änderungen an den Parametern für die radiale Beschleunigung „Maximum dynamic X/ Maximum dynamic Y“, des approximierten Kurvenradius „approx_radius“ und dem „DynamicsReductionMode“ beeinflussen sowohl die benötigte Zeit „elapsed_time“ für die Bewegung entlang des Tracks als auch die maximale Geschwindigkeit in der Kurve „max_velo_in_curve“.
