[TS]S7-1200 G2 Modbus‑RTU 作为主站通讯故障排查记录
一、明确问题
1.1 故障现象
S7-1200 G2+CM1241 作为 Modbus-RTU 主站无法和从站通讯;线缆、接线无异常,同链路更换 S7-200 SMART 做主站,通讯正常。CM1241 仅 TX 灯闪烁,无 RX 应答。
1.2 涉及硬件
| 订货号 | 描述 |
| 6ES7 214-1HH50-0XB0 | CPU 1214C DC/DC/Rly |
| 6ES7 241-1EA50-0XB0 | CM1241 RS422/485 模块 |
| 第三方 Modbus 从站 | |
| RS485 总线线缆 |
1.3 错误信息
Modbus_Master 状态码:16#7002,从站响应超时
1.4 复现步骤
按照指南中的程序进行编程:
- TIA 中调用新版 Modbus_Comm_Load + Modbus_Master 指令;
- 初始化 DB 设置
MODE=4; - 下载程序,触发 Modbus 读 / 写任务,稳定报 7002 超时。
二、收集信息
2.1 检查日志与状态
- Modbus_Comm_Load:DONE=1,初始化无报错; 此标志位为瞬时标志,需编写程序判断初始化后是否能置位一个标志位。
- Modbus_Master:REQ 正常触发,持续返回 16#7002;
- 模块指示灯:TX 闪烁、RX 不闪烁,报文发出但无返回。
2.2 核对环境配置
波特率、校验、站号、寄存器地址、A/B 接线、终端电阻、接地全部匹配从站;硬件组态端口参数设置为 RS485。
三、假设与测试
3.1 初步假设
- 总线链路、从站设备故障(替换测试推翻);
- 硬件组态串口参数不匹配(核对后排除);
3.2 验证过程
测试 1:替换主站为 S7-200 SMART,通讯正常 → 物理层、从站侧无问题;
测试 2:确认 MODE=4(两线 RS485 半双工),故障依旧;
测试 3:接入电脑的485通讯口,监测通讯报文,PLC发送数据是一样的,但是电脑端接收的数据不一致,经常发生变化。
3.3 根因确认
新版 Modbus_Comm_Load 指令依靠 LINE_PRE 控制总线空闲电平、RTS 收发切换时序;两线 RS485 场景只设置 MODE=4,LINE_PRE 默认值不匹配总线时序,导致发报后切换异常,收不到从站应答。
硬件组态不会自动同步该 DB 内部参数,同时修改硬件组态内的设置也无法使得功能块的参数发生变化。
四、实施修复
4.1 解决方案
在 Modbus_Comm_Load 背景数据块静态变量中同时配置: MODE = 4,LINE_PRE = 2
4.2 升级步骤
- 打开 Modbus_Comm_Load 背景 DB,修改静态参数;或者直接编写程序进行赋值。
- 编译、下载 PLC 程序;
- PLC 断电重启,保证 CM1241 参数加载生效。
4.3 验证效果
重新触发读写任务,Modbus_Master 无报错,TX/RX 灯交替闪烁,寄存器读写稳定正常。
五、记录复盘
5.1 问题归档
故障类型:S7-1200 新版 Modbus-RTU 指令参数遗漏;特征:链路正常、200SMART 可通、报错 7002。
5.2 经验沉淀
- CM1241(G2)新版 Modbus 指令两线 RS485,MODE=4 和 LINE_PRE=2 必须成对配置;
- 硬件组态串口模式 ≠ 指令 DB 内部时序参数,二者独立;
- 替换法(200SMART)可快速隔离物理层问题,缩小排查范围。
5.3 后续行动
将该检查项加入项目标准检查表;新项目使用 CM1241 Modbus-RTU 主站时,强制核对这两个参数。
六、Tips Modbus‑RTU 区分报文
Modbus‑RTU 帧格式:从站地址(1B)+功能码(1B)+数据域(NB)+CRC低字节(1B)+CRC高字节(1B),不存在 0x7E 这类起始 / 结束标记,依靠总线静默时间来切分帧边界。
官方标准两条核心时序规则(Modbus over Serial Line V1.02):
1.帧间间隔 t₃.₅:两帧报文之间总线空闲静默时间必须≥3.5 个字符时间。接收端检测到总线静默达到 t₃.₅,就把前面收到字节当做一完整帧上交 CRC 校验。
2.帧内最大字符间隔 t₁.₅:同一帧内部,相邻两个字节之间间隔不能超过 1.5 字符时间。如果接收中途停顿大于 t₁.₅但不足 t₃.₅,判定为破碎帧,直接丢弃,防止错位扩散。
字符时间计算公式:t_char = 11 / 波特率,1 个字符包含:1 起始位 + 8 数据位 + 1 停止位,无校验模式合计 11bit。
⚠️重要陷阱:波特率>19200(38400/57600/115200),不再按公式计算,官方强制固定:t₁.₅=750μs;t₃.₅=1.75ms。
高速波特率下如果继续用公式计算,中断抖动就会把正常报文误切分,通信直接瘫痪。
很多人误以为 “收到固定字节数就是一帧”,这是测试状态时的侥幸,不是协议标准,多设备、干扰环境必然出问题。