当前位置: 首页 > news >正文

(十八)西门子S7-1200 PLC Modbus通讯功能介绍

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

S7-1200 和 S7-200 SMART 不太一样。

200 SMART 的 Modbus 现场印象,更多是 RS485、RTU、主站库、从站库。

到了 S7-1200,第一反应应该先看以太网。

S7-1200 CPU 自带 PROFINET 接口,西门子在 TIA Portal 里提供了MB_CLIENTMB_SERVER指令,用来做 Modbus TCP 通讯。也就是说,很多 S7-1200 项目不需要额外加网关,就可以通过 CPU 的网口和上位机、边缘采集程序、另一台 PLC 或支持 Modbus TCP 的设备通讯。

但这里有一个现场非常容易混的点:

PLC 能 ping 通,不等于 Modbus TCP 已经开了。

TIA Portal 能在线监控变量,也不等于 YModbus 能直接读 PLC。

西门子的 S7 通讯、TIA 在线监控、HMI 通讯和 Modbus TCP 是几件不同的事情。YModbus 要连 S7-1200,PLC 程序里必须真的配置并运行 Modbus TCP Server,或者项目里通过其它方式把数据暴露成 Modbus。

下面专门讲 S7-1200 的 Modbus 通讯能力,以及用 YModbus 联调时应该怎么切入。

S7-1200能做哪些Modbus角色

S7-1200 常见有三类 Modbus 角色。

第一类,S7-1200 做 Modbus TCP Server。

这是上位机最常遇到的结构。PLC 监听一个 TCP 端口,外部主站来读写 PLC 暴露出来的寄存器。

比如:

  • YModbus 读取 S7-1200 的产量、状态、报警码
  • MES 或边缘网关采集 PLC 数据
  • 触摸屏或另一套控制系统通过 Modbus TCP 读写少量参数

这时 PLC 侧通常使用MB_SERVER

第二类,S7-1200 做 Modbus TCP Client。

这时 PLC 主动连接别人的 Modbus TCP Server。

比如:

  • S7-1200 主动读取一台电表
  • S7-1200 主动写入一台变频器的控制寄存器
  • S7-1200 和另一台支持 Modbus TCP Server 的控制器交换数据

这时 PLC 侧通常使用MB_CLIENT

第三类,S7-1200 做 Modbus RTU Master 或 Slave。

这时就不是直接用 CPU 网口了,而是通过 PtP 通信模块或通信板走 RS485 / RS232。端口先由MB_COMM_LOAD配置,然后再由MB_MASTERMB_SLAVE通讯。

所以 S7-1200 不是“只能 TCP”,但 TCP 是它最顺手的方向;RTU 要先看硬件有没有配对应的通信模块或通信板。

S7-1200做Modbus TCP Server

如果你希望 YModbus 读取 S7-1200,最常见的做法是让 S7-1200 做 Modbus TCP Server。

PLC 侧的思路大概是这样:

  1. 在 TIA Portal 里调用MB_SERVER
  2. MB_SERVER配置连接 ID、端口、实例 DB。
  3. 准备一块全局 DB,作为 Holding Register 数据区。
  4. MB_HOLD_REG指向这块数据区。
  5. 在 OB1 或循环调用的 FB 里持续执行MB_SERVER

这块 Holding Register 数据区,就是外部 Modbus 主站看到的保持寄存器。

举个很朴素的例子。

PLC 程序里准备一个数据区,里面放:

寄存器 0:设备状态 寄存器 1:当前产量 寄存器 2:报警代码 寄存器 3:目标速度

YModbus 读 Holding Register 地址0,读到的就是这块映射区的第一个寄存器。

这里不要把 S7-1200 的 DB 地址和 Modbus 地址直接画等号。

比如 PLC 里是DB10.DBW0,这不代表 Modbus 地址就是10100。真正的关系取决于MB_SERVERMB_HOLD_REG指到了哪块数据,以及你从这块数据的哪个位置开始读。

现场第一次联调时,我通常让 PLC 工程师先放几个固定值:

Holding Register 0 = 1234 Holding Register 1 = 5678 Holding Register 2 = 100 Holding Register 3 = 0

上位机先只读这 4 个寄存器。

固定值能读对,再谈产量、温度、速度、浮点数和报警位。固定值都读不到,就先别急着调业务逻辑。

