1. 跨品牌PLC以太网通信的工程价值与场景拆解
1.1 为什么非要让西门子和三菱“对话”
在非标自动化产线里,设备品牌混搭几乎是常态。我做过的好几个汽车零部件装配线项目,主控用的是西门子S7-1200,因为它跟博途生态配合顺手,HMI和上位机集成方便;但产线上几台老设备用的是三菱Q系列,比如Q03UDECPU或者Q06UDV,这些设备本身运行稳定,客户也不愿意花大价钱整体换掉。问题就来了:整线要做数据追溯、集中监控、MES对接,主控PLC必须能读到三菱Q系列里的产量、节拍、报警代码这些数据。
这时候就绕不开一个核心需求——跨品牌PLC的开放式以太网通信。所谓“开放式”,指的是不依赖各品牌私有的、封闭的通信协议栈,而是基于标准以太网帧和通用协议(如TCP/IP、UDP)来做数据交换。S7-1200自带PROFINET接口,三菱Q系列可以配QJ71E71-100以太网模块,两边都支持Socket通信,这就是我们做跨品牌数据互通的基础。
这个方案适合谁?适合手里同时有西门子和三菱设备、需要做数据集成但又不想加网关硬件的工程师;也适合刚接触多品牌通信、想搞明白“开放式以太网”到底怎么落地的朋友。我下面会把整个思路、参数配置、实操步骤和踩过的坑都摊开讲,你照着做基本能复现。
1.2 三种可行方案对比与选型逻辑
跨品牌通信不是只有一条路,我实际用过三种方式,各有适用场景:
| 方案 | 实现方式 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|---|
| 开放式Socket通信 | S7-1200用TSEND/TRCV指令,Q系列用QJ71E71的固定缓冲区通信 | 不依赖第三方网关,成本低,实时性可控 | 需要双方编程,数据格式要自己约定 | 数据量中等、双方都能改程序的场合 |
| Modbus TCP | S7-1200做客户端,Q系列加Modbus TCP模块或软协议 | 协议标准,调试工具多 | Q系列原生不支持,需额外模块或软实现 | 数据点少、对实时性要求不高的监控 |
| 网关转换 | 用第三方协议网关做中间转换 | 双方都不用大改程序 | 增加硬件成本和故障点 | 老设备不能改程序、只读少量数据 |
我最终选的是开放式Socket通信,原因很直接:Q系列本身有QJ71E71模块,支持固定缓冲区通信,S7-1200的TSEND/TRCV指令也很成熟,两边都不需要加硬件,成本最低。而且数据格式可以自己定义,灵活度高。下面重点讲这个方案的落地细节。
2. 通信原理与核心参数解析
2.1 开放式以太网通信到底怎么“开放”
很多人听到“开放式”觉得玄乎,其实本质很简单:两台设备通过以太网线连到同一个交换机,各自用IP地址和端口号标识自己,然后一方主动发起连接(客户端),另一方被动等待(服务器),连接建立后就可以互相发数据帧。这个过程不涉及任何品牌私有的协议封装,就是标准的TCP或UDP。
S7-1200这边,TSEND和TRCV指令底层调用的是Open User Communication,支持TCP和ISO-on-TCP。三菱Q系列QJ71E71模块支持“固定缓冲区通信”,可以配置为TCP服务器或客户端,数据直接映射到模块的缓冲区地址,PLC用FROM/TO指令读写缓冲区。两边约定好:谁做客户端、谁做服务器、端口号多少、数据长度多少、字节序怎么排。
这里有个关键点:字节序。西门子是大端模式(高字节在前),三菱Q系列也是大端,所以16位和32位数据在字节序上是一致的,不需要额外翻转。但如果你传的是浮点数,两边表示方式都是IEEE 754,直接传就行。我遇到过有人用Modbus TCP传浮点数结果数据乱跳,就是因为字节序没对齐,但开放式Socket通信反而没这个问题。
2.2 连接参数与缓冲区地址规划
先确定网络拓扑:S7-1200的PROFINET口IP设为192.168.1.10,QJ71E71的IP设为192.168.1.20,子网掩码255.255.255.0,都接在同一台工业交换机上。S7-1200做客户端,主动连接Q系列的端口;Q系列做服务器,监听端口。
QJ71E71的固定缓冲区通信需要配置“自动打开UDP端口”或“TCP连接”。我选TCP,因为可靠。在GX Works2里,打开QJ71E71的参数设置,选择“固定缓冲区通信”,设置本地端口号比如0x1388(5000十进制),对方IP设为192.168.1.10,对方端口设为2000(S7-1200的本地端口)。然后分配缓冲区地址:发送缓冲区从D1000开始,接收缓冲区从D2000开始,各分配100个字。
S7-1200这边,在博途里调用TSEND_C或TSEND/TRCV。我习惯用TSEND_C和TRCV_C这对组合,因为连接管理更方便。配置连接参数:对方IP 192.168.1.20,对方端口5000,本地端口2000,连接类型TCP。发送数据区用DB块,比如DB10,长度100字节;接收数据区DB11,长度100字节。
注意:QJ71E71的固定缓冲区通信,发送和接收是分开的缓冲区,发送用TO指令写D1000开始的区域,接收用FROM指令读D2000开始的区域。S7-1200这边,TSEND发的是DB10的数据,TRCV收的是DB11的数据。两边数据长度要一致,否则会截断或报错。
2.3 数据映射与字节对齐的实操计算
假设我们要传3个数据:产量(32位整数)、节拍(16位整数)、报警代码(16位整数)。在S7-1200的DB10里这样定义:
DB10 0.0 DINT production_count 4.0 INT cycle_time 6.0 INT alarm_code总共8个字节。Q系列这边,D1000开始映射:
D1000 低16位 production_count低字 D1001 高16位 production_count高字 D1002 cycle_time D1003 alarm_code因为两边都是大端,DINT在S7-1200里是高位在前,Q系列D1001存高字、D1000存低字,正好对应。如果你用DMOV指令把32位数据移到D1000,三菱会自动按低字在前、高字在后的顺序存放,跟西门子的DINT内存布局一致。实测下来,直接传不用做任何转换。
但如果你传的是字符串,就要注意了:西门子字符串前两个字节是最大长度和当前长度,三菱没有这个头。我一般传字符串时,在S7-1200里把字符串转成字节数组,去掉头两个字节,再发过去;Q系列收到后直接按ASCII解析。
3. 实操配置与程序实现
3.1 QJ71E71模块参数设置步骤
打开GX Works2,在导航窗口找到“参数”->“网络参数”->“以太网/CC IE/ MELSECNET”,双击打开。选择QJ71E71模块,设置如下:
- 网络类型:以太网
- 起始I/O号:根据实际插槽,比如0000
- 网络号:1
- 组号:0
- 站号:1
- 运行设置:逻辑链路设置里,选择“固定缓冲区通信”
- IP地址:192.168.1.20
- 子网掩码:255.255.255.0
- 默认网关:192.168.1.1(没有就填0.0.0.0)
- 通信速度:自动
- 打开设置:选择“TCP”,本地端口5000,对方IP 192.168.1.10,对方端口2000,打开方式“主动”或“被动”。这里Q系列做服务器,选“被动”等待连接。
然后设置固定缓冲区:发送缓冲区起始地址D1000,发送数据长度100字;接收缓冲区起始地址D2000,接收数据长度100字。这些参数写入后,重启PLC或复位模块生效。
实操心得:QJ71E71的参数设置里,“打开设置”有“主动”和“被动”两种。主动是Q系列主动连对方,被动是等对方连。我们让S7-1200做客户端主动连,所以Q系列选被动。如果选反了,连接建立不起来,但错误代码不一定明显,容易卡在这里。
3.2 S7-1200博途端TSEND_C/TRCV_C配置
在博途里新建项目,添加S7-1200 CPU,比如1214C DC/DC/DC。在OB1里调用TSEND_C和TRCV_C。先拖入TSEND_C,弹出配置向导:
- 连接参数:新建连接,选择“TCP”,对方IP 192.168.1.20,对方端口5000,本地端口2000,主动连接勾选。
- 数据参数:发送区选DB10,长度8字节(先传8字节测试)。
- 然后拖入TRCV_C,连接参数选同一个连接,接收区选DB11,长度8字节。
TSEND_C的REQ引脚用一个上升沿触发,比如用M0.0的上升沿。TRCV_C的EN_R引脚一直为TRUE,表示持续接收。注意TSEND_C的CONT引脚设为TRUE,表示保持连接不断开。
// OB1 梯形图简化描述 // M0.0上升沿触发发送 // TSEND_C: REQ=M0.0上升沿, CONT=TRUE, CONNECT=连接参数, DATA=DB10, LEN=8 // TRCV_C: EN_R=TRUE, CONNECT=连接参数, DATA=DB11, LEN=8下载程序后,观察TSEND_C的STATUS和TRCV_C的STATUS。如果STATUS为0,表示正常;如果为16#8080或16#80C0,说明连接有问题,检查IP和端口。
3.3 联调步骤与数据验证
先给Q系列上电,确认QJ71E71的LED指示灯:RUN亮,OPEN亮(表示端口打开),SD/RD闪烁表示有数据收发。然后给S7-1200上电,下载程序,监控DB10和DB11。
在S7-1200里手动给DB10.production_count赋值12345,DB10.cycle_time赋值30,DB10.alarm_code赋值0。触发M0.0上升沿,TSEND_C发送。然后在GX Works2里监控D1000到D1003,应该看到D1000=12345的低16位,D1001=12345的高16位,D1002=30,D1003=0。
反过来,在GX Works2里用MOV指令给D2000赋值100,D2001赋值0,D2002赋值25,D2003赋值1。S7-1200的TRCV_C应该收到DB11里,DB11.production_count=100,DB11.cycle_time=25,DB11.alarm_code=1。
注意:第一次联调时,TRCV_C可能收不到数据,因为Q系列的固定缓冲区通信需要先建立连接。检查QJ71E71的“打开设置”里,对方IP和端口是否写对。另外,S7-1200的本地端口2000不能跟其他连接冲突,如果同时用多个TSEND_C,每个连接要分配不同端口。
4. 常见问题与排查技巧实录
4.1 连接建立失败的错误代码速查
| 错误现象 | 可能原因 | 排查方法 | 解决方法 |
|---|---|---|---|
| TSEND_C STATUS=16#8080 | 连接未建立 | 检查Q系列OPEN灯是否亮 | 确认QJ71E71参数已写入并重启 |
| TSEND_C STATUS=16#80C0 | 端口被占用 | 检查S7-1200本地端口是否冲突 | 换一个本地端口,如2001 |
| TRCV_C收不到数据 | Q系列未发送 | 监控D2000区域是否有数据 | 确认Q系列用TO指令写了发送缓冲区 |
| 数据错位 | 长度不一致 | 对比两边数据长度 | 统一为相同字节数 |
| 连接频繁断开 | CONT引脚为FALSE | 检查TSEND_C的CONT | 设为TRUE保持连接 |
我遇到过最坑的一次:QJ71E71的“打开设置”里,对方IP写成了192.168.1.100,实际S7-1200是192.168.1.10,结果连接一直建不起来,但Q系列OPEN灯是亮的,因为端口打开了但没连上。后来用ping命令先确认网络通,再逐字核对IP,才发现多打了一个0。所以联调第一步永远是ping通,别急着写程序。
4.2 数据不刷新与缓冲区覆盖的坑
有一次客户反馈,S7-1200读到的产量数据一直不变。我到现场监控,发现Q系列D1000区域的数据确实在变,但S7-1200的DB11里始终是旧值。排查后发现,TRCV_C的EN_R引脚虽然为TRUE,但接收区DB11被其他程序段覆盖了。原来有个新手在OB1后面写了MOV指令,把DB11清零了。删掉那段程序后正常。
另一个坑是Q系列的发送缓冲区:如果你用TO指令写D1000,但写的长度超过了配置的100字,会覆盖到其他区域,导致数据错乱。我一般会在Q系列程序里加一个长度检查,确保写入不超过缓冲区边界。
实操心得:联调时养成习惯,先传固定值,比如全传0或全传1,确认链路通了再传实际数据。这样能快速区分是通信问题还是数据问题。
4.3 实时性与数据量控制的经验
开放式Socket通信的实时性取决于网络负载和扫描周期。S7-1200的TSEND_C是异步执行,发送完成需要几个扫描周期。如果数据量大,比如传1000字节,可能会影响PLC扫描周期。我的经验是:单次发送不超过200字节,发送周期不低于50ms。如果数据点多,可以分多个连接或分时发送。
Q系列这边,固定缓冲区通信的发送是TO指令触发,接收是FROM指令读取。FROM指令会占用扫描时间,如果接收区很大,建议用中断或定时读取,不要每个扫描周期都读。
另外,如果产线上有大量广播或多播流量,建议用工业交换机划分VLAN,把PLC通信隔离出来,避免网络风暴导致通信超时。我做过一个项目,客户把PLC和摄像头接在同一台交换机上,摄像头流量一大,PLC通信就断,后来加了VLAN就稳了。
5. 扩展思路与多设备组网建议
5.1 一台S7-1200对接多台Q系列
如果产线上有多台三菱Q系列,S7-1200可以用多个TSEND_C/TRCV_C实例,每个实例对应一个Q系列的IP和端口。但要注意S7-1200的连接资源有限,1214C最多支持8个开放式通信连接。如果超过8台,就要考虑用网关或换CPU。
我一般会做一个连接管理DB,把每台Q系列的IP、端口、发送区、接收区、状态字都放在一个结构体数组里,用循环调用TSEND_C/TRCV_C。这样扩展方便,加一台设备只需在数组里加一个元素。
5.2 数据打包与协议约定的最佳实践
跨品牌通信最怕数据格式变来变去。我的做法是:在项目初期就定一份通信协议表,写明每个数据的偏移地址、数据类型、字节长度、含义、更新周期。双方工程师按表编程,联调时逐项核对。协议表可以放在DB块里,用注释写清楚,后期维护也方便。
如果数据点很多,可以加一个心跳字和校验字。心跳字每周期递增,对方检测到心跳不变就知道通信断了;校验字用简单的异或校验,防止数据传输出错。这些在开放式通信里都是自己加的,虽然麻烦,但能省去很多现场排查时间。
5.3 从Socket通信升级到OPC UA的可能性
如果项目预算允许,且双方PLC都支持OPC UA,可以考虑用OPC UA做跨品牌通信。S7-1200从固件V4.0开始支持OPC UA服务器,三菱Q系列也有OPC UA模块。OPC UA的好处是自带信息模型和订阅机制,不用自己定义数据格式。但缺点是配置复杂,授权费用高,而且老Q系列可能不支持。我目前还是用Socket通信为主,因为够用、成本低、可控性强。
最后分享一个小技巧:联调时如果手头没有交换机,可以用一根网线直连S7-1200和QJ71E71,但要注意网线是交叉线还是直连线。现代设备大多支持自动翻转,直连就行。如果连不上,先换根网线试试,别一上来就怀疑程序。我踩过这个坑,折腾了半天程序,结果是网线水晶头松了。