news 2026/6/14 21:55:05

(十七)西门子S7-200 SMART PLC Modbus通讯功能介绍

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
(十七)西门子S7-200 SMART PLC Modbus通讯功能介绍

GitHub 项目地址:https://github.com/lidecong133/YModbus

S7-200 SMART 在小型设备、单机设备、改造项目里很常见。

现场经常会遇到这种问题:

“我有一台 200 SMART,能不能用 Modbus 和上位机、变频器、伺服、仪表通讯?”

答案是可以,但要先分清方向。

S7-200 SMART 的 Modbus 通讯,最常见的是通过 RS485 做 Modbus RTU。它既可以作为主站去读写外部从站,也可以作为从站被上位机或触摸屏读取。

但它不是“只要 PLC 在线就等于 Modbus 能通”。PLC 端必须配置对应的 Modbus 库、通讯端口、站号、波特率、校验位、保持寄存器区等内容。

下面按主站、从站、地址映射和 YModbus 联调几个角度,把这个功能讲清楚。

先分清:谁是主站,谁是从站

Modbus 通讯里,一定有主动发请求的一方,也有被动响应的一方。

在 S7-200 SMART 项目里,常见有两种结构。

第一种,S7-200 SMART 当 Modbus 主站。

比如 PLC 通过 RS485 去控制变频器、伺服驱动器、温控表、称重仪表。

这时 PLC 主动发请求:

  • 读变频器状态字
  • 写变频器控制字
  • 写速度设定值
  • 读仪表当前值
  • 写仪表参数

第二种,S7-200 SMART 当 Modbus 从站。

比如上位机、触摸屏、边缘网关、采集程序来读取 PLC 数据。

这时 YModbus 或其他主站工具主动读 PLC:

  • 读 PLC 的 Q 输出状态
  • 读 PLC 的 I 输入状态
  • 读模拟量
  • 读写 V 区映射出来的保持寄存器

这两个方向完全不一样。

如果 PLC 当主站,YModbus 不能也当主站直接去跟同一个从站抢通讯。

如果 YModbus 要读 PLC,PLC 端就要配置成 Modbus 从站或 Modbus TCP Server 这一类角色。

S7-200 SMART做Modbus RTU主站

S7-200 SMART 做 RTU 主站时,常见使用 Modbus 主站库。

主站侧通常会用到:

  • MBUS_CTRL
  • MBUS_MSG

MBUS_CTRL用来初始化和管理 Modbus 通讯端口。

MBUS_MSG用来执行具体读写请求。

比如 S7-200 SMART 控制一台变频器,PLC 会通过MBUS_MSG写控制字、写频率设定,再通过另一个请求读状态字和实际速度。

现场要注意一件事:不要多个MBUS_MSG同时触发。

更稳的做法是轮询。

第一个请求完成以后,再触发第二个请求;第二个请求完成以后,再触发第三个请求。每个请求看DoneError,不要所有读写块一起使能。

很多人第一次写程序,会把几个MBUS_MSG都接到常开位上。结果就是通讯乱、错误码乱、偶尔能通偶尔不通。

我的习惯是用一个步骤号或计数器控制请求顺序:

步骤 0:读状态字 步骤 1:读实际速度 步骤 2:写控制字 步骤 3:写设定值 完成后回到步骤 0

这样现场看起来很清楚,也方便定位到底是哪一步报错。

主站常见参数

S7-200 SMART 做 Modbus 主站时,最容易配错的是这些参数:

参数说明
Mode是否启用 Modbus 协议功能
Baud波特率
Parity校验方式
Port使用 CPU 自带 RS485 口,还是 CM01 信号板
Timeout等待从站响应的时间
Slave目标从站地址
RW读还是写
Count读写的数据个数
DataPtr数据缓冲区指针

波特率、校验位、从站地址必须和对方设备一致。

Timeout 不要一开始设太短。变频器、伺服、仪表响应慢一点,或者总线上设备多一点,太短就会误判超时。

如果从站完全没响应,不要只看程序。先查 RS485 A/B 线、终端电阻、站号、波特率、校验位。

S7-200 SMART做Modbus RTU从站

S7-200 SMART 做 RTU 从站时,常见使用从站库。

从站侧通常会用到:

  • MBUS_INIT
  • MBUS_SLAVE

MBUS_INIT用来初始化从站参数。

MBUS_SLAVE用来在扫描周期里持续处理主站请求。

这时 YModbus 可以作为主站来读 S7-200 SMART。

比如:

ymodbusread-holding-registers--transport rtu--serial-port COM3--baud-rate 9600--data-bits 8--parity none--stop-bitsone--slave-id 1--address 0--quantity 10