YModbus读取S7-1200 TCP Server

假设 S7-1200 的 IP 是192.168.1.20,Modbus TCP 端口是502,UnitId 先按1测试。

YModbus 代码可以这样写:

usingYModbus.Clients;awaitusingModbusClientclient=awaitModbusClientFactory.CreateTcpAsync(host:"192.168.1.20",port:502,unitId:1,readTimeoutMilliseconds:3000,writeTimeoutMilliseconds:3000);ushort[]registers=awaitclient.ReadHoldingRegistersAsync(startAddress:0,quantity:4);Console.WriteLine(registers[0]);Console.WriteLine(registers[1]);Console.WriteLine(registers[2]);Console.WriteLine(registers[3]);

CLI 先测会更快:

ymodbusread-holding-registers--host 192.168.1.20--port 502--unit-id 1--address 0--quantity 4

如果返回值正好是 PLC 里放的123456781000,说明这条链路已经通了。

如果超时,先查这些点:

  • PLC 是否在 RUN
  • MB_SERVER是否被循环调用
  • TCP 端口是不是项目里配置的端口,常见是502,但也可能不是
  • 电脑和 PLC 是否在同一个网段
  • Windows 防火墙或交换机策略有没有挡住连接
  • PLC 是否允许这个连接资源
  • MB_SERVER的连接 ID 和实例 DB 是否独立

如果能连接但返回异常,重点看:

  • 读的功能码是否匹配,比如读 Holding Register 应该对应03
  • 起始地址是否越界
  • 数量是否超过 PLC 侧映射区
  • MB_HOLD_REG指向的数据区是否正确
  • 全局 DB 是否按 Siemens 文档要求配置为可用于 Modbus 映射的形式

很多现场问题不是代码错,而是“以为地址 0 有数据,实际 PLC 映射区根本没从那里开始”。

S7-1200做Modbus TCP Client

S7-1200 也可以主动去读写外部 Modbus TCP Server。

这时 PLC 侧使用MB_CLIENT

比如一台 S7-1200 要读取一台智能电表:

电表 IP:192.168.1.50 端口:502 UnitId:1 读保持寄存器地址:0 读取数量:10

PLC 程序里由MB_CLIENT建立连接、发送请求、接收响应。上位机这边就不再是主站读取 PLC,而是可能需要扮演一个 Modbus TCP Server 给 PLC 测试。

这点很重要。

如果 PLC 已经是MB_CLIENT,它在主动请求别人。你再用 YModbus 的 Client 去连 PLC,方向就反了。

这种场景下,YModbus 更适合拿来做模拟从站或模拟服务器:

  • PLC 程序还没接真实电表时,用 YModbus 模拟电表
  • PLC 要写变频器寄存器时,用 YModbus 先接收写入请求
  • PLC 工程师调MB_CLIENT时,用 YModbus 看请求地址、功能码和数据是否正确

方向判断可以很简单:

PLC 程序里如果用的是MB_SERVER,YModbus 多半用 Client 去读它。

PLC 程序里如果用的是MB_CLIENT,YModbus 多半要用 Slave / Server 去等它读。

TCP多连接不要混用一个实例

S7-1200 做多个 Modbus TCP 连接时,要特别注意连接 ID 和实例。

西门子的示例里也强调,MB_CLIENTMB_SERVER是按连接调用的;不同连接要有自己的 ID 和实例数据。

现场很常见的错误是:

第一个连接能通,第二个连接一加上就乱。

或者一个上位机能读,另一个上位机一连进来,状态码开始跳。

这时不要只盯着网线和交换机,PLC 程序结构也要检查:

  • 每个连接有没有独立 ID
  • 每个MB_CLIENT/MB_SERVER调用有没有独立实例 DB
  • 多个请求有没有被同一个触发位同时打爆
  • 错误状态STATUS有没有被记录下来

如果只是一个上位机读取 PLC,先把结构做简单。一个MB_SERVER,一个 Holding Register 映射区,一组固定值。等这条链路稳定以后,再扩展多连接和更多数据区。

S7-1200做Modbus RTU

有些设备现场没有以太网,只能 RS485。

这时 S7-1200 可以通过 PtP 通信模块或通信板做 Modbus RTU。

