PROGRAM modbusRtu
VAR
v:usint;
xInitOk:bool:=0;                               (*MODBUS-RTU从站初始化功能块的错误信息*)
xDONE:bool;                                    (*MODBUS-RTU从站初始化完成标志*)                                  
xERROR:usint;                                  (*MODBUS从站功能块的错误信息*)

inst3_MODBUS_SLAVE_INIT:MODBUS_SLAVE_INIT;     (*MODBUS-RTU从站初始化功能块*)
inst4_MODBUS_SLAVE_CTRL:MODBUS_SLAVE_CTRL;     (*MODBUS-RTU从站执行功能块*)  

modbusDIBuf : ARRAY[0..50] OF byte;             (*用于存放只读型离散输入数据的数组*)
DI_Ptr : POINTER;                              (*数组指针*)

modbusDOBuf : ARRAY[0..50] OF byte;             (*用于存放读写线圈数据的数组*)
DO_Ptr : POINTER;                              (*数组指针*)

modbusAIBuf : ARRAY[0..100] OF Uint;             (*用于存放只读型输入寄存器数据的数组*)
AI_Ptr : POINTER;                              (*数组指针*)

modbusAOBuf : ARRAY[0..100] OF Uint;            (*用于存放读写型保持寄存器数据的数组*)
AO_Ptr : POINTER;                              (*数组指针*)
    AI1: UINT;
	AI2: UINT;
	AI4: UINT;
	AI3: UINT;
	reg1: UINT;
	reg2: UINT;
	reg3: UINT;
	reg4: UINT;

	first2008 AT%Q0.0: BYTE;
	first1008 AT%I0.0: BYTE;

END_VAR

(*本示例程序演示了如何创建MODBUS-RTU从站*)




if xInitOk=false then                (*如果未初始化*)

	inst3_MODBUS_SLAVE_INIT(         (*启动MODBUS从站初始化功能块*)
		ENABLE :=1 , 
		MODE :=1 , 
		ADDRESS :=1 ,                (*定义MODBUS从站地址*) 
		PORT :=2 ,                   (*使用的串口形式，1为RS232,2为RS485*)
		BAUD :=115200,               (*串口波特率为115200*)
		DATABITS :=8 ,               (*数据位为8*)
		PARITY :=0 ,                 (*无奇偶校验*)
		STOPBITS :=1                 (*停止位为1*)
		| v := ERROR);               (*初始化功能块的错误信息*)
 
	if v=0 then                      (*如果初始化过程未发生错误*)
		xInitOk :=1;                 (*置位初始化完成标志，不再初始化*)
	end_if;
	
end_if;

if xInitOk then                      (*如果初始化完成*)

    DI_Ptr:=&modbusDIBuf;            (*指针指向DI数组*)
	DO_Ptr:=&modbusDOBuf;            (*指针指向DO数组*)
	AI_Ptr:=&modbusAIBuf;            (*指针指向AI数组*)
	AO_Ptr:=&modbusAOBuf;            (*指针指向AO数组*)
		
     inst4_MODBUS_SLAVE_CTRL(        (*MODBUS从站执行功能块*)
	     EN_IN :=1 ,
		 PORT :=1,                   (*使用的串口形式，1为RS232,2为RS485*)
		 
		 DO_ENABLE :=1 ,             (*线圈读写使能*)
		 DO_PTR :=DO_Ptr ,           (*线圈数组指针*)
		 DO_LENGTH :=20 ,             (*线圈数组长度*)
		  
		 DI_ENABLE :=1 ,             (*离散型数据只读使能*)
		 DI_PTR :=DI_Ptr ,           (*离散型数据数组指针*)
		 DI_LENGTH :=20 ,             (*离散型数据数组长度*)
		 
		 AI_ENABLE :=1 ,             (*输入型寄存器数据只读使能*)
		 AI_PTR :=AI_Ptr ,           (*输入型寄存器数据数组指针*)
		 AI_LENGTH :=50 ,            (*输入型寄存器数据数组长度*)
		 
		 REG_ENABLE :=1 ,            (*保持型寄存器数据读写使能*)
		 REG_PTR :=AO_Ptr ,          (*保持型寄存器数据数组指针*)
		 REG_LENGTH :=50            (*保持型寄存器数据数组长度*)
		 
		 | xDONE := DONE,            (*MODBUS从站执行功能块完成标志*)
		 xERROR:= ERROR);            (*MODBUS从站功能块错误信息*)
		 
end_if;





(*************************************************中间变量、起保停演示************************************************************************************************************************************************************************************************************************************************************************************************************)
 
 modbusAIBuf[0]:=AI1;
 modbusAIBuf[1]:=AI2;
 modbusAIBuf[2]:=AI3;
 modbusAIBuf[3]:=AI4;

 
 
 reg1:=modbusAOBuf[0];
 reg2:=modbusAOBuf[1];
 reg3:=modbusAOBuf[2];
 reg4:=modbusAOBuf[3];

 
 (*************************************************数字量模块触点************************************************************************************************************************************************************************************************************************************************************************************************************)



first2008:=modbusDOBuf[0];
modbusDIBuf[0]:=first1008;




END_PROGRAM