做非标自动化这几年,我越来越觉得:一套能复用的FX5U加威纶通程序模板,比现场多写一百个IO点位的临时代码更值钱。每次接到新设备,十套里有六套都是气缸动作、脉冲伺服定位、产量统计这套老组合。如果你还在每一个新项目里从头列IO表、重新写状态机,那我强烈建议你把手头的三菱FX5U程序整理成一套带威纶通HMI的画面模板,把气缸、脉冲伺服、TPM数据统计和产量报表做成模块化框架。这篇文章我就把自己在实际调试中沉淀下来的这套框架拆开讲,包括硬件选型逻辑、程序结构、关键指令用法、HMI变量规划,以及那些文档里不会写的坑。
1. 模板先行的设计思路:从零写程序和改模板,差的不只是时间
1.1 先回答一个问题:为什么非要从模板开始
很多初学PLC的朋友觉得,模板就是把以前的程序复制一份改改IO。实际用下来你会发现,一套结构清晰的模板,真正省的不是写代码那两天,而是后面三代设备迭代时不用推倒重来。
以我常用的这套框架为例,它把设备分成了几个可以独立替换的部分:气缸动作模块只负责电磁阀输出和设备到位反馈;伺服模块只管回原点和定位;TPM模块只做设备状态统计;数据统计模块专门处理产量、不良数和节拍。这样分之后,哪怕换一套机械设备,气缸数量从6个变成10个,伺服从1轴变成3轴,程序主体逻辑都不用重写,改IO表、复制模块、重新分配地址就行。
模板的另一个价值是把命名规范和注释固定下来。我见过不少同类设备因为每个人命名习惯不同,调试时要花大量时间去猜D120到底是温度还是产量。固定一套“D区做参数、M区做状态、D区区分功能块”的规则之后,换人接手也能快速上手。
1.2 硬件选型:FX5U配威纶通的几个理由
这套模板默认以三菱FX5U晶体管输出型CPU和威纶通HMI为例。FX5U目前是非常适合中小型非标设备的一代产品,内置以太网口,和威纶通之间直接网线通讯,不需要再加通信扩展模块。下表是我一般选型时的对比逻辑:
| 方案 | 通讯方式 | 高速脉冲轴数 | 适合场景 |
|---|---|---|---|
| FX3U + 485BD + 威纶通 | 串口RS485 | 2轴最高100kHz | 老项目改造、成本敏感 |
| FX5U + 威纶通(网口) | 内置以太网SLMP | 4轴最高200kHz | 新设备、多轴、数据统计需求多 |
| 其他品牌PLC + 威纶通 | 驱动不同 | 视CPU而定 | 客户指定、特殊功能需求 |
选择FX5U配威纶通,还有几个很实际的考虑。一是GX Works3支持结构化工程,程序可以写FB功能块,气缸模块和伺服模块做成FB后,下一次新工程直接引用,内部逻辑不用再检查;二是威纶通的EBPro软件对三菱FX5U驱动的支持比较成熟,变量地址可以直接填D、M,画面上的数值和PLC寄存器同步很直接;三是FX5U的D区锁存范围可以自定义,断电之后产量、计时数据不会丢,这对TPM统计很关键。
1.3 程序目录和变量地址怎么规划
拿到新项目,我先不急着写梯形图,而是把整个程序的“抽屉”规划好。我的习惯是把地址分成若干段,每一段只干一类事。
- M0到M49:系统模式,比如急停、启动、手动自动切换、单循环、连续运行。
- M50到M199:气缸相关状态位,比如气缸1伸出中、气缸2缩回到位。
- M200到M399:伺服状态,包括原点完成、定位完成、正转极限、反转极限。
- M400到M499:报警状态,每个报警对应一个M位。
- M500到M599:TPM统计状态,包括自动运行中、故障停机中、待机中。
- D0到D99:系统参数,比如节拍设定、配方号。
- D100到D199:气缸动作延时设定。
- D200到D299:伺服位置、速度和加减速参数。
- D300到D399:TPM数据,包括运行时间、停机时间、产量、不良数。
- D400到D499:统计报表辅助数据。
这样规划之后,看起来很简单的地址表,到调试现场就是救命稻草。比如设备运行两个小时产量不对,我可以直接监控D300到D399整段区块,而不是打开几十个窗口逐个看。威纶通HMI的画面变量也照着这个规划填,PLC和HMI两边一一对应,后期不容易乱。
2. 四个核心功能模块怎么拆、怎么算、怎么写
2.1 气缸控制模块:不要用自锁,用置位复位状态机
气缸控制看起来最简单,就是一个电磁阀对应一个输出点,但实际出问题最多的恰恰是气缸。我见过很多程序里用自锁电路写气缸动作,比如:
|| 启动条件 || 气缸伸出输出 --[ M100 ]-----| |--------( Y10 ) --[ Y10 ]-----------------| |这种写法在简单场景能跑,但气缸动作一多,互锁条件就没法维护。你需要在每个输出线圈前面写“哪些条件允许伸出”“哪些条件禁止伸出”,十几个气缸互相交叉限制,梯形图会膨胀到没法看。
我模板里用的是置位复位加状态字。每个气缸有三个状态位:伸出中、缩回中、到位超时报警。以气缸1为例,伸出命令用一个M102置位,缩回命令用M103置位,输出Y10则由“伸出中状态”直接驱动。磁性开关反馈X10、X11不是直接接输出,而是和命令做一个延时判断,确认到位之后才把“到位标志”置位。
为什么一定要做延时判断?磁性开关在气缸活塞接近到位时会有一小段抖动区间,如果程序直接用常开触点判断,偶尔会把一个抖动脉冲当成到位信号,后面伺服定位就会跟着出偏差。我习惯在发出命令后延时50到100毫秒再检查到位输入,用定时器T0串联X10,到位标志只在这一小段时间窗口里更新。
2.2 脉冲伺服控制模块:回原点、绝对定位和电子齿轮比
FX5U晶体管输出型自带的脉冲输出有4轴,最大频率取决于CPU型号,一般200kHz以内。用脉冲加方向方式和伺服驱动器连接时,Y000作为脉冲输出,Y001作为方向信号。模板里我默认接两套伺服,第二套用Y002和Y003。
伺服模块第一个重点是回原点。我一般用DOG式回原点,外部原点挡块接X002。在GX Works3里调用原点回归指令,类似:
// 回原点示例:ZRN 脉冲数 速度 原点输入 脉冲输出 ZRN K50000 D210 X002 Y000;回原点完成之后,把“原点完成标志”M200置位。后面的绝对定位指令DRVA才能直接用机床坐标,不然每次上电都要先回原点,否则位置基准就是乱的。
第二个重点是电子齿轮比的计算。很多初学者在这里算错,结果手动点动正常,自动定位总差那么一点。举个例子:伺服电机一圈走10毫米,系统最小单位是0.01毫米,那负载侧一圈就是1000个用户单位。伺服编码器如果是131072脉冲每转,则电子齿轮比就是输出编码器分辨率除以用户单位精度,即131072比1000,约分后是16384比125。驱动器里把分子设成16384、分母设成125,PLC端就可以直接按0.01毫米为单位发脉冲。
定位指令的使用要特别注意执行条件。比如增量定位:
// 上升沿执行一次,K500表示脉冲数,D110表示速度,Y000脉冲,Y001方向 DRVI K500 D110 Y000 Y001;这条指令必须用上升沿触发,不能让它每个扫描周期都执行,否则伺服会一直往前走。GX Works3里最好用一个完成标志M201串成“触发—执行—复位”的动作链,执行完成后把触发位复位,避免重复启动。
第三点是加减速设置。FX5U定位指令的速度参数是运行速度,加减速时间在CPU参数里设置。加减速时间不是越小越好。我调过一台带夹具的设备,加减速时间小于50毫秒时,皮带衔接处有明显冲击,产品错位。后来把加减速调到150毫秒,节拍只慢了不到一秒,但稳定性高了非常多。
2.3 TPM综合效率模块:把停机时间变成可统计的数据
TPM在工厂管理里常指全员生产维护,但在PLC程序框架里,我更愿意把它理解成“设备综合效率数据采集”。TPM统计最核心的指标是OEE,它由三部分构成:时间开动率、性能开动率、合格率。
- 时间开动率 = 实际运转时间 / 计划生产时间。
- 性能开动率 = (理论节拍 × 总产量) / 实际运转时间。
- 合格率 = 合格品数 / 总产量。
- OEE = 时间开动率 × 性能开动率 × 合格率。
PLC里做这个统计,关键是先定义设备状态。我通常用M500表示自动运行中,M501表示待机中,M502表示故障停机中,M503表示手动调试中。这些状态位由主程序集中刷新,不能分散在不同子程序里,否则状态可能同时为1,统计就乱了。
接下来用1秒脉冲寄存器M8000里的“1秒时钟”去累计时间。FX5U有内部时钟继电器,比如M8011是10毫秒脉冲,M8012是100毫秒脉冲,M8013是1秒脉冲。我习惯把M8013作为统计时钟。每次M8013上升沿,判断M500是否导通,导通则D300加1,表示运行秒数;M502导通则D302加1,表示故障停机秒数。这样运行时间和停机时间就直接是秒数,HMI上除以3600就变成小时。
不良数统计适合用完成信号加不良信号同时满足的瞬间来累加。比如每完成一个工位,M520产生一个上升沿,总产量D310加1。如果同时检测到不良传感器信号,不良数D312加1。这里有一个很关键的细节:完成信号必须是一脉冲性的,不能用电平。如果完成信号保持5秒,程序每扫描周期都执行一次加法,产量一天能多算几十倍。我一般先把完成信号送入置位标志,处理完统计后马上复位。
2.4 数据统计与配方模块:HMI是数据窗口,不是数据库
数据统计的最终呈现靠威纶通HMI。画面里放一个“当前产量”“目标产量”“不良数”“稼动率”“OEE”的数值显示框,这些值直接映射到PLC的D区。威纶通EBPro里新建FX5U以太网驱动时,变量地址可以填D310、D312,通信周期建议在50到100毫秒,太快的采集反而会浪费PLC通信资源。
我还会在HMI里做“资料取样”。EBPro的资料取样功能可以把D300、D302、D310、D312、OEE等数据按设定周期写入U盘或SD卡,生成CSV文件。生产主管要日报表时,直接把U盘拿走去电脑上打开就行,不用再人工抄表。资料取样的采集周期建议5到30秒,太密的数据文件很快就满了,而且CSV文件实际读取体验也不好。
配方模块放在这里是因为换型号时,伺服位置、气缸延时、目标节拍都会跟着变。威纶通EBPro里的配方功能可以把一组D区数据保存到HMI内部,操作员在触摸屏上选择“配方1”或者“配方2”,点击下载,HMI就把一组预设值写入PLC的D200到D280。这样PLC程序里不需要维护一套配方表,HMI端管理反而更直观。
3. 实操搭建全过程:从IO表到HMI画面
3.1 第一步:IO分配与接线
搭建模板之前,先把IO表确认到每一个点。以FX5U-32MT/ES为例,输入点是X0到X17,输出点是Y0到Y17。我一个典型设备的IO分配长这样:
| 地址 | 信号 | 说明 |
|---|---|---|
| X0 | 急停按钮 | 常闭输入,优先切断 |
| X1 | 启动按钮 | 上升沿触发自动启动 |
| X2 | 伺服1原点DOG | 回原点挡块 |
| X3 | 气缸1伸出到位 | 磁性开关 |
| X4 | 气缸1缩回到位 | 磁性开关 |
| X5 | 气缸2伸出到位 | 磁性开关 |
| X6 | 气缸2缩回到位 | 磁性开关 |
| Y0 | 伺服1脉冲 | 高速脉冲输出 |
| Y1 | 伺服1方向 | 方向信号 |
| Y2 | 伺服2脉冲 | 高速脉冲输出 |
| Y3 | 伺服2方向 | 方向信号 |
| Y10 | 气缸1伸出电磁阀 | 二位五通单电控 |
| Y11 | 气缸2伸出电磁阀 | 二位五通单电控 |
接线时特别注意急停要接常闭点,并且程序里不要反转常闭逻辑。急停触点断开时X0为OFF,自动运行的输出要在梯形图前面串联X0作为总使能,保证急停按下瞬间所有动作输出全部断开。
3.2 第二步:GX Works3里的程序骨架
在GX Works3里新建工程时,选择FX5U CPU型号,程序类型可以选结构化程序,也可以只用梯形图加ST。我建议至少把TPM计算和数据统计这类计算逻辑用ST写,因为梯形图做乘除法、百分比转换非常别扭。
主程序的骨架按照这个顺序排:
- 公共程序:急停处理、模式切换、状态刷新。
- 手动程序:每个气缸和被伺服都能单独手动动作,这个必须优先于自动程序执行。
- 自动程序:状态机流程,调用气缸模块和伺服模块。
- TPM统计程序:根据状态位累计时间和产量。
- 报警程序:气缸超时报警、伺服定位超时报警、急停报警。
气缸模块我做成FB功能块,引脚包括伸出命令、缩回命令、伸出到位输入、缩回到位输入、超时时间、到位标志、报警输出。一个FB内部逻辑写好后,在程序里实例化多个,每个气缸实例给不同地址即可。这样就算有10个气缸,主程序里也是同一套逻辑重复引用,排查时只看实例名就知道问题在哪。
伺服模块也做成类似FB,输入是启动定位、目标位置、运行速度、原点完成信号,输出是定位完成标志、运行中标志、报警标志。调用时每个实例对应一个轴,内部统一处理DRVI、DRVA、ZRN的触发时序。
3.3 第三步:EBPro画面搭建与数据采样
威纶通EBPro工程里,第一步新增PLC驱动,选Mitsubishi FX5U Ethernet,设置PLC的IP地址和端口。FX5U默认以太网用的是SLMP协议,端口号一般在GX Works3的CPU参数里配置,常见为49152或者自定义。HMI自己的IP要和PLC在同一网段,比如PLC设192.168.1.10,HMI设192.168.1.11,子网掩码一致。
画面结构我一般按下面这个顺序建:
| 画面编号 | 画面名称 | 主要功能 |
|---|---|---|
| 01 | 主画面 | 模式选择、启动停止、状态指示灯 |
| 02 | 自动运行 | 流程步骤显示、当前产量、OEE |
| 03 | 手动调试 | 气缸和伺服点动按钮 |
| 04 | 伺服参数 | 位置、速度、加减速输入框 |
| 05 | 数据统计 | 产量报表、稼动率趋势图 |
| 06 | 报警画面 | 当前报警和历史报警 |
| 07 | 配方 | 配方选择、下载和保存 |
数据统计画面里,我会放一个OEE趋势图。EBPro的趋势图控件可以设定数据源为D300、D302、D310等,也可以绑定LW区。有一点要提一下:趋势图的X轴时间可以和HMI系统时间关联,Y轴范围要设好。OEE百分比和稼动率都是0到100,Y轴直接设0到100;产量比较大,最好单独用另一个显示窗口,不要和OEE共用一个Y轴。
HMI宏里也可以做OEE计算。比如读取PLC的理论节拍、运行秒数、产量、不良数,在HMI本地算完OEE后再放回LW区显示。示例逻辑类似:
macro_command main() unsigned short run_sec, theory_cycle, total_cnt, ng_cnt float time_rate, perf_rate, qual_rate, oee GetData(run_sec, "FX5U_Ethernet", D300, 1) GetData(theory_cycle, "FX5U_Ethernet", D360, 1) GetData(total_cnt, "FX5U_Ethernet", D310, 1) GetData(ng_cnt, "FX5U_Ethernet", D312, 1) time_rate = run_sec / 3600.0 perf_rate = (total_cnt * theory_cycle) / (run_sec * 10.0) qual_rate = (total_cnt - ng_cnt) / total_cnt oee = time_rate * perf_rate * qual_rate * 100 SetData(oee, "Local HMI", LW100, 1) end macro_command这个宏要开启周期执行,比如每5秒跑一次。注意宏里不能忘记除零判断,产量为0时合格率会直接报错,公式可以先判断total_cnt大于0再计算。
3.4 第四步:联调顺序,先单步后自动
模板搭好后,联调必须按顺序来,我吃过一次亏:伺服原点都没回,就直接上自动,结果坐标全乱,气缸把夹具撞了。现在的联调清单是这么几条:
- 先查输入:手按磁性开关、急停、DOG,看HMI和GX Works3监控里对应的X、M状态是否一致。
- 手动动作:气缸逐一动一下,确认伸出、缩回和到位信号逻辑一致;伺服点动慢速移动,确认正反方向、限位有效。
- 回原点:每个伺服单独回原点,确认原点ZRN动作和DOG挡块位置,回完检查原点完成标志。
- 单循环自动:执行一个完整的单循环,逐步观察每个流程状态切换。
- 连续运行:至少跑30分钟,观察产量、不良数、OEE数据是否正常累计。
- 断电模拟:断一次电再上电,检查产量数据有没有保持,D区锁存范围是否生效。
4. 常见问题与排查技巧实录:气缸、伺服、通讯、数据统计逐个过
4.1 通讯写不进、伺服不动、气缸磁开关误报
先说通讯问题。GX Works3连不上FX5U时,先确认PLC运行开关是不是在STOP,再查电脑网卡IP和PLC是否同一网段。程序写不进去多半是RUN状态锁定,需要在线远程STOP后再下载。如果威纶通HMI显示通信失败,要到EBPro里检查驱动类型是不是选了FX5U Ethernet,以及端口号是否和GX Works3的SLMP设置一致。很多新手把端口号默认填502,那是Modbus的端口,SLMP不认。
伺服不动是另一个高频问题。情况分两种:一种是PLC根本没发出脉冲,监控Y0的状态一直是OFF;另一种是脉冲有输出但电机不动。先说第一种,DRVI这类指令要用上升沿启动,如果梯形图里线圈一直ON,指令只会在第一次扫描时执行一次,之后不再发脉冲,看起来就像“程序没反应”。解决方法是把启动信号做成一个脉冲,用完成标志复位启动位。第二种情况,要么伺服驱动器没设成脉冲指令模式,要么电子齿轮比不对,要么Y0接错了驱动器端口。先点动低速输出,再用示波器或者驱动器面板的反馈脉冲数确认。
气缸磁开关误报也很好认。磁性开关有时闪断,程序里加几十毫秒延时判断就能滤掉。注意延时判断不是加在磁性开关输入点前面,而是要加在“命令发出后等待到位”的判断逻辑中,否则正常到位信号也会被延时不必要的周期。
4.2 排查顺序和一张速查表
现场排查问题,我习惯按“电源—输入—输出—程序—通信”一层一层剥。电源问题最常见,24V短路、气缸电磁阀和传感器共用一个电源导致电压跌落,都会让PLC随机重启或输入误动作。先把传感器电源和电磁阀电源分开,用两组DC24V,能解决很多奇怪现象。
以下是一张常见问题速查表,建议直接打印贴在电柜里:
| 现象 | 排查方向 | 常见原因 |
|---|---|---|
| PLC无法通讯 | IP、端口、运行状态 | 网段不对、RUN锁定、SLMP未启用 |
| 程序下载失败 | 运行开关、保护密码 | CPU在RUN、写入保护 |
| 伺服收不到脉冲 | Y0输出、驱动器参数 | 指令没沿触发、脉冲模式不对、接线错 |
| 定位有累计偏差 | 电子齿轮比、原点 | 齿轮比算错、DOG位置漂移 |
| 气缸到位偶尔丢失 | 磁性开关、延时 | 开关抖动、反馈线受干扰 |
| 产量乱增 | 计数脉冲、扫描周期 | 完成信号保持为ON,重复计数 |
| 上电数据丢失 | D区锁存范围 | 未设置锁存、电池未装 |
4.3 让模板往后好维护的三个习惯
第一,模板里改动任何地址规划,必须同步更新一份地址表文档,放在工程目录里。我自己的做法是画一张Excel表,第1列地址,第2列名称,第3列用途,第4列备注。HMI变量、PLC注释、文字标注三处保持一致,改一处就三处都改。
第二,FB模块内部尽量少用全局地址,引脚传递变量进去。这样FB复制出来到别的工程,不会因为D区冲突互相干扰。伺服模块最怕内部写死D200,复制到第二轴时必须手动改成D300,很容易漏。用引脚的话,实例化时每个轴分配一次即可。
第三,HMI画面的按钮和指示灯命名要和PLC注释保持一致。我见过HMI上写着“夹紧气缸”,PLC里却叫“CYL1”,调试时根本分不清谁是谁。命名统一为“气缸1夹紧”“伺服1X轴移动”,后面接手的人看了也明白。
5. 后续扩展方向:让模板越用越厚
这套框架整理出来后,我最近两年接的设备基本都在它上面做增量。想要加第三轴伺服,不用重构程序,复制一个伺服FB实例,分配Y4、Y5,把IO表和HMI画面加一组按钮就行。想要增加远程看板,可以在FX5U上留出一段数据区,让车间大屏直接读取产量和OEE,不过要注意远程访问的权限和网络安全,工厂内部网络使用即可。
还有一个非常实用的扩展是报警分析。FX5U程序里已经做了气缸超时报警和伺服定位超时报警,如果把报警发生时间也记录下来,就是很好的故障分析数据。威纶通HMI的历史报警画面自带有时间戳,模板里只需要把报警触发位和对应提示文字配置完整,后期就可以按时间段导出报警记录,查停机原因不用再靠人回忆。
我个人在实际操作中的体会是,模板不是一次建完就固定的,它会随着每一次现场调试越变越厚。每踩一个坑,就把判断逻辑补进对应模块;每次发现HMI操作员容易误操作,就在画面上加权限或互锁。等到下一台设备再上线,你会发现原来要调试一周的活,三天就能跑顺。这套FX5U加威纶通的控制框架,对我来说已经不只是程序备份,更像是这些年非标自动化经验的一种沉淀方式。