如果能读到,说明 YModbus 主站和 S7-200 SMART 从站通讯正常。

如果读不到,就先看 PLC 的MBUS_INIT参数:站号、波特率、校验位、端口、保持寄存器区起始地址和长度。

从站地址怎么映射

S7-200 SMART 做 Modbus RTU 从站时,地址映射很重要。

常见映射思路是:

Modbus地址类型S7-200 SMART数据区
00001开始Q 输出点
10001开始I 输入点
30001开始AI 模拟量输入
40001开始V 存储区映射出来的保持寄存器

这里最容易错的是保持寄存器。

保持寄存器不是自动等于所有 V 区。

从站库里通常要指定保持寄存器区的起始地址,比如从某个VB开始。这个地址作为 Holding Register 的缓冲区。

举个例子。

如果 PLC 端把保持寄存器区设置为从VB1100开始,那么 Modbus 保持寄存器40001通常对应这个缓冲区的第一个字,也就是VW1100

YModbus 里读保持寄存器地址0

ushort[]values=awaitclient.ReadHoldingRegistersAsync(0,10);

对应的就是 Modbus 显示地址40001开始的 10 个保持寄存器。

不要把 PLC 里的VW100直接想成 Modbus 地址100

中间还有“保持寄存器缓冲区从哪里开始”这个映射关系。

S7-200 SMART从站支持哪些常用功能码

作为 Modbus RTU 从站时,常见会用这些功能码:

功能码作用常见访问对象
01读线圈Q 输出点
02读离散输入I 输入点
03读保持寄存器V 区保持寄存器缓冲区
04读输入寄存器AI 模拟量
05写单个线圈Q 输出点
06写单个保持寄存器V 区保持寄存器缓冲区
15写多个线圈Q 输出点
16写多个保持寄存器V 区保持寄存器缓冲区

实际支持范围和限制,要以你使用的 S7-200 SMART 系统手册、库版本和 STEP 7-Micro/WIN SMART 帮助为准。

比如批量读写数量、Q 点写入是否被用户程序覆盖、保持寄存器缓冲区大小,都不是上位机单方面能决定的。

和YModbus怎么配合

如果 S7-200 SMART 已经配置成 Modbus RTU 从站,YModbus 作为主站可以这样读:

usingSystem.IO.Ports;usingYModbus.Clients;usingYModbus.Serial;usingSerialPortport=new("COM3"){BaudRate=9600,DataBits=8,Parity=Parity.None,StopBits=StopBits.One,ReadTimeout=3000,WriteTimeout=3000};port.Open();awaitusingModbusClientclient=ModbusSerialClientFactory.CreateRtu(slaveId:1,serialPort:port,leaveOpen:true);ushort[]values=awaitclient.ReadHoldingRegistersAsync(0,10);

用 CLI 先验证更方便:

ymodbusread-holding-registers--transport rtu--serial-port COM3--baud-rate 9600--data-bits 8--parity none--stop-bitsone--slave-id 1--address 0--quantity 10

如果 PLC 端配置的是偶校验,就要改:

--parity even

如果 PLC 站号不是 1,就改--slave-id

先把最小读取跑通,再去写上位机程序。

Modbus TCP要单独确认

S7-200 SMART 不同代际、不同固件和不同软件库,对 Modbus TCP 的支持方式不完全一样。

有些资料里会看到MB_CLIENTMB_SERVER这一类 Modbus TCP 指令,但不要把 S7-1200 / S7-1500 的用法直接搬到 S7-200 SMART 上。

比较稳妥的做法是:

  • 看你手里的 CPU 型号和固件版本
  • 看 STEP 7-Micro/WIN SMART 里是否有对应 Modbus TCP 指令或库
  • 看官方系统手册对应章节
  • 先用一个固定保持寄存器做最小测试

如果 S7-200 SMART 已经作为 Modbus TCP Server 开起来,YModbus TCP 读取方式就是:

awaitusingModbusClientclient=awaitModbusClientFactory.CreateTcpAsync(host:"192.168.1.10",port:502,unitId:1);ushort[]values=awaitclient.ReadHoldingRegistersAsync(0,10);

CLI 验证:

ymodbusread-holding-registers--host 192.168.1.10--port 502--unit-id 1--address 0--quantity 10

如果 TCP 端口不通,先不要查寄存器。先确认 PLC 端 Modbus TCP Server 是否真的启用、端口是否开放、防火墙或网络是否拦截。

一个实际调试例子

假设 PLC 程序员说:

“我把 10 个数据放在 V 区,给你按 Modbus 保持寄存器读。”

这句话还不够。

