ServoDrive_over_Ethercat ¶ Function blocks for SoE (Servodrive over EtherCAT) Example: ServoDrive over EtherCAT This example shows how to read and write IDN’s with ServoDrive over EtherCAT. As hardware a Rexroth IndraDrive is used. It is also possible to switch the device to another one which uses ServoDrive over EtherCAT. Several startup parameters can be set as device configuration. These parameters are called IDN’s for devices using ServoDrive over EtherCAT. For each IDN the name, attribute, unit, minimum, maximum and value can be set as number or byte array with a maximum of four bytes. PROGRAM SoE VAR iState : INT ; (* state variable *) Read : ETC_SoE_IDNRead ; (* Instance to read an IDN. *) Read4 : ETC_SoE_IDNRead4 ; (* Instance to read an IDN with a maximum of 4 bytes. *) Write : ETC_SoE_IDNWrite ; (* Instance to write an IDN. *) Write4 : ETC_SoE_IDNWrite4 ; (* Instance to write an IDN with a maximum of 4 bytes. *) Command : ETC_SoE_Cmd ; udiRead : UDINT ; (* The read value of the IDN. *) uiWrite : UINT ; (* The value to be written to the IDN. *) uiReadWritten : UINT ; (* The read value of the IDN, written in the step before. *) abyRead : ARRAY [1..4] OF BYTE ; (* Read EtherCAT IDN value *) abyWrite : ARRAY [1..4] OF BYTE := [8, 9, 0, 0] ; (* Write a value with a maximum of 4 bytes. *) END_VAR (* Global instance of the IoDrvEtherCAT function block.*) EtherCAT_Master (); CASE iState OF 0 : (* Wait for the EtherCAT to be ready. *) IF Ethercat_Master.xConfigFinished THEN iState := iState + 1 ; END_IF 1 : (* Read the IDN with the number 32. The value at byElem indicates that the value of the IDN is written. Other numbers are possible. Have a look at the "IODrvEtherCAT" lib under "ServoDrive_o_Ethercat". The device address is 1001 (Look at the device under the "Slave" tab).usiCom = 1, because the first master is used. A buffer is set, to where the value will be written*) Read ( xExecute := TRUE , usiCom := 1 , uiDevice := 1001 , wIDN := 32 , byElem := 7 , udiTimeOut := 1000 , pBuffer := ADR ( udiRead ), szSize := SIZEOF ( udiRead )); (* When the value is read without an error, go to the next step. *) IF Read.xDone THEN iState := iState + 1 ; Read ( xExecute := FALSE ); ELSIF Read.xError THEN iState := 32767 ; END_IF 2 : (* Write a IDN with number 33 and the value 11 at the same device. *) uiWrite := 11 ; Write ( xExecute := TRUE , usiCom := 1 , uiDevice := 1001 , wIDN := 33 , byElem := 7 , pBuffer := ADR ( uiWrite ), szSize := SIZEOF ( uiWrite ), udiTimeOut := 1000 ); (* When the value is written without an error, go TO the next step. *) IF Write.xDone THEN iState := iState + 1 ; Write ( xExecute := FALSE ); ELSIF Write.xError THEN iState := 32767 ; END_IF 3 : (* Read the IDN number 33, which was written in the step before. *) Read ( xExecute := TRUE , usiCom := 1 , uiDevice := 1001 , wIDN := 33 , byElem := 7 , pBuffer := ADR ( uiReadWritten ), szSize := SIZEOF ( uiReadWritten ), udiTimeOut := 1000 ); IF Read.xDone THEN iState := iState + 1 ; Read ( xExecute := FALSE ); ELSIF Read.xError THEN iState := 32767 ; END_IF 4 : (* Write a IDN with number 34 from an array to the device. *) Write4 ( xExecute := TRUE , usiCom := 1 , uiDevice := 1001 , wIDN := 34 , byElem := 7 , abyData := abyWrite , usiDataLength := 2 , udiTimeOut := 1000 ); IF Write4.xDone THEN iState := iState + 1 ; Write4 ( xExecute := FALSE ); ELSIF Write4.xError THEN iState := 32767 ; END_IF 5 : (* Read the IDN number 34, which was written in the step before. *) Read4 ( xExecute := TRUE , usiCom := 1 , uiDevice := 1001 , wIDN := 34 , byElem := 7 , udiTimeOut := 1000 ); IF Read4.xDone THEN abyRead := Read4.abyData ; iState := iState + 1 ; Read4 ( xExecute := FALSE ); ELSIF Read4.xError THEN iState := 32767 ; END_IF 32767 : (* error *) ; END_CASE ENUMS ETC_SOE_ERROR (Enum) ETC_SoE_Cmd (FunctionBlock) ETC_SoE_IDNRead (FunctionBlock) ETC_SoE_IDNRead4 (FunctionBlock) ETC_SoE_IDNWrite (FunctionBlock) ETC_SoE_IDNWrite4 (FunctionBlock)