TIA V13 SP1版本软件中提供了2个版本的Modbus RTU指令: 图1. 两个版本Modbus RTU指令 早期版本的Modbus RTU指令(图1中MODBUS (V2.2))仅可通过CM1241通信模块或CB1241通信板进行Modbus RTU通信。 新版本Modbus RTU指令所支持的PTP模块如下图2所示: 图2. 新版本 Modbus RTU指令所支持的PTP模块 新版本Modbus RTU指令中包含Modbus RTU 主站指令和从站指令。本文以 CPU1217C+CM1241 RS422/485+ET200SP CM PTP 模块为例,介绍新版本 Modbus RTU 指令主从通信的编程步骤。 图3. Modubus RTU 网络通信结构图 使用到的硬件和软件如下: 硬件: 软件: 一、设备组态 打开设备视图,添加S7-1200CPU,并在硬件目录里找到“通信模块”→“点到点”→“CM1241(RS422/485)”,拖拽此模块至CPU左侧即可,如下图4所示: 图4. 添加 CM 1241 RS422/485模块 需要注意:固件版本>=V2.1 的CM 1241 RS422/485模块,才支持新版本Modbus RTU指令。 接下来,在“设备视图”中用鼠标选中CM1241(RS422/485)模块,在“属性”→“端口组态”中配置此模块硬件接口参数, 图5. CM1241 RS422/485 模块端口组态 最后在“硬件标识符”里确认一下硬件标识符为269(该参数在程序编程中会被使用),如下图6所示: 图6.硬件标识符 另外,S7-1200 还提供了系统和时钟存储器功能,为了便于后续指令,建议使能该功能。在CPU “属性”→“常规”→“系统和时钟存储器”使能系统和时钟存储器功能,如图7所示。 图7. 系统和时钟存储器功能 a、插入一个ET200SP分布式站点。打开网络视图并拖入一个ET200SP站点,并将其分配给相应的IO控制器(本例CPU1217C 为 IO 控制器),如图8所示。 图8. 插入ET200SP站点 b、组态ET200SP 站点。在ET200SP的'设备视图'环境下,为ET200SP 站点添加信号、通信模块和服务器模块,在本例中只添加了CM PTP模块和服务器模块。 ET200SP接口模块需要为其分配IP地址和Device Name, 有关ET200 SP 分布式IO 组态详细步骤,请参考《ET200 SP使用快速入门》。 《ET200 SP 使用快速入门》下载链接: 在ET200SP'设备视图'中用鼠标选中CM PTP,在“属性”→“常规”→“接口”→“操作模式”中配置此模块硬件接口参数, 图9. CM PTP 操作模式 接下来,在“属性”→“常规”→“接口”→“端口组态”中配置此模块端口组态参数, 图10. CM PTP 端口组态 最后需要在“硬件标识符”里确认一下CM PTP 模块硬件标识符,该参数在程序编程中会被使用。 二、软件编程 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主站,其相关编程步骤如下: a、OB1中插入一个FC函数,并在函数中拖入Modbus_Comm_Load指令和Modbus_Master指令。如图11所示图11. 拖入Modbus RTU 主站指令 Modbus_Comm_Load指令各参数意义如下表1所示:
表1 MB_COMM_LOAD指令参数意义
表2 Modbus_Master指令参数意义 注意 ① Modbus_Comm_Load指令不建议在启动组织块OB100中调用,建议在OB1中调用。Modbus_Comm_Load指令在OB1中调用时,其输入位“REQ”需使用上升沿触发,本例中该输入位采用 “FirstScan” 系统存储器位。 · 0 = 全双工 (RS232) · 1 = 全双工 (RS422) 四线制模式(点对点) · 2 = 全全双工 (RS 422) 四线制模式(多点主站,CM PtP (ET 200SP)) · 3 = 全全双工 (RS 422) 四线制模式(多点从站,CM PtP (ET 200SP)) · 4 = 半双工 (RS485) 二线制模式 该静态变量“MODE”默认数据为0(RS232 全双工模式),需要根据CM PTP模块实际组态修改该数值,本例中CM PTP模块工作在RS485半双工模式需要将该数值修改为4,如图12所示。 图12. Modbus_Comm_Load背景数据块静态变量“MODE”修改为4 ③ Modbus_Master指令的“DATA_PTR”参数用于指向要进行数据写入或数据读取的数据区域地址,该数据区域支持优化访问的数据块或者非优化(标准的)数据块,建议采用非优化访问的数据块。 图13. 设置数据块为非优化访问 当Modbus_Master指令的“DATA_PTR”指向非优化访问的数据块时,该输入参数需要使用指针方式填写如P#DB3.DBX0.0 WORD 5 方式填写。 图14.Modbus_Master轮询调用方式 b、插入'Pull or plug of modules' 中断OB83。本例中Modbus RTU主站模块安装在分布式IO站点上,因此程序中需要考虑分布式IO站点故障、CM PTP 模块插拔模块等故障。 图15. OB83中再次调用Modbus_Comm_Load 指令 注意 ① OB83 中调用Modbus_Comm_Load指令的背景数据块需要与OB1中调用的Modbus_Comm_Load指令的背景数据块相同。 图16. 系统常量 c、插入'Rack or Station failure' 中断OB86。分布式IO站点故障和恢复时,操作系统都会调用一次OB86。通过OB86接口区的输入变量“16#Event_Class”判断故障的模块和类型:事件类型16#39表示站点故障,事件类型16#38表示站点恢复。 图17. OB86中调用Modbus_Comm_Load 指令 注意 ①OB86 中调用Modbus_Comm_Load指令的背景数据块需要与OB1中调用的Modbus_Comm_Load指令的背景数据块相同。 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从站,其相关编程步骤如下: OB1中插入一个FC函数,并在函数中拖入Modbus_Comm_Load指令和Modbus_Slave指令。如图18所示图18. 拖入Modbus RTU 从站指令 Modbus_Slave指令各参数意义如下表3所示:
表3 Modbus_Slave指令参数意义 注意 ① Modbus_Comm_Load指令不建议在启动组织块OB100中调用,建议在OB1中调用。Modbus_Comm_Load指令在OB1中调用时,其输入位“REQ”需使用上升沿触发,本例中该输入位采用 “FirstScan” 系统存储器位。 · 0 = 全双工 (RS232) · 1 = 全双工 (RS422) 四线制模式(点对点) · 2 = 全全双工 (RS 422) 四线制模式(多点主站,CM PtP (ET 200SP)) · 3 = 全全双工 (RS 422) 四线制模式(多点从站,CM PtP (ET 200SP)) · 4 = 半双工 (RS485) 二线制模式 该静态变量“MODE”默认数据为0(RS232 全双工模式),需要根据CM1241 RS422/485模块实际组态修改该数值,本例中CM1241 RS422/485模块工作在RS485半双工模式需要将该数值修改为4,如何修改“MODE”静态变量见图12.所示。 ③ Modbus_Slave指令的“MB_HOLD_REG”用于指向Modbus保持寄存器的数据区域地址,该数据区域支持优化访问的数据块或者非优化(标准的)数据块,建议采用非优化访问的数据块。 将程序下载到PLC中,并使用Profibus DP通信电缆将CM1241 RS422/485与CM PTP串口模块连接起来,即可测试Modbus RTU通信了。 三、常见问题汇总 1. 新版本 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”的作用是什么?为什么一般项目中,都需要对该变量进行修改? 3. Modbus_Comm_Load指令能否在启动组织块OB100中调用?Modbus_Comm_Load指令不建议在启动组织块OB100中调用。新版本的Modbus RTU指令扩展了Modbus RTU的功能,该指令支持PROFINET或PROFIBUS分布式 I/O 机架上的PtP通信模块实现Modbus RTU通信。 4. 如何查询Modbus RTU通信错误时的错误代码? 图19. 获取通讯错误代码STATUS |
|