IoDrvEtherNetIPAdapter.RegisterCIPObject (METH)

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

// ___OBSOLETE___
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

// ___OBSOLETE___
PROPERTY ClassCode : USINT
    GET
        VAR
        END_VAR
        ClassCode := to_usint(_wClassID);

// ___OBSOLETE___
PROPERTY EPATH : CIP_Object.LogicalEPATH
    GET
        VAR
        END_VAR
        ; // empty

// ___OBSOLETE___
PROPERTY InstanceNumber : USINT
    GET
        VAR
        END_VAR
        ; // empty

// The interesting 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 via the IEC Scanner side (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:

Scope

Name

Type

Return

RegisterCIPObject

BOOL

Input

itfCIP

CIP_Object.ICIP2