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

(二十二) 欧姆龙PLC Modbus通讯功能介绍

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

欧姆龙 PLC 做 Modbus,第一句话要先说清楚:

不要把欧姆龙的 FINS、EtherNet/IP、Host Link、上位链接、Socket 通讯都当成 Modbus。

很多欧姆龙项目里,HMI 能连,CX-Programmer 或 Sysmac Studio 能在线,甚至上位机能用 FINS 读写 PLC,都不代表 Modbus 已经打开。

YModbus 只按 Modbus 工作。

对面如果是 FINS,那就不是这套协议。对面如果是真正启用了 Modbus RTU 或 Modbus TCP,那 YModbus 才能作为主站、客户端、从站模拟器去配合。

欧姆龙系列很多,CP1、CP2E、CJ、CS、NJ、NX 的做法都不完全一样。这篇不按某一个型号硬套,而是按现场最容易遇到的几类结构讲。

先问清楚是哪一种欧姆龙PLC

欧姆龙 PLC 的 Modbus 能力,通常和系列、CPU 型号、通信板、通信单元、功能块有关。

现场可以先这样分:

系列或场景常见Modbus方式
CP1H / CP1L常见 Modbus-RTU Easy Master,用串口去读写外部从站
CP2E官方提供 Modbus RTU Master Function Block,也提供 Modbus TCP Server Function Block
CJ / CS常见通过串口通信单元、协议宏、样例程序或功能块做 Modbus
NJ / NX常见通过 Modbus TCP 指令、Socket 或库函数做客户端类通讯,具体看工程和版本
上位机想读 PLC要确认 PLC 是否真的配置成 Modbus TCP Server 或 Modbus RTU Slave

这里最容易误判的是最后一条。

欧姆龙 PLC 很多项目天然更偏 FINS 或 EtherNet/IP。你能用上位机读变量,不代表 YModbus 也能直接读。

所以不要只问:

“欧姆龙 PLC 能不能连?”

更准确的问法是:

这台 PLC 有没有运行 Modbus TCP Server?或者有没有配置成 Modbus RTU Slave?如果没有,它是不是只是用 Modbus RTU Master 去读外部设备?

欧姆龙做Modbus主站很常见

欧姆龙小型 PLC 项目里,最常见的是 PLC 做 Modbus 主站。

比如:

  • CP1H 通过 RS485 读取变频器
  • CP1L 读取温控表当前温度
  • CP2E 通过 Modbus RTU Master Function Block 读写仪表
  • CJ / CS 通过串口通信单元轮询多台从站

这时 PLC 是主动发请求的一方。

YModbus 如果也作为主站去抢同一条 RS485 总线,就会出问题。

这类场景里,YModbus 更适合做模拟从站。

举个例子。

PLC 工程师正在写欧姆龙程序,准备读取一台温控表:

从站号:1 功能码:03 起始地址:0 数量:2

真实温控表还没到,或者现场不方便接。

你可以先打开 YModbus 从站工具,模拟一个 RTU 从站,在保持寄存器01里放固定值。

PLC 如果能读到这些固定值,说明 PLC 端的站号、功能码、地址、数量、串口参数基本没问题。

这样比三个人围着一台真实仪表猜线序快得多。

CP2E做Modbus TCP Server

如果你希望上位机读取欧姆龙 PLC,最舒服的结构是 PLC 做 Modbus TCP Server。

CP2E 这一类机型,欧姆龙官方提供了 Modbus TCP Server Function Block。它的作用是让 PLC 自动响应主机 PC 或其它 PLC 的 Modbus TCP 访问,把外部请求映射到 Work Area 或 Data Memory Area。

这时 YModbus 可以作为 Modbus TCP Client 读取。

假设现场配置如下:

PLC IP:192.168.1.60 端口:502 UnitId:1 Holding Register 0:通信测试值,固定 1234 Holding Register 1:设备状态 Holding Register 2:报警代码

YModbus 代码可以这样写:

usingYModbus.Clients;awaitusingModbusClientclient=awaitModbusClientFactory.CreateTcpAsync(host:"192.168.1.60",port:502,unitId:1,readTimeoutMilliseconds:3000,writeTimeoutMilliseconds:3000);ushort[]values=awaitclient.ReadHoldingRegistersAsync(startAddress:0,quantity:3);

