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:
Das Homing selbst habe ich als State-Machine in einem zyklisch (Zykluszeit 1ms) aufgerufenen Funktionsblock abgebildet:
Wie schon gesagt, das Homing funktioniert!
Was nicht funktioniert, sind alle anderen Modi. Das sind in meinem Fall:
z.B.: für den Profile Position Mode (relativ) habe ich eine ähnliche Routine:
Methode zum Triggern:
Und FB für die State-Machine:
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
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
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
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;
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
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