1. 项目概述:从单期锁定到三期时间锁的升级思路
最近好几个做设备租赁和分期付款的朋友都在问三菱PLC的时间锁机到底怎么做。之前我分享过一版比较粗糙的方案,只能锁一个时间点,到期就停,想续期还得改程序重传,麻烦得不行。这次项目里我把这套逻辑重新撸了一遍,升级到了2.0版本,核心变化就两个:支持三期时间锁,扩展期数不用再改程序。所谓时间锁机,说白了就是在PLC里写一段授权管理逻辑,让设备按照合同约定的时间段正常运转,超出授权周期就自动进入停机或限速状态。2.0版本特别适合设备租赁、分期回款、试用期授权这类场景,做设备的人应该都能用上。
我要先说一句,这套程序本身是给设备厂商做合规授权用的,是为了保护收款权益和防止客户拖欠设备款,用来做正常商业授权没问题,别拿去搞歪门邪道。2.0版本里我采用了“时间表驱动”的设计,把每一期的开始时间和结束时间都放到数据寄存器里,程序里只做循环扫描和区间判断。这样就有一个好处:不管你是3期、5期还是8期,只要改变数据区里的期数参数和对应的时间数据,程序主体完全不用动,真正做到了“加期数不改逻辑”。
这篇文章适合三类人看:一是刚开始接触三菱PLC想搞懂时间锁机原理的工控新手,二是已经在做设备租赁授权、想把方案做得更灵活的老工程师,三是需要把时间锁机和触摸屏、上位机通讯联动起来的项目开发人员。我会把2.0版本的数据结构、核心判断逻辑、防篡改手段、实操步骤和坑点全部拆开讲,最后还会附上我在现场调试中踩过的几个典型问题。
1.1 为什么之前的单期锁机不够用
第一版方案其实就是在PLC里写一个简单的截止日期判断,到了指定日期,输出一个锁机信号。比如合同约定了设备只给客户用一年,那我把一年的最后一天写死在程序里,到期后M点置位,设备的主接触器断开,或是触摸屏上弹出一个授权到期的画面。这个方案在单一合同场景下能用,但实际做设备租金的就会发现一个问题。客户经常是先付一笔首付,用三个月,然后再付二期款,又用三个月,到期再付尾款。这种分阶段回款的合同,单期锁机根本没法处理。到了第二期要续期的时候,只能把PLC程序调出来,修改截止日期,重新编译下载。在客户现场做这种操作,又麻烦又不安全,一旦下载的时候停电断线,设备可能直接趴窝。而且频繁开箱调程序,客户也会怀疑你搞了什么小动作,后续扯皮的事情特别多。
到了做第三个项目的时候,我干脆决定做一个能存多个时间段、能通过触摸屏动态续期的版本。也就是说,PLC程序里不再只存一个截止时间,而是存一组时间区间。客户付了第一笔钱,就激活第一期;付了第二笔,通过授权码激活第二期;付了第三笔,激活第三期。每一期的时间窗口都是独立的,先到先判断,只要当前时间落在任意一个已激活的有效区间里,设备就正常放行。三期全部到期后,锁机信号才真正置位。这就是2.0版本最核心的设计目标。
1.2 2.0版本要解决的四大痛点
我整理了一下,这个升级版本主要解决四件事。
第一,期数支持必须灵活。既然叫三期时间锁,那数据结构上就不能把三期的判断逻辑写死。我用一组寄存器连续存放所有期数,每一期占用固定长度的数据块,程序里用一个循环去遍历。这样一来,从3期改成5期,只是把数据块长度变长、遍历次数变多,逻辑不需要推倒重来。
第二,续期操作必须能在现场完成。设备厂商的业务员带着一个授权码去客户现场,在触摸屏上输入授权码,PLC自动校验后写入新一期的起止时间,不需要笔记本电脑,更不需要把程序重新传一遍。这种操作方式对于非专业客户来说,也更容易接受。
第三,系统时间不能被随便改。很多时间锁机程序失效,不是因为逻辑不对,而是客户直接把PLC的系统时间往回调,或者把RTC电池拔了,导致时间基准错乱。这个问题必须在程序里做防抖处理,我会在后面专门讲容错方案。
第四,程序得能扛住误操作。现场工人不会像工程师一样规范操作,可能会连续输错授权码、可能在上电瞬间乱按触摸屏、可能在PLC电池没电的情况下长期断电。这些异常场景都要在程序里提前做好保护,否则锁机程序没锁住客户,反而先把自己锁死了。
2. 核心逻辑拆解:三期时间锁的完整实现思路
搞懂数据结构比搞懂梯形图更重要。你只要抓住“时间表驱动”这个核心,后面写程序就是照葫芦画瓢。我的2.0版本在逻辑上分成了四个模块:时间基准读取模块、时间表存储模块、状态判定模块、续期写入模块。这四个模块各干各的事,相互之间用寄存器通信,后面扩展功能的时候也方便。
2.1 时间基准怎么读才稳定
三菱PLC读取系统时间,不同系列有不同的方式。FX系列比较老的做法是直接读取特殊数据寄存器,比如D8013是年、D8014是月、D8015是日、D8016是时、D8017是分、D8018是秒,都是BCD码格式。FX5U和Q系列则有专门的时钟读取指令,比如通过软元件注释或者专用的RTC读写指令来操作。我们要先确定手里的机型,再选择对应的取时间方法,否则移植程序的时候很容易踩坑。
读取到的时间分成两个用途:一是用于显示和记录,比如在触摸屏上显示“当前时间 2025-06-01 10:30:00”,这时候单独使用年、月、日、时、分寄存器就行;二是用于逻辑比较,这时候不能一个寄存器一个寄存器去比较,而是要把时间换算成一个便于比较的整数。
我这里推荐一个非常省事的做法,把年月日换算成“日期整数”,公式很简单:日期整数=年×10000+月×100+日。比如2025年6月1日,转换后就是20250601。如果判断周期需要精确到分钟,那就再把这个整数扩展:日期时间整数=年×1000000+月×10000+日×100+小时。比如2025年6月1日14点,就是2025060114。用这种整数做区间比较,一条比较指令就能完成,不需要一个字段一个字段地比较,效率高而且不容易漏条件。
需要注意的是,PLC里读到的年月日是BCD码格式。比如D8013里面存的值,表面上看是十六进制的H2025,但FX系列里它可能是按BCD保存的,直接把它当成普通整数去乘10000,算出来的结果就会完全不对。我的经验是先把BCD转换成二进制整数,或者用指令把BCD码校正成普通数值。FX3U里可以用BCD和BIN指令做转换,具体可以参考对应机型的编程手册。GX Works软件里也提供了一些系统时间读写的功能块,能少走很多弯路。
2.2 三期时间表的数据结构
时间表是2.0版本的核心数据结构。我设计成每期占用固定数量的数据寄存器,以D100为起始地址,方式如下:
| 偏移量 | 内容 | 数据类型 | 说明 |
|---|---|---|---|
| 0 | 启用标志 | 位/整数 | 0表示未启用,1表示启用 |
| 1 | 起始日期整数 | 整数 | 如20250601 |
| 2 | 结束日期整数 | 整数 | 如20251231 |
| 3 | 授权码校验值 | 整数 | 用于续期时校验 |
| 4 | 预留 | 整数 | 扩展用 |
如果每期占用5个数据寄存器,那么第N期的起始地址就是:起始地址=100+(N-1)×5。第一期从D100开始,第二期从D105开始,第三期从D110开始。这样设计的好处是,PLC程序里只需要把变址寄存器Z的值改成0、5、10,就能依次访问每一期。三期就是循环3次,想改成10期,只要把循环次数改成10,再保证数据区放得下就够了。
我在这里故意留了一个“授权码校验值”,因为续期操作不是随便填个日期就行的。现场操作人员输入授权码后,PLC要按照写死的算法把这个授权码换算成校验值,再和当前期的预设校验值做比对,一致才允许把新的起始时间和结束时间写入。这样既能防止客户自己乱填日期,也能防止内部人员无授权操作。授权码算法不需要太复杂,三菱PLC里做不了高强度的加密,我用的是异或加偏移量扰动,关键是不要让客户轻易猜出规律。
2.3 锁机判断状态机
有了时间表之后,判断逻辑就非常清晰了。每一步都是对“当前时间”与“每一期时间区间”的关系做检查。
我用一个状态字M200来保存当前设备状态:0是正常放行,1是已到期待续期,2是非法时间被锁定。程序开机后,先读取当前日期整数,然后从第1期开始循环扫描。只要发现当前日期大于等于某一期的起始日期,并且小于等于该期的结束日期,就说明当前时间落在有效授权窗口内,M200置为0,设备正常放行。
如果扫描完所有期数,都没有找到能覆盖当前日期的时间区间,M200就置为1。这时候设备进入提示状态,触摸屏上会弹出“授权即将到期,请联系设备商”,同时可以给出一个宽限期,比如72小时内不做任何动作,只是提醒。超过宽限期后M200置为2,输出锁机信号,断开主接触器或者打开报警灯。这样做的好处是,不会在客户正在加工一个关键零件的时候突然停机,减少纠纷。
这里有一个细节特别重要:时间区间的比较必须用“大于等于起始日期”和“小于等于结束日期”这种闭区间,还是用“大于起始日期”和“小于结束日期”这种开区间?我吃过亏。如果合同说授权到2025年12月31日,那12月31日当天应该还是有效授权日,如果你用开区间,到12月31日0点0分就判定到期,客户会在最后一天白白停机。所以正确做法是闭区间,把结束日期的23点59分59秒也算在有效期内。用日期整数比较的时候,就是当前日期<=结束日期,这就没问题了。
2.4 续期写入与解锁流程
续期操作不复杂,但要做好权限校验。触摸屏上设一个“续期管理”画面,操作员输入8位授权码,PLC先把授权码通过一段固定算法转换成校验值,再和当前期预设的校验值比较。匹配通过后,把触摸屏上输入的“新起始日期”和“新结束日期”写入到对应期的数据区。写入完成后立即重新执行一次状态判断,M200自动复位到0,锁机信号消失。
这个流程的关键在于,写数据之前一定要先把设备状态切到“校验中”,防止在写入过程中正好有一个扫描周期的误判断。我写的时候用了两个M点做互锁:M300是授权码校验通过标志,M301是写入完成标志。只有M300和M301都满足要求,才把M200复位。这样就不会出现授权码还没校验完、锁机信号就已经释放的漏洞。
3. 无限扩展的设计思路与存储模型
标题里写了“不限扩展”,这个提法要稍微解释一下。PLC的数据寄存器数量是有限的,所以不可能在物理意义上无限存储,但我们可以做到“程序结构上的无限扩展”。也就是说,新增期数不需要重新设计程序结构,只需要在数据区里追加数据、在循环次数里加一个参数。下面我把这个设计怎么落地讲清楚。
3.1 PLC存储区怎么规划才够用
以三菱FX3U为例,普通数据寄存器D区一般有8000点左右,有些扩展型号更多。如果每一期占用5个寄存器,理论上可以存1600期,当然实际不可能这么干,因为还要留出大量空间给其他工艺逻辑。我的建议是规划一个独立的“授权参数区”,避免和其他工艺数据混在一起。
可以参考这个分配方式:
| 软元件范围 | 用途说明 |
|---|---|
| D100-D199 | 授权时间表区,每5点一期 |
| D200-D209 | 系统中间变量区,存放当前时间整数、状态字、循环计数 |
| M200-M299 | 锁机逻辑相关M点 |
| D3000-D3009 | 触摸屏交互缓存区 |
这样做的好处是,程序里所有和时间锁相关的指令都集中在固定区域,排查问题的时候直接打开D区监控,一目了然。很多新手写程序喜欢随手定义地址,今天用D100,明天用D105,时间一长自己都忘了哪个地址管什么,等设备出了故障再查就非常痛苦。所以我强调把“授权参数区”单独圈出来,宁可浪费一点地址,也不要和工艺逻辑抢空间。
3.2 用索引+表驱动代替写死的三期判断
传统的做法是这样写:先判断第一期,不满足再判断第二期,再判断第三期。这种写法最直观,但有个致命问题:如果客户后面要加第四期、第五期,你必须修改程序结构,增加重复的判断分支,还要重新下载。代码越长越容易出错,而且每一期判断的逻辑如果后来要微调,得改好几处。
2.0版本用的索引+表驱动方法就不一样。程序里先设置一个“期数”变量,比如当前需要启用三期,就把期数变量设为3,然后做一个FOR循环,从0到2依次取出每一期的起始地址,读取该期的起始日期和结束日期,和当前时间做比较。这个循环体只写一次,不管有多少期,程序代码体积完全不变。后期如果要从3期扩展成5期,只需要做两件事:在数据区里追加第4期和第5期的起始地址数据,把期数变量从3改成5。就这么简单。
三菱FX3U及以后的中大型PLC都支持FOR、NEXT指令,也可以使用变址寄存器Z做地址偏移。我给一个简化的结构化文本(ST)写法示意,方便大家理解:
// 伪代码,具体指令以设备机型为准 CurrentDate := INT_TO_DINT(RTC_YEAR) * 10000 + RTC_MONTH * 100 + RTC_DAY; Authorized := FALSE; FOR LoopIndex := 0 TO PeriodCount - 1 DO BaseAddr := 100 + LoopIndex * 5; IF D[BaseAddr] = 1 THEN IF CurrentDate >= D[BaseAddr + 1] AND CurrentDate <= D[BaseAddr + 2] THEN Authorized := TRUE; EXIT; END_IF; END_IF; END_FOR; IF Authorized THEN M200 := FALSE; ELSE M200 := TRUE; END_IF;这段代码的逻辑很直白,但已经能跑通核心功能了。实际项目里我还会加上宽限期判断和异常检测,不过骨架就是这个。大家看明白这个结构,就理解了为什么“无限扩展”是可行的。
3.3 表驱动方案的边界和注意事项
虽然程序结构不限制期数,但有几个边界条件必须提前设计好。
一是数据寄存器的连续性。表驱动方式要求每一期的时间参数在PLC里连续存放。如果中途被其他逻辑改写了数据,授权判断就会出错。所以我前面才强调要单独规划授权参数区,并且在程序里加上写保护逻辑。除了触摸屏续期入口,其他地方不允许直接写这个区域。
二是期数变量本身也可能被修改。如果客户把PLC内程序读出来,直接修改期数变量,那我们的时间锁就形同虚设了。所以完整方案里还要做程序加密,三菱PLC在GX Works2里可以对工程设置密码,下载到PLC的程序可以设置禁止上载保护。下载保护是一把双刃剑,设置了保护之后自己以后想上载程序也会很麻烦,我一般是先把外围调试全部完成,在出厂前才打开禁止上传。
三是时间区间的重叠问题。表驱动遍历的时候,只要找到第一个有效区间就会跳出循环。如果前一期还没有到期,第二期就已经被人为写入了一个更早的起始日期,那第一期的数据就有可能会被遮蔽。我建议在续期写入时增加一个简单校验:新写入的起始日期必须大于等于当前最后一期的结束日期。这样可以避免时间倒挂,也能防止客户通过乱填授权码造成逻辑混乱。
4. 实操过程:从零搭一个2.0版本
光讲原理不够,我把从建工程到测试的完整过程走一遍。这里以三菱FX3U系列和GX Works2软件为例,如果你的机型是FX5U或者Q系列,操作步骤大同小异,只要注意型号差异即可。
4.1 硬件与软件环境准备
我这次用的配置是这样:
| 项目 | 配置 | 说明 |
|---|---|---|
| PLC | 三菱 FX3U-32MR | 带实时时钟,需安装电池 |
| 编程软件 | GX Works2 | 也支持GX Developer |
| 触摸屏 | 三菱或国产HMI | 通过RS422/以太网连接 |
| 传感器 | 无需额外 | 时间锁机主要靠RTC |
这里有个容易忽视的点:FX3U标准型号不一定带实时时钟,不带时钟的型号需要加装时钟板(如FX3U-32BL)。如果你的设备本身没有RTC,那么时间锁机程序就是空中楼阁。买硬件之前一定要确认好。另外,三菱PLC里的时钟电池通常能用5年左右,电池耗尽后断电保持时间和时间数据会丢失。在项目交付时,最好在说明书里写清楚“更换RTC电池的方法和周期”。
4.2 建立时间基准模块
建好工程后,第一步是编写时间基准读取模块。这个模块要做的就是把系统时钟读出来,换算成方便比较的整数。在FX3U里,我们可以用特殊寄存器D8013-D8018读取年、月、日、时、分、秒。注意这些寄存器里保存的是BCD码,我用下面的梯形图思路转换:
- 先用
MOV指令把D8013读到一个中间寄存器D10。 - 再用
BCD指令确保数据格式是BCD,或者用BIN指令转成二进制。 - 最后把年×10000、月×100、日相加,存到D200。
我这边的经验是,FX3U读取RTC寄存器,在多数情况下直接做算术运算是可行的,但如果你发现算出来的日期差了十万八千里,那基本就是BCD和BIN的转换出了问题。可以用仿真软件先算一遍,用监视模式看中间寄存器的值,确保转换正确后再往下走。
4.3 编写核心的锁机判断逻辑
时间基准处理完之后,在程序里新增一个程序块,专门做授权扫描。这里我建议在梯形图里用循环结构来做。FX3U的循环指令是FOR、NEXT,中间可以使用变址寄存器Z。大致的梯形图逻辑如下:
- 先把“期数”K3送到D205,表示当前启用三期。
- 用一个16位计数器D206作为循环变量,初始化为0。
- 每循环一次,计算当前期起始地址:D100+D206×5。这里可以用变址寄存器Z,把
Z值设置为D206×5,然后所有对D100的引用变成D100Z。 - 判断D100Z是否为1,如果启用,再判断D200是否在D100Z+1和D100Z+2之间。
- 如果找到有效区间,就把M200复位并跳出循环;否则继续循环到结束,最后置位M200。
有几个细节需要特别注意。
第一,FX3U的变址寄存器Z是16位的,乘5后的结果可能溢出吗?如果是FX3U,每期5个寄存器,循环次数一般不会超过几百,Z是完全够用的。但如果你的期数很多,比如超过6000期,那就要改用32位循环和32位变址,不过这种需求在实际工控里几乎不存在。
第二,在循环体里使用EXIT指令可以提前跳出FOR循环。不同版本的GX Works2对EXIT的支持不太一样,我一般会在循环体里用“标志位置位后跳过后续动作”的方式来变相实现跳出,避免不同软件版本带来的指令兼容问题。用梯形图写起来会稍微长一点,但可靠性更高。
第三,锁机输出不要直接用M200去驱动负载。M200只是状态字,真正断主接触器或报警输出的是Y点。为了安全,我会把M200转成Y0锁机输出,并且用常闭触点控制,确保PLC一上电、程序还没运行到正常状态之前,输出处于断开状态。这种安全逻辑很重要,否则PLC一上电的瞬间设备可能会突然启动,现场操作人员容易被吓一跳。
4.4 触摸屏和上位机的交互实现
2.0版本的交互要求不高,触摸屏上做两个画面就够了。第一个画面是“运行状态”画面,放一个当前时间显示、一个授权状态显示、一个剩余天数显示。剩余天数的计算方式就是用当前期结束日期减去当前日期,注意用日期差指令或者先把日期换算成天数再相减。第二个画面是“续期管理”画面,放三个输入框:授权码、起始日期、结束日期,再加一个“确认续期”按钮。
触摸屏和PLC的通讯协议一般用三菱的MC协议。以太网连接时设置好PLC的IP地址和端口,串口连接时要注意站号、波特率、数据格式一致。我这里不展开讲通讯参数,只说一个容易犯的错:日期输入框在触摸屏上的数据格式一定要和PLC内部寄存器格式匹配。如果PLC里存的是整数20250601,触摸屏输入框就要设置为10进制整数格式,显示格式可以用8位数字。不要用日期控件,因为日期控件往往会自动转换成年月日三个独立的数值框,和PLC里的整数对不上,通讯过来后日期就对不齐了。
4.5 程序加密与防篡改设置
出厂之前的最后一步,是给程序加上保护。GX Works2里在“工程”菜单下可以设置“文件密码”和“PLC保护密码”。我建议至少做两层保护:第一层是工程文件密码,防止别人打开你的工程文件偷看逻辑;第二层是禁止上载保护,设置后PLC里的程序不能被上载读出,这就避免了客户直接扒程序改时间表。
设置禁止上载保护要慎重,因为一旦设置,你自己也读不出来了。我的做法是先把最原始的程序备份到本地电脑,并单独保存一份带密码的文件,然后才给PLC设置禁止上载。如果后期需要维护,只能通过带密码的工程文件离线修改后重新下载,同时也需要使用密码解锁PLC后才能操作。
5. 防破解与容错:时间锁的护城河
时间锁机程序最怕两件事:一是客户改系统时间,二是PLC电池失效导致时间错乱。这一节专门讲怎么提高稳定性。
5.1 防止修改系统时间
大多数三菱PLC是允许用户通过编程软件直接修改系统时间的,如果客户拿到上位机软件或者知道怎么用串口调时间,一改时间锁就废了。从程序层面,我们可以做“时间跳变检测”。PLC每次扫描时记录上一次的日期,如果发现当前日期比上一次记录的时间倒退了很多,或者突然跳变到很久以后,就认定有人动过RTC时间。
具体做法是:在数据区里放一个D210,保存上一次扫描时的日期整数。程序每次执行授权扫描前先比较D210和当前日期,如果当前日期 < D210,说明时间被往前调了,立刻置位“非法操作”标志,设备进入锁定状态,并且这个状态只能通过特定授权码解除。如果当前日期比D210大出太多,比如一次跳了30天以上,也判定为异常。正常使用过程中,日期只会每天加1,突然跳变多半是修改时间或者RTC芯片丢数据。
不过要留意,客户如果只是把时间往回调了一天,比如从6月2日调回6月1日,这种小范围跳变很容易漏过去。我的处理办法是同时记录“最近7天的日期驻留次数”,如果客户反复改时间,累计数据会暴露问题。当然这个方法也不是万能的,现场条件有限,我们做到能拦截90%的常见操作就已经很实用了。
5.2 断电保持与RTC电池
PLC断电后,程序里的普通寄存器会清零,如果时间表放在普通D区,断电后授权数据就会丢失,客户再上电设备就锁死,厂商还得跑一趟现场。所以授权时间表和状态位必须放在断电保持区。
三菱FX3U的D区有一部分默认断电保持,具体范围要看PLC参数设置。在GX Works2的PLC参数里,有一项“软元件保持设定”,可以把D100-D199设为断电保持范围。M200-M299也可以设成锁存M,这样即使断电,当前授权状态也能保持。我强烈建议把整个“授权参数区”全部设为断电保持,并且把M200状态字也设为锁存。否则设备一断电,时间锁状态全丢,现场很容易扯皮。
RTC电池方面,如果电池没电,PLC上电后系统时钟可能回到一个初始默认时间,授权判断自然就不准了。针对这种情况,程序里可以加一个“时间异常检测”,判断当前年份是否小于一个基准年份,比如小于2020年,就认为RTC异常,直接进入锁定状态,并提示“时钟故障,请联系维护”。这样至少不会出现客户把设备断电放一年,再上电发现设备还能继续用的漏洞。
5.3 异常状态处理与自恢复
还有一个常见情况是PLC上电瞬间,时间基准模块还没稳定,程序先跑了一遍授权判断。如果在PLC刚上电的扫描周期内,系统时钟寄存器还没有刷新,读出来的可能是全零,这样就会误判成时间异常,设备瞬间锁定。所以我在程序开头加了一个初始化延时:用M0特殊继电器或者定时器,让授权判断在PLC上电后0.5秒再启用。如果上电后系统时间也确实异常,则在初始化阶段先输出一个“故障提示”而不是直接锁机,给维护人员留时间查看。
另外一个要处理的是宽限期逻辑。宽限期不要用固定计时器,因为客户有可能断电多日,计时器就停了。正确做法是用日期整数计算宽限结束日期:在判断到所有期都到期后,检查当前日期是否超过“最后到期日+宽限天数”。如果没超过宽限,设备还能运行但触摸屏弹窗提醒;超过宽限则输出锁机信号。宽限天数可以放在一个断点保持寄存器里,比如D220,这样断电也不丢失。
6. 常见问题与排查技巧实录
这块内容基本是我现场调试遇到过的真实问题,挑几个典型的写出来,可以当成排查手册用。
6.1 时间不走或时间偏差
故障现象:触摸屏上显示的时间一直不变,或者和实际时间差了好几天。
排查步骤:
- 先看PLC的RUN指示灯是否正常,程序是否在运行状态。
- 用GX Works2连接PLC,在线监视D8013-D8018的值。如果这些寄存器全为0或者一直不变,大概率是RTC电池没电或者时钟板故障。
- 如果RTC寄存器在走,但触摸屏显示不对,检查触摸屏的数值格式和通讯地址是否对应正确。
实际心得:FX3U的RTC寄存器读取频率不要太快。我见过有工程师把时间转换模块放在每个扫描周期都运行,导致同步显示时偶尔出现跳变。后来改成1秒触发一次读取,问题就消失了。时间读取本身不复杂,但要记得给时间块加一个“每秒执行一次”的缓存机制。
6.2 解锁成功后设备依然锁定
故障现象:在触摸屏上输入了正确授权码,提示“续期成功”,但设备还是处于锁机状态。
这个问题的原因通常是:M200状态字是锁存型触点,续期成功之后虽然M300置位了,但M200并没有被复位。我一开始也踩过这个坑,续期写入后只改了时间表数据,没把M200复位。后来把时序改成“先写时间表,等一个扫描周期,再重新执行状态判断,根据结果复位M200”,问题就解决了。需要注意的是,M200如果设成了锁存M,那么复位指令必须明确执行一次,不能指望程序重启后自动复位。
6.3 扩展期数后数据错位
故障现象:本来3期正常,改成5期后,后面的期数判断总是不对,有时会把当前期数据当成下一期的数据。
肯定是地址偏移量算错了。比如你每期占用了6个寄存器,但偏移量还写的是5;或者你给一期分配了5个寄存器,但起始地址是105,那么第三期应该从115开始,写成110就会和第二期重叠。排查时把这些寄存器全部监控出来,逐项核对起始地址和偏移量。我习惯在表格里先排好地址清单,再往程序里搬,不要边写边算。
6.4 常见问题速查表
| 现象 | 可能原因 | 解决方向 |
|---|---|---|
| 时间不走 | RTC电池掉电或时钟板缺失 | 检查电池、更换时钟板 |
| 时间能显示但判断错误 | BCD/BIN转换错误 | 用在线监视确认中间寄存器数值 |
| 授权码输对了还失败 | 校验算法或校验值存储不一致 | 检查授权码生成和PLC校验算法是否一致 |
| 上电瞬间锁机输出抖动 | 时间模块未初始化 | 增加上电延时和状态字安全逻辑 |
| 断电后授权数据丢失 | 数据区没设断电保持 | 在PLC参数里设置保持范围 |
| 触摸屏日期无法写入 | 数据格式不匹配 | 改为整数格式,统一位数 |
7. 一点个人实操体会
这套2.0版本我前后改了三轮才稳定下来。最开始我也想着用最简单的“一个截止日期+一个定时器”来做,后来发现设备租赁场景的分期需求太常见,才下决心重构数据结构。做完之后回头看,最大的收获其实是“把期数做成数据、把逻辑做成循环”这种思路。它不只适用于三菱PLC,放到其他品牌PLC甚至单片机上也是通用的。只要你的控制器支持循环指令和变址寻址,就能套用这套时间表驱动方案。
最后再分享一个小技巧:在PLC里设置一个“出厂日期”寄存器,比如D230,烧录时写入生产日期。以后任何一期授权到期后,程序都可以自动计算“设备已经通电运营了多少天”,这个数据对设备厂商判断客户实际使用强度非常有用。它不需要额外硬件,就是做时间差值计算,但能给售后部门提供不少参考信息。
时间锁机2.0版本的核心就是这些。如果你也在做类似的设备授权管理需求,照着“时间表+周期扫描+授权码续期”的思路去搭,应该能少走不少弯路。后续如果我把这套逻辑移植到FX5U上,再回来同步新的踩坑记录。