首页 历史故事使用ModbusRTU协议进行通信的优化方案

使用ModbusRTU协议进行通信的优化方案

【摘要】:Modbus RTU格式通信协议是以主从方式进行数据传输的,主站发送数据请求报文到从站,从站返回响应报文。表8-9 数据区用户级地址表示法1.S7-1200PLC的ModbusRTU通信串口通信模块CM1241 RS232和CM1241 RS485均支持Modbus RTU协议,可作为Modbus主站或从站与支持Modbus RTU的第三方设备通信。使用S7-1200串口通信模块进行Modbus RTU协议通常是非常简单的,先调用MB_COMM_LOAD指令来设置通信端口参数,然后调用MB_MASTER或MB_SLAVE指令作为主站和从站与支持MODBUS RTU的第三方设备通信。4)Modbus指令不使用通信中断时间来控制通信过程。

Modbus RTU格式通信协议是以主从方式进行数据传输的,主站发送数据请求报文到从站,从站返回响应报文。Modbus系统间的数据交换是通过功能码来控制的。有些功能码是对位操作的,通信的用户数据是以位为单位的,例如:

1)FC01读输出位的状态。

2)FC02读输入位的状态。

3)FC05强制单一输出位。

4)FC15强制多个输出位。

有些功能码是对16位寄存器操作的,通信的用户数据是以字为单位的,例如:

1)FC03读输出寄存器。

2)FC04读输入寄存器。

3)FC06写单一输出寄存器位。

4)FC16写多个输出寄存器。

这些功能代码是对4个数据区(位输入、位输出、输入/输出寄存器)进行访问的。访问的数据区如表8-8所示。

表8-8 访问的数据区

978-7-111-34922-8-Chapter08-63.jpg

对于输出的位或寄存器是可以进行读写访问的,对于输入的数据则只能进行读操作,这4个数据区在用户级的地址表示如8-9所示。

表8-9 数据区用户级地址表示法

978-7-111-34922-8-Chapter08-64.jpg

1.S7-1200PLC的ModbusRTU通信

串口通信模块CM1241 RS232和CM1241 RS485均支持Modbus RTU协议,可作为Modbus主站或从站与支持Modbus RTU的第三方设备通信。使用S7-1200串口通信模块进行Modbus RTU协议通常是非常简单的,先调用MB_COMM_LOAD指令来设置通信端口参数,然后调用MB_MASTER或MB_SLAVE指令作为主站和从站与支持MODBUS RTU的第三方设备通信。

S7-1200 PLC的串口通信模块的Modbus RTU协议通信的注意事项如下:

1)在调用MB_MASTER或MB_SLAVE之前,必须调用MB_COMM_LOAD来设置通信端口的参数。

2)如果一个通信端口作为从站与另一主站通信,则其不能调用MB_MASTER作为主站,同时MB_SLAVE只能调用一次。

3)如果一个通信端口作为主站与另一从站通信,则其不能调用MB_SLAVE作为从站。同时MB_MASTER可调用多次,并要使用相同背景数据块。

4)Modbus指令不使用通信中断时间来控制通信过程。所以必须在程序中循环调用MB_MASTER或MB_SLAVE指令来检查通信状态。

5)如果一个通信端口作为从站,则调用MB_SLAVE指令的循环时间必须短到足以及时响应来自主站的请求。

7)如果一个通信接口作为主站,则必须循环调用MB_MASTER指令直到收到从站的响应。

8)要在一个OB中执行多个MB_MASTER指令。

2.Modbus通信指令

Modbus指令可从项目视图全局库的Modbus选项下找到。

(1)MB_COMM_LOAD

MB_COMM_LOAD指令块用来配置串口以进行Modbus RTU通信,如图8-52所示,其参数含义如表8-10所示。

表8-10 MB_COMM_LOAD参数含义

978-7-111-34922-8-Chapter08-65.jpg

(2)MB_MASTER

MB_MASTER指令块使串口作为Modbus主站来访问一个或多个Modbus从站的数据,如图8-53所示,其参数含义如表8-11所示。

978-7-111-34922-8-Chapter08-66.jpg

图8-52 MB_COMM_LOAD指令块

978-7-111-34922-8-Chapter08-67.jpg

图8-53 MB_MASTER指令块

表8-11 MB_MASTER参数含义

978-7-111-34922-8-Chapter08-68.jpg

表8-12 使用DATA_ADDR和MODER的组合来选择Modbus功能码

978-7-111-34922-8-Chapter08-69.jpg

(续)

978-7-111-34922-8-Chapter08-70.jpg

(3)MB_SLAVE

MB_SLAVE指令块使串口作为Modbus从站响应MODBUS RTU主站的数据请求,如图8-54所示,其参数含义如表8-13所示。

978-7-111-34922-8-Chapter08-71.jpg

图8-54 MB_SLAVE指令块

表8-13 MB_SLAVE参数含义

