AC500 Modbus RTU control of ACS880-01 through EFB
I am programming AC500 (Codesys 2.3) to control ACS880-01 drive through embedded fieldbus interface using Modbus RTU protocol.
ACSDrives libraries have standard function blocks for Modbus RTU communication and control, but FB description doesn’t match with the current version of ACS880 primary control program firmware manual.
Drive specific: ACS_COM_MOD_RTU + ACS_DRIVES_CTRL_STANDARD
Generic: ACS_COM_MOD_RTU_GEN + ACS_COM_MOD_RTU_GEN_READ_N_PRM.. + ACS_DRIVES_CTRL_STANDARD_GEN
Can I use drive specific libraries or do I have to use generic device libraries? Or what is the best way to create the communication?
You can use the drive libraries, but I don't on my projects.
There is a lot to the drive communications. First down load this LVD-PNTG03U-EN REVD (just Google it) the ACS880 is very close to the ACS800 the Modbus card is differnt.
I just send and recive my Modbus words using a Red Lion touch screen as my bridge from the ABB PLC to the ABB Drive.
The following is the ST in the ABB PLC that does a lot of the work for me.
Status_word_D1 := %MW0.26;(* Read the Drive Status word from D1 *)
CASE Ctrl_D1 OF
10: Control_D1 := 1151;(* Send Run command to the ACS880 *)
15: Control_D1 := 1166;(* Send Reset Fault command to the ACS880 *)
20: Control_D1 := 1152;(* Send Reset Fault command to the ACS880 *)
25: Control_D1 := 1149;(* Send Emergency Coast Stop command to the ACS880 *)
30: Control_D1 := 1147;(* Send Emergency Ramp Stop command to the ACS880 *)
35: Control_D1 := 1143;(* Send Inhibit Operation command to the ACS880 *)
ELSE Control_D1 := 1150;(* Send Normal Stop command to the ACS880 *)
IF Ctrl_D1 = 10 AND Run_D1 = FALSE OR Status_word_D1.0 = FALSE(* Send a stop command when Drive Run goes OFF *)
THEN Ctrl_D1 := 0;
IF Ctrl_D1 = 20 AND Status_word_D1.3 = FALSE(* Remove the Drive Reset when the drive Fault is clear *)
THEN Ctrl_D1 := 0;
IF Status_word_D1 = 4608
THEN Control_D1 := 1166;(* If drive is Not Ready send a Reset *)
IF Rev_D1 = TRUE
THEN Spd_Ref_D1 := (Spd_Out * -1); (* Send a Negative speed ref to go Reverse *)
ELSE Spd_Ref_D1 := Spd_Out;
IF Comm_Clock = TRUE
THEN Speed_Ref_D1 := (Speed_Ref1 - 1); (* Constainly changing speed Ref to prevent Comm fault *)
ELSE Speed_Ref_D1 := Speed_Ref1;
Forgive me for not sharing more, I can't give away all my code.