Skip to main content

Achsgruppe mit Depictor visualisieren

Für dieses Projekt benötigen Sie zusätzlich das Add-on CODESYS Depictor mit einer gültigen Lizenz.

Die SoftMotion-Anwendung besteht aus 4 rotatorischen Antrieben, die als Achsgruppe konfiguriert sind. Die ersten drei Achsen bewegen den TCP in der XY-Ebene, die vierte Achse in der Z-Ebene.

Das Beispiel zeigt, wie Sie den Depictor mit der kinematischen Konfiguration Kin_Scara3_Z verwenden können. Dasselbe Verfahren können Sie auch für andere kinematische Konfigurationen anpassen.

_sm_img_dep.png

Standardprojekt erstellen

  1. Erstellen Sie ein Standardprojekt mit der Steuerung CODESYS SoftMotion Win und der Programmiersprache ST.

  2. Fügen Sie in der Ansicht POUs einen Biliotheksverwalter hinzu.

  3. Öffnen Sie den Bibliotheksverwalter und fügen Sie die Bibliotheken SM3_Depictor und DepictorBase hinzu.

Achsen hinzufügen und parametrieren

  1. Hängen Sie unterhalb des Objekts SoftMotion General Axis Pool 4 virtuelle Achsen an und benennen Sie die Achsen mit Drive1…Drive4.

  2. Parametrieren Sie die Achsen Drive1, Drive2, Drive3 und Drive4 als Achstyp begrenzt mit Softwareendschalter von -180 Grad und 180 Grad.

    Konfigurationseditor:

    _sm_img_depictor_drives.png

Für weitere Informationen siehe: Virtueller Antrieb

Achsgruppe konfigurieren

  1. Fügen Sie unterhalb der Applikation eine Achsgruppe „KinScara“ hinzu. Wählen Sie dazu den Befehl Projekt → Objekt hinzufügen → Achsgruppe.

  2. Klicken Sie im Konfigurator auf Kinematik wählen. Wählen Sie die Kinematik TRAFO.Kin_Scara3_Z aus.

  3. Legen Sie die Parameter wie folgt fest:

    • dArmLength1, dArmLength2, dArmLength3: 500

    • dOffsetA1, dOffsetA2, dOffsetA3, dOffsetZ: 0

  4. Ordnen Sie die Achsen wie folgt zu:

    • A1: Drive1

    • A2: Drive2

    • A3: Drive3

    • Z: Drive4

    Hinweis: Sie können die Achsen direkt mit der Maus in das Eingabefeld ziehen.

Für weitere Informationen siehe: Kinematiken

