西门子 S7-200(包括 S7-200 CN、S7-200 SMART)与 Modbus 协议的地址映射核心是将 S7-200 内部寄存器(V 区、I 区、Q 区、AI/AQ 区等)转换为 Modbus 标准地址格式,Modbus 协议分 RTU/ASCII(串行)和 TCP 两种,其中 RTU 是工业场景最常用的,以下按 “映射规则 + 实操步骤 + 常见问题” 拆解,确保适配不同应用场景(如 S7-200 作为从站 / 主站)。
一、先明确核心概念:Modbus 地址格式
Modbus 协议用 “功能码 + 地址偏移量” 定义数据类型,而非直接使用 S7-200 的寄存器地址,常见功能码与数据类型对应:
| Modbus 功能码 | 数据类型 | 对应 S7-200 寄存器类型 | Modbus 地址表示(示例) |
|---|---|---|---|
| 01 | 离散输入(只读) | 输入继电器 I 区(I) | 00001~09999 |
| 02 | 线圈(读写) | 输出继电器 Q 区(Q) | 10001~19999 |
| 03 | 保持寄存器(读写) | 变量寄存器 V 区、模拟输出 AQ 区 | 40001~49999 |
| 04 | 输入寄存器(只读) | 模拟输入 AI 区 | 30001~39999 |
⚠️ 关键:Modbus 地址是 “1 起始”,而 S7-200 内部寄存器是 “0 起始”,映射时需做偏移量转换;且不同版本 Modbus 主站(如触摸屏、上位机)可能用 “无偏移地址”(如 40001 简写为 0001),需注意区分。
二、S7-200 作为 Modbus 从站(最常用:被触摸屏 / 上位机 / 其他 PLC 读写)
S7-200 通过自带的 Modbus RTU 从站库(MBUS_SLAVE 指令)实现地址映射,核心是将内部寄存器绑定到 Modbus 地址,步骤如下:
1. 基础映射规则(核心!)
| S7-200 内部寄存器 | Modbus 功能码 | Modbus 地址(1 起始) | 偏移量计算(关键) | 示例(S7-200→Modbus) |
|---|---|---|---|---|
| 输入继电器 I | 01(离散输入) | 00001~09999 | Modbus 地址 = I 地址 + 1 | I0.0 → 00001;I1.2 → 00013(I1.2=1×8+2=10 → 10+1=11?⚠️ 修正:I 区按 “位” 映射,I0.0=00001,I0.1=00002…I0.7=00008;I1.0=00009,I1.2=00011) |
| 输出继电器 Q | 02(线圈) | 10001~19999 | Modbus 地址 = Q 地址 + 1 | Q0.0 → 10001;Q2.5 → 10021(Q2.5=2×8+5=21 → 21+1=22?❌ 位映射:Q0.0=10001,Q0.7=10008;Q1.0=10009,Q2.5=10021) |
| 模拟输入 AI | 04(输入寄存器) | 30001~39999 | Modbus 地址 = AI 通道 + 1 | AIW0(通道 0)→ 30001;AIW2(通道 1)→ 30002;AIW4(通道 2)→ 30003(AI 区按 “字” 映射,每通道占 1 字) |
| 变量寄存器 V | 03(保持寄存器) | 40001~49999 | Modbus 地址 = V 字地址 + 1 | VW100 → 40101(VW100 是 V 区第 100 字 → 100+1=101);VW200 → 40201;AQW0 → 40001(AQ 区映射到 V 区起始位置,需在库中配置) |
⚠️ 重要补充:
2. 实操步骤(用 STEP 7-Micro/WIN 编程)
步骤 1:调用 Modbus 从站库
步骤 2:配置 MBUS_SLAVE 指令参数
MBUS_SLAVE指令参数定义映射范围,核心参数:
| 参数名 | 含义 | 示例值 |
|---|---|---|
| EN | 使能(常 ON 即可) | SM0.0 |
| MODE | 模式:0 = 禁用,1 = 启用 Modbus 从站 | 1 |
| BAUD | 波特率(需与主站一致) | 9600(SMB30 配置) |
| PARITY | 校验位:0 = 无,1 = 奇,2 = 偶(与主站一致) | 2(偶校验) |
| SLAVE | 从站地址(1~247,主站需匹配) | 1 |
| MB_ADDR | Modbus 保持寄存器起始地址(对应 V 区起始字) | &VB0(V 区起始) |
| MB_LEN | 保持寄存器长度(字,最大 100) | 100(VW0~VW99) |
| DONE | 完成标志(BOOL) | M0.0 |
| ERROR | 错误码(BYTE) | MB0 |
⚠️ 示例:若设置MB_ADDR=&VB100、MB_LEN=50,则 Modbus 保持寄存器 40101 对应 VW100,40102 对应 VW102,…,40150 对应 VW198(每字占 2 字节)。
步骤 3:配置串口参数
S7-200 的通讯口(PORT0/PORT1)需与 Modbus 参数匹配,在主程序开头添加串口配置:
ladder
LD SM0.1 // 首次扫描 MOVB 16#09, SMB30 // PORT0:9600波特率、偶校验、8数据位、1停止位 // 16#09解析:二进制00001001 → 波特率9600(001)、偶校验(10)、8位数据位
步骤 4:验证映射
三、S7-200 作为 Modbus 主站(读写其他从站:如变频器、传感器)
S7-200 通过MBUS_MASTER指令实现主站功能,核心是将 Modbus 从站地址映射到 S7-200 内部寄存器,步骤如下:
1. 核心映射逻辑
主站需指定 “从站地址 + 功能码 + Modbus 地址 + 目标 S7-200 寄存器”,示例:
2. MBUS_MASTER指令参数
| 参数名 | 含义 | 示例值 |
|---|---|---|
| EN | 触发信号(上升沿有效) | M0.1 |
| MODE | 操作模式:0 = 读,1 = 写 | 0(读) |
| SLAVE | 从站地址 | 1 |
| FUNC | Modbus 功能码(01/02/03/04/05/16 等) | 3(读保持寄存器) |
| MB_ADDR | Modbus 起始地址(1 起始) | 1(对应 40001) |
| MB_LEN | 读取 / 写入长度(位 / 字,功能码 01/02 按位,03/04/16 按字) | 1 |
| DATA_PTR | 数据指针(S7-200 内部寄存器地址) | &VW200 |
| DONE | 完成标志 | M0.2 |
| ERROR | 错误码 | MB1 |
示例:读取从站 1 的 AI 值(Modbus 30001)存入 VW200
ladder
LD M0.0 // 触发信号(上升沿) CALL MBUS_MASTER, // 调用主站指令 1, // MODE=1?❌ MODE=0(读) 1, // SLAVE=1 4, // FUNC=4(读输入寄存器) 1, // MB_ADDR=1(30001) 1, // MB_LEN=1 &VW200, // DATA_PTR=VW200 M0.2, // DONE=M0.2 MB1 // ERROR=MB1
四、常见问题与避坑
五、S7-200 SMART 的简化映射(补充)
S7-200 SMART 支持 “Modbus 地址直接映射”,无需调用库指令,在 “系统块”→“通讯端口”→“Modbus RTU 从站” 中:
总结
S7-200 Modbus 地址映射的核心是:
若需针对具体场景(如 S7-200 与台达触摸屏 Modbus 通讯、S7-200 读写变频器参数)的映射示例(含程序片段),可补充需求进一步细化。