978-7-111-34922-8-Chapter08-72.jpg

表8-14 Modbus功能码中的地址与S7-1200PLC的地址对应关系

978-7-111-34922-8-Chapter08-73.jpg

(续)

978-7-111-34922-8-Chapter08-74.jpg

3.MODBUS通信举例

本例中通过实现两台安装CM1241 RS232通信模块的S7-1200 PLC之间的MODBUS RTU协议通信演示MODBUS通信的组态方法。通过标准的RS232C电缆连接两台CM1241 RS232通信模块。

(1)S7-1200 PLC的参数设置

在S7-1200 PLC的属性对话框中设置MB1作为系统存储区字节,则M1.0值只在启动运行第1个扫描周期为1。

(2)Modbus RTU从站端S7-1200 PLC的通信程序

在Modbus RTU从站端S7-1200 PLC的OB1中编写程序如图8-55所示,程序段1的功能为在程序初次启动时将MODBUS通信的RS232端口参数初始化为:波特率9600、8位数据位、1位停止位、无校验、无流控、响应超时时间为1000ms。

程序段2的功能为将Modbus从站地址设置为2,db_mb_slave_HR为从站的保持寄存器数据块,Hold_Register_Array为数据块中Array[1..20]of WORD类型的变量

978-7-111-34922-8-Chapter08-75.jpg

图8-55 Modbus从站程序

978-7-111-34922-8-Chapter08-76.jpg

图8-55 Modbus从站程序(续)

(3)Modbus RTU主站端S7-1200 PLC的通信程序

在Modbus RTU主站端S7-1200 PLC的OB1中编写程序如图8-56所示,程序段1的功能为在程序初次启动时将Modbus通信的RS232端口参数初始化为:波特率9600、8位数据位、1位停止位、无校验、无流控、响应超时时间为1000 ms。

程序段2的功能为Modbus主站实现Modbus功能码02H的通信程序,即在b_Read_DI_Req变量为1时读取另一Modbus从站地址为2的S7-1200 PLC的DI通道I0.0开始的16位的值,并将读取的值存放到db_mb_master数据块中名为ReadDI_Array的BOOL型数组中。db_mb_master数据块结构如图8-57所示。

程序段3的功能为Modbus主站实现Modbus功能码03H的通信程序,即在b_Read_DI_Re变量值为1时读取另一Modbus从站地址为2的S7-1200 PLC的保持寄存器数据块前5个字的值,并将读取的值存放到db_mb_master数据块中名为ReadHR_Array的WORD数组中。

978-7-111-34922-8-Chapter08-77.jpg

图8-56 Modbus主站程序

978-7-111-34922-8-Chapter08-78.jpg

图8-57 Modbus主站程序(续)

978-7-111-34922-8-Chapter08-79.jpg

图8-57 Modbus主站程序(续)

978-7-111-34922-8-Chapter08-80.jpg

图8-58 db_mb_master数据块结构

程序段4的功能为Modbus主站实现Modbus功能码15H的通信程序,即在b_Write_DO_Req变量值为1时,将db_mb_master数据块中名为WriteDO_Array的BOOL数组的值赋值给另一Modbus从站地址为2的S7-1200 PLC的Q0.0开始的16个DO通道。

程序段5的功能为Modbus主站实现MODBUS功能码16H的通信程序,即在b_Write_HR_Req变量为1时,将db_mb_master数据块中名为WriteHR_Array的WORD数组的值赋给另一Modbus从站地址为2的S7-1200 PLC的前5个保持寄存器。

(4)S7-1200 PLC的Modbus RTU通信程序测试

打开主站S7-1200 PLC的变量监视表格,将变量b_Read_DI_Req置1,可读取从站I0.0开始的16位的值并存放到db_mb_master数据块中名为ReadDI_Array的BOOL数组中。改变作为从站的S7-1200 PLC的DI通道的值并打开监视表格查看其值。

打开作为从站的S7-1200 PLC的变量监视表格,改变前5个保持寄存器的值。打开主站S7-1200 PLC的变量监视表格,将变量b_Read_DO_Req置1,可读取从站的保持寄存器数据块前5个字的值,并将读取的值放到db_mb_master数据块中的ReadHR_Array的WORD数组中。

打开主站S7-1200 PLC的变量监视表格,将变量b_Write_DO_Req置1,可将db_mb_master数据块中的名为WriteDO_Array的BOOL数组的值赋值给另一Modbus从站地址为2的S7-1200 PLC的Q0.0开始的16个DO通道。打开从站变量监视表格查看其值。

打开主站S7-1200 PLC的变量监视表格,将变量b_Write_HR_Req置1,可将db_mb_master数据块中的名为ReadHR_Array的WORD数组的值赋值给另一Modbus从站地址为2的S7-1200 PLC的前5个保持寄存器。打开从站的S7-1200 PLC的变量监视表格查看其值。