西门子S7-1200和三菱FX5U做以太网通讯,我折腾了两天终于搞定了
上个月接了个项目,客户要求把一条老产线的三菱FX5U和新增的西门子S7-1200连起来通讯。听起来像个常规需求对吧?我当时也是这么想的。结果这一干就是两天,中间踩了无数坑,今天专门写出来给兄弟们避避雷。
项目背景
这是浙江一家包装材料厂的项目。原来的产线用的是一套三菱系统,FX5U做主站,控制着几台伺服、一个触摸屏和几个温控模块。现在客户要在产线末端加一台自动分拣设备,用的是西门子的方案——S7-1200配一个ET200SP的远程IO站。
客户的要求很直接:分拣设备要根据产线过来的产品型号和尺寸做自动分类,所以西门子的PLC必须能从三菱那边读到产品数据。说白了就是两台PLC之间要做数据交换。
项目开始前我跟客户确认了一下数据量:需要传输的数据大概有30个字节,包括产品代码、长度、宽度、高度、重量和一些状态位。频率要求不高,每秒更新一次就够了。
第一个方案:Modbus TCP
一开始我想得很简单。两台PLC都支持Modbus TCP协议,那就走Modbus呗。三菱FX5U做Modbus TCP服务器,西门子S7-1200做客户端,轮询读取数据。这个方案技术成熟,文档也多,应该好搞。
结果一上手就发现不对劲了。
三菱那边,我用GX Works3配置了SLMP/Modbus TCP服务器功能,在以太网配置里把Modbus TCP使能打开,设好了端口号502。然后在全局标签里把要共享的数据地址规划好,用D寄存器区。
西门子这边,我用了TIA Portal的Modbus TCP库,调了”MB_CLIENT”功能块。按照手册配好IP地址、数据地址、数据长度。下载程序,在线监控——结果MB_CLIENT一直报错,错误代码我查了下是”连接超时”。
当时就懵了。两台PLC在同一个交换机上,IP地址在一个网段,物理连接肯定是通的。Ping也都能Ping通,怎么就连接不上呢?
踩坑记:端口号和防火墙
排查了大半天,最后发现问题出在两个地方。说出来你们可能会笑,但这就是现场的真实情况。
第一坑:端口号冲突。 三菱的Modbus TCP服务器默认虽然是502端口,但如果你在以太网配置里同时使能了SLMP,它会默认用另一个端口处理Modbus请求。我翻了半天三菱的手册才发现,FX5U的Modbus TCP服务默认监听端口是502没错,但如果使能了”SLMP通信”,两者会有冲突。解决方法很简单:在以太网配置里把SLMP和Modbus TCP的端口分开,或者不用的协议就不使能。
第二坑:防火墙和安全设置。 客户的IT部门在交换机上做了端口隔离策略,非标端口全部被拦了。但502端口是Modbus的标准端口,按理说应该放行的。后来发现他们只放行了TCP 2000-3000段的生产端口,502不在这个范围。找IT哥们开了个口子才搞定。
重新思考方案:Socket自由协议
Modbus TCP折腾到能通讯了,但客户又提了一个要求:数据格式希望用自定义的,因为后续还有别的设备要接入,统一数据格式方便管理。于是我想着干脆用Socket自由协议,自己做应用层。
三菱FX5U做Socket通讯是它的强项。用GX Works3的”Socket通信功能”库,可以很方便地创建TCP服务器或客户端。我让FX5U做服务器,用SP.SOCSND和SP.SOCRCV指令来收发数据。
我定义了一个简单的数据帧格式:帧头(2字节)+数据长度(2字节)+数据体(30字节)+CRC校验(2字节)。帧头用0xA5A5做标识,方便接收端做帧同步。
西门子S7-1200这边,我用TIA Portal的TSEND_C和TRCV_C功能块来处理Socket通讯。这两个块是西门子自带的功能,支持TCP和UDP协议。配置起来比三菱稍微复杂一点,因为需要先在硬件组态里把通信伙伴的连接信息配好。
具体步骤是这样的:
- 在S7-1200的设备组态里,添加一个新连接,选择”TCP连接”,对方填FX5U的IP地址,本地端口设一个空闲的高位端口(比如2000),对方端口设2000。
- 然后在程序里调用TSEND_C块,CONNECT引脚连到刚才配好的连接DB块,DATA引脚填要发送的数据区。
- TRCV_C块同理,接收对方发来的数据。
这里又踩了一个坑。三菱的Socket指令发送和接收是分开的,每次发送都要用SP.SOCSND。但西门子的TSEND_C是带连接管理的,连接建立后可以反复发送。两边行为不一致,结果第一次联调的时候,三菱那边发了数据,西门子这边收不到。排查了半天,发现是连接建立后西门子主动发了几个维持连接的空包,三菱收到后误以为是有效数据,解析的时候帧头对不上就丢弃了。
解决办法是在三菱的接收逻辑里加上一个缓冲区管理,头一次连接建立后的前几帧数据做丢弃处理,等通讯稳定了再开始解析。这个经验后来我用到了好几个项目里,都很管用。
最终成果和调试经验
折腾了两天,终于把通讯搞通了。数据显示在西门子的触摸屏上,跟三菱那边传过来的数值完全一致。客户验收的时候竖了个大拇指,我心里说:兄弟你不知道我这两天经历了什么。
总结几个实战经验给兄弟们参考:
- 通讯协议先定好再动手:哪怕两台PLC都支持Modbus,也要确认具体功能码和地址映射是否一致。不同品牌的实现细节千差万别。
- 物理层排查永远是第一步:网线通不通、交换机端口亮不亮、IP能不能Ping通。这些最基础的往往最容易忽略。
- 加一个心跳机制:不管用什么协议,通讯双方最好有周期性心跳。这样任何一方断线了,另一方马上能检测到并报警。我一般是用一个累加计数器,每秒加1,对方读到这个值连续3秒不变就认为通讯中断。
- 数据校验不要省:自定义协议一定要加CRC或者累加和校验。工厂车间里电磁干扰大的地方,数据在传输过程中可能被污染,没有校验你会被”随机报错”折磨疯。
这个项目搞完后,我写了一个标准的通讯模板,后面再遇到西门子跟三菱通讯的项目,直接用模板改改参数就完事了,再也不用折腾两天了。如果有兄弟需要这个模板,欢迎在下面留言,我整理一下发出来。
你们做不同品牌PLC通讯的时候,遇到过什么奇葩问题?评论区见!