做非标设备这么多年,最深的体会就是:程序本身不难,难的是把几十台从没见过的新设备,用一套稳定、能跑、敢交付的程序串起来。
这个项目是某制造企业一整条智能装配线的程序集成工程,累计三十四个成熟项目,设备类型覆盖转盘机、组装机、锁螺丝机、点胶机、检测机等七八种非标设备。我作为程序主控负责人,从第一台设备的地线压接到最后一台设备的联动联调都全程跟进。今天把这些经验拆出来,重点讲明白三菱PLC在非标设备里的程序集成思路、模块复用方式、典型设备的控制逻辑,以及这个过程中最容易被忽略、但又最能决定交付质量的细节。内容会比较长,但保证每一条都能直接用在现场。
1. 非标设备程序集成,到底在集成什么
1.1 非标设备的真实项目状态
先说实话。非标自动化行业里的“三十四个项目”,听着像是很规整的工程集群,真实情况往往是:客户产线规划了三十多个工位,每个工位单独设计、单独采购、单独装配,最后拼成一条整线。
这些设备来自不同时期,有的是前两年做的老机型,有的是这半年新交付的,PLC的型号有FX5U、有Q系列、甚至还有几台是L系列的。它们的程序风格也完全不同:早期的工程师喜欢把所有逻辑堆在同一个程序块里,后来的项目开始用子程序,但也只是把气缸动作拆出来而已。真正接手的时候,程序风格、变量命名、IO分配简直是一场灾难。
这种情况下做“程序集成”,核心不只是把程序合并到一个工程里,而是要完成三件事:第一,建立一套统一的程序和变量规范,把三十四个设备的程序放在一个可维护的框架下;第二,保留每台设备的独立控制逻辑,同时让它们能被线体总控统一调度;第三,确保每台设备单独调试、单独运行没有问题,联动时也不会互相干扰。
1.2 从单机思维升级到整线思维
很多工程师做单机程序很熟练,转盘机怎么转、气缸怎么顶、传感器怎么感应,顺手就来。但到了三十四台设备一起跑的阶段,思维方式必须变:你写的每一段程序,都不只是控制一台设备,而是在跟另外三十三台设备打交道。
我接手时做的第一件事,不是打开GX Works3开始写代码,而是把三十四个项目的IO表和程序架构全部拉出来,做了一张统一的功能清单。每个设备的IO分成了四个大类:本体控制点(气缸、电机、传感器)、工艺参数点(压力、温度、扭矩)、节拍管理点(启动、停止、复位、完成)、状态上报点(运行中、待机、报警、急停)。这套分类定下来之后,后面所有设备的程序就都有了统一的骨架,而不是三十四种五花八门的写法。
这里有个非常关键的经验:非标设备的程序集成,最高层的功夫不在程序里,而在程序之外的标准制定上。没有统一标准,你后面改三十四台设备的程序会被细节淹没。
2. 三菱PLC程序集成的架构设计与复用方法
2.1 主程序架构:把设备拆成标准功能块
三菱PLC里做程序集成,我推荐的方式是用FB(功能块)+子程序+中断程序的组合架构。底层的核心思路就一条:把设备的行为拆成标准动作单元,再用主程序把这些动作按顺序组织起来。
拿一台标准的转盘机来说,它的动作无非就是:上料工位感应到工件→转盘旋转到位→各工位同时动作(压装、检测、锁螺丝)→转盘再转→下料。这些动作拆开看,都不是什么复杂的逻辑。但三十四台设备要联动,转盘机的动作就得能被打断、能暂停、能复位、能单步空跑。
我习惯用ST语言编写FB,每个设备建一个设备FB实例,比如FB_转盘_01、FB_组装_02,FB内部管理设备自己的状态机。梯形图只做调用和握手,不在梯形图里堆设备逻辑。这样做的优势在后期的故障排查中特别明显——某个工位报警了,直接看那个设备FB里的状态值,一眼就知道卡在哪一步,不用在线监控几十个M继电器的通断。
2.2 状态机的程序实现方法
在三菱PLC里实现设备状态机,我的做法是给每个设备定义一组状态字,用整数来表示当前状态:
| 状态值 | 含义 | 对应动作 |
|---|---|---|
| 0 | 空闲待机 | 等待启动信号 |
| 10 | 自动运行中 | 执行自动生产节拍 |
| 20 | 暂停保持 | 保持当前动作,等待恢复 |
| 30 | 手动调整 | 允许人工单步操作 |
| 40 | 报警停止 | 触发安全保护,所有动作停止 |
| 50 | 复位退料 | 执行复位流程,退出工件 |
状态切换用IF语句判断条件,比如自动状态下收到暂停信号,就把状态值从10改到20,同时把当前执行中的气缸动作锁住。收到恢复信号时从20回到10,程序继续往下走。这个办法在非标设备上已经验证了非常多轮,比用一堆M点和T/C定时器去搭状态逻辑要可靠得多。
记得有台设备调试时,客户提出“这里要加个暂停功能,工人有时候需要临时离开一下”。如果早期那种散装逻辑的程序,加这个功能意味着要把所有动作都重新梳理一遍,非常容易漏掉某个气缸,导致暂停后气缸还在动。但基于状态机的程序,只需要在状态切换的处理里加一个“暂停时切断所有输出”的逻辑,全设备行为一次搞定。
2.3 程序块的标准化封装
三十四个项目里,重复的底层逻辑非常多。我把它们做成了标准库:
- 气缸控制块:接受目标位置,输出两个电磁阀信号,带磁性开关检测确认,超时报警。气缸动作只有两类——伸出和缩回,但很多设备上气缸有几套不同缸径、不同速度,所以块参数里要预留动作超时时间。
- 变频器控制块:输出启动/停止信号,读取运行频率和电流,带故障复位逻辑。
- 步进/伺服定位块:输出脉冲方向,读取定位完成信号,带原点回归逻辑。
- 真空检测块:读取真空压力开关信号,判断吸着OK/NG,用于搬运机构。
- 气缸压力检测块:读取压力传感器模拟量,判断压力到达范围,用于压装工位。
这些标准块共用一套接口,管脚名字统一叫x_Target、x_Done、x_Fault。后面新来的工程师写代码,只需要知道怎么调用,不需要关心块内部怎么写。这就是复用带来的效率提升。用标准块还有一个隐形的好处:调试工具可以统一。我在HMI上做了一个通用监控页面,每个设备块的状态都在同一套界面框架里显示,工人换操作设备时不用重新学界面。
2.4 模拟量的统一处理
非标设备里模拟量点位不多,但处理不好会出大问题。常见的是温度传感器、压力传感器、位移传感器,以及变频器的频率反馈。
我的经验是把模拟量全部统一成工程量单位后放进全局变量,程序内部不直接读D寄存器。举个实际案例,某压装工位用的压力传感器是4-20mA输出的,量程0-5kN。PLC读取的是0-4000的数值,我在程序里做了一次线性换算,把D值转成kN单位的浮点数:
// 4-20mA对应D值范围:0-4000 // 对应工程值范围:0.0-5.0kN real_pressure := INT_TO_REAL(d_ai_pressure) / 4000.0 * 5.0;这样做的最大好处是程序里的报警判断全部用真实单位,比如IF real_pressure > 4.8 THEN,维修电工一看就知道是压力超了,不需要再去对照PLC手册查D值是多少对应多少kN。这个细节在快速交付阶段省了特别多沟通成本。
3. 各类非标设备的程序特点与实战处理
3.1 转盘机的程序实现要点
转盘机是非标设备里最常见也最有代表性的机种。核心控制对象是一个间歇分割器驱动的圆盘,上面分布着多个工位,每个工位完成一个工艺动作。
转盘机程序关键的三个问题:分割器到位确认、多工位并发动作、节拍优化。
分割器到位这块,我见过很多程序只靠分割器内部的凸轮开关信号,这个信号如果调试时不校正好,会出现到位信号提前或滞后,导致动作干涉。稳妥的做法是:在分割器从动侧安装接近开关,与凸轮信号做“与”逻辑,两个信号同时为ON才判定到位。误判概率大幅下降。
多工位并发动作的意思是,转盘到位后,六个工位同时开始压装、检测、锁螺丝等操作。三菱PLC的扫描周期通常在几毫秒到十几毫秒,六个工位的动作如果串行判断,一个完整节拍会被拉长不少。我采用的方案是:到位后用一个“工位动作使能”字,位0到位5分别使能六个工位;每个工位在独立的中断程序里执行自己的动作序列;扫描周期内所有工位同步运行。
节拍优化这块最有意思,分享一个我踩过的坑。某转盘机原来节拍是4.5秒,客户嫌慢,要求提到3.5秒。我先优化了动作顺序:原来所有工位到位后先等0.5秒再开始动作,去掉这个延时;然后发现有一个保压工位是瓶颈,保压要3秒,但实际工艺只需要2秒保压就够。我找到工艺确认后把保压时间降到2.2秒,同时让这个工位提前到转盘还未完全停止时就开始预压(提前0.3秒)。这样组合优化下来,节拍最终做到3.4秒。
转盘机程序调试里最重要的一件事:第一次转盘手动转动时,必须低速、点动、确认每个工位的机械干涉范围。程序写得再好,机械上撞一下,半天时间就没了。
3.2 组装机的程序实现要点
组装机通常有几个到十几个工位,每个工位完成上料、定位、压装、涂胶、螺丝锁紧等动作的组合。组装机和转盘机最大的不同在于:组装机的工位动作是顺序依赖的,上一个工位的装配结果会直接影响下一个工位能不能继续。
组装机程序最核心的逻辑是互锁与防错。每个工位条件里,不仅要检查本工位传感器状态,更要检查前后工位的结果标志。举个例子,拧螺丝工位开始工作前,必须确认前面涂胶工位已经完成、且涂胶检测传感器判定为OK。如果涂胶NG而漏检,螺丝工位照样运行,装出来的产品就是废品。
这个场景我在程序里用的是“工艺流转记录”方式。每个产品在托盘上有一个数据区,记录它在每个工位的检测结果。工位动作前查前一工位结果,动作后写本工位结果。遇到NG品时,程序自动跳过后续加工工位,只执行运输动作,到NG排出工位自动推出。
这个逻辑本身不复杂,但这类的项目上有过一次深刻的教训。当时用的是单纯的传输带和传感器计数的思路,一个站位站两个产品,结果传感器偶尔抖一下,计数就错位了,后面的工位全乱了。后来改成前面那套记录方式,产品的位置靠夹具上的识别标记确认,彻底解决了错位问题。
组装机的另一个特点:气缸和传感器数量特别多。一台中等规模的组装机,气缸可能有七八十个,传感器一百多个。程序里气缸控制块的使用频率是最高的。这里有个实际经验——气缸磁性开关的接线很多现场是两线式,信号容易受干扰,我的做法是PLC输入模块选漏型输入,且磁性开关信号全部并接RC吸收电路,效果在多次现场验证中都很稳定。
3.3 锁螺丝机、点胶机、检测机的程序差异
这几类设备在三十四个项目的占比不算少,它们的程序各有特点:
锁螺丝机:核心是螺丝供给机的协调。程序要监视螺丝供料器的缺料信号、螺丝滑落到位信号,以及锁付电机的扭矩/圈数反馈。锁螺丝机的节拍快,一个螺丝锁付大概1到2秒,程序里要保证锁付完成后自动判断扭矩到位和圈数范围,两条件满足才判OK,任何一个不满足就报警。
点胶机:核心是点胶阀的控制和轨迹配合。早期的点胶机用的是继电器控制,后来换PLC做,多了个好处是可以跟视觉系统配合做位置校正。点胶机的PLC程序要处理的,主要是按点位表顺序触发点胶阀开关,配合XYZ轴运动。点位表存在PLC的数据寄存器区,用数组记录,点位表数量上不封顶,修改点位参数不用改程序,直接改HMI的数据表就行。
检测机:核心是IO采集速度和判定逻辑。有些检测需要高频率采数据,比如产品振动检测,一个产品要采几千个点。这种情况PLC内置的扫描速度不够,我通常建议客户把高速采集放视觉或专用仪表里,PLC只负责触发和结果接收。见过一些项目硬要PLC直接采样高速数据,程序写得极其复杂,效果还很差,得不偿失。
4. PLC与周边设备的通信集成
4.1 与视觉系统的通信
三十四个项目里,用过基恩士的视觉,也用过海康的,通信方式覆盖了串口和TCP/IP。
我最推荐的是用TCP/IP直接用三菱的MC协议,简洁稳定。以三菱FX5U为例,用Socket通信功能做TCP客户端,视觉系统做TCP服务端。PLC这边发送请求报文,视觉收到后返回检测结果。
MC协议报文格式大致是这样:
// 请求读取视觉检测结果报文(简化格式) // 头部: 帧头 + 命令 + 地址 + 长度 + 数据 请求: D0 00 01 04 00 00 00 01 00 00 响应: D0 00 01 04 00 00 00 02 00 00 01 F0实际的工程里,我不用这么底层的协议解析,直接用三菱现成的通信指令做,比如SP.SOCOPEN打开连接,SP.SOCSND发送数据,SP.SOCRCV接收数据。程序里把通信封装成一个FB,视觉检测请求发出去后等待返回结果,结果OK或者NG直接映射到设备状态机里的判定变量。
4.2 与工业机器人的交互
现在很多非标产线里会集成六轴机器人做上下料、搬运。PLC和机器人的交互逻辑相对简单,核心就是“请求-应答”的握手信号。
推荐用IO硬接线方式,不要依赖总线通信,原因很简单:IO方式直观、故障容易排查,拉一条网线通信出问题了,现场维修人员往往无从下手;IO方式拿万用表就能量出信号有没有到。
握手逻辑是这样的:机器人到取料位后给PLC一个“到位请求”信号,PLC确认料盘就绪后给机器人“允许取料”信号,机器人取料完成给PLC“取料完成”信号,PLC收到后把料盘状态位更新。四根信号线,简单可靠。我用这种方式带过不少型号的机器人,ABB、发那科、安川都跑过,从来没有在交互层面出过问题。
4.3 与上位机/MES系统的对接
非标设备如果能往MES系统上传数据,价值高很多。现在的工厂基本都要数据追溯,每个产品的装配数据、检测数据、设备参数都要上传。
PLC往上位机传数据,用MC协议或SLMP协议都很方便。三菱PLC做服务端,上位机主动来读,或者PLC做客户端主动上报。我推荐主动上报模式:产品完成一个周期后,PLC主动把记录好的数据帧通过Socket发给上位机,上位机收到后保存到数据库。
数据帧格式我一般定义成:
帧头(0xAA55) + 设备编号 + 产品条码 + 工位ID + 工艺结果 + 各检测值 + 时间戳 + CRC校验这个帧格式定了之后,上位机那边只要照着解析就行。程序里我维护一个发送缓存区,如果上位机没在线或网络闪断,数据不会丢,而是等连接恢复后补发。这个“补发”机制非常重要,工厂网络再稳定也扛不住偶尔的交换机重启,没有补发机制,数据追溯就会有缺口。
5. 程序集成调试流程与常见问题排查手册
5.1 程序下载和初始化阶段的异常处理
程序集成时最容易出的问题,就是在下载完程序后,PLC报错跑不起来。
我遇到过的第一类错误:软元件重复占用。早期的散装程序里大家各管各的,有的把M500当设备启动按钮用,另一个项目里M500又被当报警记忆用了。程序一合并,元件冲突。解决方法是:在集成前做一次软元件规划表,M区和D区按设备段分块,例如1号设备的M区用M0-M199,2号设备用M200-M399,每一段留下余量,以后新加设备不冲突。
第二类错误:标签名重复或混乱。GX Works3里标签名重复会直接编译报错。我采取的做法是标签前缀统一规则:设备号_功能_名称,比如D01_Trans_Forward、D02_Press_OK。这样项目数多了也不会乱,别人接手时看标签名就知道是什么设备的什么功能。
第三类错误:程序初始化顺序问题。有些设备程序里依赖上位机或机器人发来的初始状态,一旦通信还没建立就往下走,会导致程序状态卡死。我的做法是在主程序开头加一个“系统就绪”位,所有设备FB在启动逻辑里必须先确认系统就绪为ON,否则进入等待状态。
5.2 运行过程中的信号干扰和误动作排查
非标设备现场电磁环境非常杂,变频器、伺服驱动器、开关电源都在一起,信号干扰是个老大难。
排查干扰的时候,我基本按照这个顺序:
- 电源隔离:先检查PLC的24V电源是否和变频器共用地线。地线没处理好是干扰的第一来源。我一般要求PLC的24V电源单独接地,且接地电阻小于4欧姆。
- 信号走线:检查信号线和动力线是否走了同一个线槽。所有模拟量信号线必须屏蔽双绞线,且屏蔽层单端接地。数字量信号线尽量避开变频器输出线。
- 输入滤波:三菱PLC的输入模块一般都有数字滤波设置,我默认把滤波时间设置成3ms左右。有些信号抖动是机械振动引起的,调大滤波时间能过滤掉,但对高速计数信号要特别注意不能设太长,把真实信号也滤没了。
- RC吸收:气缸阀和接触器线圈两端并联RC阻容吸收,能大幅减少开关瞬间的浪涌干扰。
分享一个实际排查案例:某装配工位经常出现“气缸伸出到位信号丢失”的偶发报警,一天两三次,不定时。我先怀疑是磁性开关松动,检查没问题。后来我用示波器抓磁性开关的信号线,发现气缸动作瞬间有一个-80V的尖峰干扰,持续约1ms。最终定位到是旁边的真空泵接触器动作瞬间产生的干扰,干扰通过共用直流电源传播。处理方式是给真空泵接触器线圈两端并联RC吸收电路,同时把磁性开关信号线改用屏蔽线,问题彻底消失。排查这个故障花了半天,但每天都觉得值,因为彻底解决后两年这台设备再也没出过同样问题。
5.3 程序版本管理和变更记录
三十四个设备的程序集成工程,如果没有版本管理,一定会乱。我的做法是在每个设备的程序头注释里维护一段变更记录:
// 设备编号: D17 组装机 // 程序版本: V2.3 // 最后修改: 2024-XX-XX // 变更内容: 增加漏装检测传感器,修改报警停復位逻辑 // 修改人: 某工程师GX Works3支持工程内嵌注释,这个能力被很多人忽略了。每次变更必须写清楚改了什么、为什么改。现场设备出了故障,翻变更记录能快速缩小排查范围。我经历过一次痛苦的排查,被修改过的程序逻辑坑了整整两天,最后发现是别人改了报警复位逻辑,改完后一直有隐患,从那以后对版本控制越来越严格。
另外,程序要定期批量备份到网盘或者本机,至少保留最近三个版本。现场改完程序后测试没问题,回到办公室就马上同步备份。我见过太多人改完程序不备份,第二天设备卡死了才发现新程序有问题,可旧版本没了,只能重新改回来。这种低级错误真的会让人心态崩掉。
5.4 常见问题速查表
| 常见问题 | 可能原因 | 排查办法 |
|---|---|---|
| PLC运行Normal灯闪/灭 | 程序逻辑死循环或看门狗超时 | 查看PLC诊断信息,检查中断程序是否过长 |
| 伺服电机定位偏差 | 机械松动或电子齿轮比错误 | 先确认机械方面,重新校核电子齿轮 |
| 气缸动作超时报警 | 气压不足/电磁阀卡滞/磁性开关损坏 | 量气压、换阀、检查磁性开关 |
| 模拟量读数跳动剧烈 | 干扰或地电势差 | 检查屏蔽接地,加模拟量滤波 |
| 通信偶尔超时 | 网线接触不良或交换机端口协商问题 | 更换成品网线,固定IP禁用自动协商 |
| HMI画面无响应 | PLC通信掉线或画面数据地址错误 | 看PLC通信状态,核对画面元件地址 |
| 触摸屏按钮失灵 | 按钮地址冲突 | 全局搜索地址是否有多个地方写入 |
| 报警无法复位 | 报警条件仍满足 | 查看报警的触发条件变量,逐个排查 |
| 原点回归找不到原点 | 原点传感器不在感应范围或方向选择错误 | 检查原点传感器,核对回归方向设置 |
| 设备偶发停顿 | 程序扫描周期过长或中断频繁 | 优化程序块,减少每周期无条件执行的FB |
6. 一些真实做过的优化与经验教训
6.1 从“能用”到“好维护”的程序优化
三十四个项目集成到一起后,程序总量已经非常大,扫描周期开始变长。我做过一次系统性的程序优化:
第一,把不需要每个周期都执行的程序块做条件跳转。比如HMI的通信处理,只有在画面切换或按钮按下时才需要执行;配方数据读取,只在换型时才执行。用跳转指令绕过这些块,能明显降低扫描周期。
第二,把大量数据寄存器整理成数组结构。三菱FX5U支持数组变量,我建了一个结构体数组,每个产品的数据记录统一存,上位机读取时按规律读取,效率比散乱的D元件高很多。
第三,精简报警逻辑。原来每台设备的报警判断都写在各自的程序块里,报警文本维护在HMI里,两边的对应关系全靠人工对齐。我优化成:所有报警触发一个统一的报警管理FB,报警代码和设备号作为参数传入,HMI按代码自动关联文本。这样新增报警时,只要在程序里加一个代码常量,HMI不用改。
6.2 程序集成过程中的沟通协调经验
最后想聊聊容易被技术文章忽略的软技能。
集成三十四台设备的程序,表面是技术活,其实就是沟通活。每台设备的原设计工程师、装配调试师傅、客户现场的维修主管、设备操作员,每个人对这设备的理解都不一样。程序集成时,不能只看程序代码本身,更要听到现场声音。
我养成了一个习惯:每集成完一台设备的程序,都会约这个设备的主管工程师一起在现场从空跑开始测,一个流程一个流程的过。这个习惯在多次项目中避免了重大问题。有一次,组装机的某工位传感器位置在程序集成时被重新规划了,IO编号方便了软件,但机械上原有的走线更顺。如果集成时不沟通、硬按新规划改,装配师傅要重新穿线。跟机械工程师沟通后,我用了一个折中的IO映射方案,程序不变,物理接线还是走老路线,只是PLC模块内部的地址做了交换,双方都满意。
这个细节,比任何PLC技巧都重要。技术做得再深,最终交付的是整条产线的顺畅运行,大家的目标一致,方法上就总能找到平衡。
三十四个项目做下来,我对“程序集成”这个岗位的理解也变了。它不是单纯的程序合并,而是把不同时期、不同风格、不同工程师习惯的设备,统一到一套稳定可靠、可维护、可扩展的标准体系里。程序量在增长,但维护的复杂度不能跟着无限膨胀。这套标准体系,才是集成阶段最值得投入时间打磨的东西。
希望能给正在做非标集成或者准备接这类活的同行一些参考。程序里的门道其实都不是神乎其神的技巧,更多的是踩坑之后沉淀下来的习惯和原则。把这些原则落到实处,比自己闷头憋程序效果好得多。