做非标设备的同行应该都有体会:每一台新设备的程序如果从零开始写,光是气缸动作、伺服定位、报警处理这些基础逻辑就得耗掉大把时间,而且不同项目之间风格还不统一,后期维护全靠翻旧程序慢慢回忆。我最近整理了一套基于三菱FX5U PLC与威纶通HMI的程序模板,把气缸控制、脉冲伺服、TPM设备管理和产量数据统计全部整合进一个结构化框架里。这套框架的核心价值在于:换一个新项目时,改I/O表、改参数,就能快速出一版能跑的逻辑,而不是每个项目都重新发明轮子。如果你也在做非标自动化、单机设备或者小型产线改造,这篇文章里的设计思路和程序写法可以直接抄走。
先说清楚这套模板的适用范围:单机自动化设备,比如组装机、压装机、检测机、小型工作站,气缸数量在4到16个左右,伺服轴数1到4轴,配合一台威纶通触摸屏做操作界面。这类设备在非标行业里最常见,程序架构的复杂度也正好卡在一个"学得会、用得着"的区间。再大的产线级系统可能需要更强的运动控制器,再小的设备又不值得这么铺开,所以这套模板卡的场景是刚刚好的。
1. 我为什么要把控制程序做成一套可复用的骨架
1.1 从零写程序的三宗罪
很多工程师写程序是这样的:拿到项目就开始拖梯形图,气缸多了就复制粘贴,线圈地址随手分配,报警信息写到哪算哪。程序写完能跑,但到了调试阶段问题就来了。
第一是地址冲突。上一个项目用了M100做启动,这个项目也在用M100做启动,但中间变量、步号、报警标志难免交错在一起,查起来非常痛苦。尤其是伺服定位参数,今天放在D200,明天放在D210,新旧程序对不上,现场改参数都要拿笔对着图纸找半天。
第二是程序结构混乱。自动流程、手动操作、报警逻辑、复位逻辑全混在一段梯形图里,想屏蔽一个气缸动作都找不到按钮在哪。更别提客户突然要求加一个"连续模式"或者"单步模式",改起来简直是一场灾难。
第三是复用性差。上一台设备的程序根本带不过来,因为它的I/O分配、软元件规划、流程组织方式都是针对那个项目定死的。哪怕机构再像,程序也没法平滑迁移。
1.2 模板化框架的取舍逻辑
这套FX5U模板不是为了做一个放之四海皆准的万能程序,而是把非标单机设备里最常用、最稳定的那几块逻辑沉淀下来:气缸顺序动作、脉冲伺服定位、TPM维护提醒、产量数据统计。
模板化的好处很实在:换项目时,保留程序框架,重新分配I/O表,改气缸逻辑的步进条件,改伺服定位参数地址,就能在两天内产出一版比较完整的基础程序。调试时,HMI上的画面框架也不需要重画,修改标签名和地址映射就能直接用。
当然,模板也有代价:对于特别简单的设备,模板显得冗余;对于多轴复杂动作的设备,模板的步进逻辑又不够用。所以这套模板的核心定位是"中等复杂度单机设备",这个边界要在心里清楚。
2. 模板第一步:I/O分配和软元件地图,决定了后面所有的调试效率
2.1 I/O分配的分区原则
在写第一段功能程序之前,先把I/O表定死。很多新手上来就写程序,写到一半发现输入点不够用了,输出点全挤在Y10以后,这才回头改图纸,那调试现场就非常被动。
我惯用的分区方式是按照信号类型而不是物理顺序来分配。开关量输入分三块:操作类信号(启动、停止、复位、模式)、执行机构检测类信号(气缸到位磁性开关、真空检测、压装到位)、安全类信号(急停、门锁、光幕)。输出也分三块:执行元件输出(电磁阀、继电器)、指示灯输出(三色灯、蜂鸣器)、伺服使能和方向信号。
举个例子,一个典型的三气缸+单伺服设备,I/O分配可以这样定:
| 用途 | 地址 | 说明 |
|---|---|---|
| 启动按钮 | X0 | 自动循环启动 |
| 停止按钮 | X1 | 完成本次循环后停止 |
| 复位按钮 | X2 | 故障复位 |
| 手动/自动模式 | X3 | 选择开关 |
| 急停 | X4 | 常闭信号 |
| 门锁检测 | X5 | 安全门打开则禁止动作 |
| 气缸A缩回到位 | X10 | 磁性开关常开 |
| 气缸A伸到位 | X11 | 磁性开关常开 |
| 气缸B缩回到位 | X12 | |
| 气缸B伸到位 | X13 | |
| 气缸C缩回到位 | X14 | |
| 气缸C伸到位 | X15 | |
| 伺服原点信号 | X20 | 驱动器原点输出 |
| 伺服Z相输入 | X21 | 高速输入,接Z相 |
| 正行程限位 | X22 | |
| 负行程限位 | X23 | |
| 气缸A电磁阀 | Y0 | |
| 气缸B电磁阀 | Y1 | |
| 气缸C电磁阀 | Y2 | |
| 伺服脉冲输出 | Y4 | FX5U高速脉冲输出 |
| 伺服方向输出 | Y5 | |
| 伺服使能 | Y6 | |
| 绿色指示灯 | Y10 | |
| 黄色指示灯 | Y11 | |
| 红色指示灯 | Y12 | |
| 蜂鸣器 | Y13 |
这里有一个关键原则:每个安全类输入必须常闭接线,PLC程序里用常开触点判断"ON表示正常"。比如急停按下去,物理触点断开,X4为OFF,程序里判定为故障状态。这样一旦线路断线,设备会立即报急停故障,而不是在断线时仍然正常运行,这是安全逻辑的基本功。
2.2 软元件地址的分区地图
I/O定完,接下来是内部软元件。我强烈建议在一张表格里把所有地址的使用范围规定好,就像城市的用地规划一样,住宅区、商业区、工业区分开,谁也别越界。
这套模板的软元件地图大致如下:
| 地址范围 | 用途 | 说明 |
|---|---|---|
| M0-M99 | 系统状态 | 模式、启动、停止、复位、报警总标志 |
| M100-M199 | 气缸控制标志 | 各气缸阀输出、到位状态、联锁标志 |
| M200-M299 | 伺服控制标志 | 定位启动、定位完成、原点回归、报警 |
| M300-M399 | 步进状态 | 自动流程步号状态位 |
| M500-M599 | 报警标志 | 每个报警对应一个独立M位 |
| D0-D99 | 系统参数 | 计时器设定、节拍参数 |
| D100-D199 | 各气缸动作延时参数 | 每个气缸两个参数:伸出延时、缩回延时 |
| D200-D299 | 伺服定位参数 | 目标位置、速度、加减速、原点回归速度 |
| D400-D499 | 产量统计区 | 总数、良品、不良品、循环次数 |
| D500-D599 | TPM数据区 | 累计运行时间、动作次数、保养周期 |
| D1000 | 自动流程步号 | 核心的状态机步号寄存器 |
M区和D区为什么会留这么多间隔?因为实际项目里随时可能增加中间继电器、增加定时器,如果一开始就塞得满满当当,后面加一个变量就要四处腾地方。宁可空着一大段,也好过交叠。
另外提一句,FX5U的D区有掉电保持区和非保持区之分,默认情况下有些D地址是保持型的。TPM数据、产量数据、报警历史这类需要断电保存的数据,一定要规划到保持型D区或者通过参数设置开启保持属性。这一点在后面章节还会展开讲。
3. 气缸控制模块:真正的坑不在"动起来",而在联锁与超时
3.1 双电控阀与单电控阀的程序差异
气缸控制看起来简单,一个输出点控制一个电磁阀,检测到位信号,但不同阀型的程序写法完全不同。
单电控阀(弹簧复位)只有一根电磁线圈,得电伸出,断电缩回。程序里一个输出点搞定,线圈置ON气缸伸出,置OFF气缸缩回。这种阀的优点是简单、成本低,缺点是断电时气缸会缩回,有些工况下这是危险动作,比如夹具夹持工件时断电松开会掉落,所以重载夹紧场合慎用。
双电控阀有两个线圈,一端得电伸出并保持,另一端得电缩回。这种阀的优点是断电保位,气缸保持在当前状态,适合夹紧保持场景。但程序上有两个输出点,而且必须做互锁:两个线圈任何时候不能同时得电,否则阀芯卡死、气动回路短路。
我在这套模板里预留了两种阀型的接口,在参数区加了一个"阀型选择"字,0代表单电控,1代表双电控。程序里通过这个参数决定气缸逻辑的生成方式。双电控阀的互锁逻辑是所有气缸控制里最简单也最容易漏掉的一份保护,一定不能省。
3.2 用步号寄存器做顺序控制
多气缸顺序动作,我不建议每个人都写一堆"动作完成即触发下一个动作"的散装梯形图,那样改流程时牵一发动全身。模板里用了一个核心步号寄存器D1000,配合ST语言里的CASE语句,整个自动流程的骨架非常清晰。
下面是一个简化的流程结构,假设设备循环是这样:气缸A夹紧,伺服走到位置1,气缸B下压,保压0.5秒,气缸B上升,伺服回原点,气缸A松开,循环次数加1。
CASE D1000 OF 0: // 待机状态 IF bAutoStart AND bNoAlarm THEN D1000 := 10; END_IF; 10: // 气缸A夹紧 bValveA_Out := TRUE; IF bCylA_OutSensor THEN D1000 := 20; END_IF; 20: // 伺服绝对定位到位置1 bServoGo := TRUE; IF bServoDone THEN bServoGo := FALSE; D1000 := 30; END_IF; 30: // 气缸B下压 bValveB_Out := TRUE; IF bCylB_OutSensor THEN D1000 := 40; END_IF; 40: // 保压延时0.5秒 IF Timer500msDone THEN D1000 := 50; END_IF; 50: // 气缸B上升 bValveB_Out := FALSE; IF bCylB_InSensor THEN D1000 := 60; END_IF; 60: // 伺服回原点 bServoHome := TRUE; IF bServoAtHome THEN D1000 := 70; END_IF; 70: // 气缸A松开 bValveA_Out := FALSE; IF bCylA_InSensor THEN D1000 := 80; END_IF; 80: // 循环计数,回到待机 D400 := D400 + 1; // 总产量 D1000 := 0; END_CASE;这种写法的优势在改流程时特别明显。想在下压之前增加一个预定位动作?在CASE里插入一个步号,把后续步号统一调整,逻辑关系一目了然。想在某个步骤增加等待条件?在IF判断里加一个触点就行。
每个步号对应HMI上的一个状态显示,威纶通画面直接读D1000的值,用多状态指示元件把0到80对应的文字描述映射出来。现场操作工看不懂程序,但能看到当前停在哪个步骤、为什么停,这是调试阶段最节省时间的HMI功能之一。
3.3 气缸超时报警与手动操作互锁
气缸动作最典型的故障就是"动了但没到位"。磁性开关没感应到、气缸卡住、气源压力不足、电磁阀损坏,表现形式都是到位信号不返回。如果程序里没有超时保护,设备会一直停在那里,操作工只能关机重启,故障信息完全没有留下。
模板里每个气缸都有两个参数:伸出超时时间、缩回超时时间,默认3秒。逻辑是:输出阀动作时启动一个定时器,定时器到点而到位信号没来,就触发对应的报警M位,同时停止后续所有动作。
超时时间不能设得太短,否则气缸慢速运行时一抖动就误报警;也不能太长,否则故障发现不及时,可能损坏机构。调试现场我一般先设在5秒,等动作节拍稳定后再收紧到动作实际时间的1.5到2倍。
手动操作模式必须和自动模式严格互锁。手动模式下,自动流程步号寄存器D1000强制复位为0,且手动输出与自动输出之间要有前置禁止条件。我见过一个设备因为手动画面上的气缸动作按钮在自动运行时被误触,导致自动流程中气缸提前动作撞了治具。从那以后,这套模板的所有手动输出都有同一个前置条件:M0自动模式为OFF,且D1000=0。
4. 脉冲伺服模块:电子齿轮比、原点回归和完成信号的三个关键决策
4.1 电子齿轮比到底怎么算
脉冲伺服,就是PLC通过高速脉冲输出口向伺服驱动器发位置脉冲信号,驱动器收到脉冲后按电子齿轮比换算成电机转角。FX5U本体的高速脉冲输出最大200kHz,配合一般的伺服应用够了,丝杠导程、减速机、同步带轮这些机械参数全部在电子齿轮比里消化掉。
电子齿轮比的本质,是让"一个指令脉冲"对应一个合理的"用户单位"。这个单位最好设置成0.01mm或0.001mm,这样HMI上的位置数值直接就是工程单位,操作工看着舒服,编程也方便。
计算过程用一个例子说透。丝杠导程10mm,减速比1:1,伺服电机编码器分辨率131072脉冲/转(这是MR-JE系列常见的17bit分辨率)。想让每个脉冲对应0.01mm,那么电机转一圈需要发出的指令脉冲数就是:
10 ÷ 0.01 = 1000脉冲/圈
电子齿轮比 = 编码器分辨率 ÷ 每转指令脉冲数 = 131072 ÷ 1000 = 16384 ÷ 125
化简后分子16384,分母125,这就是驱动器参数PA05、PA06要设置的数。
很多工程师在这里犯的错是直接用131072÷1000=131.072填进去,但电子齿轮比要求是分子分母整数,必须化简。如果化简后分母过大,脉冲当量过细,100个脉冲才走0.01mm,定位速度会被脉冲频率卡死。假如简化后要发更多的脉冲才能走同样的距离,那就要考虑换减速比或者重新设定当量单位。
还有一种情况是同步带轮结构,伺服走的是同步带,定位单位用mm,这时关键参数是带轮圆周长度除以减速比,得到电机转一圈的皮带行程。计算思路完全一样,只是"一转对应行程"这个数值变了。
4.2 原点回归方式的选择
伺服上电后,PLC不知道机械的实际位置,第一步必须回原点。原点回归的可靠性直接决定设备安全性,这部分的程序模板分三种情况。
第一种,仅使用原点传感器。伺服向原点方向寻找,遇到原点传感器下降沿或上升沿后停止,把当前位置设为原点。这种方式的优点是简单,但停止位置每次可能有几个脉冲的偏差,取决于寻找速度,适合定位精度要求不高的场景。
第二种,原点传感器+Z相脉冲。伺服遇到原点传感器后减速,再捕捉编码器Z相脉冲的上升沿,以Z相位置作为零点。因为Z相是电机每转一圈发一个固定信号,重复精度可以达到几个脉冲以内,这是使用FX5U高速输入捕捉Z相的标准做法。X21接Z相信号,通过高速计数器或中断方式捕捉,程序上稍复杂,但精度可靠得多。
第三种,对撞式原点回归。机构直接撞到机械限位,伺服驱动器检测到扭矩限制后判定为原点。这种看场合,验证治具精度要求不高时可以用,但是每次撞实体都心疼机构寿命,不推荐作为模板默认方案。
模板里把原点回归做成独立的子程序,由HMI上的"回原点"按钮触发,完成后再切换为待机状态。自动流程启动前会检查"已回原点"标志,这个标志在掉电后自动清零,也就是每次上电都必须重新回原点。这个逻辑不能省,省了可能第二天开机就跑飞位置,撞坏治具。
4.3 定位完成判断的可靠性问题
伺服定位的"是否到位",程序里怎么判断?我见过有人只看伺服驱动器的"定位完成"信号,也见过只等PLC侧脉冲输出完成标志,这两种都有隐患。
伺服驱动器的定位完成信号,是在位置偏差进入设定范围后输出的,但脉冲输出还没完全结束;PLC侧脉冲输出完成标志是PLC脉冲发完了,但机械可能因为负载惯性还在微动。正确的做法是两者都等:PLC的脉冲输出完成标志AND伺服驱动器的定位完成信号AND实际位置与目标位置差在允许范围内。
模板里的伺服定位完成判断程序,实际就是这么写的。先确认定位指令的脉冲发送结束,再读驱动器的定位完成输出点,再比较当前位置计数器与实际目标位置的差,三者都成立,才置位bServoDone。
另外注意,伺服驱动的定位完成信号在脉冲输出期间可能短暂失效,程序里要做确认延时,比如连续50ms保持ON才判定完成,不要用沿信号去触发。这一点很多现场调试时才会暴露出来:明明定位完成了,后面的气缸就是不动,查半天发现是完成信号的抖动被当成沿脉冲吃掉了。
5. TPM功能:把维护保养变成PLC里的一组可累计数据
5.1 TPM做进程序的思路
TPM,全员生产维护,这个概念在工厂里讲了不知道多少年,但实际上很多中小型非标设备上完全没落地。设备保养全靠机修凭经验"感觉该换了就换",没有量化数据。
把TPM做进PLC模板,思路其实很朴素:让设备自己记录自己干了多少活,用数据决定什么时候保养。气缸电磁阀、气缸密封圈、同步带、伺服联轴器,这些易损件的寿命基本和使用次数强相关。统计动作次数,比按日历时间提醒准确得多。
5.2 运行时间和动作次数的累计
运行时间累计在FX5U里非常容易实现。PLC有个特殊的10ms时钟寄存器,配合设备运行标志,每100次累加1秒,每秒累加1分钟,就能得到累计运行分钟数。
气缸动作次数统计,我在每个气缸的到位信号上升沿做加1。比如气缸A每完成一次伸出,在"气缸A伸到位"的上升沿对D501加1。伺服轴的累计移动距离,可以用当前位置每次定位完成时取绝对值累加,但注意正反方向要取绝对值,不然来回运动可能互相抵消。
这些计数器全部放在掉电保持D区,并通过系统参数开启保持属性。通电时间、总循环次数、各轴动作次数,这些数据对保养判断很有价值。
5.3 保养到期提醒的HMI交互
模板里定义了一组保养项目,每个项目四个参数:保养代码、保养内容文字、设定周期(次数)、当前计数值。当前计数值到达设定周期后,PLC侧置位对应的保养提醒M位,HMI上弹出提醒画面,显示保养内容,并提醒相关维护人员保养后复位计数器。
一个典型项目表:
| 保养代码 | 内容 | 设定周期 | 当前计数 |
|---|---|---|---|
| T01 | 气缸A密封圈检查 | 50万次 | D501 |
| T02 | 气缸B密封圈检查 | 50万次 | D502 |
| T03 | 伺服联轴器检查 | 6个月 | D505(按天数计) |
| T04 | 电磁阀阀芯清洗 | 30万次 | D510 |
按天数计的保养,是在每次上电时读取当前时钟,与上次保养记录日期比较,超过设定天数就提醒。天数保养和次数保养混在一起管理,正好是威纶通HMI擅长的场景:把PLC的D寄存器映射到表格控件里,一目了然。
保养提醒不能直接锁机,只能用黄色指示灯慢闪进行提醒,因为生产高峰期没人想被强制停产。但如果超过设定的二段周期(比如超期一半),就要报警锁机,防止带病运行导致更大的故障。这两种不同级别的提醒,在PLC里用两个不同的M位表达,HMI上分别做不同的显示和确认逻辑。
6. 数据统计链路:从PLC软元件到威纶通屏幕上的报表
6.1 产量与节拍统计的基本盘
数据统计模块是客户最喜欢看的板块。模板里做了三个最基本的指标:总产量、合格品数、不良品数,以及由此算出的良品率。
总产量在自动流程循环计数处加1,合格品和不良品则由检测结果决定。比如压装设备判断压装压力曲线是否在合格范围内,检测OK则合格品加1,检测NG则不良品加1。这个检测结果判断在执行完毕后由PLC的模拟量压力比较逻辑给出。
节拍统计稍微复杂一点。我在模板里记录了每50个循环的总耗时,用D1000最后一个循环结束的时间差计算平均单件节拍,单位秒。平均节拍可以反映设备是否存在频繁停机等待,是优化产能的重要数据。节拍计算不需要太精确,重点是长期趋势,所以用累计时间除以循环数的方式已经足够。
6.2 设备稼动率怎么算
稼动率是生产管理者最关心的指标之一,计算公式是:
稼动率 = 设备实际运行时间 ÷ 设备计划运行时间 × 100%
计划运行时间指的是班次时间减掉计划停机时间。在程序里实现时,我做了两个累计计数器:一个在设备总上电且非报警停机期间累加"实际运行时间",一个在操作工点击"开始生产"到"结束生产"之间累加"计划运行时间"。
两者分别用D区长时间计数器,配合HMI上的班次切换逻辑。白班、夜班分别有独立的计划时间和运行时间计数器,换班时操作工在HMI上按"换班确认",把当前数值归档到历史数据记录中,然后计数器清零重新开始。
这套逻辑解决了纸质交接班报表经常漏填、错填的问题。稼动率自动算,管理者直接看屏幕就行。不过要注意,开机待机但没生产的时间,到底算不算运行时间,各家工厂定义不同。模板里用参数让客户自行选择,默认按"设备在自动模式且非报警停机"才计入。
6.3 威纶通HMI上的数据呈现与配方管理
威纶通和FX5U走以太网通信,协议用三菱的SLMP或者专用MC协议,EB Pro配置起来比较简单。核心思路是:HMI上的数值显示元件、趋势图、历史表格,全部直接绑定PLC的D寄存器,减少宏指令中转。
产量数据这页,我用了一个折线趋势图,数据显示最近50次班次的产量和稼动率,VF屏上读数非常直观。威纶通的趋势图元件和资料采样功能是现成的,只需要在"资料采样"里配置好采样周期和采样通道,把D400、D405这些地址加进去。
配方功能用在伺服定位参数的切换上。模板里预置了10组配方,每组包含5个伺服目标位置值,产品切换时调出一组配方写入D200到D204,PLC程序里定位指令直接读这些D地址。威纶通的配方数据库可以在HMI侧编辑导出,现场换型号时也方便。
历史报警记录,威纶通自带报警记录功能,报警信息可以直接存到HMI内部存储器或者U盘里。PLC只需要把报警M位状态传给HMI,报警时间、次数统计全由HMI干,PLC侧不冗余存储。不过报警持续时间和次数的统计逻辑我会在PLC里做一份,防止HMI换电池后记录丢失,两份数据形成交叉验证。
7. 调试实录:这套框架在实际设备上踩过的坑和补救
7.1 伺服定位位置偶尔偏差一个脉冲的根因
在某项目调试时,伺服每次回原点后位置都很准,但连续跑几十个循环后,偶尔会出现位置偏差,大概零点几毫米。一开始怀疑电子齿轮比参数不对,排查了机械联轴器和丝杠间隙,都正常。最后把高速计数器的滤波时间调整了才解决。
FX5U高速输入X20、X21默认有数字滤波,对Z相脉冲这种高频信号,如果滤波时间太长,会漏掉脉冲或边沿抖动,导致原点捕捉位置不稳定。解决方法是把X21(Z相输入)的滤波时间设置为极短档,或者在参数里把该通道设置为中断输入模式。
这个坑很隐蔽,因为故障是间歇性的,而且只会在连续高速运行时出现。以后所有带Z相回原点的项目,我都会在初始化参数里把Z相输入滤波时间单独缩短,这是模板里已经固化的配置。
7.2 TPM数据掉电丢失的教训
第一次做这套模板时,TPM计数器在关机一段时间后归零了,客户非常不满。排查发现,FX5U的D区保持属性默认只对部分地址生效,D500以上的普通D区在掉电后不保存。
后来我在PLC参数的软元件设置里,手动把所有TPM统计D区的保持起始地址和个数配置好。同时,为了防止电池电压不足导致数据丢失,还在HMI侧做了特殊数据的定期备份,在每天换班确认时把PLC的TPM数据读取并保存到HMI的配方或数据存储区。双保险,即使PLC电池耗尽,也能从HMI恢复大部分数据。
7.3 气缸超时误报警的实战修正
模板初版的气缸超时报警时间全部设为3秒,结果第一台设备试运行时频繁报警。原因不是气缸真的卡了,而是气源压力在几个气缸同时动作时瞬时下降,气缸动作速度变慢,一次正常的慢速伸出耗时超过了3秒。
这种误报警的教训是:超时报警时间不要一刀切,要按每个气缸的实际工况分别设定。而且最好把超时报警做成"第一次超时只提示、连续两次超时才停机"的逻辑。我后来在模板的参数区给每个气缸加了两个时间参数,一个短报警提醒时间、一个长停机时间,并且报警标志要等动作真正完成后才复位。现场这样调整后,误报警率基本为零。
还要提一个小细节:气缸磁性开关的安装位置,决定到位信号在哪个点触发。如果安装位置偏了,气缸杆伸出到一半就触发了到位信号,后面执行下一个动作时可能正好撞上一半行程的气缸,非常危险。调试时我习惯把磁性开关紧固前,先手动让气缸运行几次,观察到位点的稳定性,再用锁紧螺母固定,并在程序里加"到位信号连续保持50ms才确认"的滤波逻辑,避免机械抖动带来的误触发。
8. 模板化框架还能往哪个方向扩展
这套FX5U+威纶通的模板跑过几个项目后,我越来越觉得它的价值不止于此。后续我已经在考虑把模拟量PID温控模块、视觉相机判断结果、扫码枪数据绑定等常见需求也沉淀成标准子程序,加到模板的扩展库里。
比如视觉检测,PLC通过Socket通信或以太网接收相机判断结果,再把OK/NG信号变成标准位,融合进自动流程的步进控制里。再比如扫码枪,把产品序列号写入D区并上传到HMI,配合数据库导出实现产品溯源。这些扩展的方向都建立在同一套I/O规划、软元件地图和步进状态机的底层基础上。
对于正在做非标设备的朋友,我个人的建议是:不要等所有功能都想明白了再动手搭模板,先把你最近做过的两三个项目里重复性最高的程序块抽出来,做一个最基础的框架,然后在下一个项目里边用边补充。模板是在项目之间长出来的,不是一次设计出来的。每多一个项目,你就多一份积累,下一台设备调试的底气也就更足。