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