1. 这不只是一台包膜机:先搞清楚控制需求
做设备电气这几年,我收拾得最多的一类机器就是包膜机。很多人一听这个名字,以为就是把货裹一圈膜,没什么技术含量。真到现场看了才知道,一台大型自动包膜机,尤其是给建材、家电、物流行业做整托包装的那种,转台、膜架、送膜、压膜、切膜、输送、安全门,几十个执行机构要在一条节拍下面联动,稍有配合不及时,轻则膜跑偏、膜面起皱,重则把整托货物带翻。这台设备的主控我用的是西门子S7-200 SMART,配合ABB和森兰的变频器走Modbus RTU通讯,整个程序按状态机架构来写,再加上报警分级、时间锁授权和一套完整的调试文档,才算真正顺利交付。这篇文章就是基于这个项目做的完整复盘,也是一份能直接落地的参考学习指南。
你适合读这篇内容的场景大概是这三类:一是设备厂电气工程师,正在做或者准备做缠膜、包装、输送类设备,想找一套成熟的控制框架;二是工厂里的售后维护电工,需要快速理解这类设备的程序结构和报警逻辑;三是刚入行的工控学习者,想知道一台“看起来没什么技术含量”的设备,到底藏了多少编程细节。读完你会发现,这套思路不只适用于包膜机,像贴标机、开箱机、码垛机,甚至基于西门子PLC的大棚灌溉这类顺序控制项目,结构上都能平移复用。
1.1 工艺流程与控制对象
这台设备是标准的自动托盘缠膜机,配合叉车上下料,完成整托货物的拉伸膜缠绕包装。工作流程写成一句话就是:货到、定位、旋转缠膜、断膜、复位、完成。拆细一点是下面几个工位。
进料与定位环节,货物由叉车放到转台,光电开关和限位开关确认到位,夹紧装置动作把货物固定住。缠膜环节,转台旋转带着货物转,膜架沿立柱上升或下降,送膜辊在预拉伸机构带动下匀速放膜。断膜收尾环节,缠够设定圈数后,压膜气缸压住膜尾,切膜机构把膜切断,抚平辊把膜尾贴在货物表面。输出环节,转台停稳,膜架复位,三色灯提示完成,货物由叉车取走。
控制对象跟着流程走:转台旋转电机、膜架升降电机、送膜辊电机各配一台变频器,加上压膜、切膜、夹紧几组气缸,以及安全门、急停、限位开关这些输入信号。整机I/O大概有三十个输入、十几个输出,规模不算大,但逻辑彼此嵌套,环环相扣,处理不好设备就跑不顺。
1.2 大型设备的三个控制难点
第一个难点是节拍。缠膜圈数、膜架上升速度、送膜速度和断膜时机是绑在一起的。单轴随便怎么跑都没问题,一旦联动起来,任何一路慢了半拍,膜就会松,或者堆褶。程序里不能靠一堆定时器硬凑,必须有一套清晰的时序模型,让每个动作都知道“上一步完成没有,下一步能不能开始”。
第二个难点是通讯。三台变频器全部通过RS485走Modbus RTU和PLC通讯,这不光是写启动停止命令那么简单。现场变频器一启动,电缆上的干扰就起来,通讯偶尔掉线、CRC报错都是家常便饭。后面我会把调试时踩过的坑一条一条列出来,这些都是真金白银换来的经验。
第三个难点是程序的可维护性。设备交付客户之后,现场电工不一定懂你当初的思路。程序里没有注释、没有分层、没有明确的报警文本,后面维护就是灾难。所以这个项目从一开始我就定了规矩:主程序只做调度,每个工位单独一个子程序,所有报警集中处理。这也是为什么这篇文章敢叫参考学习指南,因为这套结构可以直接抄去用。
2. 硬件选型与通信架构:S7-200 SMART怎么扛起大设备
2.1 主控选型:为什么选S7-200 SMART SR40
选型的时候其实纠结过S7-1200。说实话,如果这台设备将来要连MES、要上OPC UA、要做数字孪生,我肯定直接上S7-1200甚至S7-1500。但当时项目要求很明确:单机设备,逻辑控制为主,客户电工熟悉西门子的使用习惯,预算也要控制住。S7-200 SMART在这类设备上有天然优势:CPU本体自带以太网口,程序下载、触摸屏通讯都很方便;扩展模块便宜且现货充足;指令集对继电器逻辑非常友好;维修配件遍地都是,客户那边的电工也愿意接受。
具体型号选了SR40,也就是24个输入、16个继电器输出那款。为什么不用晶体管输出的ST40?因为这台设备的输出对象是接触器、电磁阀、三色灯,全是交流负载,继电器输出直接带,不用再挂中间继电器,接线省一圈。如果后面要加伺服脉冲控制,再换ST40也不迟,底座和程序基本可以平移。另外配了一块EM DT08扩展输出模块,把输出点扩到24个,留足余量,防止现场临时加东西。
顺便说一下什么时候该选S7-1200。如果你这台机器要跟MES交互、要做配方管理、程序要跑结构化文本和OPC UA,那S7-200 SMART就别硬扛了,直接上S7-1200。特别是“Process Simulate虚拟调试加OPC UA通讯”这种新玩法,是建立在S7-1200/1500平台上的,S7-200 SMART没有原生的OPC UA服务端。这里分享一条个人经验:选PLC不是选最贵的,是选“这个项目最稳的”。单机逻辑型的包装设备,S7-200 SMART就是最稳的那一类。
2.2 三台变频器协同:ABB与森兰的Modbus RTU接入
转台旋转电机是7.5kW,用ABB ACS355,看重的是启动转矩和低频特性好,转台带着几吨货物启动不能抖;膜架升降1.5kW和送膜辊2.2kW用的是森兰SB200系列高性能通用型变频器,性价比高,SB200本身自带RS485口和Modbus RTU协议,不需要额外加通讯板。
这里要先说一个很实际的点:很多人一听到“ABB变频器和西门子PLC通讯”,第一反应是加DP网关、加PROFINET通讯模块,其实完全不必。ACS355内置的RS485口就支持Modbus RTU,西门子PLC这边也不需要任何通讯模块,CPU串口直接当Modbus主站就行。Modbus RTU这个协议虽然老,但在现场抗干扰、调试方便程度上,对中小型设备依然是最实用的通讯方式,三台变频器挂一条总线,成本几乎为零。
西门子S7-200 SMART系列PLC与森兰变频器SB200的通讯也是同理。这台设备的三个变频器全部挂在一条RS485总线上,PLC是主站,变频器是从站。这里要特别提醒一句:变频器侧的“运行命令来源”和“频率设定来源”如果不在通讯模式下,你上位机怎么发启动、怎么给频率,变频器都置若罔闻。森兰SB200这块尤其明显,出厂默认是面板控制,必须在参数里把命令源和频率源切到MODBUS,新手十有八九卡在这一步。
2.3 通讯参数、接线与地址分配
Modbus RTU接线看着简单,实际最容易出幺蛾子。我的习惯是:三台变频器的RS485的A和B分别并联,全部接到PLC串口0的3、8两个端子;通讯线用屏蔽双绞线,屏蔽层单端接地;总线两端各并一个120欧终端电阻。请注意,端子千万不要接反,A/B接反的典型症状是“偶尔能通,通讯极不稳定”,查起来非常费时间。
参数上,以森兰SB200为例,需要设置的核心参数就是这几项:从站地址、波特率、数据格式。我现场统一设置为地址1号、2号、3号,波特率9600,8位数据、无校验、1位停止位。ABB ACS355走Modbus RTU时,要特别注意把它的现场总线协议从默认的ABB协议切换成Modbus RTU,然后同样设置站地址、波特率和校验。ABB有些型号默认波特率跟常规的9600不一样,第一次通讯不上时,先查这个。
地址分配方面,1号变频器是转台旋转,2号是膜架升降,3号是送膜辊,三台全部按Modbus从站方式映射,PLC作为主站轮询。这样后面写程序时,哪个站控制哪个轴一目了然,调程序不用翻图纸。
| 变频器编号 | 驱动机构 | 电机功率 | Modbus站地址 | 品牌型号 |
|---|---|---|---|---|
| 1号 | 转台旋转 | 7.5kW | 1 | ABB ACS355 |
| 2号 | 膜架升降 | 1.5kW | 2 | 森兰SB200 |
| 3号 | 送膜辊 | 2.2kW | 3 | 森兰SB200 |
3. 程序控制核心:状态机、EN/ENO与变频器驱动
3.1 用状态机把连续工艺变成有序步骤
包膜机的工艺是典型的“顺序加条件”结构,我建议用状态机,而不是一堆“置位复位加定时器”硬拼。这个项目里,我在主程序里用一个整数变量VB100表示当前步号:0是待机,10是定位,20是缠膜,30是断膜,40是复位。每个子程序只负责处理当前步号对应的动作,以及“满足什么条件就切换到下一步”。这样有几个好处:
节拍逻辑全集中在一张表里,调试时看VB100的数值就知道设备卡在哪一步;新增工艺步骤不用打乱原有程序,插一个步号就行;手动、自动可以共用同一套状态机,只是手动模式下步号由按钮触发,自动模式下步号由条件触发。
步进切换是最容易写坏的地方。我自己的规矩是:同一个扫描周期里,一步只能向后切换一步,不允许一次跳两级;切换条件必须用沿触发,防止变量在多个步之间被重复使用;进入下一步之前,先复位上一步的输出。举个例子,缠膜步进入条件是“缠膜圈数计数器达到设定值”,这个条件一旦成立,先置位压膜气缸,再清圈数计数器,然后才把步号从20改成30。顺序一旦写反,计数器和气缸动作就会打架,设备就会出现莫名其妙的偶发故障。
3.2 EN/ENO到底是什么,实战中怎么用
西门子PLC里的EN是“允许执行”,ENO是“执行结果”。很多人把它当成普通逻辑线圈,其实ENO解决的是“这条指令到底执行成功没有”的问题。典型场景:除法指令DIV遇到除数为0,ENO变成0;通讯指令MBUS_MSG在总线忙时不执行,ENO也变成0;指针操作指向非法地址,ENO同样会断开。
判断指令是否正常,最直接的用法是把ENO串到下一个指令的EN上,形成链条:上一条失败了,下一条自动不执行。还有一种更实用的用法,是把ENO接到一个置位线圈上,一旦关键指令执行异常,立刻置出报警标志。比如我这里有一条“读变频器当前频率”的MBUS_MSG,如果通讯返回异常,ENO断开,我就把通讯报警位M0.1置位,触摸屏上马上提示,而不是等变频器真的停了才发现问题。
还有一个细节:上升沿P指令和下降沿N指令,它们的ENO和输出位是同一个意思,上升沿来了,ENO就通一个扫描周期。配合MBUS_MSG时,必须用这种沿触发来发起读写请求,否则每个扫描周期都发一次,总线直接堵死。这个点下面还会再讲,因为它直接关系到通讯能不能稳定跑起来。
3.3 变频器的启停、调速与反馈读取
变频器通讯这块,程序里用的是S7-200 SMART的MBUS_CTRL和MBUS_MSG两条指令。MBUS_CTRL每个扫描周期都要调用一次,负责初始化串口、设置波特率和校验方式;MBUS_MSG负责具体的读写请求,必须用沿触发,而且同一时刻整个PLC只能有一条MBUS_MSG在执行,所以多台变频器要用轮询方式排队。
我个人的写法是把变频器读写封装成一个独立的子程序,用一个整数变量做站号索引,依次读取1号、2号、3号的数据。每个站的读写内容包括三个部分:写控制字(启动、停止、正反转、故障复位),写频率给定值,读当前运行频率和输出电流。频率给定有个重要细节:西门子PLC传给变频器的频率值一般要按比例换算。比如你用的满量程是0到2000,对应0到50Hz,那要给定10Hz,实际写入的寄存器值就是400。这个换算系数不是拍脑袋定的,是根据变频器手册里的频率给定标定参数来的,最好在调试早期拿一个固定值实测确认。
读回来的运行频率也建议做换算后再给到触摸屏显示,而不是直接显示寄存器原始值。用户看到转速、频率对不上,第一反应就是程序有问题,其实往往就是换算系数不对。设备交付之后,这种问题解释起来非常费口舌,不如一开始就把换算做对。
4. 关键工艺环节的实现细节
4.1 缠膜动作的时序配合
缠膜是一个典型的多轴联动过程。我把它拆成几个动作窗口来设计时序:转台启动并达到设定转速后,膜架才开始上升;膜架运动过程中,送膜辊保持同步送膜;缠膜圈数够了一定层数,膜架开始下降;下降到设定位置后,转台减速,准备断膜。
这里最忌讳的是“动作都启动了就算完事”。我的方案是用一组状态标志位来描述当前缠膜阶段,比如转台稳定标志、膜架到位标志、送膜启动标志,每个标志都由各自的条件触发,所有后续动作都以这些标志的“与”条件作为启动前提。这样做的好处是,任何时候程序都知道“转台还没稳,膜架先别动”,不会出现机械上打架。
断膜时序更要小心。膜架回到原位,转台还在低速运行,此时压膜气缸先动作,把膜压在货体表面,紧接着切膜机构动作,切断后膜尾自然贴在货物侧面。这个窗口时间非常短,程序里不能简单用延时,而是用“压膜到位传感器加切膜到位传感器”作为完成条件。经验是:断膜这个动作宁慢勿快,一旦膜没切断还缠着,轻则膜卷报废,重则把膜架拉变形。
4.2 张力匹配与送膜速度的标定
缠膜质量的好坏,很大程度取决于送膜辊的预拉伸速度和转台速度之间的匹配。说白了,转台转得快,膜就得给得快,不然膜被拉变形甚至拉断;膜给得快了,转台跟不上,膜的张力就松,缠绕效果不好。
现场调试时我的做法是:先固定转台运行频率,然后把送膜辊变频器的频率从低往高一点点加,观察膜面的张力变化,直到膜的拉伸度合适、不起皱、不断膜。这个过程中,圈数计数对膜架升降的切换点也要同步调整。测量的时候别只肉眼看,要用张力仪或者手感,而且是连续观察一整圈,因为货物四个面的包膜效果不一样,要取最差的那个面来定参数。
标定完成后,把这几组速度写入触摸屏的自定义配方,下次换不同尺寸货物时直接调配方,不用重新接线或者改程序。这也是客户最认可的一个功能,换规格产品从原来的一两个小时改成五分钟搞定。
4.3 报警分级与安全联锁
电气设计里,安全永远是第一位的,程序只是最后一道防线。这台设备的急停回路我用的是硬接线,直接切断主接触器和变频器的使能信号,不进PLC做软处理。原因很简单:PLC扫描周期再短也是有周期的,而急停必须毫秒级动作。然后,程序里把报警分成了三级。
1级是提示性报警,比如通讯偶发掉线,只亮黄灯,设备继续跑,同时记录触发次数。2级是暂停报警,比如膜架上升超时,设备自动暂停当前动作,清理完故障后按复位键继续。3级是严重报警,比如安全门打开、变频器过流,设备立即停机并锁住主接触器,必须把故障原因排查清楚才能复位。
| 报警级别 | 名称 | 动作方式 | 典型示例 |
|---|---|---|---|
| 1级 | 提示报警 | 亮黄灯,记录触发次数 | 通讯偶发超时 |
| 2级 | 暂停报警 | 暂停当前动作,复位后继续 | 膜架上升超时 |
| 3级 | 严重报警 | 立即停机并锁主接触器 | 安全门打开、变频器过流 |
分级的好处是:客户现场不会因为一个小报警就整线停摆,也不会因为严重故障还在那硬跑。触摸屏上每一级报警都配了中文文本、触发时间和恢复条件,维护电工翻屏幕就能知道该看哪里,不需要打电话找厂家远程猜。
5. 参考学习指南:时间锁、通讯踩坑与调试经验
5.1 时间锁程序案例:基于RTC的授权时限实现与解锁思路
时间锁这个需求,设备厂商大概率都会遇到:设备或程序按合同分期交付,或者只授权客户使用到某个日期,逾期要联系厂家续费解锁。这是一个合法的商业行为,我在这里讲实现思路,但绝不是为了让程序变成恶意工具。
实现方式有两种。第一种是基于实时时钟的日期锁。S7-200 SMART有READ_RTC指令,可以读出当前的年、月、日、时、分、秒,存放到指定的VB地址。我把“授权截止日期”以年、月、日三个整数存放在数据区里,程序每次开机时做一个比较:如果当前年大于授权年,或者年相同且当前月大于授权月,或者年月相同且当前日大于授权日,那么就把运行允许标志清掉,触摸屏显示“请联系厂家解锁”。解锁方式是厂家输入一个由固定算法算出来的授权码,程序比对通过后把新的截止日期写回数据区。
第二种是累计运行时间锁。用SM0.4这个1分钟脉冲,在设备运行状态下累加一个长整数变量,当累计值超过授权小时数后,设备每运行10分钟就会自动停机一次,要求输入解锁密码。这里要注意,累计时间要单独放在一个不会因为程序升级被覆盖的数据区。为了防止客户直接改PLC时钟绕过日期锁,正规做法是日期锁和运行时间锁同时用,互相兜底。
写这类程序时,我给自己定的原则是:锁的是程序授权,不是设备硬件;界面一定写清楚“联系厂商解锁”,而不是搞一堆隐藏口令;绝不配合任何非法用途。设备厂家用它来完成尾款回收、维保到期提醒,是能让行业健康发展的正常商业行为。
5.2 变频器通讯现场踩坑记录
通讯在实验室里永远是干净的,一到现场就原形毕露。我把这个项目里踩过的坑整理一下,全是真金白银换来的教训。
第一是波特率不一致。PLC设了9600,ABB ACS355那边还是默认值,结果就是握手失败。排查方法很简单:用电脑接USB转RS485,先扫一遍总线上实际能通的变频器地址和波特率,再回头改PLC参数。第二是A/B接反,症状是时通时不通,尤其在转台启动后更明显。接线前先用万用表量出每台变频器RS485端子的A/B定义,不同厂家标注可能完全反过来,别想当然。第三是共地问题。三台变频器和PLC不共地时,RS485的差分电压会被地电位差彻底破坏。我们的做法是所有通讯设备的GND端子全部连在一起,再单点接大地,屏蔽层只在PLC侧接地。
第四是MBUS_MSG的first必须用沿。如果用SM0.0直接给first等于1,等于每个扫描周期都发一遍请求,总线立刻被占死,其他站全部超时。轮询时要加忙判断,上一条MBUS_MSG执行完,才允许发下一条。第五是变频器报CRC错误,这个通常是布线问题,通讯线跟动力线走了同一根桥架,或者屏蔽层没接地。现场解决办法是给通讯线套屏蔽管单独走线,远离变频器输出电缆和主电源线。第六是变频器面板参数被改导致程序失效。客户电工觉得频率给定不对,直接在面板上改了个参数,结果通讯给定和面板给定冲突,设备不动了。所以我把变频器参数做成一张出厂表,每次交付都打印一份贴到电柜门内侧,维修时必须先核对参数表。
5.3 现场调试经验与程序参考建议
最后讲几条调试经验,对做同类设备的人应该最有用。
第一条,先用手动模式把每个单轴跑顺,再上自动。手动模式下把转台、膜架、送膜、气缸全部单独点动一遍,确认方向、限位、传感器都正确,再切自动,能省掉大量联调时的排查时间。第二条,触摸屏上一定要做“当前步号”和“关键状态位”的监视页。我见过太多设备调试时出了问题,电工只能拿着螺丝刀看PLC指示灯,效率极低。把VB100和几个核心标志位做成十六个指示灯显示在屏上,遇到故障,一眼就能定位卡在哪一步。
第三条,程序上传前必须做完整注释和版本号。很多程序员嫌注释麻烦,三个月后自己都看不懂自己写的程序。这个项目里每个子程序头都写了功能说明、作者、日期,每个网络标题都写清楚逻辑用途,交付时把程序和参数表一起刻盘存档。第四条,尽可能用命名好的符号表,而不是直接写VB200、VW300这种裸地址。符号表能让人一眼看懂M0.3其实是“缠膜启动中”,维护效率完全不一样。
最后再说一点个人体会。如果你想往更高级的方向走,可以了解一下虚拟调试。新项目用S7-1200或S7-1500做控制,配合Process Simulate这类软件通过OPC UA和PLC通讯,把整个缠膜节拍在电脑上先仿真跑一遍,干涉、卡滞、时序问题在虚拟环境里就能暴露出来,设备到场后的调试时间能压缩一大半。这也是我今年明显感受到的行业变化,单机设备工程师掌握这条技术栈,含金量会高很多。做完整台设备回头再看,最值钱的其实不是那几页PLC程序,而是把机械动作、变频器通讯和现场维护这三拨人的视角拧到了一起。程序写得再花哨,不如让一个不懂程序的人在触摸屏上三分钟看懂报警来得实在,这才是设备能长期稳定运行的根本。