你要继续问:

  • S7-200 SMART 是 RTU 从站还是 TCP Server?
  • 站号是多少?
  • RTU 参数是多少?
  • 保持寄存器缓冲区从哪个 VB 开始?
  • Modbus 地址从40001开始吗?
  • 这 10 个值是什么类型?
  • 有没有倍率?
  • 有没有 32 位或浮点数?

如果对方说保持寄存器从VB1100开始,第一个值是VW1100 = 1234,站号是1,串口是9600,N,8,1

那你就可以先用 CLI 读:

ymodbusread-holding-registers--transport rtu--serial-port COM3--baud-rate 9600--data-bits 8--parity none--stop-bitsone--slave-id 1--address 0--quantity 1

读到1234,说明基本链路和映射都对。

如果读不到,再按顺序查:串口、站号、校验位、MBUS_INIT、MBUS_SLAVE、保持寄存器缓冲区、库内存分配。

库内存分配也会影响通讯

S7-200 SMART 使用 Modbus 库时,库本身需要占用 V 存储区。

保持寄存器缓冲区也会占用 V 存储区。

这两个区域不能重叠。

如果重叠,程序可能能编译,但运行时通讯异常、数据错乱、错误码莫名其妙。

所以分配库内存时,不要随便从VB0开始一路占用。最好规划清楚:

库使用区:例如 VB0 ~ VB800 保持寄存器区:例如 VB1100 ~ VB3100 用户变量区:避开以上区域

具体地址按你的项目和库提示来,不要照抄。

常见坑

S7-200 SMART Modbus 通讯里,我最常见到这些问题:

  • PLC 端没调用MBUS_SLAVE,上位机当然读不到
  • MBUS_INIT只初始化了,但后续没有持续处理请求
  • 波特率和校验位与上位机不一致
  • SlaveId 填错
  • RS485 A/B 接反
  • 保持寄存器缓冲区和库内存重叠
  • 40001当成 YModbus 地址40001
  • 把 PLC 内部VW100当成 Modbus 地址100
  • 多个MBUS_MSG同时触发,主站通讯混乱
  • Q 点被 Modbus 写入后,又被 PLC 用户程序覆盖

这些问题都很普通,但每一个都能让现场调试卡很久。

我建议的联调顺序

如果让我接一台 S7-200 SMART,我会这样做:

  1. 先确认 PLC 是 Modbus 主站还是从站
  2. 如果 YModbus 要读 PLC,确认 PLC 端从站库已经运行
  3. RTU 先确认串口参数和站号
  4. 让 PLC 放一个固定值到第一个保持寄存器
  5. 用 CLI 读地址0,数量1
  6. 读通后再读一段
  7. 再处理int32float、倍率、字节序
  8. 最后才考虑写入

写入前一定要确认这个寄存器是不是允许写。

尤其是写 Q 输出点或控制字时,不要拿真实设备乱试。

到这里

S7-200 SMART 的 Modbus 通讯功能不难,但它有几个关键点:

  • 主站用MBUS_CTRL/MBUS_MSG
  • 从站用MBUS_INIT/MBUS_SLAVE
  • RTU 参数必须一致
  • 保持寄存器通常映射到指定 V 区
  • YModbus 里的地址是从0开始的协议地址
  • 多个MBUS_MSG要轮询执行,不要同时触发
  • 库内存区和保持寄存器区不要重叠

这些弄清楚,S7-200 SMART 和 YModbus 配合起来就比较顺。

参考资料

  • Siemens:S7-200 SMART Modbus RTU Communication
  • Siemens:S7-200 SMART 与 G120 变频器 MODBUS RTU 通讯控制
  • Siemens:S7-200 Smart 通过 Modbus 通信实现 V90 的速度控制
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/14 21:50:00

PiliPlus终极指南:如何快速部署全平台B站第三方客户端

PiliPlus终极指南:如何快速部署全平台B站第三方客户端 【免费下载链接】PiliPlus PiliPlus 项目地址: https://gitcode.com/gh_mirrors/pi/PiliPlus PiliPlus是一款基于Flutter开发的开源B站第三方客户端,支持Android、iOS、Windows、Linux和macO…

作者头像 李华
网站建设 2026/6/14 21:32:39

083、测试用例补充:为遗留代码补充测试的 AI 辅助工作流与覆盖率提升

083、测试用例补充:为遗留代码补充测试的 AI 辅助工作流与覆盖率提升 上周五晚上十一点,线上告警把我从代码里拽出来。一个跑了三年的老服务突然报空指针,定位到一段没人敢动的遗留代码——OrderService.process() 方法,四百行,if-else 嵌套七层,没有一行单元测试。我盯着…

作者头像 李华