(十六)YModbus连接PLC示例:西门子、三菱、汇川、台达怎么接
发布时间:2026/6/14 21:56:56
分类:文化教育
浏览:1234
YModbus连接PLC示例:西门子、三菱、汇川、台达怎么接)
GitHub 项目地址https://github.com/lidecong133/YModbus前面讲了 YModbus 怎么读写、怎么调试、怎么排查问题。这一篇更贴近现场一点如果对面是 PLC应该怎么连很多人一听 PLC就会直接问“西门子能不能连三菱能不能连汇川和台达呢”答案要分开说。YModbus 是 Modbus 通讯库。只要 PLC 端提供的是 Modbus TCP、Modbus RTU 或 Modbus ASCIIYModbus 就可以按 Modbus 去连。但如果 PLC 端用的是厂家自己的协议比如西门子的 S7 通讯、三菱的 MC / SLMP 通讯那就不是 Modbus 了不能拿 YModbus 硬连。这个边界一定要先讲清楚。先确认PLC端到底开了什么协议连接 PLC 前我一般先问三个问题。第一PLC 是当 Modbus Server / Slave还是当 Modbus Client / Master大多数上位机读取 PLC 的场景是 PLC 当从站或服务器YModbus 当主站去读。第二走 TCP 还是 RTUTCP 看 IP、端口、UnitId。RTU 看串口号、波特率、校验位、停止位、SlaveId。第三PLC 里的寄存器怎么映射到 Modbus 地址这一步最容易出问题。PLC 里的DB、D、M、V、VW、D100不一定直接等于 Modbus 地址100。有些要通过 PLC 参数或程序块做映射有些手册会给一张专门的 Modbus 地址表。所以不要只问“能不能连西门子”。更准确的问法是这台西门子 PLC 有没有配置 Modbus TCP Server保持寄存器地址 0 对应 PLC 里的哪块数据通用TCP连接模板PLC 作为 Modbus TCP Server 时YModbus 这样连usingYModbus.Clients;awaitusingModbusClientclientawaitModbusClientFactory.CreateTcpAsync(host:192.168.1.10,port:502,unitId:1,readTimeoutMilliseconds:3000,writeTimeoutMilliseconds:3000);ushort[]valuesawaitclient.ReadHoldingRegistersAsync(startAddress:0,quantity:10);先别急着读一大段。第一次建议只读一个最确定的地址ushort[]valuesawaitclient.ReadHoldingRegistersAsync(0,1);如果这个能通再扩大到 10 个、100 个。用 CLI 也可以先试ymodbusread-holding-registers--host 192.168.1.10--port 502--unit-id 1--address 0--quantity 1CLI 很适合做第一步验证。它能帮你判断到底是 YModbus 库代码问题还是 PLC 端配置、IP、端口、站号、地址的问题。通用RTU连接模板PLC 通过 RS485 做 Modbus RTU 从站时YModbus 这样连usingSystem.IO.Ports;usingYModbus.Clients;usingYModbus.Serial;usingSerialPortportnew(COM3){BaudRate9600,DataBits8,ParityParity.None,StopBitsStopBits.One,ReadTimeout3000,WriteTimeout3000};port.Open();awaitusingModbusClientclientModbusSerialClientFactory.CreateRtu(slaveId:1,serialPort:port,leaveOpen:true);ushort[]valuesawaitclient.ReadHoldingRegistersAsync(0,1);RTU 的坑通常不在代码里。更多是在这些地方COM 口选错USB 转 RS485 驱动异常波特率不一致校验位不一致停止位不一致SlaveId 不对A/B 线接反PLC 程序或参数里没有启用 Modbus RTU 从站如果 RTU 完全没响应不要第一时间改 C#。先把串口参数和接线查一遍。西门子PLC连接示例西门子 PLC 要先分清楚你是走 S7 协议还是走 Modbus。如果你用的是 S7-1200、S7-1500 这类 PLC很多项目默认会想到 S7 通讯。那不是 Modbus。YModbus 要连它PLC 端需要配置 Modbus TCP Server或者通过网关、通信模块把数据以 Modbus 方式暴露出来。一个典型思路是PLC IP192.168.1.10Modbus TCP 端口502或项目里配置的端口UnitId按 PLC Modbus 配置填写常见先试1Holding Register 地址0映射到 PLC 里某个数据区YModbus 读取awaitusingModbusClientclientawaitModbusClientFactory.CreateTcpAsync(host:192.168.1.10,port:502,unitId:1);ushort[]registersawaitclient.ReadHoldingRegistersAsync(0,10);现场我会先让 PLC 程序员在 PLC 里放几个固定值比如Holding Register 0 1234 Holding Register 1 5678上位机先读这两个固定值。如果固定值都读不到就不要急着讨论温度、压力、浮点数。先查 PLC 端 Modbus Server 有没有运行、端口有没有打开、地址映射有没有配对。西门子这边常见误区是PLC 在线、TIA Portal 能监控变量不代表 Modbus TCP 已经开了。S7 通讯能通也不代表 Modbus 能通。三菱PLC连接示例三菱 PLC 也要先分清协议。很多三菱项目会用 MC 协议、SLMP 协议或者通过 GX Works 监控 PLC。那些都不是 Modbus。如果要用 YModbus就要确认 PLC 本体、以太网模块、串口模块或网关已经启用了 Modbus TCP / RTU。一个 TCP 示例PLC IP192.168.1.20端口按三菱以太网或 Modbus 参数配置常见项目会用502UnitId按配置填写读取保持寄存器地址0awaitusingModbusClientclientawaitModbusClientFactory.CreateTcpAsync(host:192.168.1.20,port:502,unitId:1);ushort[]valuesawaitclient.ReadHoldingRegistersAsync(0,5);如果是 RTUawaitusingModbusClientclientModbusSerialClientFactory.CreateRtu(slaveId:1,serialPort:port,leaveOpen:true);ushort[]valuesawaitclient.ReadHoldingRegistersAsync(0,5);三菱现场容易混的是“D 寄存器地址”和“Modbus 保持寄存器地址”。比如 PLC 程序员说数据在D100不代表你一定填 Modbus 地址100。要看模块或 PLC 参数怎么把 D 区映射到 Modbus 保持寄存器。我的习惯是让 PLC 里先放一个很特别的测试值比如12345。然后从手册或配置表对应地址读它。不要一开始就读现场变化值因为变化值不容易判断你到底读对了没有。汇川PLC连接示例汇川 PLC 在国产设备里很常见很多项目会用 Modbus RTU也有以太网 Modbus TCP 的场景。如果是 TCP先确认 PLC 端启用了 Modbus TCP Server并确认端口和站号。示例awaitusingModbusClientclientawaitModbusClientFactory.CreateTcpAsync(host:192.168.1.30,port:502,unitId:1);ushort[]valuesawaitclient.ReadHoldingRegistersAsync(0,10);如果是 RS485 RTUusingSerialPortportnew(COM3){BaudRate9600,DataBits8,ParityParity.None,StopBitsStopBits.One,ReadTimeout3000,WriteTimeout3000};port.Open();awaitusingModbusClientclientModbusSerialClientFactory.CreateRtu(slaveId:1,serialPort:port,leaveOpen:true);ushort[]valuesawaitclient.ReadHoldingRegistersAsync(0,10);汇川现场常见问题也是地址映射。有些手册会写类似4x地址有些会写内部软元件地址。YModbus 里填的是 Modbus 协议地址也就是从0开始的地址。如果手册写40001通常先试地址0。如果 PLC 工程里写的是某个内部寄存器比如D0、D100要看它映射到 Modbus 后到底是地址几。别靠猜最好让 PLC 程序员给一张“Modbus 功能码 起始地址 数据类型”的表。台达PLC连接示例台达 PLC 很多场景会用 Modbus RTU尤其是 RS485 总线。也有通过以太网模块或内置以太网做 Modbus TCP 的项目。RTU 示例usingSerialPortportnew(COM4){BaudRate9600,DataBits8,ParityParity.None,StopBitsStopBits.One,ReadTimeout3000,WriteTimeout3000};port.Open();awaitusingModbusClientclientModbusSerialClientFactory.CreateRtu(slaveId:1,serialPort:port,leaveOpen:true);ushort[]valuesawaitclient.ReadHoldingRegistersAsync(0,10);TCP 示例awaitusingModbusClientclientawaitModbusClientFactory.CreateTcpAsync(host:192.168.1.40,port:502,unitId:1);ushort[]valuesawaitclient.ReadHoldingRegistersAsync(0,10);台达这类 PLC 接 RTU 时我会特别注意两件事。第一站号和通讯格式要在 PLC 端参数里确认不要只看程序。第二D、M 等内部软元件和 Modbus 地址之间的关系要按型号手册或工程配置确认。如果客户说“D100 里面有值”你要继续问“D100 对应 Modbus 保持寄存器地址多少”这个问题问清楚后面会省很多时间。四类PLC连接时的通用排查方法不管是西门子、三菱、汇川还是台达我都会按同一个顺序排查。先确认协议。是 Modbus TCP / RTU还是厂家专用协议如果不是 ModbusYModbus 不应该硬连。再确认角色。PLC 是 Server / Slave还是 Client / Master如果 PLC 也是主站而 YModbus 也是主站两边都在主动发请求就不会形成正常的一问一答。再确认地址映射。PLC 内部地址和 Modbus 地址不是一回事。一定要拿到功能码、起始地址、数据类型、字节序、比例系数。最后用最小请求验证。TCPymodbusread-holding-registers--host 192.168.1.10--port 502--unit-id 1--address 0--quantity 1RTUymodbusread-holding-registers--transport rtu--serial-port COM3--baud-rate 9600--data-bits 8--parity none--stop-bitsone--slave-id 1--address 0--quantity 1先读一个固定值。固定值能读到再谈批量读取、浮点数解析、轮询、写入。写入PLC前要更谨慎读 PLC 一般风险小一些。写 PLC 就不一样了。写一个保持寄存器可能是在改设定值。写一个线圈可能是在触发启动、复位、清报警。所以我建议第一次写入一定先对模拟从站做。确认主站工具或程序发出的功能码、地址、值都对再到真实 PLC 上测试。真实 PLC 上写入前至少确认写入地址是否允许写当前模式是否允许远程写写入值是否在安全范围是否需要写保存命令是否会触发设备动作写完能不能读回确认这不是保守是工业现场必须要有的习惯。我希望PLC程序员给什么表如果和 PLC 程序员配合我希望对方给的不是一句“你读 D100”。最好给这种表名称功能码Modbus地址PLC内部地址类型字序倍率读写当前温度030D100UInt16无0.1只读目标温度06/0310D110UInt16无0.1读写运行状态010M0Bool无1只读启动命令0510M10Bool无1写有了这张表上位机写起来很快。没有这张表只靠一句“寄存器在 D 区”现场就容易变成反复试地址。到这里连接不同品牌 PLC代码本身差别其实不大。TCP 都是 IP、端口、UnitId。RTU 都是串口参数、SlaveId。真正的差别在 PLC 端有没有启用 ModbusPLC 是主站还是从站内部软元件怎么映射到 Modbus 地址数据类型、字节序、倍率怎么定义这些确认清楚以后YModbus 连接西门子、三菱、汇川、台达写法都是同一套 Modbus 思路。