Steuerungsprogramm erstellen

  1. Deklarieren Sie im Programm PLC_PRG Instanzen des Funktionsbausteins MC_Power für alle Antriebe. Legen Sie eine Variable istate für die Zustandsmaschine an.

    VAR
     Power_Drive1, Power_Drive2, Power_Drive3, Power_Drive4 : MC_Power;
     istate: INT;
    END_VAR
  2. Definieren Sie in der Implementierung eine Zustandsmaschine.

    CASE istate OF
     0:
     1:
     2:
    END_CASE
  3. Schalten Sie im Zustand 0 alle Antriebe ein.

    0:
     Power_Drive1(Axis:=Drive1, Enable:=TRUE, bRegulatorOn:=TRUE, bDriveStart:=TRUE);
     Power_Drive2(Axis:=Drive2, Enable:=TRUE, bRegulatorOn:=TRUE, bDriveStart:=TRUE);
     Power_Drive3(Axis:=Drive3, Enable:=TRUE, bRegulatorOn:=TRUE, bDriveStart:=TRUE);
     Power_Drive4(Axis:=Drive4, Enable:=TRUE, bRegulatorOn:=TRUE, bDriveStart:=TRUE);
     IF Power_Drive1.Status AND Power_Drive2.Status AND Power_Drive3.Status AND Power_Drive4.Status THEN
      istate:=istate+1;
     END_IF
  4. Wenn die Achsen zugeschaltet sind, geben Sie die Achsgruppe frei (Schalten von „deaktiviert“ auf „standby“).

    VAR
     GroupEnable:MC_GroupEnable;
    END_VAR
    
    1:
     GroupEnable(AxisGroup:=KinScara, Execute:=TRUE);
     IF GroupEnable.Done THEN
      istate:=istate+1;
     END_IF
  5. Deklarieren und Initialisieren Sie eine Variable, um den Sollwert in Maschinenkoordinaten zu speichern. Deklarieren Sie zwei Instanzen des Typs SMC_POS_REF, um den TCP in kartesischen und Achskoordinaten zu darzustellen.

    VAR
     Frame: MC_COORD_REF:=(X:=-120, Y:=-25); // This variable stores the cartesian position & orientation of the TCP
     Pos_Cart: SMC_POS_REF; // This variable represents the position of the TCP in cartesian coordinates coordinates
     Pos_Axis: SMC_POS_REF := (a := axispos);// This variable represents the position of the TCP in Axis coordinates
    END_VAR
    VAR CONSTANT
     axispos: TRAFO.AXISPOS_REF := (a0 := 0, a1 := 100, a2:=60);
    END_VAR
    
    2:
     Pos_Cart.c:= Frame; // To represent the TCP in cartesian coordinates;
  6. Deklarieren Sie eine Instanz von MC_MoveDirectAbsolute, um den Scara-Roboter auf die festgelegten Koordinaten zu bewegen.

    VAR
     MoveAbs:MC_MoveDirectAbsolute; // Moves the TCP to the defined coordinates
    END_VAR
    
    2:
     MoveAbs(AxisGroup:=KinScara, Execute:=TRUE, Position:=Pos_Axis,CoordSystem:=SMC_COORD_SYSTEM.ACS, BufferMode:=MC_BUFFER_MODE.Aborting,); //move to the defined Axis coordinates
     //MoveAbs(AxisGroup:=KinScara, Execute:=TRUE, Position:=Pos_Cart,CoordSystem:=SMC_COORD_SYSTEM.MCS, BufferMode:=MC_BUFFER_MODE.Aborting,); //move to the defined cartesian coordinates
    
     IF MoveAbs.Done THEN
             MoveAbs(AxisGroup:=KinScara, Execute:=FALSE); // Waits for the next new coordinates
       istate:=2;
            END_IF
  7. Deklarieren Sie eine Variable vom Typ SMC_GroupReadSetPosition um den aktuellen Wert des Roboters in kartesischen Koordinaten und Achskoordinaten zu lesen.

    VAR
     Car_pos, Axis_pos :SMC_GroupReadSetPosition; //to read the current axis values
    END_VAR
    
    2:
     Car_pos(AxisGroup:=KinScara, CoordSystem:=SM3_Robotics.SMC_COORD_SYSTEM.MCS, Enable:=TRUE); // to read the current position in cartesian coordinates
     Axis_pos(AxisGroup:=KinScara, CoordSystem:=SM3_Robotics.SMC_COORD_SYSTEM.ACS, Enable:=TRUE); // to read the current axis values

Das gesamte Programm PLC_PRG

Vergleichen Sie Ihr Programm und fügen Sie die fehlenden Programmteile hinzu.

Deklaration

PROGRAM PLC_PRG
VAR
    Power_Drive1, Power_Drive2, Power_Drive3, Power_Drive4 :MC_Power;
    istate: INT;

    GroupEnable:MC_GroupEnable;

    Frame:MC_COORD_REF:=(X:=-120, Y:=-25); // This variable stores the cartesian position & orientation of the TCP
    Pos_Cart:SMC_POS_REF; // This variable represents the position of the TCP in cartesian coordinates coordinates
    Pos_Axis:SMC_POS_REF := (a := axispos);// This variable represents the position of the TCP in Axis coordinates

    MoveAbs:MC_MoveDirectAbsolute; // Moves the TCP to the defined coordinates (PTP)

    Car_pos,Axis_pos :SMC_GroupReadSetPosition; //to read the current position of the TCP in Cartesian and Axis Coordinates and display it on the visu

    scara_Config:trafo.Kin_Scara3_Z_Config; // To set the configuration of the SCARA_3_Z
    kin_Config:SMC_SetKinConfiguration; // To set the defined configuration of SCARA_3_Z to the axis group used
    nPeriod:DINT:=0; // SCARA_3_Z Period
    Xelbow:BOOL:=TRUE;

