SIMATIC S7-1200,模拟输入, SM 1231 TC,热电偶 4 模拟输入
SIMATIC S7-1200 SM 1231,AI 4x16 bit TC
订货号: 6ES7231-5QD32-0XB0
b. Modbus 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_Slave 指令的(静态)MB_DB 参数。
本例中 CPU 机架 CM1241 RS422/485 作为 Modbus RTU 从站,其相关编程步骤如下:
OB1 中插入一个 FC,并在函数中拖入 Modbus_Comm_Load 指令和 Modbus_Slave 指令。如图 16 所示。
图 16. 拖入Modbus RTU 从站指令
Modbus_Slave 指令各参数意义如表 4 所示:
引脚 | 说明 |
---|---|
MB_ADDR | Modbus 从站的标准寻址: 标准寻址范围(1 到 247), 扩展寻址范围(0 到 65535) |
MB_HOLD_REG | 数据指针,指向 Modbus 保持寄存器的地址, Modbus 保持寄存器可以为 M 存储区或 DB 数据区。 |
NDR | 可用的新数据:
|
DR | 读取数据:
|
ERROR | 如果上一个请求完成出错,则 ERROR 位将变为 TRUE 并保持一个周期。 如果执行因错误而终止,则 STATUS 参数中的错误代码仅在 ERROR = TRUE 的周期内有效。 |
STATUS | 错误代码 |
表 4. Modbus_Slave 指令参数意义
注意:
① Modbus_Comm_Load 指令不建议在启动组织块 OB100 中调用,建议在 OB1 中调用。
Modbus_Comm_Load 指令在 OB1 中调用时,其输入位“REQ”需使用上升沿触发,本例中该输入位采用 “FirstScan” 系统存储器位。
② Modbus_Comm_Load 指令背景数据块中的静态变量 “MODE” 用于描述点对点模块的工作模式,有效的工作模式包括:
0 = 全双工 (RS232)
1 = 全双工 (RS422) 四线制模式(点对点)
2 = 全双工 (RS422) 四线制模式(多点主站)
3 = 全双工 (RS422) 四线制模式(多点从站)
4 = 半双工 (RS485) 二线制模式
该静态变量 “MODE” 默认数据为 0(RS232 全双工模式),需要根据 CM PtP 模块实际组态修改该数值,本例中 CM PtP 模块工作在 RS485 半双工模式需要将该数值修改为 4,参考图 13 。
③ Modbus_Slave 指令的 “MB_HOLD_REG” 用于定义 CPU 的 Modbus 保持寄存器的数据区域地址,该数据区域在 V3.0 支持非优化(标准的)数据块。一般建议使用指针方式填写,例如程序中的 P#DB6.DBX0.0 WORD 100,此外也可以使用基本数据类型数组方式填写。指针的含义参见链接。
从 V4.0 版本开始支持优化 DB 块,具体参见链接。
在数据块的属性中取消“优化的块访问”即可将数据块修改为非优化访问的数据块(鼠标右键数据块,选择“属性”,取消“优化的块访问”),参考图 14 。
④ Modbus RTU 从站数据区定义,参见表 5。
地址区 | 定义 | 说明 |
---|---|---|
输出位 | Q0.0 开始 |
|
输入位 | I0.0 开始 |
|
输入寄存器 | IW0 开始 |
|
保持寄存器 | 由 MB_HOLD_REG 定义 |
|
注意:数据区从指令集版本 V4.0 开始,可以自由定义,方法参见链接。
表 5. 数据区定义
⑤ 如果是分布式 IO 上的串口模块,还需要考虑模块拔出或者掉站的情况,具体处理参见常见问题 5。
c. 编译下载
之后将程序和组态编译下载到 PLC 中,即可测试 Modbus RTU 通信了。
3. 常见问题 FAQ
1. 新版本 Modbus RTU 指令的使用是否存在些限制条件?
新版本 Modbus RTU 指令通过 CM1241 通信模块或 CB1241 通信板进行 Modbus RTU 通信时,需要满足如下条件:
S7-1200 CPU 的固件版本不能低于 V4.1
CM1241 通信模块不能低于 V2.1
CB1241 没有要求
分布式上的串口模块包括:
ET200SP 的 CM PtP
ET200MP 的 CM PtP RS232 HF
ET200MP 的 CM PtP RS422/485 HF
S7-1200 V4.0 固件 CPU 可以通过固件更新到 V4.1 及以上版本,V2.0 固件的 CM1241 通信模块也可以通过固件更新的方式更新到 V2.1 及以上版本。 相关固件更新的方法请参考 S7-1200 固件更新 。
2. Modbus_Comm_Load 指令背景数据块中的静态变量 “MODE” 的作用是什么?为什么一般项目中,都需要对该变量进行修改?
新版本的 Modbus RTU 指令扩展了 Modbus RTU 的功能,该指令除了支持 CM1241 通信模块、CB1241 通信板还支持 PROFINET 或 PROFIBUS 分布式 I/O 机架上的点对点通信模块实现 Modbus RTU 通信。 而分布式 I/O 机架上的点对点通信模块可以支持多种工作模式,以 ET200SP CM PtP 模块(订货号:6ES7137-6AA0x-0BA0)为例,其可以支持 RS232、RS485 以及 RS422 等多种工作模式。
Modbus_Comm_Load 指令背景数据块中的静态变量 “MODE” 则用于定义点对点模块的工作模式,具体如下说明。 “MODE” 的默认数值为 0,代表“全双工 (RS232)”工作模式,实际项目组态中则需要根据实际工作模式对该变量进行修改。
0 = 全双工 (RS232)
1 = 全双工 (RS422) 四线制模式(点对点)
2 = 全双工 (RS422) 四线制模式(多点主站)
3 = 全双工 (RS422) 四线制模式(多点从站)
4 = 半双工 (RS485) 二线制模式
3. Modbus_Comm_Load 指令能否在启动组织块 OB100 中调用?
Modbus_Comm_Load 指令可以但不建议在启动组织块 OB100 中调用。
新版本的 Modbus RTU 指令扩展了 Modbus RTU 的功能,该指令支持 PROFINET 或 PROFIBUS 分布式 I/O 机架上的点对点通信模块实现 Modbus RTU 通信。 操作系统需要调用读取数据记录和写入数据记录等指令来实现与分布式 I/O 机架上点对点模块的 Modbus RTU 通信。读取数据记录和写入数据记录指令为异步读写指令,指令需要多次执行,所以不建议 Modbus_Comm_Load 指令在启动组织块 OB100 中调用。如果需要,可以参考常见问题 5 中的方式,在 OB100 中反复执行 Modbus_Comm_Load 指令,直到指令完成。