当前位置: 首页 > 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.jsqmd.com/news/1017531/

相关文章:

  • Sionna物理层仿真库完整指南:从零开始构建通信系统仿真
  • 2026年苏州冲压工厂GEO优化公司推荐|行业优选名单 - 资讯快报
  • 烟台市美的空调维修师傅电话|各区金牌师傅,靠谱选欧米到家 - 欧米到家
  • 2026年北京优质导游旅行社测评|5日精品出游攻略|京城正规地接团队甄选指南 - 纯玩旅游攻略指南
  • 2026 昆明黄金回收安全变现指南:白名单 5 家 + 黑名单 3 家,一目了然 - 开心测评
  • 鲲鹏编译器AI场景竞争力
  • 奉化知名的景观设计公司 - GrowthUME
  • VisualCppRedist AIO:一站式解决Windows系统VC++运行库依赖难题
  • Ugreen FineTrack 2:价格低至 AirTag 一半,电池续航 5 - 7 年,优势显著!
  • 性能优化与高并发:Neo4j查询、LLM推理、全链路压测实战
  • PXS20微控制器ADC、CRC与CTU模块详解与内存映射实战
  • 2026年宁夏建材采购指南:钢结构与聚氨酯板源头厂家对标评测 - 优质企业观察收录
  • 2026成都注册公司攻略,掌柜家财税助你避坑 - 天涯视角
  • 拆掉承重墙:业务中台与DDD(领域驱动设计)的救赎
  • 2026年西安变压器回收厂家联系电话,一站式解决合规物资回收服务商选择! - 深度智识库
  • 操作系统内存池化实现机制,助力超节点应用创新
  • PowerToys中文汉化版:让Windows效率工具真正为你所用
  • Defender-Control:如何实现Windows Defender的永久禁用?[特殊字符][特殊字符]
  • 生产部署与监控告警:Docker+K8s部署Neo4j问答系统
  • DRG存档编辑器终极指南:3步快速掌握深岩银河游戏数据修改
  • 有磨损的包包也能变现,西安添价收按品相公正定价,每件都不亏待2026 - 薛定谔的梨花猫
  • GitHub子域名发现工具在渗透测试中的5个实战应用技巧
  • 长春同城黄金回收服务 金裕恒黄金回收 - 润富黄金回收
  • 别总想跑赢大盘,先看看自家的“承重墙”裂没裂
  • 广州 LV 全系列回收:老花 / 中古 / 限量款一站式变现 - 薛定谔的梨花猫
  • Pasteboard-Viewer与Xcode调试:集成到iOS/macOS开发环境的终极技巧
  • GDSDecomp:深入解析Godot游戏逆向工程与资源重构技术栈
  • 山东304不锈钢护栏厂家推荐:3个核心筛选维度 - 速递信息
  • 2026天津装修公司排名:教你避开套路选靠谱家装 - 资讯快报
  • 终极指南:如何用OpenColorIO-Config-ACES构建专业色彩管理