END_VAR
VAR CONSTANT
    axispos : TRAFO.AXISPOS_REF := (a0 := 0, a1 := 100, a2:=60);
END_VAR

Implementierung

CASE istate OF

0:
 Power_Drive1(Axis:=Drive1, Enable:=TRUE, bRegulatorOn:=TRUE, bDriveStart:=TRUE);
 Power_Drive2(Axis:=Drive2, Enable:=TRUE, bRegulatorOn:=TRUE, bDriveStart:=TRUE);
 Power_Drive3(Axis:=Drive3, Enable:=TRUE, bRegulatorOn:=TRUE, bDriveStart:=TRUE);
 Power_Drive4(Axis:=Drive4, Enable:=TRUE, bRegulatorOn:=TRUE, bDriveStart:=TRUE);

 IF Power_Drive1.Status AND Power_Drive2.Status AND Power_Drive3.Status AND Power_Drive4.Status THEN
  istate:=istate+1;
 END_IF

1:
 GroupEnable(AxisGroup:=KinScara, Execute:=TRUE);

 IF GroupEnable.Done THEN
  istate:=istate+1;
 END_IF

2:
 scara_Config(xElbowRight:=Xelbow, nPeriodA3:=nPeriod);
 kin_Config(AxisGroup:=KinScara,ConfigData:=scara_Config.Config, Execute:=TRUE);
 Pos_Cart.c:=Frame; // To represent the TCP in cartesian coordinates

 Car_pos(AxisGroup:=KinScara, CoordSystem:=SM3_Robotics.SMC_COORD_SYSTEM.MCS, Enable:=TRUE); // read the current position in cartesian coordinates
 Axis_pos(AxisGroup:=KinScara, CoordSystem:=SM3_Robotics.SMC_COORD_SYSTEM.ACS, Enable:=TRUE); // read the current position in Axis coordinates

 MoveAbs(AxisGroup:=KinScara, Execute:=TRUE, Position:=Pos_Axis,CoordSystem:=SMC_COORD_SYSTEM.ACS, BufferMode:=MC_BUFFER_MODE.Aborting,); //move to the defined axis coordinates
 //MoveAbs(AxisGroup:=KinScara, Execute:=TRUE, Position:=Pos_Cart,CoordSystem:=SMC_COORD_SYSTEM.MCS, BufferMode:=MC_BUFFER_MODE.Aborting,); //move to the defined cartesian coordinates

 IF MoveAbs.Done THEN
  MoveAbs(AxisGroup:=KinScara, Execute:=FALSE); // Waits for the next new coordinates
  istate:=2;
 END_IF
END_CASE

Depictorprogramm erstellen

  1. Fügen Sie unterhalb der Applikation eine neue POU „Depic“ vom Typ „Programm“ hinzu. Wählen Sie dazu den Befehl Projekt → Objekt hinzufügen → POU.

  2. Deklarieren Sie eine Variable vom Typ SM3_Depictor.SMC_R_Scara3_Z_Data. Deklarieren Sie eine Variable LrSize vom Typ LREAL und initialisieren Sie die Variable mit dem Wert 100.

    VAR
     ScaraTrafo : SM3_Depictor.SMC_R_Scara3_Z_Data;
     LrSize:LREAL:=100;
    END_VAR
  3. Fügen Sie in der Implementierung einen Aufruf des Funktionsbausteins ein.

    ScaraTrafo(AxisGroup:=KinScara, trf:=KinScara.trafo);
  4. Fügen Sie die POU „Depic“ zur Task MainTask hinzu.

