Quantcast
Channel: SPS-Forum - Automatisierung und Elektrotechnik
Viewing all articles
Browse latest Browse all 49625

igus D1 über CANopen - Homing funktioniert - andere Modi nicht

$
0
0
Hallo allerseits,

ich hab eine igus D1 Motorsteuerung an einer Beckhoff CX9020 mit EL6751 als CANopen Master hängen.

igus D1 Handbuch: https://igus.widen.net/content/kda7m...NsgAuKxI81o%3D

Die Kommunikation mit der D1 funktioniert, ich kann alle SDOs auslesen und beschreiben.

Als Start habe ich ein Homing-Programm erstellt:

Mittels Methode werden die SDOs dazu auf der D1 geschrieben und das Homing getriggert:

Code:

METHOD PUBLIC Start_Homing
VAR_INPUT
    Feed_constant_Feed                    : UDINT;        // Vorschub des Antriebs
    Feed_constant_Shaft_revolutions        : UDINT;        // Motorwellendrehzahl
    Switch_Search_VEL                    : UDINT;        // Endlagenschaltersuchgeschwindigkeit
    Zero_Search_VEL                        : UDINT;        // Nullpunktsuchgeschwindigkeit
    Homing_ACC                            : UDINT;        // Beschleunigung/Verzögerung für die Referenzfahrt
END_VAR

IF NOT _Homing.x_inProgress THEN
    //Set parameters for Homing lt D1 Handbuch S 88
    _dict.Feed_constant_Feed_RWW := Feed_constant_Feed;
    _dict.Feed_constant_Shaft_revolutions_RWW := Feed_constant_Shaft_revolutions;
    _dict.Homing_speeds_Speed_during_search_for_switch_RWW := Switch_Search_VEL;
    _dict.Homing_speeds_Speed_during_search_for_zero_RWW := Zero_Search_VEL;
    _dict.Homing_acceleration_RWW := Homing_ACC;
    _dict.Modes_of_operation_RWW := 6;
    //Trigger FB_Homing
    _Homing.x_StartHoming := TRUE;
END_IF

Das Homing selbst habe ich als State-Machine in einem zyklisch (Zykluszeit 1ms) aufgerufenen Funktionsblock abgebildet:

Code:

FUNCTION_BLOCK FB_Homing
VAR_INPUT
    _p_statusword            : POINTER TO _D1_states;            // Pointer zum Statusword (_status    in FB_D1)
    _p_controlword            : POINTER TO _D1_controls;            // Pointer zum Controlword
    CAN_is_inSync            : BOOL;
END_VAR
VAR_OUTPUT
END_VAR
VAR
    state                    : BYTE := 0;
    _x_isHomed                : BOOL;
    _x_StartHoming            : BOOL;
    _x_inProgress            : BOOL;
    _fb_Delay                : TON;                // Verzögerung für 100ms
    _str_Status_User        : STRING;            // User-friendly status messages
    _fb_Toggle                : BLINK;
END_VAR

// External Trigger Homing Action
IF _x_StartHoming AND NOT _x_inProgress THEN
    _x_StartHoming := FALSE;
    _x_isHomed := FALSE;
    _x_inProgress := TRUE;
    state := 1; // Start Homing
END_IF

