做设备的人都知道,包装机械里的包膜机算是非标自动化里最“万金油”的机型,但同时也是最容易在控制层面翻车的设备。它既有伺服定位、温度控制这种连续量逻辑,又有大量气缸顺序动作、气动夹紧、切刀联动这种标准离散控制,再加上需要跟变频器、温控表、称重仪表这类第三方设备做通信,对PLC的程序架构和触摸屏的人机交互要求都不低。
我近几年做过的几个包膜机项目里,用得最顺手、后期维护反馈最好的组合就是西门子S7-1200PLC加威纶通触摸屏。S7-1200在中小型设备上的性价比和博途环境的调试效率确实能打,威纶通EBPro组态灵活、报警和变量处理方便,两个配合起来可以说是非标包装设备的经典搭档。这篇就把我从项目前期选型、I/O分配、程序架构,到Modbus轮询的坑、威纶通报警导入和弹窗切换的完整方案一次说清楚,给正要上手这类设备的朋友做个参考。
1. 包膜机工艺流程与控制需求拆解
包膜机这个词其实覆盖面很广,有做热收缩膜的,有做三维透明膜包装的,也有做袖口式套膜装箱的。但不管什么形式,控制逻辑的内核高度相似:送料、供膜、封切、成型、出料,外加一套热封温度控制和若干安全互锁。这里面真正决定设备能不能稳定跑的,不是某一个动作多复杂,而是整个节拍内各执行机构的时序配合。
1.1 典型工艺环节和对应的执行机构
以最常见的侧封式热收缩包膜机为例,整机工艺大致可以分为六个工位:
- 产品进料:由前段输送线送到包装工位,通常用光电传感器检测到位,变频器或伺服电机驱动输送带。
- 膜卷供膜:膜卷由伺服电机牵引,完成送膜、拉膜、定长截切。送膜长度直接影响包装外观,所以这一轴的控制精度是整个设备的命门。
- 成型器封合:薄膜包裹产品后,通过横封刀和纵封刀加热封口。刀具动作一般由气缸推动,加热温度由温控模块或PLC的PID调节。
- 裁切分离:封口完成的同时用切刀将膜切断,有的机型切刀和封刀一体,有的分两工位。
- 热收缩:封好的产品进入收缩炉,炉内温度分区控制,输送速度根据炉温自动匹配。
- 出料整理:收缩完成的产品经过冷却段和出料输送线,进入下一道装箱工序。
从这个工艺清单就能看出来,包膜机的控制对象非常杂:伺服轴、变频器、温控回路、气缸电磁阀、各种光电和磁性传感器。这就决定了PLC选型时必须把通信接口、高速脉冲输出或者总线轴控能力、模拟量采集通道、以及足够的数字量I/O点全部考虑进去,缺一个后面都要拿扩展模块来找补。
1.2 控制系统的核心设计思路
我在规划这种设备时,第一件事不是写程序,而是先理清楚控制架构。包膜机属于典型的“顺序逻辑为主、连续控制为辅”的混合型设备,所以程序结构我习惯按状态机来划分,而不是一上来就堆梯形图。
设备工作模式至少分三种:手动模式(单动检修用)、自动模式(正常生产)、回原点模式(换膜或故障恢复后复位)。每种模式下,各工步的转换条件必须先列清楚,比如“送料到位且前工位无料”才允许启动供膜;“封刀温度达到设定值且安全门关闭”才允许自动运行。这些条件如果不在程序里做成显式的互锁逻辑,设备迟早会出安全事故。
另外一个容易忽略的点是电控柜的硬件布局和网络拓扑。S7-1200作为主站,下面挂几路从站设备,比如变频器走Modbus RTU、温控表走Modbus RTU、伺服走脉冲或PROFINET,触摸屏走以太网。整个网络层次要提前画出来,尤其要考虑Modbus轮询和PLC扫描周期、HMI通信之间的相互影响,这部分后面我单独展开。
2. PLC选型、硬件配置与I/O分配方案
S7-1200家族型号很多,从1211C到1217C都有,选型时主要看三个指标:数字量I/O点数、模拟量通道数、以及是否需要多路高速脉冲输出或总线运动控制。包膜机这种设备,我给的建议是CPU尽量选1214C或以上,原因很简单——1214C自带14DI/10DO,板载2路模拟量输入,还支持4路高速计数和2路脉冲输出,基本覆盖了常规包膜机的需求。如果后期要挂4个以上伺服轴,建议直接上PROFINET版本的伺服,或者选1215C以上的型号配合多的脉冲输出点。
2.1 硬件配置清单和模块选型
下面是我在一个典型包膜机项目里用过的硬件配置,大家可以参考这个盘型:
| 硬件项目 | 选型建议 | 说明 |
|---|---|---|
| CPU | S7-1214C DC/DC/DC | 自带14DI/10DO,2路AI,4路高速计数,2路脉冲输出 |
| 数字量扩展 | SM 1223 DI16/DO16 | 补充气缸阀岛、传感器、报警灯等I/O点 |
| 模拟量扩展 | SM 1231 AI 8路(热电偶) | 用于封刀温度、收缩炉温区的温度采集 |
| 通信模块 | CB1241 RS485(选配) | 如果CPU型号不带第二个串口,用这个扩展Modbus RTU |
| 伺服驱动 | 支持脉冲/Modbus的国产伺服或西门子V90 | 供膜轴、拉膜轴各一台 |
| 变频器 | 支持Modbus RTU的通用变频器 | 驱动输送带、收缩炉风机 |
| 触摸屏 | 威纶通MT8071iP或TK6071iP | 10寸以内完全够用,性价比高 |
有人会问,为什么不直接用1217C或者上S7-1500?说实话,包膜机不算高端设备,成本和维护便利性才是甲方最在意的。S7-1200全系使用博途V15以上版本就可以编程,程序的上限远超包膜机需要的水平,没必要花几倍预算去追求过剩的性能。
2.2 I/O点表分配原则
I/O分配这个环节看着简单,但实际上特别影响后期的接线和调试效率。我的原则是:输入按区域分组、输出按负载类型分组、备用点必须预留。
以下是我常用的分配思路(以1214C加SM1223扩展为例):
| 地址区 | 用途 | 规划说明 |
|---|---|---|
| I0.0 - I0.3 | 启动/停止/复位/急停 | 急停必须接硬回路,同时在程序里做软互锁 |
| I0.4 - I0.7 | 供膜轴原点、送料检测、封刀到位、切刀到位 | 伺服和气缸的反馈信号,用于步进条件判断 |
| I1.0 - I1.5 | 纵封气缸上/下限、横封气缸上/下限、膜断检测、安全门检测 | 气缸磁开关和传感器,安全相关的点全部进PLC |
| Q0.0 - Q0.3 | 供膜伺服脉冲/方向、拉膜伺服脉冲/方向 | 板载高速脉冲输出,接伺服驱动器 |
| Q0.4 - Q0.7 | 纵封电磁阀、横封电磁阀、切刀电磁阀、真空吸膜阀 | 气缸动作输出 |
| Q1.0 - Q1.3 | 输送带变频器启停、收缩炉风机启停、蜂鸣器、三色灯 | 启停控制加报警指示 |
模拟量方面,SM1231热电偶模块的通道分配我习惯跟温区一致,比如通道0为横封刀温度、通道1为纵封刀温度、通道2到通道5为收缩炉四个温区,这样程序里做温度数组时可以直接对应,不用来回映射地址。I/O点表提前定下来还有一个好处,后面写触摸屏变量表时可以直接引用,不用等设备装好再补。
2.3 S7-1200与威纶通组网的通信配置
威纶通触摸屏和S7-1200之间的通信,在不同项目里我用过两种方式,简单对比一下:
- 以太网直连方式:触摸屏和PLC通过网线直连或经过交换机,EBPro里选Siemens S7-1200驱动,填PLC的IP地址。这种方式最稳定,通信速度也快,程序上下载和触摸屏监控同时进行毫无压力。对于每台设备单独配一个触摸屏的单机项目,我强烈建议这种方式。
- Modbus模式:触摸屏做主站,PLC做从站,通过S7-1200的PROFINET口映射Modbus TCP,或者通过CB1241走Modbus RTU。这种方式在老的威纶通屏上比较常见,但变量访问效率不如以太网直连驱动高,而且需要在PLC里把数据块映射到保持寄存器区,增加一层维护成本。
说实话,现在的新项目我基本不再用Modbus方式连威纶通了。S7-1200全系都有以太网口,威纶通EBPro对S7-1200的原生驱动支持已经非常成熟,直接走以太网驱动不仅能读写I/O和M区,还能直接访问数据块,变量刷新速度快,后期做报警和配方都方便很多。
通信配置里我踩过最明显的坑是IP地址规划。S7-1200的PROFINET口默认IP是192.168.0.1,但很多电工师傅习惯把触摸屏也设成192.168.0.1,一上电两个设备就冲突了。我的习惯是把PLC设成192.168.1.10这类固定地址,触摸屏设成192.168.1.20,子网掩码统一255.255.255.0,网关不设。如果有上位机或者MES要接进来,再单独规划一个网段或加交换机。
3. 核心控制逻辑设计与程序架构
包膜机的PLC程序,如果你一上来就打开梯形图网络开始写,大概率会写成一团乱麻。我见过不少项目,程序倒是能跑,但后面改一个条件要找半天逻辑,或者加了新功能之后整个时序就乱了。所以程序架构一定要先规划。
3.1 基于状态机的自动流程设计
自动流程我习惯用一个字节或者一个整型变量做“当前工步号”,用CASE指令或跳转指令来组织。每个工步都有三个基本要素:步进条件(满足后进入下一步)、本步动作(执行哪些输出)、跳转目标(下一步或指定步)。这样做的好处特别明显:调试时想让人工干预,只需要改工步号,就能跳到指定位置;故障恢复时也可以从断点继续,不需要从头来过。
以“自动循环”为例,工步划分大致如下:
| 工步号 | 工步名称 | 本步动作 | 步进条件 |
|---|---|---|---|
| 0 | 待机 | 等待启动信号 | 启动按钮按下,且无报警 |
| 10 | 送料 | 前段输送带运行 | 产品检测到位 |
| 20 | 供膜 | 供膜伺服定长送膜 | 送膜长度到,膜张力正常 |
| 30 | 纵封 | 纵封气缸下压、加热 | 气缸到位反馈,温度OK |
| 40 | 横封/切刀 | 横封气缸动作,切刀下切 | 气缸到位,切刀反馈 |
| 50 | 出料 | 后段输送带运行 | 出料检测有料且已封切完成 |
| 60 | 回待机 | 各气缸复位 | 所有输出复位、无报警 |
这里特别提醒一下,工步号之间一定要加“超时保护”。气缸动作如果超过3秒没到位,那就是卡料或者气路有问题了,程序必须报警停机,不能无限等下去。伺服定位如果超过设定时间没到位,多半是卡膜,同样要报故障。这个在设备调试初期就能帮你省掉大量的排查时间。
3.2 供膜伺服与定长控制
包膜机的供膜轴是整个设备的精度核心。如果用S7-1200板载脉冲输出控制伺服,我一般用两个轴工艺对象来做:一个供膜轴,一个拉膜轴。轴工艺对象的好处是可以通过MC_MoveRelative或者MC_MoveAbsolute指令实现相对定位和绝对定位,程序里不用自己计算加减速曲线和脉冲个数,博途帮我们把这一层封装好了。
定长控制最怕的是送膜长度误差累积。我实际项目里用两种手段解决:一是每次动作完成之后把实际位置读到数据块里,下一次定位以当前实际位置为基准做相对运动,不用绝对位置累加,这样误差不会累积;二是加一个编码器反馈在送膜辊上,做成闭环,把编码器的实测长度和伺服指令长度做比较,一旦偏差超过设定阈值就报警提示膜可能打滑或张力异常。
3.3 温度PID控制逻辑
封刀温度和收缩炉温区的控制,如果用温控表就走Modbus读写设定值和实际值,如果直接用PLC模拟量采集,就要自己写PID。S7-1200自带PID_Compact指令,底层算法已经封装好,只需要配置输入输出通道和设定值。但PID参数整定还是得靠经验。
我这边分享一个比较粗糙但实用的整定方法:
- 先把P值设小,比如1到2,积分时间放到很大,微分关闭,让系统不振荡也不超调。
- 然后慢慢往上升P,直到温度稳定时间最短且不产生明显过冲。
- 再加上积分,积分时间一般设为P的2到3倍,用来消除稳态误差。
- 温度控制我基本不用微分,因为热电偶信号本身噪声大,微分容易放大干扰。
加热输出建议用固态继电器加脉冲宽度调制(PWM)的方式控制加热管,而不是直接通断接触器。固态继电器开关频率可以到秒级,PID输出周期设个500毫秒到1秒,加热过程更平稳,封刀温度波动能控制在±2度以内。
3.4 安全互锁与故障处理机制
包膜机涉及加热、气缸、切刀、高速伺服,安全设计做不好就是事故源。我在程序里做了三层保护:
- 硬件层:急停按钮直接串在电磁阀和伺服使能回路里,急停一按,气缸失压、伺服掉使能,不管PLC程序跑到哪一步,机器都会停。
- 软件层:安全门开关、膜断检测、切刀原点信号,这些全部进PLC逻辑。比如安全门打开时,所有自动流程立即暂停,气缸输出全部切断,伺服使能断开。
- 策略层:故障发生后,程序自动记录故障代码和故障发生时的工步号。操作员清除故障后,可以选择回到故障前的工步继续运行,但前提是所有执行机构都已经复位到位。这个逻辑在设备连续生产时特别重要,否则每次小故障都要重新跑一整轮包装流程,废品率会很难看。
4. Modbus轮询的实现与“数据覆盖”避坑方案
Modbus轮询这部分,我单独拿出来讲,是因为这些年做包膜机项目,几乎每次都有人在通信上栽跟头。尤其是标题里提到的“S7-1200做Modbus轮询读取频率会覆盖其他数据”这个问题,我用两个项目踩过坑之后才彻底搞明白。
4.1 S7-1200 Modbus RTU轮询的正确姿势
S7-1200做Modbus RTU主站,标准做法是用MB_COMM_LOAD配置串口,再用MB_MASTER指令发起读写请求。MB_MASTER每个扫描周期只能处理一条请求,所以如果项目里有变频器、温控表、称重仪表等多个从站,必须自己做轮询调度。
这里最常见的错误就是把所有从站的数据都读到同一个数据地址区,或者用同一个数据指针。比方说,第一次轮询读1号变频器的频率写到DB1.DBW0,第二次轮询读2号温控表的温度也写到DB1.DBW0,那两个数据不就互相覆盖了吗?这不是偶发问题,而是程序逻辑设计错误。
正确的做法是给每个从站单独的存储区域,我的习惯是用一个数组或者结构体,每个从站一个结构,内部字段按仪表数据手册定义好。然后轮询计数器从0开始,每轮+1,根据计数器值切换MB_MASTER的DATA_PTR指向不同的数据块偏移。下面是个示意逻辑:
- 轮询计数器从0到N-1循环;
- 计数器等于0时,MB_MASTER读写1号变频器的数据区,DATA_PTR指向“从站1数据”结构;
- 计数器等于1时,MB_MASTER读写2号温控表的数据区,DATA_PTR指向“从站2数据”结构;
- 计数器等于2时,读写3号称重仪表,依此类推;
- 每执行完一条请求,把MB_MASTER的DONE位或ERROR位处理后,才允许计数器加1。
这样每个从站的数据始终在自己独立的结构体里,不会互相覆盖。而且即使某个从站通信异常,也只影响它自己的数据区,不会把其他从站的正常数据冲掉。
4.2 轮询周期与数据有效性的平衡
Modbus轮询还有另外一个隐蔽的问题:数据刷新频率。S7-1200的扫描周期一般在10毫秒以下,但一个Modbus RTU请求从发帧到收到响应大约需要20到50毫秒(取决于波特率和报文长度)。如果挂4个从站,每个从站读3到5个寄存器,一轮完整的轮询可能要200到300毫秒。
这个刷新速度在包膜机上够不够用?要分情况看。如果只是监控变频器的运行频率和电流,几百毫秒的刷新完全没问题。但如果是用通信方式给变频器写频率给定,或者读称重仪表的值做配重控制,那几百毫秒的延迟就会明显影响设备的动态响应。我的原则是:有实时性要求的控制量尽量走硬接线,Modbus只承担参数设定和状态监控的角色。这样通信负载低,轮询周期短,可靠性也高。
另外还有一个必须做的防护:判定“数据新鲜度”。Modbus读回来的数据放在DB里之后,因为通信异常或者从站掉线,数据可能一直停在最后一次正常读到的值。如果你在程序里直接用这个值做联锁判断,设备可能会在错误的数据下继续运行。我一般会在每个从站结构里加一个“通信超时标志”:如果连续2到3个轮询周期都没收到该从站的正常响应,就置位通信故障,同时将对应的数据有效性位置0。触摸屏上面就可以显示“xx从站通信中断”,程序里也不会拿过期数据做逻辑判断。
4.3 通信指令和扫描周期的相互影响
S7-1200的MB_MASTER指令不像200 SMART那样要手动管理完成位,但在调用时还是要注意REQ端子的触发方式。如果REQ每个扫描周期都为TRUE,那PLC会不断发起新的请求,可能造成请求排队甚至通信拥堵。正确做法是用一个周期脉冲(比如1秒的时钟脉冲)来触发一次REQ,然后等MB_MASTER的DONE位置位后,再切换下一个从站的请求。
举个例子,我把轮询脉冲设为200ms的周期,每来一个脉冲执行一次MB_MASTER,因为要轮询4个从站,一个完整周期就是800ms。实际调试时,如果发现变频器响应慢或者偶发抖动,可以把波特率从9600提到19200,报文长度尽量精简,只读需要的寄存器,不要一次读一大片没用的数据。Modbus通信不是读取越多越好,报文越短越抗干扰。
5. 威纶通触摸屏与S7-1200联调完整方案
触摸屏这块,威纶通EBPro的强大之处在于它的灵活性和导入导出机制。但很多朋友第一次做S7-1200配威纶通的项目时,卡在“变量怎么建”“报警怎么导”这些基础问题上,我这里把整个流程走一遍。
5.1 EBPro中建立PLC连接和变量
新建设备时,在“系统参数”里选“新增设备”,厂商选Siemens,类型选S7-1200 Ethernet,然后填IP地址。注意EBPro里的设备类型要跟你实际用的PLC型号匹配,S7-1200选“S7-1200”驱动即可。
变量建立有两条路:
- 手动建立:在“资料/历史”里直接新增变量,地址格式有点讲究。I区写I0.0,Q区写Q0.0,M区写M0.0,DB区写DB1.DBW0这种格式。S7-1200的数据块如果开启了“优化的块访问”,触摸屏直接访问会困难,建议在博途中把用于HMI通信的数据块改成“非优化的块访问”,或者用绝对地址访问方式。
- 批量导入:如果PLC里已经建好了变量表,用博途导出变量(可以是CSV格式),再在EBPro里用“地址标签/导入”功能批量导入。这个功能在做大型项目时非常省时间,几百个变量手敲容易出错,导入还能保留注释和数据类型的映射关系。
批量导入这个点,跟热词里提到的“西门子博图怎么将数据块中的报警标签和注释导入威纶通触摸屏”是同一个思路。博途的数据块变量导出后,用EBPro的导入向导,选择“从Siemens TIA Portal导出变量”就能把变量名、数据类型、注释一起带进来。我第一次用这功能时还觉得不靠谱,后来实测非常顺,强烈推荐。
5.2 报警标签和注释的导入实现
报警设计是触摸屏里最容易被忽略、但客户最看重的功能之一。包膜机常见的报警有:膜断、供膜伺服故障、封刀温度超限、收缩炉温度超限、气缸不到位、通信故障、安全门打开等等。
在威纶通EBPro里做报警有两种方式:
- 直接在EBPro里建立报警变量,变量地址指向PLC相应的位置。这种方式简单直接,适合报警数量少、类型固定的项目。
- 把博途中的PLC报警文本(Alarm text)导出,然后通过EBPro的“报警导入”功能批量生成报警记录。这种方式适合报警数量大、需要跟PLC程序报警文本保持一致的场景。
我实操时用的流程是这样的:先在博途里把PLC的所有报警组态好,每条报警绑定一个位地址并填写报警文本。编译后,在博途的“PLC报警”里选择“导出”,生成CSV或XML文件。然后打开EBPro的报警功能,选“导入”,指向刚才导出的文件。导入后检查一下变量地址映射是否正确,尤其是数据块地址的偏移量,然后编译下载到触摸屏。这样做的好处是PLC和触摸屏里的报警文本完全一致,后续改报警文字只需要在博途里改一次,再导出导入一遍就行,不会出现两边报警描述对不上的尴尬。
5.3 变量替换功能的实战用法
热词里提到的“威纶通触摸屏变量替换”,在EBPro里对应的是“查找/替换”功能。这个功能在以下场景特别有用:
- 项目复制之后,需要把一套画面里的变量全部换成另一套变量。比如复制了3台包膜机的画面,每台机器的数据块地址不同,手动改会累死人。
- 调整变量地址映射时,比如原来用M区变量,后来改成DB区变量,批量替换一下就行。
- 修改变量名前缀。比如从“BTJ1_供膜速度”改成“BTJ2_供膜速度”,查找替换一次搞定。
EBPro的查找替换在大工程文件里也能用,不像某些组态软件只支持单画面替换。不过我提醒一句,替换前一定要备份工程文件,因为查找替换是批量操作,万一你只想替换一部分变量但条件设置得太宽泛,回车之后画面里一堆地方被改错,到时候再想恢复就麻烦了。我一般会先导出一份变量清单,看清楚要替换的范围,再执行操作。
5.4 弹窗索引的工程化应用
弹窗(Popup Window)是我在威纶通项目里非常喜欢用的功能。包膜机操作画面多,如果每个功能都做独立窗口,画面数量会失控。弹窗可以做到只占用一个窗口编号,内容由索引寄存器动态切换。
具体做法:
- 在EBPro中新建一个公共窗口作为弹窗容器,窗口里放一个“索引显示”控件或者通过宏指令控制内部元件的可见性。
- 分配一个LW寄存器作为索引寄存器,比如LW-0。
- 在画面上放多个按钮,每个按钮写入不同的索引值。比如按钮1按下去,LW-0=1,弹窗显示“手动调试”页面;按钮2按下去,LW-0=2,弹窗显示“参数设置”页面。
- 在弹窗里通过“功能键”或者“宏指令”检测LW-0的值,切换画面中对应页面的“可见性”属性。
这样做的优势是:画面数量少、切换速度快、程序维护方便。我做过一个包膜机项目,整机画面加弹窗总共只用了十几个窗口,而如果用传统方案,至少要多出来五六个独立画面,编译和下载的时间都变长了。
弹窗里还要注意一个问题:触摸屏上的弹窗跟PLC程序是独立运行的,PLC无法直接知道操作员当前打开了哪个弹窗。如果PLC程序需要在某些情况下强制弹出报警提示,可以在PLC里写入LW-0的值来切换弹窗页面。这也是我选择用LW寄存器做索引的一个原因——PLC可以随时修改它,实现“强制弹窗”的效果。
5.5 配方和参数管理的实现思路
包膜机换产品规格时,需要调整的参数不少:送膜长度、封刀温度、收缩炉温度、输送带速度、气缸延时时间等。如果每次换型都在触摸屏上逐个改参数,又慢又容易漏。
我习惯在EBPro里用配方功能把这些参数做一个“规格表”,每种产品存一行配方数据。换型时,操作员在触摸屏上选择配方号,点击“下载”,配方数据一次性写入PLC数据块。
配方功能在EBPro里的实现比较成熟:先在“资料/历史”里建立配方数据,定义各字段对应的PLC地址,然后在画面上放一个“配方”控件,设置好配方编号和字段。运行时操作员可以直接通过控件新增配方、修改配方、上传下载配方。我做过一个项目,客户有十几种产品规格,原来换型要花二十多分钟,用了配方功能后三分钟就能搞定,客户的维护人员都说这钱花得值。
配方功能有个细节要注意:配方下载到PLC时,因为数据量可能比较大,PLC程序的接收逻辑要做成“先接收完成标志,再启用新参数”的顺序,避免参数写到一半设备就开始运行,用旧参数和新参数混在一起的数据来生产。我的做法是在PLC里做一个“参数更新请求”位,触摸屏配方下载完成后置位该请求位,PLC检测到请求后把数据块内的参数整体复制到运行参数区,再复位请求位,确认更新完成。
6. 大型项目调试中的常见问题和排查实录
调试包膜机这种设备,问题永远不会只出现在PLC程序里,往往是通信、机械、电气、甚至触摸屏组态多方面的因素纠缠在一起。以下这几个问题,都是我实际项目中遇到过并且排查了比较久的,整理出来给大家做个参考。
6.1 PLC与威纶通通信不稳定的快速排查
通信时断时续这个问题的排查思路,我一般是按“硬件-参数-变量”的顺序来:
- 硬件:先检查网线接口是否松动,屏蔽层是否接地,触摸屏和PLC是否共地。工业现场如果变频器和伺服驱动器的动力线跟网线走同一个线槽,干扰很容易把以太网通信搞挂。我吃过这个亏,后来所有通信线缆都单独走线槽,并且跟动力线保持20公分以上距离。
- 参数:核对IP地址、子网掩码、端口号。S7-1200的PUT/GET通信如果启用了“优化块访问”而触摸屏用的是绝对地址,会导致变量读不上来。需要在PLC里把对应数据块改成非优化访问,或者在驱动设置里打开“允许PUT/GET通信访问”。
- 变量:检查变量地址是否超出PLC实际地址范围。比如数据块大小只有100个字节,但触摸屏变量里定义了一个DB1.DBD400,通信就会报错或超时。
如果以上都没问题,就在EBPro里用“在线模拟”或者“通信监视”功能,看变量实时值是否正常刷新。EBPro自带的这个功能比PLC侧的在线监控方便得多,可以直接看到哪些变量通信失败了。
6.2 Modbus轮询过程中偶发性数据异常的排查
前面提到轮询数据覆盖是程序逻辑问题,但还有一类“偶发性数据异常”是通信干扰或者参数配置不当导致的。常见的症状是:某个从站的数据偶尔跳变一下、或者读回来的值和仪表面板显示不一致。
排查思路我建议按以下顺序:
- 先确认波特率、数据位、停止位、校验位跟从站设备完全一致。Modbus RTU的标准配置是9600、8、N、1,但很多仪表出厂默认可能不同,不一致时通信表现是时好时坏,特别有迷惑性。
- 再检查通信线缆和终端电阻。RS485总线两端需要120欧终端电阻,如果没接或者接错位置,长线传输时信号反射会导致偶发错误。
- 如果都没问题,让轮询计数器在每次请求完成后等待一个短暂延时(比如20毫秒),避开从站设备响应时间不足的问题。某些仪表写寄存器后需要几百毫秒才能完成内部处理,读太快会返回错误码或旧数据。
我调试时还习惯在MB_MASTER的ERROR位后面接一个“错误代码存储”功能,把错误码存到DB里。这样一旦现场通信出问题,让操作员把触摸屏上的通信错误码拍照发过来,我就能快速定位是超时、CRC错误还是从站异常响应,不用全凭猜。
6.3 报警不显示或报警地址对不上的处理方法
报警不显示这个问题的根源,十有八九是“PLC地址和触摸屏地址没对齐”。我做项目时吃过一次亏:在博途里组态报警时,报警位用的是DB1.DBX0.0,但触摸屏报警定义时地址写成了DB1.DBX0.1,结果报警条件都满足了,触摸屏上就是不弹报警。
后来我养成了一个习惯:所有报警位单独规划一个数据块区,比如DB10,这个DB块只放报警位,每位对应一条报警。然后在博途导出的变量清单里,把每个报警位的地址和报警文本整理成一个Excel表,再对照着导入EBPro。导入完成后,在EBPro的报警列表里逐条核对地址偏移,确保与PLC侧完全一致,之后基本再没出过这类问题。
6.4 触摸屏弹窗不切换或误切换的排查
弹窗不切换的常见原因有两个:
- 索引寄存器冲突。如果LW-0还被其他功能占用了,比如宏指令里也写了LW-0,程序运行时会互相覆盖,弹窗就会乱跳。我的习惯是规划一块专门的LW区间用于弹窗索引,比如LW-100到LW-200,其他功能一律不用这个区间。
- 可见性条件写反。弹窗里的页面元件可见性设置成“等于1时可见”,但PLC写入的索引值却是别的数字,自然看不到。这种情况把索引值打印到触摸屏的数值显示控件上,一看就知道哪里对不上了。
另外提醒一点:EBPro的LW寄存器有“断电保持”的设置,有些LW在重新上电后会保留旧值。如果弹窗的初始状态跟上次关机时的状态不一致,设备一上电弹窗状态可能不对。所以弹窗索引寄存器一定要设成非保持型,或者在初始宏里强制清零。
7. 项目收尾时的实用经验和工程习惯
最后分享几点我在包膜机项目里沉淀下来的实践经验,这些不是教科书上会写的东西,但实际能帮你少走很多弯路。
第一,程序里的每个数据块都要做匿名注释。不只是变量名有意义,数据块内的每个成员也要在注释里写清楚用途、单位、可能范围。这看起来费时间,但后期一旦需要远程协助客户排查问题,或者接手项目的同事要改程序,这些注释的价值比代码本身还大。
第二,PLC程序和触摸屏程序的版本要配套管理。我在项目交付时会给PLC程序和触摸屏程序打上版本号,比如V1.0、V1.1,并在触摸屏的“关于”页面里显示版本号。客户报故障时,第一句话问清楚现场装的是哪个版本的程序,很多事情瞬间就明朗了,省得拿旧程序去排查新问题。
第三,报警文本和报警代码一定要规范化。我建议所有报警都带一个固定的前缀,比如“ALM-001”这种格式。客户看到“ALM-001”配合报警文本,就知道是哪一类故障,反馈问题时也更精确。中文报警文本虽然直观,但有些客户的维护人员习惯用英文或者阿拉伯数字做记录,统一代码格式对双方都有好处。
第四,触摸屏上的操作记录功能一定要打开。EBPro支持操作日志记录,操作员按了什么按钮、改了什么参数、什么时候下发了配方,都会被记录下来。这个功能对排查“谁改了什么导致设备异常”这类纠纷特别有用,也方便设备管理方做责任追溯。
包膜机项目说大不大,说小不小,但控制系统的架构思路一通百通。S7-1200加威纶通这套组合,在这个场景下算是性价比和可靠性的最佳平衡点。希望这篇把关键踩坑点都讲透的内容,能帮正在做或准备做类似设备的朋友少走点弯路。