- 1. 一、概述
- 2. 二、Modbus地址类型说明
- 3. 三、S7-200 SMART Modbus地址映射表
- 4. 3.1 数字量输出区(Q区)→ 0xxxx线圈
- 5. 3.2 数字量输入区(I区)→ 1xxxx离散输入
- 6. 3.3 模拟量输入区(AIW区)→ 3xxxx输入寄存器
- 7. 3.4 V存储区 → 4xxxx保持寄存器
- 8. 四、PLC从站配置步骤
- 9. 4.1 安装Modbus从站指令库
- 10. 4.2 调用MBUS_INIT指令初始化从站
- 11. 4.3 主轮询MBUS_SLAVE指令
- 12. 4.4 配置V存储区数据
- 13. 五、PLC主站配置与读取示例
- 14. 5.1 调用MBUS_CTRL指令初始化主站
- 15. 5.2 调用MBUS_MSG指令发起读写请求
- 16. 5.3 读取保持寄存器示例
- 17. 六、常见问题与排障指南
- 18. 6.1 通讯无响应,从站不回话
- 19. 6.2 读不到数据或数据不对
- 20. 6.3 数据乱码或数值不对
- 21. 6.4 偶发通讯失败
- 22. 6.5 Error错误代码说明
- 23. 七、总结
- 24. 八、相关链接
一、概述
S7-200 SMART PLC作为Modbus RTU主站或从站时,其内部存储区(I、Q、AIW、V)与Modbus标准地址之间有固定的映射关系。本文基于西门子官方技术文档,详细说明S7-200 SMART的Modbus地址映射规则,包含完整的地址对照表、配置步骤、通讯示例和排障指南。
S7-200 SMART支持两种Modbus工作模式:
- Modbus RTU主站(Master):主动发起通讯请求,读取或控制从站设备
- Modbus RTU从站(Slave):被动响应主站的读写请求
二、Modbus地址类型说明
Modbus协议定义了四种数据区域,每种区域有固定的地址范围和功能码:
| Modbus地址区域 | 功能码 | 读写属性 | 数据类型 | 对应S7-200 SMART存储区 |
|---|---|---|---|---|
| 0xxxx(线圈) | 01(读线圈)/ 05(写单线圈)/ 15(写多线圈) | 读/写 | 位(1 bit) | Q区数字量输出 |
| 1xxxx(离散输入) | 02(读离散输入) | 只读 | 位(1 bit) | I区数字量输入 |
| 3xxxx(输入寄存器) | 04(读输入寄存器) | 只读 | 字(16 bit) | AIW模拟量输入 |
| 4xxxx(保持寄存器) | 03(读保持寄存器)/ 06(写单寄存器)/ 16(写多寄存器) | 读/写 | 字(16 bit) | V存储区(可配置) |
重要说明:Modbus地址采用1-based编号,即从1开始计数。而PLC内部地址通常是0-based,从0开始。
三、S7-200 SMART Modbus地址映射表
3.1 数字量输出区(Q区)→ 0xxxx线圈
数字量输出Q区映射到Modbus的0xxxx线圈区域,支持读写操作。
| Modbus地址 | S7-200 SMART地址 | 说明 |
|---|---|---|
| 00001 | Q0.0 | 第0通道第0位 |
| 00002 | Q0.1 | 第0通道第1位 |
| 00003 | Q0.2 | 第0通道第2位 |
| 00004 | Q0.3 | 第0通道第3位 |
| 00005 | Q0.4 | 第0通道第4位 |
| 00006 | Q0.5 | 第0通道第5位 |
| 00007 | Q0.6 | 第0通道第6位 |
| 00008 | Q0.7 | 第0通道第7位 |
| 00009 | Q1.0 | 第1通道第0位 |
| 00010 | Q1.1 | 第1通道第1位 |
| 00011 | Q1.2 | 第1通道第2位 |
| 00012 | Q1.3 | 第1通道第3位 |
| 00013 | Q1.4 | 第1通道第4位 |
| 00014 | Q1.5 | 第1通道第5位 |
| 00015 | Q1.6 | 第1通道第6位 |
| 00016 | Q1.7 | 第1通道第7位 |
| 00017 | Q2.0 | 第2通道第0位 |
| 00018 | Q2.1 | 第2通道第1位 |
| … | … | 依次类推,每8个地址对应一个字节 |
| 00256 | Q31.7 | 最大地址(最多支持32个字节输出) |
计算公式:Modbus地址 = 通道号 × 8 + 位号 + 1
示例:要访问Q2.3,Modbus地址 = 2×8 + 3 + 1 = 00020
功能码:
- 读线圈状态:功能码01
- 写单个线圈:功能码05
- 写多个线圈:功能码15(0x0F)
注意事项:
- Q区地址映射是固定的,不需要额外配置
- 实际可用的Q区数量取决于CPU型号和扩展模块
- 如果硬件上不存在对应的Q点,读出来的值始终为0
3.2 数字量输入区(I区)→ 1xxxx离散输入
数字量输入I区映射到Modbus的1xxxx离散输入区域,只读。
| Modbus地址 | S7-200 SMART地址 | 说明 |
|---|---|---|
| 10001 | I0.0 | 第0通道第0位 |
| 10002 | I0.1 | 第0通道第1位 |
| 10003 | I0.2 | 第0通道第2位 |
| 10004 | I0.3 | 第0通道第3位 |
| 10005 | I0.4 | 第0通道第4位 |
| 10006 | I0.5 | 第0通道第5位 |
| 10007 | I0.6 | 第0通道第6位 |
| 10008 | I0.7 | 第0通道第7位 |
| 10009 | I1.0 | 第1通道第0位 |
| 10010 | I1.1 | 第1通道第1位 |
| 10011 | I1.2 | 第1通道第2位 |
| 10012 | I1.3 | 第1通道第3位 |
| 10013 | I1.4 | 第1通道第4位 |
| 10014 | I1.5 | 第1通道第5位 |
| 10015 | I1.6 | 第1通道第6位 |
| 10016 | I1.7 | 第1通道第7位 |
| 10017 | I2.0 | 第2通道第0位 |
| 10018 | I2.1 | 第2通道第1位 |
| … | … | 依次类推,每8个地址对应一个字节 |
| 10256 | I31.7 | 最大地址(最多支持32个字节输入) |
计算公式:Modbus地址 = 10000 + 通道号 × 8 + 位号 + 1
示例:要访问I3.5,Modbus地址 = 10000 + 3×8 + 5 + 1 = 10030
功能码:读离散输入用功能码02
注意事项:
- I区地址映射是固定的,不需要额外配置
- 离散输入是只读的,主站不能写
- 实际可用的I区数量取决于CPU型号和扩展模块
3.3 模拟量输入区(AIW区)→ 3xxxx输入寄存器
模拟量输入AIW区映射到Modbus的3xxxx输入寄存器区域,只读。
| Modbus地址 | S7-200 SMART地址 | 说明 |
|---|---|---|
| 30001 | AIW0 | 第1路模拟量输入 |
| 30002 | AIW2 | 第2路模拟量输入 |
| 30003 | AIW4 | 第3路模拟量输入 |
| 30004 | AIW6 | 第4路模拟量输入 |
| 30005 | AIW8 | 第5路模拟量输入 |
| 30006 | AIW10 | 第6路模拟量输入 |
| 30007 | AIW12 | 第7路模拟量输入 |
| 30008 | AIW14 | 第8路模拟量输入 |
| 30009 | AIW16 | 第9路模拟量输入 |
| 30010 | AIW18 | 第10路模拟量输入 |
| … | … | 依次类推,步长为2 |
| 30056 | AIW110 | 第56路模拟量输入(最大) |
计算公式:Modbus地址 = 30000 + AIW编号 / 2 + 1
示例:要读取AIW20,Modbus地址 = 30000 + 20/2 + 1 = 30011
功能码:读输入寄存器用功能码04
注意事项:
- AIW是字寻址,每个AIW占2个字节,所以地址步长为1对应AIW步长2
- 输入寄存器是只读的,主站不能写
- 模拟量输入值范围通常是0-32767(单极性)或-32768-32767(双极性)
- 实际可用的AIW数量取决于模拟量模块的路数
3.4 V存储区 → 4xxxx保持寄存器
V存储区的映射是可配置的,通过Modbus从站指令MBUS_INIT的两个参数定义:
- HoldStart:保持寄存器区的起始V地址(如&VB1000)
- MaxHold:保持寄存器区的字数(单位:字,即VW的数量)
映射规则:
| Modbus地址 | S7-200 SMART地址 | 说明 |
|---|---|---|
| 40001 | VW[HoldStart] | 第1个保持寄存器 |
| 40002 | VW[HoldStart + 2] | 第2个保持寄存器 |
| 40003 | VW[HoldStart + 4] | 第3个保持寄存器 |
| 40004 | VW[HoldStart + 6] | 第4个保持寄存器 |
| … | … | 依次类推,步长为2字节 |
| 400XX | VW[HoldStart + 2 × (XX – 1)] | 第XX个保持寄存器 |
完整示例:如果HoldStart = &VB1000,MaxHold = 100
| Modbus地址 | V存储区地址 | 字节范围 | 说明 |
|---|---|---|---|
| 40001 | VW1000 | VB1000-VB1001 | 第1个保持寄存器 |
| 40002 | VW1002 | VB1002-VB1003 | 第2个保持寄存器 |
| 40003 | VW1004 | VB1004-VB1005 | 第3个保持寄存器 |
| 40004 | VW1006 | VB1006-VB1007 | 第4个保持寄存器 |
| 40005 | VW1008 | VB1008-VB1009 | 第5个保持寄存器 |
| … | … | … | … |
| 40100 | VW1198 | VB1198-VB1199 | 第100个保持寄存器(最后一个) |
功能码:
- 读保持寄存器:功能码03
- 写单个寄存器:功能码06
- 写多个寄存器:功能码16(0x10)
注意事项:
- V存储区映射是可配置的,通过MBUS_INIT指令的HoldStart和MaxHold参数设置
- HoldStart必须指向VB地址,如&VB1000
- MaxHold的单位是字(VW),不是字节(VB)
- 保持寄存器区域不能与PLC程序中已使用的V存储区冲突
- 如果MaxHold设为100,则占用VB1000-VB1199共200个字节
四、PLC从站配置步骤
4.1 安装Modbus从站指令库
- 打开STEP 7-Micro/WIN SMART编程软件
- 在指令树中找到「库」文件夹
- 如果没有Modbus Slave库,需要先导入:右键「库」→「导入库」→ 选择Modbus Slave库文件
- 库文件通常在西门子官方网站下载,名称为「Modbus Slave」
4.2 调用MBUS_INIT指令初始化从站
在第一个扫描周期(SM0.1)调用MBUS_INIT指令,参数说明如下:
| 参数名 | 取值范围 | 说明 |
|---|---|---|
| Mode | 0 / 1 | 0=禁用Modbus从站,恢复为普通自由口;1=启用Modbus从站 |
| Baud | 1200-115200 | 波特率,常用值:9600、19200、38400、115200 |
| Parity | 0 / 1 / 2 | 校验方式:0=无校验,1=奇校验,2=偶校验 |
| Port | 0 / 1 | 通讯端口:0=板载RS485口,1=信号板SB CM01的RS485口 |
| SlaveAddr | 1-247 | Modbus从站地址,同一总线不能重复 |
| HoldStart | &VBxxx | 保持寄存器区起始V地址指针,如&VB1000 |
| MaxHold | 0-10000 | 保持寄存器区字数(单位:字),如100表示100个VW |
| Done | BOOL | 初始化完成标志位 |
| Error | BYTE | 错误代码 |
4.3 主轮询MBUS_SLAVE指令
在主程序循环中,每个扫描周期都要调用MBUS_SLAVE指令:
- 该指令负责处理Modbus主站发来的请求
- 如果不调用,从站将无法响应主站
- 参数:Done(完成标志)、Error(错误代码)
4.4 配置V存储区数据
在HoldStart指定的V地址区存放要读写的数据:
- 主站写过来的数据会存到这个区域
- PLC程序从这个区域读取数据进行处理
- 注意不要与程序中其他已使用的V地址冲突
五、PLC主站配置与读取示例
5.1 调用MBUS_CTRL指令初始化主站
在第一个扫描周期(SM0.1)调用MBUS_CTRL指令初始化Modbus主站:
| 参数名 | 取值范围 | 说明 |
|---|---|---|
| Mode | 0 / 1 | 0=禁用Modbus主站,1=启用Modbus主站 |
| Baud | 1200-115200 | 波特率,必须与从站一致 |
| Parity | 0 / 1 / 2 | 校验方式,必须与从站一致 |
| Port | 0 / 1 | 通讯端口:0=板载RS485,1=信号板 |
| Timeout | 1-32767 ms | 等待从站响应的超时时间,建议1000ms |
| Done | BOOL | 初始化完成标志位 |
| Error | BYTE | 错误代码 |
5.2 调用MBUS_MSG指令发起读写请求
MBUS_MSG指令用于发起一次Modbus读写请求:
| 参数名 | 取值范围 | 说明 |
|---|---|---|
| First | BOOL | 首次执行脉冲,检测到上升沿时发起请求 |
| Slave | 1-247 | 从站地址 |
| RW | 0 / 1 | 0=读请求,1=写请求 |
| Addr | Modbus地址 | 要访问的Modbus地址,如40001表示读保持寄存器第1个 |
| Count | 1-120 | 读写的寄存器/线圈数量 |
| DataPtr | &VBxxx | 数据缓冲区指针,如&VB2000 |
| Done | BOOL | 本次请求完成标志位 |
| Error | BYTE | 错误代码 |
5.3 读取保持寄存器示例
假设要读取地址为1的从站设备的10个保持寄存器(40001-40010):
- First:用一个脉冲信号触发
- Slave:1
- RW:0(读)
- Addr:40001
- Count:10
- DataPtr:&VB2000
读取成功后,VB2000开始的20个字节中存放了10个寄存器的数据。
六、常见问题与排障指南
6.1 通讯无响应,从站不回话
- 检查接线:RS485的A+和B-是否接反,这是最常见的错误
- 检查参数一致性:主从站的波特率、数据位、停止位、校验位必须完全一致
- 检查从站地址:SlaveAddr是否正确,总线上不能有重复地址
- 测量总线电压:A线(D+)应高于B线(D-)约200mV以上
- 检查终端电阻:总线两端是否加了120Ω终端电阻(距离远时需要)
- 检查Port参数:是否选对了通讯端口(0或1)
6.2 读不到数据或数据不对
- 检查地址格式:Modbus地址有1-based和0-based两种写法,注意区分
- 检查HoldStart:确认保持寄存器起始地址设置是否正确
- 检查MaxHold:确认保持寄存器数量是否足够
- 检查地址范围:要读的地址是否在MaxHold定义的范围内
- 检查字节序:32位数据的高低字顺序是否与主站匹配
6.3 数据乱码或数值不对
- 检查数据格式:确认是16位整数、32位整数还是浮点数
- 检查字节序:大端序(Big-Endian)和小端序(Little-Endian)是否一致
- 检查字序:32位数据的高低字顺序是否正确
- 检查缩放比例:是否需要乘以倍率(如0.1℃单位的要除以10)
- 检查负数处理:负数是用补码表示的,注意有符号数和无符号数的区别
6.4 偶发通讯失败
- 检查屏蔽线:RS485线是否用了屏蔽双绞线,屏蔽层是否单端接地
- 检查总线长度:9600bps下最大1200米,115200bps下最大约100米
- 检查从站数量:一条RS485总线最多挂32个从站(不带中继器)
- 检查电磁干扰:通讯线是否与动力线平行走线,是否有干扰源
- 检查超时设置:Timeout参数是否设得太小,适当调大试试
6.5 Error错误代码说明
| 错误代码 | 说明 | 解决方法 |
|---|---|---|
| 0 | 无错误 | – |
| 1 | 奇偶校验错误 | 检查校验位设置 |
| 2 | 波特率不支持 | 检查波特率参数 |
| 3 | 超时错误 | 检查接线、从站电源、超时设置 |
| 4 | 从站地址错误 | 检查SlaveAddr参数 |
| 5 | 确认未收到 | 从站无响应,检查接线和参数 |
| 10 | 网关错误 | 检查网关配置 |
七、总结
S7-200 SMART的Modbus地址映射规则清晰明了:
- 0xxxx线圈区域 → 对应Q区数字量输出,读写
- 1xxxx离散输入区域 → 对应I区数字量输入,只读
- 3xxxx输入寄存器区域 → 对应AIW模拟量输入,只读
- 4xxxx保持寄存器区域 → 对应V存储区,可配置,读写
掌握这个映射关系,就能快速实现S7-200 SMART与第三方设备的Modbus RTU通信。实际应用中,建议先用Modbus Poll等调试软件测试通讯,确认地址映射正确后再编写PLC程序。
八、相关链接
- Modbus RTU通讯基础教程
- Modbus功能码详解
- 西门子S7-200 SMART Modbus主站配置实例
- RS485总线接线规范
发表回复