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

// ___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:

Scope

Name

Type

Return

RegisterCIPObject

BOOL

Input

itfCIP

CIP_Object.ICIP2