CLI 更适合第一步验证:

ymodbusread-holding-registers--host 192.168.1.60--port 502--unit-id 1--address 0--quantity 3

如果第一个值能读到1234,说明 TCP 链路、端口、UnitId、功能码和基本映射都通了。

如果读不到,先别改 C#。

先查这些点:

  • PLC 是否在 RUN
  • Modbus TCP Server Function Block 是否真的在执行
  • PLC IP 和端口是否正确
  • 端口是否被防火墙或交换机策略拦住
  • UnitId 是否和 PLC 配置一致
  • Holding Register 地址0是否真的映射到了测试值
  • 请求数量是否超过映射区

欧姆龙这里特别要注意:PLC 里写的是 Work Area、DM、CIO、WR、HR 这些区域,上位机读的是 Modbus 地址。

两者中间一定有映射关系。

不要把D100DM100直接当成 Modbus 地址100

CP2E做Modbus RTU主站

CP2E 官方也提供 Modbus RTU Master Function Block。

它用于 PLC 通过 RS485 直接读写变频器、仪表等 Modbus RTU 从站。

官方功能块覆盖常见的几类命令,比如读线圈、读保持寄存器、写单线圈、写单寄存器、写多寄存器。

这时 PLC 是主站。

YModbus 的推荐用法是做从站模拟器,而不是再做主站。

比如 PLC 要读地址01

  1. 在 YModbus 从站工具里启动 RTU 从站。
  2. SlaveId 设置成1
  3. 保持寄存器0 = 250
  4. 保持寄存器1 = 1000
  5. 让 CP2E 程序执行 Modbus RTU Master Function Block。

如果 PLC 能读到2501000,先证明 PLC 端请求是对的。

后面再换真实仪表。

如果 PLC 读不到,就看:

  • 串口参数是否一致
  • RS485 A/B 是否接反
  • SlaveId 是否一致
  • PLC 功能块是否被触发
  • 是否多个请求同时抢一个串口
  • 功能码和地址是否和模拟从站一致

串口 Modbus 最怕“一边猜程序,一边猜接线”。

先用模拟从站把 PLC 程序验证一遍,会省很多时间。

CP1H和CP1L的Easy Master

CP1H / CP1L 项目里,常见会看到 Modbus-RTU Easy Master。

它的思路是:PLC 程序把要执行的 Modbus 命令放到指定的数据区,再触发对应控制位,让 PLC 自动生成 Modbus RTU 请求。

这种方式很适合 PLC 主动控制外部设备。

比如:

  • 读温控表 PV
  • 写温控表 SV
  • 读变频器状态字
  • 写变频器频率设定

但它不是“让上位机随便读 PLC”。

如果 CP1H / CP1L 只是作为 Modbus RTU Master 去读外部从站,YModbus 不能直接把它当成从站来读。

YModbus 更适合模拟它要访问的仪表或变频器。

如果你的需求是上位机读取 CP1H / CP1L 里的数据,要另外确认:

  • PLC 是否配置成 Modbus RTU Slave
  • 是否有支持 Modbus TCP Server 的以太网模块、网关或功能块
  • 是否应该改用 FINS 协议,而不是 Modbus

这个边界一定要讲清楚。

否则很容易出现这种对话:

“欧姆龙支持 Modbus。”

“那我为什么读不到 PLC?”

因为它支持的是 PLC 主动读别人,不代表它已经作为从站让你读。

NJ和NX系列要看工程实现

NJ / NX 系列更现代,工程里常见 EtherNet/IP、OPC UA、Socket 通讯、数据库连接、运动控制等功能。

Modbus 也能做,但要看具体工程怎么实现。

有些项目用 Modbus TCP 指令或功能块主动访问外部设备。

有些项目会用 Socket 或库函数实现 Modbus TCP 客户端。

有些项目可能通过网关把数据暴露成 Modbus TCP Server。

所以对 NJ / NX,不要只问“CPU 有没有网口”。

要问:

它现在是 Modbus TCP Client,还是 Modbus TCP Server?

如果是 Client,YModbus 可以做 Server 模拟器。

如果是 Server,YModbus 才作为 Client 去读它。

如果只是 EtherNet/IP 或 FINS,那就不是 Modbus。