Depictor konfigurieren

  1. Fügen Sie unterhalb der Applikation ein Objekt „Depictor“ hinzu. Wählen Sie dazu den Befehl Projekt → Objekt hinzufügen → Depictor.

  2. Doppelklicken Sie auf das Objekt.

  3. Selektieren Sie im Depictor-Baum das Element Pose.

  4. Wählen Sie den Befehl Depictor → Element hinzufügen.

    Das Element Box wird unterhalb der Pose hinzugefügt.

  5. Wählen Sie in den Eigenschaften des Elements die Option Depictor Ref.

  6. Klicken Sie auf die Schaltfläche _cds_icon_three_dots.png.

  7. Wählen Sie aus der Bibliothek SM3_Depictor das Objekt SMC_R_Depictor_Scara3_Z.

  8. Definieren Sie die Schnittstellenvariablen wie folgt:

    • fb: Depic.ScaraTrafo

    • lrZ_: Drive1.fSetPosition

    • lrZmin: 10

    • lrZmax: -50

    • lrSize: Depic.LrSize

    • xShowPlane: 0

Visualisierung erstellen

Erstellen Sie eine Visualisierungsseite, in der die kartesischen Koordinaten und die Achskoordinaten angezeigt und verändert werden können.

_sm_img_depictor_visu.png
  1. Fügen Sie unterhalb der Applikation ein Objekt „Visualisierung“ hinzu. Wählen Sie dazu den Befehl Projekt → Objekt hinzufügen → Visualisierung .

  2. Öffnen Sie die Visualisierung im Editor.

  3. Fügen Sie ein Visualisierungselement Rechteck (1) ein.

  4. Ändern Sie die Eigenschaften des Elements.

    • Texte → Text: %s

    • Textvariablen → Textvariable: PLC_PRG.Car_pos.Position.c.X

    • Eingabekonfiguration → OnMouseDown → Variable schreiben

      • Eingabetyp: VisuDialogs.Numpad

      • Andere Variable verwenden: PLC_PRG.Frame.X

  5. Fügen Sie die anderen Visualisierungselemente Rechteck ein.

  6. Ändern Sie die Eigenschaften der Element (2) und (3).

    • Texte → Text: %s

    • Textvariablen → Textvariable: PLC_PRG.Car_pos.Position.c.Y bzw. PLC_PRG.Car_pos.Position.c.Z

    • Eingabekonfiguration → OnMouseDown → Variable schreiben

      • Eingabetyp: VisuDialogs.Numpad

      • Andere Variable verwenden: PLC_PRG.Frame.Y bzw. PLC_PRG.Frame.Z

  7. Ändern Sie die Eigenschaften der Element (4), (5) und (6).

    • Texte → Text: %s

    • Textvariablen → Textvariable: PLC_PRG.Frame.A bzw. PLC_PRG.Frame.B bzw. PLC_PRG.Frame.C

  8. Ändern Sie die Eigenschaften der Element (7), (8), (9) und (10).

    • Texte → Text: %s

    • Textvariablen → Textvariable: PLC_PRG.Axis_pos.Position.a.a0 bzw. PLC_PRG.Axis_pos.Position.a.a1 bzw. PLC_PRG.Axis_pos.Position.a.a2 bzw. PLC_PRG.Axis_pos.Position.a.a3

    • Eingabekonfiguration → OnMouseDown → Variable schreiben

      • Eingabetyp: VisuDialogs.Numpad

      • Andere Variable verwenden: PLC_PRG.Pos_Axis.a.a0 bzw. PLC_PRG.Pos_Axis.a.a1 bzw. PLC_PRG.Pos_Axis.a.a2 bzw. PLC_PRG.Pos_Axis.a.a3

  9. Beschriften Sie die Visualisierungselemente mit dem Element Beschriftung.

Programm starten und testen

Über die Visualisierung des Projekts können Sie die Achswerte verändern. Wenn Sie im Programm PLC_PRG den aktiven Bewegungsbefehl (MoveAbs...) auskommentieren und die Kommentare des zweiten Bewegungsbefehls entfernen, können Sie die kartesischen Koordinaten verändern.

  1. Übersetzen Sie das Projekt und laden Sie es auf die Steuerung.

  2. Öffnen Sie den Editor des Depictor-Objekts Ihres Projekts.

  3. Wechseln Sie zur Visualisierung und Ändern Sie die Achswerte oder die kartesischen Werte. Beobachten Sie die Bewegung des Scara-Roboters im Depictor.