Modbus RTU新版指令介绍
TIA V13 SP1版本软件提供2个版本的Modbus RTU指令:
图1. Modbus RTU 命令的两个版本
早期版本的Modbus RTU指令(图1中的MODBUS(V2.2))只能通过CM1241通信模块或CB1241通信板进行Modbus RTU通信。新版Modbus RTU指令(图1中MODBUS(RTU)V3.0)扩展了Modbus RTU的功能,该指令除了支持CM1241通信模块、CB1241通信板,还支持PROFINET或 PROFIBUS分布式I/O机架上的PTP通信模块实现Modbus RTU通信。
新版本Modbus RTU指令支持的PTP模块如下图2所示:
图2. 新版本Modbus RTU命令支持的PTP模块
新版Modbus RTU指令的使用新版本Modbus RTU指令中包含Modbus RTU 主站指令和从站指令。本文以 CPU1217C+CM1241 RS422/485+ET200SP CM PTP 模块为例,介绍新版本 Modbus RTU 指令主从通信的编程步骤。其中CPU机架CM1241 RS422/485作为Modbus RTU从站,分布式机架ET200SP中 CMPTP模块作为Modbus RTU主站。网络结构图如下:
图3. Modubus RTU网络通信结构图
使用到的硬件和软件如下:
软件: TIA V13 SP1 UP 9
一、设备组态
1 配置CM1241 RS422/485 模块。打开设备视图,添加S7-1200CPU,在硬件目录中找到“通讯模块”“点对点”“CM1241(RS422/485)”,将此模块拖到CPU侧左侧,如图如下图4所示:
图4. 添加CM 1241 RS422/485 模块
需要注意:固件版本=V2.1的CM 1241 RS422/485模块,才支持新版本Modbus RTU指令。
接下来用鼠标在“设备视图”中选择CM1241(RS422/485)模块,在“属性”“端口配置”中配置该模块的硬件接口参数。本例中以传输速率=9.6Kbps、奇偶校验=无奇偶校验、数据位=8位字符、停止位=1为例。例如,CM 1241 端口配置设置如下图5 所示:
图5. CM1241 RS422/485 模块端口配置
最后确认“硬件标识符”中硬件标识符为269(编程时会用到该参数),如下图6所示:
图6. 硬件标识符
另外,S7-1200 还提供了系统和时钟存储器功能,为了便于后续指令,建议使能该功能。在CPU “属性”“常规”“系统和时钟存储器”使能系统和时钟存储器功能,如图7所示。
图7. 系统和时钟存储器功能
2组态ET200 SP CM PtP模块
打开网络视图,拖入一个ET200SP站点,分配给对应的IO控制器(本例中CPU1217C为IO控制器),如图8所示。
图8. 插入ET200SP 站点
在ET200SP的"设备视图"环境下,为ET200SP 站点添加信号、通信模块和服务器模块,在本例中只添加了CM PTP模块和服务器模块。需要注意:ET200SP站点中,服务器模块是必须组态的。服务器模块随接口模块一起采购,无需单独购买。
需要为ET200SP 接口模块分配IP 地址和设备名称。 ET200 SP 分布式IO 配置的详细步骤请参考《ET200 SP 快速入门》。
“ET200 SP 快速入门”下载链接:https://support.industry.siemens.com/cs/cn/zh/view/78304711
在ET200SP“设备视图”中用鼠标选择CM PTP,在“属性”“常规”“接口”“工作模式”中配置该模块的硬件接口参数。本例中设置“指定工作模式”:“半双工(RS485)2线操作”; '接收线初始状态':'无'。如下图9所示:
图9. CM PTP 操作模式
接下来,在“属性”“常规”“接口”“端口配置”中配置该模块的端口配置参数。在本例中,设置'Protocol': 'Freeport/Modbus'; “端口参数”设置:传输速率=9.6Kbps,奇偶校验=无奇偶校验,数据位=8位字符,停止位=1为例。端口配置设置如下图10所示:
图10. CM PTP 端口配置
最后,需要在“硬件标识符”中确认CM PTP模块硬件标识符。该参数在程序编程时会用到。
二、软件编程
1Modbus RTU主站编程Modbus RTU主站编程需要调用Modbus_Comm_Load指令和Modbus_Master指令。 Modbus_Comm_Load指令通过Modbus RTU协议配置通信模块。 Modbus_Master指令可以通过Modbus_Comm_Load指令配置的端口作为Modbus主站进行通信。 Modbus_Comm_Load 指令的MB_DB 参数必须连接到Modbus_Master 指令的(静态)MB_DB 参数。
本例中,分布式机架ET200SP中的CM PTP模块作为Modbus RTU主站。相关编程步骤如下:
图11. 拖入Modbus RTU 主站命令
Modbus_Comm_Load指令各参数含义如下表1所示:
引脚
说明
要求
上升沿触发
港口
通讯端口的硬件标识符
波特率
波特率选择:3600、6000、12000、2400、4800、9600、19200、38400、57600、76800、115200
平价
奇偶校验选择:0-无; 1-奇数支票; 2-偶数检查
流量控制
流量控制选择:0-(默认)无流量控制
RTS_ON_DLY
RTS延迟选择:0-(默认)
RTS_OFF_DLY
RTS关闭延迟选择:0-(默认)
响应_TO
响应超时:默认=1000 毫秒。 MB_MASTER 从设备响应所允许的时间(以毫秒为单位)。
MB_DB
引用Modbus_Master 或Modbus_Slave 指令的背景数据块。 MB_DB 参数必须连接到Modbus_Master 或Modbus_Slave 指令中的静态变量MB_DB 参数。
完毕
如果前一请求完成且没有错误,则DONE 位将变为TRUE 并在一个周期内保持为真。
错误
如果前一请求完成时出现错误,则ERROR 位将在一个周期内变为TRUE。 STATUS 参数中的错误代码仅在ERROR=TRUE 期间有效。
地位
有关端口配置错误代码,请参阅TIA软件在线帮助或S7-1200系统手册。
表1 MB_COMM_LOAD指令参数含义Modbus_Master指令各参数含义如下表2所示:
引脚
说明
CN
启用结束
要求
TRUE=请求发送数据到Modbus从站,建议使用上升沿触发
MB_地址
Modbus RTU 从站地址。默认地址范围:0到247;扩展地址范围:0 到65535。值0 保留用于向所有Modbus 从站广播消息。
模式
模式选择:指定请求类型(读或写)。
数据地址
从站起始地址:指定Modbus从站中要访问的数据的起始地址。
数据长度
数据长度:指定此请求中要访问的位数或字数。
数据PTR
数据指针:指向要写入数据或要读取数据的标记或数据块地址。
完毕
Done 位:在前一请求无错误完成后,DONE 位将在一个扫描周期内保持TRUE。
忙碌的
FALSE Modbus_Master 没有活动命令:TRUE 正在执行Modbus_Master 命令
错误
引用Modbus_Master 或Modbus_Slave 指令的背景数据块。 MB_DB 参数必须连接到Modbus_Master 或Modbus_Slave 指令中的静态变量MB_DB 参数。
地位
如果前一请求完成且没有错误,则DONE 位将变为TRUE 并在一个周期内保持为真。
错误
如果前一请求完成时出现错误,则ERROR 位将在一个周期内变为TRUE。 STATUS 参数中的错误代码仅在ERROR=TRUE 期间有效。
地位
错误代码
表2 Modbus_Master 命令参数含义
注意
Modbus_Comm_Load指令不建议在启动组织块OB100中调用,建议在OB1中调用。Modbus_Comm_Load指令在OB1中调用时,其输入位“REQ”需使用上升沿触发,本例中该输入位采用 “FirstScan” 系统存储器位。Modbus_Comm_Load指令背景数据块中的静态变量“MODE”用于描述PTP模块的工作模式,有效的工作模式包括:
0=全双工(RS232)
1=全双工(RS422) 四线模式(点对点)
2=全双工(RS 422) 4 线模式(多点主站、CM PtP (ET200SP))
3=全双工(RS 422) 4 线模式(多点从站、CM PtP (ET200SP))
4=半双工(RS485) 2 线模式
静态变量“MODE”的默认数据为0(RS232全双工模式)。该值需要根据CM PTP模块的实际配置进行修改。本例中CM PTP模块工作在RS485半双工模式,需要修改该值为4。如图12所示。
图12. Modbus_Comm_Load 实例数据块静态变量“MODE”修改为4
Modbus_Master指令的“DATA_PTR”参数用于指向要进行数据写入或数据读取的数据区域地址,该数据区域支持优化访问的数据块或者非优化(标准的)数据块,建议采用非优化访问的数据块。本例中使用的数据区为非优化访问的数据块,在数据块的属性中取消“优化的块访问”即可将数据块修改为非优化访问的数据块(鼠标右键数据块,选择“属性”,取消“优化的块访问”),如图13所示。
图13. 将数据块设置为非优化访问
当Modbus_Master指令的“DATA_PTR”指向非优化访问的数据块时,输入参数需要使用指针填写,如P#DB3.DBX0.0 WORD 5.当Modbus RTU网络中存在多个modbus RTU从站或一个modbus RTU从站同时需要读操作和写操作,则需要调用多个Modbus_Master指令,Modbus_Master指令之间需要采用轮询方式调用。下图14用于描述两个Modbus_Master指令轮询调用的方式。
图14. Modbus_Master 轮询调用方法
本例中,Modbus RTU 主站模块安装在分布式IO 站点上,因此程序中需要考虑分布式IO 站点故障、CM PTP 模块插件模块等故障。当在分布式IO站点中插入或拔出模块时,操作系统将调用OB83一次。通过OB83接口区的输入变量“16#Event_Class”判断故障模块及类型:事件类型16#39表示模块被拔出,事件类型16#38表示模块被插入。当重新插入CM PTP 模块时,需要在中断OB83 中调用Modbus_Comm_Load 指令来重新配置通信模块,如图15 所示。
图15. 在OB83 中再次调用Modbus_Comm_Load 指令
注意
OB83 中调用Modbus_Comm_Load指令的背景数据块需要与OB1中调用的Modbus_Comm_Load指令的背景数据块相同。CM PTP模块的硬件标识符也可以在"PLC变量"---"系统常数"中查询,如图16. 所示。
图16. 系统常数
当分布式IO站点发生故障并恢复时,操作系统将调用OB86一次。通过OB86接口区的输入变量“16#Event_Class”确定故障模块和类型:事件类型16#39表示站点故障,事件类型16#38表示站点恢复。当CM PTP模块所在IO站点恢复后,需要在中断OB86中调用Modbus_Comm_Load指令来重新配置通信模块,如图17所示。
图17. 在OB86 中调用Modbus_Comm_Load 指令
注意
OB86 中调用Modbus_Comm_Load指令的背景数据块需要与OB1中调用的Modbus_Comm_Load指令的背景数据块相同。分布式IO 站点的硬件标识符也可以在"PLC变量"---"系统常数"中查询。
2Modbus RTU 从机编程Modbus RTU 从机编程需要调用Modbus_Comm_Load 指令和Modbus_Slave 指令。 Modbus_Comm_Load指令通过Modbus RTU协议配置通信模块。 Modbus_Slave 指令可以通过Modbus_Comm_Load 指令配置的端口作为Modbus 从站进行通信。 Modbus_Comm_Load 指令的MB_DB 参数必须连接到Modbus_Slaver 指令的(静态)MB_DB 参数。
本例中,CPU 机架CM1241 RS422/485 用作Modbus RTU 从站。相关编程步骤如下:
图18. 拖入Modbus RTU 从站命令
Modbus_Slave指令各参数含义如下表3所示:
引脚
说明
MB_地址
Modbus 从站的标准寻址: 标准寻址范围(1 至247) 扩展寻址范围(0 至65535)
MB_HOLD_REG
数据指针指向Modbus保持寄存器的地址。 Modbus保持寄存器可以是M存储区或DB数据区。如果Modbus保持寄存器是DB数据区,则DB数据区支持优化访问数据块或非优化访问数据块。建议使用非优化访问数据块。
国家报告
新可用数据:
FALSE - 没有新数据
TRUE 表示Modbus 主站已写入新数据。如果前一个请求完成且没有错误,NDR 位将变为TRUE 并保持一个周期。
DR
读取数据:
FALSE - 没有新数据
TRUE 表示该命令已将Modbus 主站接收到的数据存储在目标区域中。如果前一请求完成且没有错误,则DR 位将变为TRUE 并在一个周期内保持为真。
错误
如果前一请求完成时出现错误,则ERROR 位将在一个周期内变为TRUE。如果执行因错误而终止,则STATUS 参数中的错误代码仅在ERROR=TRUE 期间有效。
地位
错误代码
表3 Modbus_Slave命令参数含义
注意
Modbus_Comm_Load指令不建议在启动组织块OB100中调用,建议在OB1中调用。Modbus_Comm_Load指令在OB1中调用时,其输入位“REQ”需使用上升沿触发,本例中该输入位采用 “FirstScan” 系统存储器位。Modbus_Comm_Load指令背景数据块中的静态变量“MODE”用于描述PTP模块的工作模式,有效的工作模式包括:
0=全双工(RS232)
1=全双工(RS422) 四线模式(点对点)
2=全双工(RS 422) 4 线模式(多点主站、CM PtP (ET200SP))
3=全双工(RS 422) 4 线模式(多点从站、CM PtP (ET200SP))
4=半双工(RS485) 2 线模式
静态变量“MODE”的默认数据为0(RS232全双工模式)。该值需要根据CM1241 RS422/485模块的实际配置进行修改。本例中CM1241 RS422/485模块工作在RS485半双工模式,需要修改。值改为4。如何修改“MODE”静态变量如图12所示。
Modbus_Slave指令的“MB_HOLD_REG”用于指向Modbus保持寄存器的数据区域地址,该数据区域支持优化访问的数据块或者非优化(标准的)数据块,建议采用非优化访问的数据块。本例中使用的数据区为非优化访问的数据块,固该输入参数需要使用指针方式填写如P#DB6.DBX0.0 WORD 100 方式填写。如何在数据块的属性中取消“优化的块访问”,见图13. 所示。
将程序下载到PLC中,使用Profibus DP通讯电缆连接CM1241 RS422/485和CM PTP串口模块,测试Modbus RTU通讯。
三、常见问题汇总
1. 新版本 Modbus RTU指令的使用是否存在些限制条件?新版本Modbus RTU指令通过CM1241通信模块或CB1241通信板进行Modbus RTU通信时,需要满足如下条件:
a. S7-1200 CPU 的固件版本不能低于V4.1;
b. CM1241通信模块或CB1241通信板的固件不能低于V2.1。
S7-1200 V4.0固件CPU可
件更新到V4.1版本,V2.0固件的CM1241通信模块也可以通过固件更新的方式更新到V2.1版本。 2 .Modbus_Comm_Load指令背景数据块中的静态变量“MODE”的作用是什么?为什么一般项目中,都需要对该变量进行修改?新版本的Modbus RTU指令扩展了Modbus RTU的功能,该指令除了支持CM1241通信模块、CB1241通信板还支持PROFINET或PROFIBUS分布式I/O机架上的PTP通信模块实现Modbus RTU通信。而分布式I/O机架上的PTP通信模块可以支持多种工作模式,以ET200SP CM PtP模块(订货号:6ES7137-6AA00-0BA0)为例,其可以支持RS232、RS485以及RS422等多种工作模式。Modbus_Comm_Load指令背景数据块中的静态变量“MODE”则用于定义PTP模块的工作模式。“MODE”的默认数值为0,代表“全双工 (RS232)”工作模式,实际项目组态中则需要根据实际工作模式对该变量进行修改。 3. Modbus_Comm_Load指令能否在启动组织块OB100中调用?Modbus_Comm_Load指令不建议在启动组织块OB100中调用。新版本的Modbus RTU指令扩展了Modbus RTU的功能,该指令支持PROFINET或PROFIBUS分布式 I/O 机架上的PtP通信模块实现Modbus RTU通信。操作系统需要调用读取数据记录和写入数据记录等指令来实现与分布式I/O机架上PtP模块的Modbus RTU通信。读取数据记录和写入数据记录指令为异步读写指令,指令的执行需要N个扫描周期,所以不建议Modbus_Comm_Load指令在启动组织块OB100中调用。 4. 如何查询Modbus RTU通信错误时的错误代码?以Modbus_Master指令为例,当通信出现错误时,Modbus_Master指令的“ERROR”输出位将变为TRUE但是只保持一个扫描周期,所以通过TIA 软件程序监控时无法查询到错误。Modbus_Master指令“STATUS”参数中的错误代码仅在“ERROR” = TRUE 的扫描周期内有效,为了获取了Modbus RTU通信错误的错误代码我们可以采用下图19. 方式编程。 图19. 获取通讯错误代码STATUS