前阵子有个兄弟问我,两个PLC之间想做信号交互,除了硬接线还有没有别的办法。我说有啊,Profinet IO就挺好使。
说起来他遇到的情况跟我去年一个项目很像——甲方要求把两条独立产线的PLC连起来。一条线是包装机,用S7-1200控制。另一条线是码垛机,也是S7-1200。需求很简单:包装机生产完一个托盘,给码垛机发个信号,码垛机就知道有货来了,自动去接。
听起来不难对吧?但问题在于甲方不想加任何硬件——不加交换机、不加通讯模块、不改现有程序太多。就一句话:”你们两根网线对插一下不就完了?”
我当时心里想的是:大哥,你当这是路由器呢?
不过后来我想想,PLC之间做简单的信号交互,Profinet IO确实是最直接的方式,一个作为IO Controller,一个作为IO Device,把对方的输入输出当自己的用。
今天就聊聊这个,把我踩过的坑也一并说了。
Profinet IO和Profinet CBA的区别
先扫个盲。
很多搞PLC的兄弟分不清Profinet IO和Profinet CBA。简单说,IO是一主多从模式——一个Controller管一堆Device。CBA是对等通讯——各PLC之间平等对话。
做数据交换,最常用的就是Profinet IO。A PLC做Controller,B PLC做Device。A的DB块可以直接映射到B的I区。
具体怎么做
我用的两台S7-1200,固件版本V4.5。TIA Portal V18。
第一步:硬件连线
两台PLC直接用网线连到同一个交换机上(或者直连也可以,但是官方不推荐直连,因为Profinet要求环形拓扑或者星形,直连在调试的时候经常出奇怪的问题,后来换成交换机就稳定了)。
IP地址配置:
– PLC-A(Controller):192.168.0.1
– PLC-B(Device):192.168.0.2
第二步:在TIA Portal里组态
1. 在TIA Portal里同时把两台PLC都加进去
2. 打开PLC-B的设备组态,在操作模式里勾上”IO Device”,设定分配给PLC-A
3. 在PLC-B里添加传输区(Transfer Area),把要发给PLC-A的数据和从PLC-A接收的数据配置好
传输区大小一般设32字节就够用了。传送速率的话,Profinet IO默认的更新周期是1ms到512ms可调。信号交互用1ms有点浪费,我设的16ms。
第三步:在PLC-A里调用
在PLC-A里,PLC-B的I/Q区会被自动映射出来。比如你在PLC-B的传输区里配了”发送给Controller”的Q区,那么在PLC-A里读I区就能拿到PLC-B发来的数据。代码量非常少,逻辑清爽。
踩过的坑
坑1:Device名称必须和硬件一致
这是最基础但也最容易忘的。Profinet IO靠设备名称(Device Name)来识别硬件,不是靠IP地址。你在硬件组态里给PLC-B起名叫”palletizer_device_01″,那么PLC本体里也必须是这个名字,否则连不上。
有一次在调试现场,我把程序下载完之后发现Controller一直报”Device Name not set”。后来发现是新换的PLC没设设备名,用PRONETA(西门子免费工具,强烈推荐)重新设一下就好了。
坑2:传输区大小不能随便写
第一次配的时候,我设了64字节。结果下载时报错说”IO data length mismatch”。后来查手册才发现S7-1200做Device的时候,传输区最大就是32字节输入、32字节输出。如果超过这个限制,就得用PUT/GET指令走S7通信了。
坑3:固件版本不兼容
我的PLC-A固件V4.5,PLC-B固件V4.0。在TIA Portal V18里组态,设备列表里找PLC-B V4.0找不到对应版本。解决方案就是刷固件。我花了半天研究怎么在TIA Portal里在线更新固件,发现其实很简单——软件里点”固件更新”,选文件就行。但前提是你得先把固件文件下载到本地。西门子官网要账号,我找销售要了一下才拿到。
坑4:诊断信息怎么看
刚调试好的时候,PLC-A一直报”IO Device Fault”,红灯闪烁。我当时一脸懵逼,不知道哪里错了。
后来发现在TIA Portal的设备组态里,右键PLC-A → 在线 → 诊断。诊断缓冲区里会详细告诉你哪个Device丢了、什么原因。
常用的诊断方法:
– 看LED灯:Device的BF灯闪烁说明通讯异常,常亮说明通讯中断
– 看诊断缓冲区:TIA Portal在线状态下,每个CPU的诊断缓冲区会记录错误代码
– 用PRONETA扫网络:免费工具,能扫出网络上所有Profinet设备以及它们的状态
坑5:IO周期设置太短引起CPU负载过高
开始不懂,把IO更新周期设成了1ms。结果PLC-A的CPU负载从10%飙到了60%。Profinet IO每1ms刷新一次,对于只要传几个开关量信号的应用来说,完全没必要。后来改回16ms,CPU负载降到5%以下。
项目最终效果
两条产线现在配合得很好。包装机每完成一个托盘,DB块里的”包装完成”位置1,码垛机收到信号后自动过来接。
中间也出过一次问题——交换机坏了,Profinet IO断掉了。但好在Profinet IO有断线检测,PLC检测到IO Device丢失之后,自动发出报警,操作员看到直接打电话叫我去修。15分钟换了交换机,一切恢复。
总结
Profinet IO通信在S7-1200上做信号交互,确实比走I/O硬接线方便太多了。以前两台PLC之间传信号得拉控制电缆、配继电器、加隔离。现在一根网线+一个交换机就搞定。
硬接线的方式在某些场合确实可靠,但说句实在话,现在交换机质量已经很稳定了,Profinet IO的实时性也完全够用。你要说安全性,IO Device丢失了PLC还能检测到报警,硬接线断了你都不知道。
你们做PLC之间的通信用的是Profinet IO还是I/O硬接线?有遇到过什么奇葩问题吗?欢迎在评论区聊聊。