常见流程是:

  1. 安装并配置 RS485 / RS232 通信硬件。
  2. 使用MB_COMM_LOAD配置端口、波特率、校验、停止位等参数。
  3. PLC 做主站时调用MB_MASTER
  4. PLC 做从站时调用MB_SLAVE

MB_COMM_LOAD这一步不要省。

它不是一个摆设。端口没有按 Modbus RTU 配好,后面的MB_MASTERMB_SLAVE就没有一个可靠的通信基础。

RTU 现场更容易出“看起来像程序问题,其实是物理层问题”的情况:

  • A/B 线接反
  • 没有公共参考地
  • 终端电阻不合适
  • 波特率不一致
  • 校验位不一致
  • SlaveId 写错
  • 多个主站同时抢同一条总线
  • PLC 程序里端口已经被另一个通信功能占用

如果 S7-1200 作为 RTU 从站,YModbus 可以这样读:

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

对应 C# 代码:

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,4);

如果 S7-1200 是 RTU 主站,YModbus 就要反过来做 RTU 从站模拟器。这样可以先不接真实仪表,只验证 PLC 发出来的地址、功能码和写入值。

地址从0还是从40001开始

这类问题在 S7-1200 上也绕不开。

Modbus 协议帧里的地址通常是从0开始的。

很多设备手册里写的显示地址会从40001开始。

所以:

YModbus 地址 0 通常对应显示地址 40001 YModbus 地址 1 通常对应显示地址 40002 YModbus 地址 10 通常对应显示地址 40011

但这只是 Modbus 地址显示习惯,不是 S7-1200 的 DB 地址规则。

真正联调时,最稳的办法还是让 PLC 侧放固定值,然后从01这些地址开始小范围读取。

如果读地址0不对,不要马上把所有地址都加40001。先问清楚 PLC 侧MB_HOLD_REG映射的是哪块 DB、从哪个字开始、数据类型是字还是双字。

浮点数和字节序

S7-1200 里很多工程量会用Real

Modbus Holding Register 一次读出来是 16 位寄存器。一个 32 位浮点数通常占两个寄存器。

所以联调浮点数时要同时确认三件事:

  • PLC 侧这个值到底是不是按两个连续寄存器暴露
  • 高字在前还是低字在前
  • 字节序是否和上位机解析方式一致

YModbus 里可以先把原始寄存器打印出来,不要一上来就转浮点数。

比如读到:

寄存器 0 = 17142 寄存器 1 = 59769

先把这两个原始值记录下来,再用RegisterConverter尝试不同的字序。这样和 PLC 工程师沟通时,有证据,不是只说“温度不对”。

现场调试最怕一句话:“读出来是乱的。”

更有用的说法是:

我从地址0读了两个寄存器,原始值是1714259769。按 AB CD 解析是12.34,按 CD AB 解析就不对。

这样 PLC 侧和上位机侧很快就能对上。

一个推荐的联调顺序

第一次接 S7-1200,我建议按这个顺序走:

  1. 先确认 PLC 到底是MB_SERVERMB_CLIENTMB_SLAVE还是MB_MASTER
  2. 如果是 TCP,先确认 IP、端口和 UnitId。
  3. 如果是 RTU,先确认通信模块、串口参数、站号和接线。
  4. 让 PLC 侧放 2 到 4 个固定寄存器值。
  5. 用 YModbus CLI 先读一个寄存器。
  6. 再读多个寄存器。
  7. 再接入 C# 程序。
  8. 最后再处理浮点数、位状态、报警字和写入控制。

这样做看起来慢,其实最快。

因为它把问题拆开了:先证明链路,再证明地址,再证明数据类型,最后才证明业务逻辑。

小结

S7-1200 的 Modbus 能力可以简单记成一句话:

以太网走MB_CLIENT/MB_SERVER,串口 RTU 走MB_COMM_LOADMB_MASTER/MB_SLAVE

YModbus 能不能连,关键不在“它是不是西门子 PLC”,而在 PLC 端有没有把数据按 Modbus 的角色和地址暴露出来。

如果 S7-1200 做 Modbus TCP Server,YModbus 就用 TCP Client 去读。

如果 S7-1200 做 Modbus TCP Client,YModbus 就更适合做 Server / Slave 模拟器配合它测试。

如果走 RTU,先把通信模块、端口参数和接线查清楚,再谈代码。

