METHOD RegisterCIPObject : BOOL
This function is needed, to register extra CIP services by the user. The following example is showing how this is done and how to use UnregisterCIPObject, which is also available over ENIPAdapterRegisterObjects.project.
// Called in an IEC task
PROGRAM PLC_PRG
VAR
myObject : GenericCIPObject;
xInit : BOOL;
xUnregister : BOOL;
END_VAR
IF NOT xInit THEN
// this interface to register cip objects should be published
EtherNet_IP_Adapter._cipMessageRouter.Register(myObject);
// this is how it works with CODESYS V3.5.9.0
//EtherNet_IP_Adapter.RegisterCIPObject(myObject);
xInit := TRUE;
END_IF
IF xUnregister THEN
EtherNet_IP_Adapter._cipMessageRouter.Unregister(myObject);
// this is how it works with CODESYS V3.5.9.0
//EtherNet_IP_Adapter.UnregisterCIPObject(myObject);
xUnregister := FALSE;
END_IF
// The FB itself looks like
FUNCTION_BLOCK GenericCIPObject EXTENDS LAT.Element IMPLEMENTS CIP_Object.ICIP2
VAR_INPUT
END_VAR
VAR_OUTPUT
uiValue : UINT;
END_VAR
VAR
_dwInstance : DWORD := 1;
_wClassID : WORD := 16#64;
_strEPath : CIP_Object.UnpackedEPATH := (usiPathSize := 2, wClassValue := _wClassID, dwInstanceValue := _dwInstance);
END_VAR
// ___OBSOLTED___
METHOD Service : CIP_Object.ERROR_CODE
VAR_INPUT
uiServiceCode : UINT;
usiInstanceNumber : USINT;
pby_Data : POINTER TO BYTE;
uiSizeOfData : UINT;
END_VAR
VAR_OUTPUT
pby_ResponseData : POINTER TO BYTE;
uiSizeofResponseData : UINT;
END_VAR
// ___OBSOLTED___
PROPERTY ClassCode : USINT
GET
VAR
END_VAR
ClassCode := to_usint(_wClassID);
// ___OBSOLTED___
PROPERTY EPATH : CIP_Object.LogicalEPATH
GET
VAR
END_VAR
; // empty
// ___OBSOLTED___
PROPERTY InstanceNumber : USINT
GET
VAR
END_VAR
; // empty
// The intresting part
METHOD ServiceRequest : CIP_Object.ERROR_CODE
VAR_INPUT
uiServiceCode : UINT;
dwInstanceID : DWORD;
pData : POINTER TO BYTE;
uiDataSize : UINT;
(* Inputs for response callback *)
pRequest : POINTER TO CIP_ENC.EncapsulationPacket;
itfCallback : CIP_Object.ICIPCallback;
END_VAR
VAR
byteBuffer : MEMUtils.ByteBuffer;
bAttributeSegment : BYTE;
wAttributeID : WORD;
pAttData : POINTER TO BYTE;
uiAttDataSize : UINT;
END_VAR
PROPERTY ClassID : WORD
GET
VAR
END_VAR
ClassID := _wClassID;
PROPERTY InstanceID : DWORD
GET
VAR
END_VAR
InstanceID := _dwInstance;
PROPERTY UnpackedEPATH : CIP_Object.UnpackedEPATH
GET
VAR
END_VAR
UnpackedEPATH := _strEPath;
;
Now you are able to call over the IEC Scanner site over the library EtherNetIPServices the service:
// Called in an IEC task
PROGRAM PLC_PRG
VAR
setAttribute : ENIP.Set_Attribute_Single;
getAttribute : ENIP.Get_Attribute_Single;
uiSetValue : UINT := 16#CAFE;
uiGetValue : UINT;
END_VAR
setAttribute(
xExecute:= ,
xDone=> ,
xBusy=> ,
xError=> ,
itfEtherNetIPDevice:= EtherNetIP_Adapter,
eClass:= 16#64,
dwInstance:= 1,
eError=> ,
pData:= ADR(uiSetValue),
udiDataSize:= SIZEOF(uiSetValue),
wAttribute:= 3);
getAttribute(
xExecute:= ,
xDone=> ,
xBusy=> ,
xError=> ,
itfEtherNetIPDevice:= EtherNetIP_Adapter,
eClass:=16#64 ,
dwInstance:= 1,
eError=> ,
pData:= ADR(uiGetValue),
udiDataSize:= SIZEOF(uiGetValue),
wAttribute:= 3,
udiReceivedDataSize=> );
;
InOut: |
|