地址映射一定要让PLC侧写清楚

欧姆龙 PLC 的内部区域很多。

你可能会看到:

  • CIO
  • WR
  • HR
  • AR
  • DM
  • EM
  • 全局变量
  • 结构体变量

这些都不是 YModbus 直接认识的东西。

YModbus 只认识 Modbus 数据区和协议地址。

更稳的地址表应该这样写:

Modbus地址功能码PLC侧变量或区域类型说明
003通信测试值UInt16固定1234
103设备状态UInt160 停止,1 运行
203报警代码UInt160 无报警
1003温度原始值Int16实际值 = 原始值 / 10
001运行中BoolCoil

不要只写:

DM100:温度 WR10:状态

这对 PLC 工程师很清楚,但对 Modbus 主站不够。

上位机需要的是功能码、地址、长度、类型、倍率、字序和读写权限。

40001和地址0

欧姆龙项目里也会遇到40001

Modbus 显示地址40001通常对应协议地址0

YModbus 里传的是协议地址。

所以:

显示地址 40001 -> YModbus 地址 0 显示地址 40002 -> YModbus 地址 1 显示地址 40011 -> YModbus 地址 10

如果欧姆龙功能块或网关手册写的是40001,第一次测试时不要把40001原样填进startAddress

先从0开始读。

如果项目方给的是 PLC 内部地址,比如DM100,那就要先问它映射到哪个 Modbus 地址。

RTU从站场景下YModbus怎么读

如果某个欧姆龙 PLC 或串口单元已经配置成 Modbus RTU Slave,YModbus 可以作为 RTU 主站去读。

示例:

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

CLI 示例:

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

如果完全超时,先查串口参数和接线。

如果返回异常,重点查功能码、地址、数量和映射区。

如果返回数据但值不对,再查类型、倍率和字序。

写入要走命令区

上位机写欧姆龙 PLC 时,不建议直接写输出相关地址。

更稳的是让 PLC 程序员做一个通信命令区:

Holding Register 100:命令号 Holding Register 101:参数 1 Holding Register 102:参数 2 Coil 100:命令触发 Coil 101:PLC 已接收 Coil 102:PLC 执行完成 Holding Register 110:执行结果码

上位机只写命令区。

PLC 程序自己判断模式、急停、互锁、伺服状态、报警状态,然后决定是否执行。

这样比上位机直接写某个输出点安全。

YModbus 写寄存器示例:

awaitclient.WriteSingleRegisterAsync(address:100,value:1);

写线圈示例:

awaitclient.WriteSingleCoilAsync(address:100,value:true);

第一次写入前,先在从站模拟器里验证写入流程,再接真实 PLC。

一个推荐的联调顺序

第一次接欧姆龙 PLC,我建议这样走:

  1. 先确认协议是不是 Modbus,而不是 FINS 或 EtherNet/IP。
  2. 确认 PLC 是主站/Client,还是从站/Server。
  3. 如果是 TCP,确认 IP、端口、UnitId。
  4. 如果是 RTU,确认串口板或通信单元、波特率、校验、停止位、站号。
  5. 让 PLC 侧给出 Modbus 地址表,不要只给 DM 或变量名。
  6. 先放固定值1234
  7. 用 YModbus CLI 或主站工具读一个寄存器。
  8. 再读多个寄存器。
  9. 再处理线圈、浮点数、双字和写入命令。
  10. 如果 PLC 是主站,就用 YModbus 从站工具先模拟目标设备。

这个顺序能把问题拆开。

先证明链路,再证明地址,再证明数据类型,最后才证明业务逻辑。

常见坑

欧姆龙 PLC 联调 Modbus 时,常见坑有这些:

  • 把 FINS 当成 Modbus
  • PLC 只是 Modbus 主站,却被当成从站来读
  • 功能块没有循环执行或触发条件不对
  • CP / CJ / CS / NJ / NX 系列做法混用
  • 串口参数只差一个校验位
  • RS485 A/B 接反
  • 40001当成协议地址
  • DM100当成 Modbus 地址100
  • 映射区长度不够,读数量太大
  • 写入成功但 PLC 程序没有处理命令区

这些问题看起来小,但现场最耗时间。

所以第一步还是老办法:先读一个固定值。

小结

