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.
Beispiel „Planar-Mover auf Track einkoppeln und mit DynamicsReductionMode verfahren“ 1:
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.
Beispiel „Planar-Mover auf Track einkoppeln und mit DynamicsReductionMode verfahren“ 2:
Anschließend können die Planar-Mover im „MC Project“ mit dem Button Link To PLC… im Reiter Settings verknüpft werden.
Beispiel „Planar-Mover auf Track einkoppeln und mit DynamicsReductionMode verfahren“ 3:
Der Track muss separat über die folgenden Dialogfenster verlinkt werden.
Beispiel „Planar-Mover auf Track einkoppeln und mit DynamicsReductionMode verfahren“ 4:
Beispiel „Planar-Mover auf Track einkoppeln und mit DynamicsReductionMode verfahren“ 5:

Projekt aktivieren und starten

1. Aktivieren Sie die Konfiguration über den Button in der Menüleiste Beispiel „Planar-Mover auf Track einkoppeln und mit DynamicsReductionMode verfahren“ 6:.
2. Versetzen Sie das TwinCAT-System in den Zustand „Run“ über den Button Beispiel „Planar-Mover auf Track einkoppeln und mit DynamicsReductionMode verfahren“ 7:.
3. Loggen Sie die PLC über den Button in der Menüleiste ein Beispiel „Planar-Mover auf Track einkoppeln und mit DynamicsReductionMode verfahren“ 8:.
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“.

Beispiel „Planar-Mover auf Track einkoppeln und mit DynamicsReductionMode verfahren“ 9: