The BACnet server from the FAQ BACnet: Cyclic Reading of a Property is used as the server here.

Reduce this one to reading the analog value.




Requirements for the server and client

Check that the following entries are present in the file CODESYSControl.cfg.

  • Integration of the BACnet component:
    [ComponentManager]
    Component.[n+1]=CmpBACnet
  • Integration of the INI file of the BACnet stack (pay attention to the syntax):
    [CmpBACnet]
    IniFile=bacstacd.ini


BACnet client project

  • Create a "Standard project” and select CODESYS Control Win V3 as the device.
  • Define the target system by means of the network scan (see BACnet server).
  • Insert a "BACNet Server" object into the device tree and rename it as "BACnet_Client".

  • Open the Library Manager and add the following libraries:
    CmpBACnet




  • Edit the  PLC_PRG POU as follows:


    Declaration

    VAR
        fbWriteProperty : BACnet.BACnetClientWriteProperty;
        writePropVal    : BACnet.CmpBACnet.IEC_BACNET_REAL := 16.34;
        writePropCont   : BACnet.CmpBACnet.IEC_BACNET_PROPERTY_CONTENTS;
        xWriteExecute   : BOOL;
        writePrio       : CmpBACnet.IEC_BACNET_SIGNED := 16;
        xInitDone       : BOOL := FALSE;
    END_VAR

    Implementation

    IF NOT xInitDone THEN
        fbWriteProperty.RegisterToServer(BACnet_Client);
        fbWriteProperty(dwTargetDeviceNumber := 718,
                        objType := BACnet.CmpBACnet.IEC_BACNET_OBJECT_TYPE.OBJ_ANALOG_VALUE, objInst := 1,
                        propID := BACnet.CmpBACnet.IEC_BACNET_PROPERTY_ID.PROP_PRESENT_VALUE);
        xInitDone := TRUE;    
    ELSE
    	writePropCont.buffer.pBuffer := ADR(writePropVal);
        writePropCont.buffer.nBufferSize := SIZEOF(writePropVal);
        writePropCont.nElements := 1;
        writePropCont.tag := BACnet.CmpBACnet.IEC_BACNET_DATA_TYPE.DATA_TYPE_REAL;
    
        fbWriteProperty(xExecute := xWriteExecute,
                        propertyContents := writePropCont,
                        nWritePriority := writePrio); 
    END_IF


  • Download the project to the controller and set the xWriteExecute variable to TRUE.

    The value is transferred to the server.






    The PresentValue property is written with priorities from 1 to 16, where 16 is the lowest.

    When you write a value with a higher priority to the server, it is retained until it is deleted or overwritten by an even higher priority.

    During the delete operation, the value of the highest set priority is then output as PresentValue.

    A priority is deleted by writing to it with the data type DATA_TYPE_NULL.