把方向分清楚,S7-1200 的 Modbus 通讯其实很好调。最怕的是还没确认MB_SERVER有没有运行,就开始怀疑 UnitId、浮点数和 C# 代码。

参考资料

  • Siemens: Modbus/TCP with instructions MB_CLIENT and MB_SERVER
  • Siemens: MODBUS-TCP using the instructions MB_CLIENT and MB_SERVER
  • Siemens: MB_CLIENT communicates via PROFINET as a Modbus TCP client
  • Siemens: MB_SERVER communicates via PROFINET as a Modbus TCP server
  • Siemens: MB_COMM_LOAD configures a PtP port for Modbus RTU
  • Siemens: MB_MASTER communicates using the PtP port as Modbus RTU master
  • Siemens: MB_SLAVE communicates using the PtP port as Modbus RTU slave
http://www.rkmt.cn/news/1524225.html

相关文章:

  • 用结构化合成数据解剖Transformer注意力机制
  • 3步智能激活:KMS_VL_ALL_AIO全版本Windows与Office一键解决方案
  • ByteDexter 嵌入式系统的底层实现方案,包含三个核心模块:1) 动态内存池管理,采用固定块分配机制,支持最小64字节粒度,具有碎片整理和优先级分配功能;2) 硬件随机数生成器配置,包含熵源采集
  • MPC823 CPM DSP功能解析:嵌入式通信系统的片上信号处理引擎
  • 3分钟免费解锁B站视频解析终极方案:从零到精通的完整指南
  • 2026年6月武汉品牌首饰回收优选指南 七家实力平台全面解析,谁是你手中珍品的最佳归宿? - 薛定谔的梨花猫
  • 济南劳力士手表回收综合实力排名:四大维度正向盘点,谁在领跑? - 薛定谔的梨花猫
  • S8.2习惯养成机制——让产品成为用户日常不可或缺的一部分
  • 2026 中山黄金回收测评报告 整合本地九千余位变现用户打分门店 - 靖昱黄金回收
  • 2026年6月杭州GEO机构筛选指南:十家头部优化公司综合实力对比 - 玖叁鹿
  • 2026唐山本土装修公司排行 深耕本地家装实力榜 - 装企自媒体训练营辉哥
  • 积家腕表官方售后服务体系全面升级(2026年6月最新发布) - 速递信息
  • 别再乱格式化了!U盘、移动硬盘、NAS到底该用FAT32、NTFS还是exFAT?
  • 三亚美食推荐:招牌脆皮烤乳猪 解锁地道海岛舌尖盛宴 - 速递信息
  • 终极歌词体验:如何在macOS上实现完美歌词同步的完整指南
  • 告别理论!手把手教你用毫米波雷达数据做目标跟踪(Python实战,含FMCW仿真)
  • 2026年6月靠谱的减脂训练营攻略,青少年减肥训练营/健身训练营/专业健身训练营/封闭式减肥训练营,减脂训练营怎么选择 - 品牌推荐师
  • B站视频下载终极指南:如何使用bilibili-downloader免费保存高清内容
  • 企业级KMS激活解决方案:分布式架构部署与自动化配置指南
  • 嵌入式I2C总线协议深度解析与MPC8323E实战配置指南
  • 实测对比:YOLOv8实例分割 vs 检测框,在动态SLAM中到底该选谁?
  • 2026 揭阳黄金回收测评报告 整合本地九千余位变现用户打分门店 - 靖昱黄金回收
  • 2026年6月沈阳首饰回收怎么选?同城探店总结,添价收一站式鉴定更省心 - 薛定谔的梨花猫
  • 3步深度实战:NGA论坛浏览效率进阶优化方案
  • 3步配置LyricsX:专业歌词显示工具在macOS的完整使用指南
  • 五大维度全面领跑,融景科技拿下 2026 广州 AI 搜索排名优化综合实力榜单第一名,树立行业标杆 - 广东科技观察
  • [智能体-414]:Coze是AI的应用使用平台,还是AI应用开发平台?还是AI应用发布平台?
  • 2026 湛江黄金回收测评报告 整合本地九千余位变现用户打分门店 - 靖昱黄金回收
  • 东莞翡翠回收 2026 门店评测,甄选靠谱商家拒绝恶意压价 - 薛定谔的梨花猫
  • 别再只做单目标定了!用MATLAB搞定双目标定,解锁三维重建与测距