Function Blocks ¶ Apply_Attributes (FunctionBlock) DataExchange Generic_Service (FunctionBlock) Get_Attribute_List (FunctionBlock) Get_Attribute_Single (FunctionBlock) Get_Attributes_All (FunctionBlock) Set_Attribute_List (FunctionBlock) Set_Attribute_Single (FunctionBlock) Set_Attributes_All (FunctionBlock) NOP (FunctionBlock) Reset (FunctionBlock) Start (FunctionBlock) Stop (FunctionBlock)
Apply_Attributes (FB) ¶ FUNCTION_BLOCK Apply_Attributes EXTENDS BaseService This function block is used for calling the “Apply_Attributes” service of a specific instance of a CIP object. As a result, the attributes that were previously set with “Get_Attribut_Single” or “Get_Attribut_All” are adopted and saved by the adapter. InOut: Scope Name Type Comment Inherited from Input xExecute BOOL Rising edge: Action starts Falling edge: Resets outputs If a falling edge occurs before the function block has completed its action, the outputs operate in the usual manner and are only reset if either the action is completed or in the event of an error. In this case, the corresponding output values ( xDone , xError ) are present at the outputs for exactly one cycle. ETrig Output xDone BOOL TRUE : Action successfully completed ETrig xBusy BOOL TRUE : Function block active ETrig xError BOOL TRUE : Error occurred, function block aborts action FALSE : No error ETrig Input itfEtherNetIPDevice IEtherNetIPService BaseService eClass CIPClass BaseService dwInstance DWORD BaseService tTimeOut TIME BaseService Output eError ERROR BaseService
DataExchange ¶ The byte order of EtherNet/IP is little endian/Intel. It is possible to send any service with this library, but the structure is unknown to the library so you have to swap your received data by yourself on big endian/Motorola platforms. One example would be, if you read a single more than one byte long value: PROGRAM PLC_PRG VAR vendorId : WORD ; getAttributeSingle : ENIP.Get_Attribute_Single ; udiReceivedData : UDINT ; END_VAR getAttributeSingle ( (* Read VendorID, which is 2 byte long *) xExecute := , itfEtherNetIPDevice := EtherNetIP_Adapter , (* instance of the device (instance is found in the I/O Mapping of the device) *) eClass := ENIP.CIPClass.IdentityObject , (* cip class which contains the desired attribute *) dwInstance := 1 , (* value of 0 is class level, range from 1..x is instance level *) wAttribute := 1 , (* attribute no. 6 of the tcp/ip interface object is the Hostname (CIP Spec. Vol.2 Chapter 5-3.3.2.6)*) pData := ADR ( vendorId ), (* data buffer *) udiDataSize := SIZEOF ( vendorId ), (* size of the data buffer *) xDone => , xBusy => , xError => , eError => , udiReceivedDataSize => udiReceivedData ); (* if the request was successful, udiReceivedData contains the number of bytes which have been received *) IF ( getAttributeSingle.xDone ) THEN (*swapping*) SysMem.SysMemSwap ( ADR ( vendorId ), SIZEOF ( vendorID ), 1 ); END_IF You could download this also to an Intel platform without changes, because it will be only swapped on Motorola platforms. Before you set an attribute, swap it once. If you are sending or receiving a whole structure, it´s necessary to swap each element: structure : DUT ; IF ( getAttributeSingle.xDone ) THEN SysMem.SysMemSwap ( ADR ( structure.d1 ), SIZEOF ( structure.d1 ), 1 ); SysMem.SysMemSwap ( ADR ( structure.d2 ), SIZEOF ( structure.d2 ), 1 ); SysMem.SysMemSwap ( ADR ( structure.d3 ), SIZEOF ( structure.d3 ), 1 ); SysMem.SysMemSwap ( ADR ( structure.d4 ), SIZEOF ( structure.d4 ), 1 ); END_IF Generic_Service (FunctionBlock) Get_Attribute_List (FunctionBlock) Get_Attribute_Single (FunctionBlock) Get_Attributes_All (FunctionBlock) Set_Attribute_List (FunctionBlock) Set_Attribute_Single (FunctionBlock) Set_Attributes_All (FunctionBlock)
Generic_Service (FB) ¶ FUNCTION_BLOCK Generic_Service EXTENDS BaseService This function block performs a generic service at an EtherNet/IP Adapter. The message will be sent as an unconnected explicit message request. Note Data received and send needs to be swapped. See parent folder. /// Force trigger to TRUE to activate. /// Example device used here is WAGO 750-352 FC ETHERNET. /// But you can adapt it, by using the services which are implemented by your prefered device. PROGRAM PLC_PRG VAR dut : ENIP.Generic_Service ; data : usint := 16#FF ; trigger : BOOL ; END_VAR dut.xExecute := trigger ; dut.itfEtherNetIPDevice := WAGO_750_352_FC_ETHERNET ; dut.eClass := 100 ; dut.dwInstance := 1 ; dut.wAttribute := 11 ; dut.eService := ENIP.CIPCommonService.SET_ATTRIBUTE_SINGLE ; dut.pWriteData := ADR ( data ); dut.udiWriteDataSize := 1 ; dut (); InOut: Scope Name Type Comment Inherited from Input xExecute BOOL Rising edge: Action starts Falling edge: Resets outputs If a falling edge occurs before the function block has completed its action, the outputs operate in the usual manner and are only reset if either the action is completed or in the event of an error. In this case, the corresponding output values ( xDone , xError ) are present at the outputs for exactly one cycle. ETrig Output xDone BOOL TRUE : Action successfully completed ETrig xBusy BOOL TRUE : Function block active ETrig xError BOOL TRUE : Error occurred, function block aborts action FALSE : No error ETrig Input itfEtherNetIPDevice IEtherNetIPService BaseService eClass CIPClass BaseService dwInstance DWORD BaseService tTimeOut TIME BaseService Output eError ERROR BaseService Input wAttribute WORD Attribute the services is addressed to. Leave 0 if this service does not address an attribute. eService CIPCommonService Choose one of the CIPCommonService members, or insert any vendor specific service code. pWriteData POINTER TO BYTE Data to write to the EtherNet/IP Adapter. Leave 0 if no data should be sent to the EtherNet/IP Adapter. udiWriteDataSize UDINT Size of data to write to the EtherNet/IP Adapter. Leave 0 if no data should be sent to the EtherNet/IP Adapter. pReadData POINTER TO BYTE Data expected to receive from the EtherNet/IP Adapter. Leave 0 if no data is expected to be received from the EtherNet/IP Adapter. udiReadDataSize UDINT Size of data expected to receive from the EtherNet/IP Adapter. Leave 0 if no data is expected to be received from the EtherNet/IP Adapter. Output udiReceivedDataSize UDINT Size of the received data
Get_Attribute_List (FB) ¶ FUNCTION_BLOCK Get_Attribute_List EXTENDS BaseService This function block returns the contents of the selected gettable attributes fo the specified CIP Object class or instance. Note Data received and send needs to be swapped. See parent folder. PROGRAM PLC_PRG VAR arData : ARRAY [0..5] OF BYTE ; getAttributeList : ENIP.Get_Attribute_List ; arResponse : ARRAY [0..11] OF BYTE ; END_VAR getAttributeList ( xExecute := , itfEtherNetIPDevice := EtherNetIP_Adapter , (* instance of the device (instance is found in the I/O Mapping of the device) *) eClass := ENIP.CIPClass.TCPIPInterfaceObject , (* cip class which contains the desired attribute *) dwInstance := 1 , (* value of 0 is class level, range from 1..x is instance level *) pRequestData := ADR ( arData ); (* data buffer *) udiRequestDataSize := SIZEOF ( arData ); (* size of the data buffer *) pResponseData := ADR ( arResponse ); (* data buffer from the response *) udiResponseDataSize := SIZEOF ( arResponse ); (* size of the data buffer from the response *) xDone => , xBusy => , xError => , eError => ); ; InOut: Scope Name Type Comment Inherited from Input xExecute BOOL Rising edge: Action starts Falling edge: Resets outputs If a falling edge occurs before the function block has completed its action, the outputs operate in the usual manner and are only reset if either the action is completed or in the event of an error. In this case, the corresponding output values ( xDone , xError ) are present at the outputs for exactly one cycle. ETrig Output xDone BOOL TRUE : Action successfully completed ETrig xBusy BOOL TRUE : Function block active ETrig xError BOOL TRUE : Error occurred, function block aborts action FALSE : No error ETrig Input itfEtherNetIPDevice IEtherNetIPService BaseService eClass CIPClass BaseService dwInstance DWORD BaseService tTimeOut TIME BaseService Output eError ERROR BaseService Input pRequestData POINTER TO BYTE udiRequestDataSize UDINT pResponseData POINTER TO BYTE udiResponseDataSize UDINT Output udiReceivedDataSize UDINT
Get_Attribute_Single (FB) ¶ FUNCTION_BLOCK Get_Attribute_Single EXTENDS BaseService Use this function block for querying the attribute of a specific instance of a CIP object. Note Data received and send needs to be swapped. See parent folder. (* CIP Data type for string with a length of max. 64 chars *) TYPE STRING64 : STRUCT uiLength : UINT ; sString : STRING ( 63 ); END_STRUCT END_TYPE PROGRAM PLC_PRG VAR strHostnameToGet : STRING64 ; getAttributeSingle : ENIP.Get_Attribute_Single ; udiReceivedData : UDINT ; END_VAR getAttributeSingle ( xExecute := , itfEtherNetIPDevice := EtherNetIP_Adapter , (* instance of the device (instance is found in the I/O Mapping of the device) *) eClass := ENIP.CIPClass.TCPIPInterfaceObject , (* cip class which contains the desired attribute *) dwInstance := 1 , (* value of 0 is class level, range from 1..x is instance level *) wAttribute := 6 , (* attribute no. 6 of the tcp/ip interface object is the Hostname (CIP Spec. Vol.2 Chapter 5-3.3.2.6)*) pData := ADR ( strHostnameToGet ), (* data buffer *) udiDataSize := SIZEOF ( strHostnameToGet ), (* size of the data buffer *) xDone => , xBusy => , xError => , eError => , udiReceivedDataSize => udiReceivedData ); (* if the request was successful, udiReceivedData contains the number of bytes which have been received *) ; InOut: Scope Name Type Comment Inherited from Input xExecute BOOL Rising edge: Action starts Falling edge: Resets outputs If a falling edge occurs before the function block has completed its action, the outputs operate in the usual manner and are only reset if either the action is completed or in the event of an error. In this case, the corresponding output values ( xDone , xError ) are present at the outputs for exactly one cycle. ETrig Output xDone BOOL TRUE : Action successfully completed ETrig xBusy BOOL TRUE : Function block active ETrig xError BOOL TRUE : Error occurred, function block aborts action FALSE : No error ETrig Input itfEtherNetIPDevice IEtherNetIPService BaseService eClass CIPClass BaseService dwInstance DWORD BaseService tTimeOut TIME BaseService Output eError ERROR BaseService Input wAttribute WORD pData POINTER TO BYTE udiDataSize UDINT Output udiReceivedDataSize UDINT
Get_Attributes_All (FB) ¶ FUNCTION_BLOCK Get_Attributes_All EXTENDS BaseService This function block is used for querying the attribute of a specific instance of a CIP object. Note Data received and send needs to be swapped. See parent folder. PROGRAM PLC_PRG VAR data : ARRAY [0..500] OF BYTE ; getAttributeAll : ENIP.Get_Attributes_All ; udiReceivedData : UDINT ; END_VAR getAttributeAll ( xExecute := , itfEtherNetIPDevice := EtherNetIP_Adapter , (* instance of the device (instance is found in the I/O Mapping of the device) *) eClass := ENIP.CIPClass.TCPIPInterfaceObject , (* cip class which contains the desired attribute *) dwInstance := 1 , (* value of 0 is class level, range from 1..x is instance level *) pData := ADR ( data ), (* data buffer *) udiDataSize := SIZEOF ( data ), (* size of the data buffer *) xDone => , xBusy => , xError => , eError => , udiReceivedDataSize => udiReceivedData ); (* if the request was successful, udiReceivedData contains the number of bytes which have been received *) ; InOut: Scope Name Type Comment Inherited from Input xExecute BOOL Rising edge: Action starts Falling edge: Resets outputs If a falling edge occurs before the function block has completed its action, the outputs operate in the usual manner and are only reset if either the action is completed or in the event of an error. In this case, the corresponding output values ( xDone , xError ) are present at the outputs for exactly one cycle. ETrig Output xDone BOOL TRUE : Action successfully completed ETrig xBusy BOOL TRUE : Function block active ETrig xError BOOL TRUE : Error occurred, function block aborts action FALSE : No error ETrig Input itfEtherNetIPDevice IEtherNetIPService BaseService eClass CIPClass BaseService dwInstance DWORD BaseService tTimeOut TIME BaseService Output eError ERROR BaseService Input pData POINTER TO BYTE udiDataSize UDINT Output udiReceivedDataSize UDINT
Set_Attribute_List (FB) ¶ FUNCTION_BLOCK Set_Attribute_List EXTENDS BaseService This function blocks is used for setting the contents of selected attributes of the specified CIP Object class or instance. Note Data received and send needs to be swapped. See parent folder. PROGRAM PLC_PRG VAR arData : ARRAY [0..9] OF BYTE ; setAttributeList : ENIP.Set_Attribute_List ; arResponse : ARRAY [0..9] OF BYTE ; END_VAR setAttributeList ( xExecute := , itfEtherNetIPDevice := EtherNetIP_Adapter , (* instance of the device (instance is found in the I/O Mapping of the device) *) eClass := ENIP.CIPClass.TCPIPInterfaceObject , (* cip class which contains the desired attribute *) dwInstance := 1 , (* value of 0 is class level, range from 1..x is instance level *) pRequestData := ADR ( arData ); (* data buffer *) udiRequestDataSize := SIZEOF ( arData ); (* size of the data buffer *) pResponseData := ADR ( arResponse ); (* data buffer from the response *) udiResponseDataSize := SIZEOF ( arResponse ); (* size of the data buffer from the response *) xDone => , xBusy => , xError => , eError => ); ; InOut: Scope Name Type Comment Inherited from Input xExecute BOOL Rising edge: Action starts Falling edge: Resets outputs If a falling edge occurs before the function block has completed its action, the outputs operate in the usual manner and are only reset if either the action is completed or in the event of an error. In this case, the corresponding output values ( xDone , xError ) are present at the outputs for exactly one cycle. ETrig Output xDone BOOL TRUE : Action successfully completed ETrig xBusy BOOL TRUE : Function block active ETrig xError BOOL TRUE : Error occurred, function block aborts action FALSE : No error ETrig Input itfEtherNetIPDevice IEtherNetIPService BaseService eClass CIPClass BaseService dwInstance DWORD BaseService tTimeOut TIME BaseService Output eError ERROR BaseService Input pRequestData POINTER TO BYTE udiRequestDataSize UDINT pResponseData POINTER TO BYTE udiResponseDataSize UDINT
Set_Attribute_Single (FB) ¶ FUNCTION_BLOCK Set_Attribute_Single EXTENDS BaseService This function block is used for setting the attribute of a specific instance of a CIP object. This instance call sets the host name (of the device in the network) from the DEVICE_123_ETHERNET device as soon as xExecute yields TRUE: Note Data received and send needs to be swapped. See parent folder. (* CIP Data type for string with a length of max. 64 chars *) TYPE STRING64 : STRUCT uiLength : UINT ; sString : STRING ( 63 ); END_STRUCT END_TYPE PROGRAM PLC_PRG VAR setAttributeSingle : ENIP.Set_Attribute_Single ; strHostnameToSet : STRING64 := ( sString := 'NewName' ); END_VAR strHostnameToSet.uiLength := INT_TO_UINT ( Standard.LEN ( strHostnameToSet.sString )); setAttributeSingle ( xExecute := , itfEtherNetIPDevice := EtherNetIP_Adapter , (* instance of the device (instance is found in the I/O Image of the device) *) eClass := ENIP.CIPClass.TCPIPInterfaceObject , (* cip class which contains the desired attribute *) dwInstance := 1 , (* value of 0 is class level, range from 1..x is instance level *) pData := ADR ( strHostnameToSet ), (* data to be assigned to the attribute *) udiDataSize := SIZEOF ( strHostnameToSet.uiLength ) + strHostnameToSet.uiLength , (* size of the data. Here: size of the Length-Parameter PLUS the length of the string *) wAttribute := 6 , (* attribute no. 6 of the tcp/ip interface object is the Hostname (CIP Spec. Vol.2 Chapter 5-3.3.2.6)*) xDone => , xBusy => , xError => , eError => ); ; InOut: Scope Name Type Comment Inherited from Input xExecute BOOL Rising edge: Action starts Falling edge: Resets outputs If a falling edge occurs before the function block has completed its action, the outputs operate in the usual manner and are only reset if either the action is completed or in the event of an error. In this case, the corresponding output values ( xDone , xError ) are present at the outputs for exactly one cycle. ETrig Output xDone BOOL TRUE : Action successfully completed ETrig xBusy BOOL TRUE : Function block active ETrig xError BOOL TRUE : Error occurred, function block aborts action FALSE : No error ETrig Input itfEtherNetIPDevice IEtherNetIPService BaseService eClass CIPClass BaseService dwInstance DWORD BaseService tTimeOut TIME BaseService Output eError ERROR BaseService Input wAttribute WORD pData POINTER TO BYTE udiDataSize UDINT
Set_Attributes_All (FB) ¶ FUNCTION_BLOCK Set_Attributes_All EXTENDS BaseService This function blocks is used for setting the attribute of a specific instance of a CIP object. Note Data received and send needs to be swapped. See parent folder. InOut: Scope Name Type Comment Inherited from Input xExecute BOOL Rising edge: Action starts Falling edge: Resets outputs If a falling edge occurs before the function block has completed its action, the outputs operate in the usual manner and are only reset if either the action is completed or in the event of an error. In this case, the corresponding output values ( xDone , xError ) are present at the outputs for exactly one cycle. ETrig Output xDone BOOL TRUE : Action successfully completed ETrig xBusy BOOL TRUE : Function block active ETrig xError BOOL TRUE : Error occurred, function block aborts action FALSE : No error ETrig Input itfEtherNetIPDevice IEtherNetIPService BaseService eClass CIPClass BaseService dwInstance DWORD BaseService tTimeOut TIME BaseService Output eError ERROR BaseService Input pData POINTER TO BYTE udiDataSize UDINT