欧姆龙 PLC 的 Modbus 通讯,关键不是“欧姆龙支不支持 Modbus”。

关键是这台 PLC 当前到底扮演什么角色。

如果 PLC 做 Modbus TCP Server 或 RTU Slave,YModbus 就作为主站去读写。

如果 PLC 做 Modbus TCP Client 或 RTU Master,YModbus 就作为从站或 Server 模拟器配合 PLC 调试。

如果现场用的是 FINS、EtherNet/IP、Host Link 或其它欧姆龙通信方式,那就不要拿 Modbus 硬套。

把协议和角色分清楚,后面再谈地址、功能码、浮点数和写入,欧姆龙项目就会顺很多。

参考资料

  • OMRON: Modbus RTU Master Function Block for CP2E
  • OMRON: Modbus TCP Server Function Block for CP2E
  • OMRON: CP1H / CP1L overview with Modbus-RTU Easy Master
  • OMRON: NJ/NX-series Instructions Reference Manual
http://www.zskr.cn/news/1529354.html

相关文章:

  • 鲲鹏编译器AI场景竞争力
  • Ugreen FineTrack 2:价格低至 AirTag 一半,电池续航 5 - 7 年,优势显著!
  • 2026成都注册公司攻略,掌柜家财税助你避坑 - 天涯视角
  • 2026年西安变压器回收厂家联系电话,一站式解决合规物资回收服务商选择! - 深度智识库
  • 操作系统内存池化实现机制,助力超节点应用创新
  • PowerToys中文汉化版:让Windows效率工具真正为你所用
  • GitHub子域名发现工具在渗透测试中的5个实战应用技巧
  • 有磨损的包包也能变现,西安添价收按品相公正定价,每件都不亏待2026 - 薛定谔的梨花猫
  • GDSDecomp:深入解析Godot游戏逆向工程与资源重构技术栈
  • 避坑指南:gprMax正演模拟时,你的A-Scan和B-Scan图像为什么对不上?常见错误排查
  • 2026 中山黄金回收本地可上门服务靠谱渠道实测指南新手避坑全攻略 - zzlzzl6688
  • Simple-Camera:让手机摄影更简单!快速上手这款轻量级相机应用
  • 2026头部优质靠谱且服务好的二手搅拌站设备厂家推荐指南:泰安恒首机械有限公司领衔 - 栗子测评
  • R3nzSkin:5分钟掌握英雄联盟国服免费换肤的终极指南
  • 走遍成都各大商圈回收网点,27 家门店实地摸排,精选稳妥变现商户 - 奢侈品回收评测
  • 30+个Illustrator脚本:设计师效率提升的终极解决方案
  • 亨得利手表维修正规门店在哪里?2026年全国官方授权网点全名单:劳力士/欧米茄/百达翡丽等9大品牌维修实录与避坑指南 - 亨得利腕表维修中心
  • 深圳黄金回收口碑测评报告|暗访多家门店,收的顶综合实力靠前 - 奢侈品回收测评
  • 深圳亨得利官方网点实地探访(虚假网点曝光 + 避坑指南)2026 最新权威 - 亨得利官方维修中心
  • 怕手表回收隐私泄露?沈阳合扬私密交易全程保密 - 开心测评
  • 浮梁县朝阳中大道黄金回收服务福易顺黄金回收 - 润富黄金回收
  • 温州高莱居原木定制工厂 本土全屋木作定制优选 联系电话:15858009555 地址:温州瑞安市经济开发区大道3588号--望新路198号C 幢 - GrowthUME
  • Awoo Installer:3种方式快速安装Switch游戏,小白也能轻松上手
  • VisualCppRedist AIO完整掌握:一站式解决Windows运行时依赖的终极方案
  • 终极Unity游戏去马赛克指南:6大插件完全解析
  • 深圳黄金回收专业测评:光谱仪当面验金,本地头部实体店强烈推荐 - 奢侈品回收测评
  • 猫为何被AI认成金鱼?对抗样本生成与业务风险实战解析
  • 5分钟搞定:暗黑破坏神2现代化补丁d2dx终极优化指南
  • Pearcleaner:macOS系统深度清理的智能解决方案,释放宝贵磁盘空间的终极工具
  • Python里的“赋值”到底是什么意思?