简介:汇川小型PLC与欧姆龙PLC通过EtherNet/IP协议进行通讯的完整配置案例,适合工业自动化现场工程师、PLC编程与调试人员快速上手跨品牌组网。资源为1个PDF文件,大小约846KB,内容以图文步骤形式呈现,无需安装额外环境即可阅读。文档先从汇川侧入手,介绍在AutoShop中调用Generic EtherNet IP Device、配置从站IP地址、修改组合消耗与生产实例ID(如105/106)、设置传输字节数与心跳转换格式,并添加所需变量;再转向欧姆龙侧,说明在Sysmac Studio中建立结构体变量、在全局变量表设置网络公开选项,通过EtherNet/IP连接设置注册输入输出变量,手动指定实例ID后验证数据读写。已有644人学习该资源,通过这份案例可系统了解两种品牌PLC在EIP通讯中的关键配置差异与对应关系,快速应用到实际项目中。
1. 汇川小型PLC与欧姆龙EIP通讯:为什么值得搭这条链路
做设备改造的老工程师都清楚,柜子里同时躺着两个不同品牌的PLC是常事:产线上老设备用欧姆龙,新上的工位为了成本或供货周期选了汇川小型PLC。两边要交换状态、启停命令和工艺参数,最快最稳的路子就是走EtherNet/IP(以下简称EIP)通讯,而不是加一堆中间继电器或改模拟量接线。EIP是工业以太网里比较“高级”的协议,理论上不需要知道对方内部的寄存器表,只要在两侧把“标签”对上就能点对点交换数据。但真到现场联调时,IP规划、Scanner/Adapter角色、字节序、RPI这些参数会把人折腾一遍。这篇文章就用一个汇川小型PLC(以H5U系列为例)和欧姆龙PLC(以NX1P2为例)做EIP通讯的案例,从协议原理、两侧参数配置到抓包验证,把能抄作业的步骤和常见翻车点都拆开讲。
2. EIP通讯原理与硬件选型:搞清楚Scanner和Adapter各做什么
2.1 EIP的协议栈:CIP over Ethernet与隐式/显式报文
EIP的全称是EtherNet/IP,由ODVA推进,核心是把PLC的“数据表”抽象成一个个CIP对象,再通过标准以太网帧传输。它分为两种数据通道:显式报文(Explicit Message)走TCP 44818端口,用于读写参数、诊断这类非周期性信息;隐式报文(Implicit Message)走UDP 2222端口,用于周期性I/O数据交换,实时性高、报文格式紧凑。我们平常说的“EIP通讯正常”,多数情况下指的正是UDP 2222端口上那一路周期性IO连接。
隐式报文的两个角色常被叫混。Scanner(扫描器/主站)是主动发起连接的一方,设定刷新周期RPI(Requested Packet Interval),按固定节奏发送和接收数据;Adapter(适配器/从站)则被动响应,只监听网络上的连接请求,按Scanner设置的RPI把本地数据打包发回去。因此,你在汇川小型PLC侧看到的“EIP连接配置”,本质是建立一个Scanner类型的连接,指定对端IP和IO大小;而在欧姆龙侧要做的,不是去“连接汇川”,而是“允许哪个Scanner连进来,给本地数据预留多少空间”。这两个方向如果搞反,通讯逻辑就会一直卡在握手阶段。
2.2 为什么要选EIP而不是Modbus TCP
很多人的第一反应是:两个PLC都支持Modbus TCP,用那个不是更简单?确实,Modbus TCP上手容易,但它建立在“寄存器地址”上,汇川侧要把欧姆龙的数据地址背熟,欧姆龙侧还得手工维护一张地址映射表,一旦程序版本更新,地址对不上就是一场排查灾难。EIP则不相同,它以“标签/变量”为通讯对象,欧姆龙侧定义一个符号变量,汇川侧直接用这个符号变量名做映射,程序结构清晰得多。
从刷新速度来看,EIP隐式报文可以做到毫秒级周期性交换,而且报文里自带连接ID和序列号,链路异常能快速被两端PLC识别。Modbus TCP虽然也可以轮询到毫秒级,但要靠主站程序自己编排,数据一致性不如EIP的“定时快照”机制。对于需要频繁交换几十个字的现场,EIP的体验更接近“一根虚拟网线直通对方内存区”。
2.3 设备选型与准备工作清单
先看汇川侧。小型PLC里带内置EtherNet/IP扫描器功能的主要是H5U系列,它可以在AutoShop软件里做EIP连接配置,不需要额外加通讯模块。如果手上是H3U这类偏Modbus TCP定位的型号,就要加EIP网关或换H5U,别指望固件升级能补上这个缺口。欧姆龙侧建议选内置EIP端口的型号,比如NX1P2、CJ2M或者NJ系列。以NX1P2为例,它自带双以太网口,其中一个口可以独立配置为EIP Adapter,不占用CPU上的串口资源,也不会和上位机通讯冲突。
工具和硬件方面,汇川侧安装AutoShop,欧姆龙侧装Sysmac Studio(NX系列)或CX-One(CJ系列)。网络连接上,最简单的办法是把两台PLC用一个工业交换机连起来,交换机支持IGMP Snooping更佳,因为EIP隐式报文会涉及组播。IP规划不要随意,尽量避开DHCP自动分配,固定成两段独立地址,例如汇川192.168.1.10,欧姆龙192.168.1.20,子网掩码255.255.255.0。下面是一个典型的IP和通讯规划表,照着填就能省掉不少事:
| 项目 | 汇川H5U | 欧姆龙NX1P2 |
|---|---|---|
| IP地址 | 192.168.1.10 | 192.168.1.20 |
| 子网掩码 | 255.255.255.0 | 255.255.255.0 |
| 通讯角色 | Scanner(主站) | Adapter(从站) |
| EIP端口 | UDP 2222 / TCP 44818 | UDP 2222 / TCP 44818 |
| RPI建议值 | 100ms(调试期) | 100ms(由主站设置) |
| 数据方向 | 输入区:欧姆龙 → 汇川 | 输出区:汇川 → 欧姆龙 |
3. 汇川小型PLC侧EIP参数配置:从IP规划到数据映射
3.1 AutoShop工程中的EIP扫描器配置入口
打开AutoShop新建工程,型号选择H5U后,左侧项目树里会有一个“EtherNet/IP”配置节点。双击进去,首先要使能“EIP Scanner功能”,再把PLC本机IP地址填好。这里有个细节:在AutoShop里设置的IP地址会下载到PLC的以太网参数区,如果你之前用了BOOTP或DHCP,务必先把“自动获取IP”关掉,否则下载完程序PLC会去抢一个和规划表不一致的IP。
接下来是创建连接。点击“添加连接”,目标IP填欧姆龙的192.168.1.20。你会看到“输入连接大小”和“输出连接大小”两个参数——这里的“输入”指的是从欧姆龙读进汇川的方向,“输出”是汇川写给欧姆龙的方向,与物理网口的收发方向无关。新手最容易在这把方向弄反,结果就是两边都通但数据全是零。每个连接还要填“RPI”,也就是隐式报文的刷新周期。调试初期建议设100ms,稳定后再往下压到20ms或10ms,避免一开始就因为报文太密导致交换机堵塞。
配置完连接后,AutoShop会自动为这个连接分配一组内部映射地址,通常命名为EIP_Input_0和EIP_Output_0,每个都是数组形式。这个映射区就是汇川CPU和EIP协议栈之间的数据中转站,你的程序通过读写这些数组变量,就能拿到欧姆龙发来的数据和把数据发给欧姆龙。
3.2 输入输出缓冲区的长度与字节序设置
输入/输出连接大小以“字节”为单位,常见设置是32字节或64字节。建议两边的长度严格一致:假设你只交换16个字的数据,那每一侧就都填32字节。如果汇川填了32字节,欧姆龙侧只配置了16字节,连接大概率建立不起来;反过来的话,多出来的字节会被填充成随机值,程序里读到会很迷糊。
字节序是EIP联调的第一个大坑。EtherNet/IP协议本身规定数据在网络上传输时按大端序(Big-Endian),也就是高位字节在前。但汇川H5U的CPU内部寄存器按小端序处理数据,欧姆龙NX系列的内部变量默认也按小端序排列。这就导致:你在欧姆龙里往变量里赋一个16#1234,汇川这边读到的可能是16#3412。AutoShop的EIP配置节点里有一个“字节交换”选项,把它打开可以解决16位数据的字节逆序问题。如果是32位浮点数,还要再核对一次,必要时在程序里单独做位交换处理。
下面是一个典型的ST代码块,把EIP输入区里的数据同步到D区,同时把D区另一段数据放到输出区:
// 汇川H5U(AutoShop, ST语言) // 将EIP输入区数据复制到D100~D115 // 将D200~D215的数据放入EIP输出区 VAR i : INT; END_VAR FOR i := 0 TO 15 BY 1 DO %MW100[i] := EIP_Input_0[i]; // 从欧姆龙收到的数据 EIP_Output_0[i] := %MW200[i]; // 要发给欧姆龙的数据 END_FOR;代码逻辑非常直白:EIP_Input_0和EIP_Output_0是AutoShop根据连接配置自动生成的数组变量,每个元素是16位字。FOR循环把输入区16个字搬到D100起,把D200起的16个字放上输出区的发送队列。参数说明:循环次数16由连接大小除以2得到,如果你连接配置的是64字节,这里就应该是0到31。D区地址可以随意改,但要注意别和系统保留区冲突。
3.3 理解连接状态字与运行/停止联动
H5U的EIP配置页里有一个“运行状态连接”选项,建议在调试初期保持默认的“始终连接”。如果选了“仅在运行状态连接”,PLC处于编程状态时EIP链路会自动断开,欧姆龙那边可能会因为通讯超时报错,容易误判成硬件故障。等程序完全调好、确认上电即运行后,再根据应用需要决定是否切换。
另外,AutoShop会为每个连接生成一个状态字,例如EIP_Status_0,里面记录了连接当前状态、丢帧计数、最后一次错误码。程序里加一段监控逻辑:把状态字里连接建立的那一位映射到一个内部线圈,作为“通讯正常”标志给触摸屏显示。这样即使他人不在现场,看HMI页面就能判断链路是否健康,不用反复去翻软件诊断页。
3.4 常见误设:连接数量与目标端口
H5U支持的EIP Scanner连接数量不是无限的,小型PLC通常并发连接数在8个以内。别一次性创建十几条连接去连不同设备,会直接导致后面的连接建立失败。如果现场有多台欧姆龙PLC要通讯,优先做“网关转发”而不是一台汇川拖一堆从站——用一条连接连到欧姆龙的路由器或触摸屏,再分发数据。
目标端口默认是44818?注意,EIP隐式I/O不使用TCP,UDP端口固定是2222,虽然部分软件里会让你填端口号,但一般保持默认即可。不要因为防火墙原因去改这个端口,两端都改还不行,会直接让Scanner找不到Adapter。
4. 欧姆龙侧EIP从站配置:标签连接与数据区映射
4.1 在Sysmac Studio中启动EIP Adapter服务
欧姆龙NX1P2使用Sysmac Studio进行配置。新建工程后双击“EtherNet/IP”节点,把PLC的本机IP地址设置为192.168.1.20。默认情况下NX1P2的EIP服务是关闭的,必须手动启用,否则汇川扫描器发过来的连接请求根本没人应答。启用后,PCB设置里会有“TCP/IP”和“EtherNet/IP”两个子项,前者管普通以太网通讯,后者管CIP通讯,两者都是开着的并不冲突。
接下来要处理“是否限制连接来源IP”。如果不确定客户端IP,就选“接受所有IP地址的Scanner连接”,省得误拦截。出于安全考虑,也可以指定汇川的IP 192.168.1.10为允许连接对象。这里有个隐含问题:欧姆龙侧一旦限定了来源IP,要是汇川侧用了多网卡或者换了个IP,链路马上断,排错时容易被表象迷惑。
4.2 定义要交换的数据变量
欧姆龙侧不需要像传统PLC那样手工去写“EIP接收区地址”,Sysmac Studio支持直接把全局变量暴露给EIP。你在全局变量表里新建两个数组变量,例如RECV_DATA_USR[0..15]和SEND_DATA_USR[0..15],然后在EIP配置里把它们分别映射为Adapter的“输入缓冲区”(汇川写入方向)和“输出缓冲区”(汇川读取方向)。这样欧姆龙程序里正常读写这些变量,EIP协议栈会自动帮你打包到网络上,不需要额外的数据搬移指令。
下面这段ST代码展示了欧姆龙侧如何处理接收和发送的数据:
// 欧姆龙NX1P2(Sysmac Studio, ST语言) // 假设已配置变量: FROM_HUICHUAN : WORD[16]; TO_HUICHUAN : WORD[16]; // FROM_HUICHUAN 存放汇川发过来的数据,TO_HUICHUAN 存放要发给汇川的数据 FOR i := 0 TO 15 DO // 把汇川下发的命令字转存到欧姆龙程序内部数组 Command_From_Huichuan[i] := FROM_HUICHUAN[i]; END_FOR; FOR i := 0 TO 15 DO // 把欧姆龙状态数据放入EIP发送缓冲区 TO_HUICHUAN[i] := Status_To_Huichuan[i]; END_FOR;这段代码的作用是隔离EIP缓冲区和业务程序:FROM_HUICHUAN和TO_HUICHUAN是Sysmac Studio生成的EIP接口变量,每周期由协议栈刷新;Command_From_Huichuan和Status_To_Huichuan是业务程序真正使用的数组。不建议直接拿EIP接口变量当业务变量用,因为没有中间层,后期改程序时容易误动通讯配置。参数方面,数组长度16对应汇川侧的32字节连接,两侧保持一致。
4.3 IO连接实例与CIP Assembly映射
如果用了CX-Programmer而不是Sysmac Studio,需要到“Network Configurator”里查看IO连接实例。欧姆龙做Adapter时,每个连接会对应一个Assembly Object实例,输入/输出数据对应不同实例号。汇川Scanner创建连接时会把目标实例作为握手参数发过来,常见默认值是输入实例101、输出实例100,这是CIP标准里推荐的值。如果两边用的第三方软件不一致,可能要把实例号改成一致才能连上。遇到连接建立失败时,先在欧姆龙侧看“Active Connection”列表里有没有汇川的条目,没有就说明Scanner的连接请求根本没到达Adapter。
4.4 不要忽视欧姆龙侧的数据一致性
EIP缓冲区刷新周期由Scanner的RPI决定,比如100ms刷新一次,欧姆龙程序里读写这些变量时,要考虑数据快照的“原子性”。如果汇川一次写了32字节,欧姆龙程序恰好在写入中间读取,可能读到前半段新数据、后半段旧数据。处理办法有两种:一种是在欧姆龙侧先把EIP缓冲区拷到另一组变量,再用这一组变量做业务判断;另一种是让汇川在数据里放一个“批次号”字段,欧姆龙先读批次号,发现变化再取整个数组。第二种更可靠,因为它在应用层保证了数据同步,不依赖通讯底层。
5. 联调避坑与排查:EIP通讯失败的常见坑
5.1 避坑一:连接闪断,状态在“Established”和“None”之间跳变
现象:汇川AutoShop的EIP监控页里,连接状态一会儿是绿色“已建立”,一会儿变成“无连接”,欧姆龙侧也同步出现报警,有时还会伴随“Connection timeout”错误。
原因之一:RPI设置太短,比如设了5ms或10ms,而工业交换机的转发延时和数据量导致报文无法在这个间隔内稳定到达,Scanner认为链路超时,主动断开连接。原因之二:欧姆龙侧已经达到Adapter最大连接数限制,新连接挤掉旧连接,尤其调试时需要反复上下载程序,连接资源没有及时释放。
解决:先把RPI放宽到100ms验证链路稳定性,确定没问题再慢慢收紧到20ms。检查欧姆龙Sysmac Studio里“连接数量使用情况”,把不用的调试连接全部关掉。如果现场允许,把交换机的端口速率和双工模式强制为100M Full,而不是自动协商,减少握手时间。
5.2 避坑二:数据通了,但数值高16位和低16位对调
现象:欧姆龙侧变量值为16#1234,汇川侧读到16#3412;或者浮点数读出来完全离谱,比如1.0变成1.889E-38。
原因:EIP网络层按大端序传输,但汇川H5U内部寄存器按小端序访问,欧姆龙NX系列虽然CPU内部也是小端,但变量定义方式和网络缓冲区的解析方式不同,导致16位数据高低字节颠倒。如果是32位浮点数,还涉及4个字节的排列组合问题,更加隐蔽。
解决:汇川AutoShop的EIP连接配置里打开“字节交换”选项,通常可以解决16位字数据。如果是浮点数,建议在汇川侧做一次字节顺序交换后再解析。下面是一段在欧姆龙侧做字节交换的ST示例,可以单独放在一个循环里用于测试:
// 欧姆龙侧将接收到的16位数据交换字节序 // 适用于未在EIP配置中启用自动交换的场景 FOR i := 0 TO 15 DO Temp[i] := (FROM_HUICHUAN[i] AND 16#00FF) * 16#0100 OR ((FROM_HUICHUAN[i] AND 16#FF00) / 16#0100) Command_From_Huichuan[i] := Temp[i]; END_FOR;不过更推荐的做法是直接在两侧配置里打开交换功能,程序里的交换逻辑越多,后期维护越痛苦。现场调试时先用一个固定值(比如16#5A5A)做测试,从源端写、目标端读,确认字节序无误再接正式数据。
5.3 避坑三:断电重启后连接断,必须重新上下载程序才恢复
现象:调试时一切正常,断电再上电后,汇川显示EIP连接失败,欧姆龙侧也没有收到连接请求。用手动触发一次“上电初始化”或者重传配置又能恢复。
原因:欧姆龙PLC上电启动比汇川慢。汇川Scanner作为主站,上电后立刻发起EIP连接请求,而此时欧姆龙CPU还在初始化阶段,EIP服务没有就绪,请求被丢弃。Scanner不会无限制重试,重试次数耗尽后状态变成故障,需要程序干预才能重新连接。
解决:在汇川侧程序中加入通电延时逻辑,延时5~10秒后再让EIP连接参与工作。具体方法是把连接配置里的“始终连接”改为“由程序控制连接”,用定时器控制一个线圈,线圈ON才启动连接。欧姆龙侧则检查PLC电源的启动顺序,尽量让欧姆龙先上电,汇川后上电,或者加一个小的断电延时继电器。这条看起来是电气问题,但往往是被当成通讯问题排了半天才发现根因。
5.4 避坑四:偶发数据丢帧,但网口指示灯全正常
现象:EIP链路没有断开,但数据偶尔会“卡住”几秒钟不刷新,触摸屏上的数值停留不动。查看交换机端口统计,发现CRC错误包或丢包计数在缓慢增长。
原因:工业网络中广播报文过多,比如其他设备在发DHCP请求、SNMP轮询或者NetBIOS广播。EIP隐式报文大概率会使用组播地址,交换机如果不做IGMP Snooping,这些组播报文会被当成广播转发到所有端口,占用了有效带宽,导致周期报文偶发丢帧。
解决:换用支持IGMP Snooping的工业交换机,并在交换机上开启IGMP查询功能。如果条件不允许,至少把汇川和欧姆龙用一根网线直连,跳过交换机做验证,确认是网络环境问题而不是PLC配置问题。直连测试通过、过交换机就丢包,基本可以断定要把目光转移到交换机配置上。
6. 验证技巧:用诊断对象和Wireshark确认EIP链路稳定
联调暂时跑通不算完,我习惯在现场多留一步验证手段,防止过两周用户打电话过来说“数据不动了”。最常见的验证就是在应用层加一个“心跳”,让欧姆龙每周期递增一个计数器,汇川这边判断计数器是否在变化。下面这段ST代码可以放在汇川H5U的周期性任务里:
// 通讯心跳检测:欧姆龙侧每周期将Heartbeat加1写入EIP输出区 // 此处读取汇川EIP输入区的第0个字做比较 IF EIP_Input_0[0] <> Last_Heartbeat THEN Last_Heartbeat := EIP_Input_0[0]; Link_OK := TRUE; Drop_Count := 0; ELSE Drop_Count := Drop_Count + 1; IF Drop_Count > 10 THEN Link_OK := FALSE; // 连续10个扫描周期没更新,判定断链 END_IF; END_IF;把Link_OK这个布尔量接到触摸屏的报警画面里,就能及时感知通讯异常。这个习惯帮我排查过很多“看似通讯正常但数据不刷新”的隐性故障,比单纯看EIP状态字要可靠得多——因为状态字有时候在偶发丢帧时不会立刻翻转,而心跳计数器能直观反映每一次周期性刷新是否到位。
进阶一点的验证是用Wireshark抓包。把电脑网卡接到汇川或欧姆龙所在的交换机上,设置好镜像端口,然后用显示过滤器锁定EIP隐式报文:udp.port == 2222 && ip.addr == 192.168.1.10 && ip.addr == 192.168.1.20。正常能看到固定间隔的周期报文,间隔与RPI基本一致。如果发现报文间隔明显抖动,或者出现TCP重传,就去查网络拥塞和交换机配置。这个环节不需要改PLC程序,是纯外部诊断,现场排错时最优先做。
调试到现在这类场景,我已经不太信“多试几次就好”的运气流。EIP通讯只要角色分配清楚、IP规划固定、RPI和字节序两边对齐,剩下的都是纯工程细节。每次做完项目,我都会在程序里留一个心跳和一个诊断寄存器,方便后续售后远程看问题。希望帮到你。
本文还有配套的精品资源,点击获取