Example - Manual - SIMATIC AX - Instructions that can be used for Modbus-RTU communication. - Siemens.Simatic.S71500.CommunicationsProcessor.ModbusRtu,library

Siemens.Simatic.S71500.CommunicationsProcessor.ModbusRtu library

Portfolio
SIMATIC AX
Product
SIMATIC AX
Software version
1.0.2
Edition
11/2024
Language
English (original)
Package Name
@ax/simatic-1500-modbusrtu

configuration.st

CONFIGURATION MyConfiguration
    TASK Main (INTERVAL := T#100ms, PRIORITY := 1);
    PROGRAM P1 WITH Main : ModbusProgram;
    VAR_GLOBAL
        sendReq : BOOL;
        modBuffer : ARRAY[0..40] OF BYTE;
        hreg : ARRAY[0..7] OF BYTE := [BYTE#16#0A, BYTE#16#0B, BYTE#16#0C, BYTE#16#0D, BYTE#16#0E, BYTE#16#0F, BYTE#16#1A, BYTE#16#1B];
    END_VAR
END_CONFIGURATION

program.st

USING Siemens.Simatic.S71500.CommunicationsProcessor.ModbusRtu;

PROGRAM ModbusProgram
    VAR_EXTERNAL
        sendReq : BOOL;
        modBuffer : ARRAY[0..40] OF BYTE;
        hreg : array[0..7] of BYTE;
    END_VAR
    VAR
        previousSendReq : BOOL;
        positiveEdgeSendReq : BOOL;
        isMaster : BOOL := TRUE;
        isLoaded : BOOL;
        modbusData : P2P_MB_BASE;
        modbusCommLoad : ModbusCommonLoad;
        modbusMaster : ModbusMaster;
        modbusSlave : ModbusSlave;
        loadData : ModbusLoadData := (port := WORD#16#115, baud := UDINT#19200);
        masterReqData : ModbusMasterReqData;
        masterData : ModbusMasterData;
        readHr  : ModbusMasterReqData := (stationAddress := UINT#3, MODE := USINT#0, startingAddress := UDINT#40001, dataLength := UINT#2);
        slaveData : ModbusSlaveData;
    END_VAR

    positiveEdgeSendReq := NOT previousSendReq AND sendReq;
    previousSendReq := sendReq;

    loadData.request := true;
    modbusCommLoad(
        request := loadData.request,
        port := loadData.PORT,
        baud := loadData.baud,
        parity := loadData.parity,
        flowControl := loadData.flowControl,
        rtsOnDelay := loadData.rtsOnDelay,
        rtsOffDelay := loadData.rtsOffDelay,
        responseTimeout := loadData.responseTimeout,
        MB_DB := modbusData,
        done => loadData.done,
        error => loadData.error,
        status => loadData.status
    );

    IF loadData.DONE THEN
        isLoaded := TRUE;
        loadData.request := FALSE;
    END_IF;
    IF loadData.ERROR THEN
        isLoaded := FALSE;
    END_IF;

    IF isLoaded THEN
        IF isMaster THEN
            masterReqData := readHr;
            modbusMaster.MB_DB := modbusData;
            modbusMaster(
                request := positiveEdgeSendReq,
                stationAddress := masterReqData.stationAddress,
                mode := masterReqData.MODE,
                startingAddress := masterReqData.startingAddress,
                dataLength := masterReqData.dataLength,
                buffer := modBuffer,
                done => masterData.done,
                busy => masterData.busy,
                error => masterData.error,
                status => masterData.status
            );
        ELSE
            modbusSlave.MB_DB := modbusData;
            modbusSlave(
                stationAddress := slaveData.stationAddress,
                holdingRegister := hreg,
                NDR => slaveData.NDR,
                DR => slaveData.DR,
                error => slaveData.error,
                status => slaveData.status
            );
            slaveData.requestCount := modbusSlave.Request_Count;
        END_IF;
    END_IF;
END_PROGRAM

TYPE
    ModbusLoadData : STRUCT
        request : BOOL;
        port : Word := WORD#16#115;
        baud : UDInt := UDInt#19200;
        parity : UInt := UINT#0;
        flowControl : UInt := UINT#0;
        rtsOnDelay : UInt := UINT#0;
        rtsOffDelay : UInt := UINT#0;
        responseTimeout : UInt := UINT#1000;
        done : BOOL;
        error : BOOL;
        status : WORD := WORD#16#7000;
    END_STRUCT;
END_TYPE

TYPE
    ModbusMasterReqData : STRUCT
        stationAddress : UINT := UINT#0;
        mode : USINT := USINT#0;
        startingAddress : UDINT := UDINT#40001;
        dataLength : UINT := UINT#2;
    END_STRUCT;
END_TYPE

TYPE
    ModbusMasterData : STRUCT
        done : BOOL;
        busy : BOOL;
        error : BOOL;
        status : WORD := WORD#16#7000;
    END_STRUCT;
END_TYPE

TYPE
    ModbusSlaveData : STRUCT
        enable : BOOL;
        stationAddress : UINT := UINT#5;
        NDR : BOOL;
        DR : BOOL;
        error : BOOL;
        status : WORD := WORD#16#7000;
        requestCount: UINT;
    END_STRUCT;
END_TYPE