西门子S7-200 SMART系列PLC因其高性价比和易用性,在中小型自动化项目中应用广泛。与第三方仪表进行Modbus RTU通信是现场最常见的需求之一,本文将完整讲解从硬件接线到程序调试的全流程操作。
一、通信前必须明确的参数
建立通信前,需向仪表厂家确认以下参数,任何一项错误都会导致通信失败。
| 参数项 | 常见取值 | 说明 |
|---|---|---|
| 波特率 | 9600 / 19200 / 38400 | 双方必须完全一致 |
| 数据位 | 8 | 固定值 |
| 停止位 | 1 或 2 | 需确认 |
| 校验方式 | 无校验 / 偶校验 / 奇校验 | 双方必须一致 |
| 站地址 | 1~247 | 同一总线不可重复 |
| 功能码 | 03(读保持寄存器) / 04(读输入寄存器) / 06(写单寄存器) / 16(写多寄存器) | 查仪表手册 |
| 寄存器地址 | 40001~49999 或 0-based地址 | 注意地址偏移 |
关键提示:Modbus地址存在"1-based"与"0-based"两种表示方式。若仪表手册写"40001",在PLC程序中可能需输入"0"(西门子库指令自动处理40000偏移)或"1",需实测验证。
二、硬件接线与终端电阻
2.1 RS-485接线
S7-200 SMART本体集成RS-485端口(端口0),引脚定义如下:
- 3号引脚:B+(信号正)
- 8号引脚:A-(信号负)
- 1号引脚:5V输出(一般不用)
- 2号引脚:24V输出(一般不用)
- 5号引脚:GND(信号地,建议连接)
连接方式:将PLC的B+接仪表B+,A-接仪表A-,GND接仪表GND(如有)。采用屏蔽双绞线,屏蔽层单端接地。
2.2 终端电阻配置
RS-485总线需在物理最两端各加120Ω终端电阻:
- PLC端:若PLC位于总线一端,短接RS-485连接器上的TER与A2端子(内置120Ω电阻接入)
- 仪表端:部分仪表内置终端电阻需拨码开关启用,或通过外部电阻跨接在A-B之间
总线拓扑必须为手拉手结构,禁止星型连接。总线长度超过50米时,务必降低波特率或使用中继器。
三、PLC程序编写
3.1 初始化通信端口
使用MBUS_CTRL指令初始化端口0,每个扫描周期调用一次。
| 参数 | 类型 | 说明 |
|---|---|---|
| Mode | BOOL | 1 = Modbus主站模式 |
| Baud | DINT | 波特率,如 9600 |
| Parity | BYTE | 0=无校验, 1=奇校验, 2=偶校验 |
| Port | BYTE | 0=端口0, 1=端口1(仅ST40/ST60) |
| Timeout | INT | 超时时间(毫秒),建议 1000 |
| Done | BOOL | 初始化完成标志 |
| Error | BYTE | 错误代码 |
操作步骤:
- 打开 STEP 7-Micro/WIN SMART软件
- 双击 项目树中的"程序块" → "主程序[MAIN]"
- 拖拽 指令树"库" → "Modbus" →
MBUS_CTRL到网络1 - 设置 参数:
Mode赋值为1,Baud输入9600,Parity按仪表设定(通常2偶校验) - 分配 全局变量存储Done和Error状态,便于监控
3.2 读取仪表数据
使用MBUS_MSG指令发起单次读请求。该指令需用边沿触发(通常使用Done标志的取反或上升沿),避免每个扫描周期重复调用。
| 参数 | 类型 | 说明 |
|---|---|---|
| First | BOOL | 上升沿触发一次请求 |
| Slave | BYTE | 仪表站地址,如 1 |
| RW | BYTE | 0=读, 1=写 |
| Addr | DWORD | Modbus起始地址(西门子格式:40001对应40001或1) |
| Count | INT | 读取寄存器数量(1~120) |
| DataPtr | DWORD | 本地存储地址指针(&VBx) |
| Done | BOOL | 请求完成标志 |
| Error | BYTE | 错误代码 |
典型应用场景:读取功率表的电压、电流、功率,假设:
- 电压:40001(单精度浮点,占2个寄存器)
- 电流:40003(单精度浮点,占2个寄存器)
- 功率:40005(单精度浮点,占2个寄存器)
操作步骤:
- 计算 总寄存器数:3个参数 × 2寄存器 = 6个寄存器
- 规划 存储区:为6个寄存器预留12字节,如
VB100~VB111 - 拖拽
MBUS_MSG到网络2 - 配置 参数:
First:使用M0.0作为触发位,配合SM0.1首次扫描置位,或定时脉冲Slave:输入1RW:输入0(读取)Addr:输入40001或1(需实测)Count:输入6DataPtr:输入&VB100
- 添加 第二个
MBUS_MSG(网络3),使用第一个的Done标志作为First的触发条件,实现轮询
轮询机制实现:
由于同一时刻只能有一个MBUS_MSG处于活动状态,需用完成标志串联多个请求:
- 请求1的
Done→ 触发请求2的First - 请求2的
Done→ 触发请求3的First或 回到请求1(循环)
3.3 数据格式转换
Modbus以16位寄存器传输,浮点数需解析。常见两种格式:
| 格式 | 说明 | 处理方法 |
|---|---|---|
| AB CD | 高字在前(标准Modbus大端) | 直接 VD100 读取 |
| CD AB | 低字在前(部分国产仪表) | 字交换后再读取 |
西门子浮点解析(标准大端):
若 VB100~VB103 收到电压数据,则:
- 直接使用
VD100即为浮点电压值
非标准字节序处理:
若数值异常(如1.5e-38或NaN),尝试字交换:
VW100 ↔ VW102 交换后,再读VD100
程序实现:使用 SWAP 指令对 VW100 和 VW102 分别处理,或编程交换字节。
四、地址映射与调试技巧
4.1 地址偏移实测方法
仪表手册地址与PLC程序地址常存在偏移,建议用Modbus调试工具辅助:
操作步骤:
- 下载 Modbus Poll或类似调试软件
- 连接 USB转RS-485转换器到电脑
- 设置 与仪表相同的串口参数
- 尝试 读取不同地址范围,观察哪个地址返回有效数据
- 记录 有效地址,转换为PLC程序值
转换规则(西门子库):
- 若调试工具读
40001有效,PLC中尝试Addr = 40001或1 - 若调试工具读
0有效(0-based),PLC中尝试Addr = 40001或1
4.2 常见错误代码排查
| 错误码 | 含义 | 排查方向 |
|---|---|---|
| 0 | 无错误 | — |
| 1 | 校验错误 | 检查波特率、校验方式、接线 |
| 2 | 超时 | 检查站地址、接线、终端电阻、仪表上电 |
| 3 | 接收错误 | 检查干扰、接地、波特率过高 |
| 4 | CRC错误 | 检查线缆质量、干扰 |
| 5 | 功能码不支持 | 仪表不支持该功能码,更换Addr尝试 |
| 6 | 地址错误 | 寄存器地址超出仪表范围 |
| 7 | 数据错误 | Count值超出限制 |
4.3 状态监控程序
建议编写状态监控逻辑,快速定位问题:
- 创建 状态字
VW200存储当前执行步骤 - 创建 错误记录区
VB201~VB210保存最近10次错误码 - 使用 比较指令判断
MBUS_MSG的Error值,非零时触发报警位 - 添加 通信超时计数器,连续10次超时自动复位端口
五、多仪表轮询架构
单总线连接多台仪表时,需设计高效轮询机制。
5.1 轮询表设计
建立参数表,用索引指针切换目标仪表:
| 索引 | 站地址 | 起始地址 | 寄存器数 | 本地存储指针 |
|---|---|---|---|---|
| 0 | 1 | 40001 | 6 | &VB100 |
| 1 | 2 | 40001 | 6 | &VB112 |
| 2 | 3 | 40001 | 6 | &VB124 |
操作步骤:
- 建立 数据块存储上表参数
- 使用 间接寻址读取当前索引的参数
- 执行
MBUS_MSG,Done后索引+1 - 判断 索引是否越界,越界则归零循环
- 添加 单台仪表通信故障跳过机制(错误计数超3次暂时跳过)
5.2 通信负荷计算
确保轮询周期满足数据刷新要求:
$$\text{单帧时间} \approx \frac{11 \times \text{字节数}}{\text{波特率}} + \text{仪表响应延时}$$
示例:9600波特率,读6寄存器(12字节请求+15字节响应≈30字节):
$$\text{单帧时间} \approx \frac{11 \times 30}{9600} + 50\text{ms} \approx 84\text{ms} + 50\text{ms} = 134\text{ms}$$
10台仪表轮询周期约1.3秒,若需更快刷新,提升波特率至19200或分组使用多个RS-485端口。
六、写入操作与特殊处理
6.1 写单个寄存器
使用MBUS_MSG,RW = 1,Count = 1
操作步骤:
- 准备 写入数据到目标存储区(如
VW50) - 触发
First上升沿 - 等待
Done置位确认完成 - 严禁 在
Done前修改DataPtr指向的数据
6.2 写多个寄存器
RW = 1,Count = N(N>1),部分仪表需功能码16(0x10)支持。
注意:西门子MBUS_MSG自动选择功能码:
Count = 1→ 功能码06Count > 1→ 功能码16
若仪表仅支持功能码06写多寄存器,需循环单写。
七、实战调试清单
最后一步调试,逐项核对:
- 确认 仪表通信参数与程序一致(波特率、校验、站地址)
- 确认 A-B线未接反,终端电阻正确配置
- 确认 仪表处于Modbus模式(部分仪表需菜单切换)
- 确认 寄存器地址经过Modbus工具验证
- 确认
MBUS_CTRL的Done已置位 - 确认
MBUS_MSG的First为边沿触发非电平保持 - 确认 多台仪表时无地址冲突
- 确认 数据格式(浮点字节序、整数有无符号)
完成以上步骤,西门子S7-200 SMART与第三方仪表的Modbus通信即可稳定运行。

暂无评论,快来抢沙发吧!