CASE state OF
   
    0:
        //do nothing - no Homing required
       
    1:
        IF CAN_is_inSync THEN
            state := state + 1;
        END_IF
       
    2:
        // Rücksetzen von delay
        _fb_Delay(IN := FALSE);
        // Starte Homing durch setzen von Controlword bit 4
        _p_controlword^.x_04_Mode_specific := TRUE;
        state := state + 1;
       
    3:
        //Warte für 100 ms.
        _fb_Delay(IN := TRUE, PT := T#100MS);
        IF _fb_Delay.Q THEN
            state := state + 1;
            // Rücksetzen von delay
            _fb_Delay(IN := FALSE);
        END_IF
       
    4:
        //Failsafe: Toggle Bit 4 Controlword um zu starten
        _fb_Toggle(ENABLE := TRUE, TIMELOW := T#50MS, TIMEHIGH := T#50MS);
        _p_controlword^.x_04_Mode_specific := _fb_Toggle.OUT;
        // Überprüfe ob Referenzfahrt im Gange?
        // Lt. D1 Handbuch S 88
        IF    NOT _p_statusword^.x_12_Operation_mode_specific AND
            NOT _p_statusword^.x_10_Target_reached THEN
                _str_Status_User := 'Das Homing wird ausgeführt.';
                state := state + 1;
        END_IF
       
    5:
        //Überprüfe ob Referenzfahrt beendet?
        IF        _p_statusword^.x_12_Operation_mode_specific AND
                _p_statusword^.x_10_Target_reached THEN
                _str_Status_User := 'Das Homing wurde erfolgreich ausgeführt.';
                state := state + 1;
        END_IF
       
    6:
        //Beende Homing process
        _p_controlword^.x_04_Mode_specific := FALSE;
        _x_isHomed := TRUE;
        _x_inProgress := FALSE;
        state := 0; // Reset Statemachine
END_CASE

Wie schon gesagt, das Homing funktioniert!

Was nicht funktioniert, sind alle anderen Modi. Das sind in meinem Fall:

  • Profile Position Mode (absolut und relativ)
  • Profile Velocity Mode


z.B.: für den Profile Position Mode (relativ) habe ich eine ähnliche Routine:

Methode zum Triggern:

Code:

METHOD PUBLIC GoToPosition_Rel
VAR_INPUT
    Feed_constant_Feed                    : UDINT;        // Vorschub des Antriebs
    Feed_constant_Shaft_revolutions        : UDINT;        // Motorwellendrehzahl
    Target_Position                        : DINT;            // Angabe der neuen Zielposition
    Profile_Velocity                    : UDINT;        // Geschwindigkeit
    Profile_Acceleration                : UDINT;        // Beschleunigung
    Profile_Deceleration                : UDINT;        // Verzögerung
END_VAR


//Set parameters for Profile Position Mode lt D1 Handbuch S 89
_dict.Feed_constant_Feed_RWW := Feed_constant_Feed;
_dict.Feed_constant_Shaft_revolutions_RWW := Feed_constant_Shaft_revolutions;
_dict.Target_position_RWW := Target_Position;
_dict.Profile_velocity_RWW := Profile_Velocity;
_dict.Profile_acceleration_RWW := Profile_Acceleration;
_dict.Profile_deceleration_RWW := Profile_Deceleration;
_dict.Modes_of_operation_RWW := 1;
_control.x_06_Mode_specific := TRUE;    // Control Bit 6 true-> Relativpositionierung
//Trigger FB_GoToPos_Abs
_RelPos.x_StartPos := TRUE;

Und FB für die State-Machine:

Code:

FUNCTION_BLOCK FB_GoToPos_Rel
VAR_INPUT
    _p_statusword            : POINTER TO _D1_states;            // Pointer zum Statusword (_status    in FB_D1)
    _p_controlword            : POINTER TO _D1_controls;            // Pointer zum Controlword
    CAN_is_inSync            : BOOL;
END_VAR
VAR_OUTPUT
END_VAR
VAR
    state                        : BYTE := 0;
    _x_StartPos                    : BOOL;
    _x_inProgress                : BOOL;
    _fb_Delay                : TON;                // Verzögerung für 10ms
    _str_Status_User            : STRING;            // User-friendly status messages
    _fb_Toggle                    : BLINK;
END_VAR

// External Trigger Homing Action
IF _x_StartPos AND NOT _x_inProgress THEN
    _x_StartPos := FALSE;
    _x_inProgress := TRUE;
    state := 1; // Start
END_IF

CASE state OF
   
    0:
        //do nothing - no Positioning required
       
    1:
        IF CAN_is_inSync THEN
            state := state + 1;
        END_IF
       
    2:
        //Failsafe: Toggle Bit 4 Controlword um zu starten
        _fb_Toggle(ENABLE := TRUE, TIMELOW := T#50MS, TIMEHIGH := T#50MS);
        _p_controlword^.x_04_Mode_specific := _fb_Toggle.OUT;
       
        IF NOT _p_statusword^.x_10_Target_reached THEN
            //Motor in Bewegung
            state := state + 1;
        END_IF
       
    3:
        //Warte für 100 ms.
        _fb_Delay(IN := TRUE, PT := T#100MS);
        IF _fb_Delay.Q THEN
            state := state + 1;
        END_IF
       
    4:
        // Rücksetzen von delay
        _fb_Delay(IN := FALSE);
        _p_controlword^.x_04_Mode_specific := FALSE;
        IF NOT _p_statusword^.x_10_Target_reached AND _p_statusword^.x_12_Operation_mode_specific THEN
            // Rücksetzen von Startbit
            _str_Status_User := 'Positionierung im Gange.';
        END_IF
        IF _p_statusword^.x_10_Target_reached THEN
            // Ziel erreicht
            _str_Status_User := 'Position erreicht.';
            state := state + 1;
        END_IF
       
    5:
        //Beende Positioning process
        _x_inProgress := FALSE;
        state := 0; // Reset Statemachine

END_CASE

Ich habe mich auf folgenden Ablauf lt. Handbuch für einen Positioniervorgang gehalten (S.89 im D1 Handbuch):
igus HB.jpg

Lt. der Beschreibung sollte nach Setzen des Startbefehls Bit4 das Bit 10 im Statusword (Target reached) auf FALSE gesetzt werden. Das passiert aber nicht. Sehrwohl wird jedoch Bit 12 (New Setpoint) auf TRUE gesetzt.

Das sind die SDOs auf der D1:
SDOs.jpg

Und das ist der Zustand nach setzen von Bit 4 (Startbefehl)
Nach Bit4.jpg

Der Motor dreht sich nicht.

Hat jemand einen Rat, was ich falsch mache?

Danke!

Beste Grüße
LeFish
Angehängte Grafiken

Viewing all articles
Browse latest Browse all 49625


<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>