尾款锁机程序——“定时密码锁”,自动计算“授权”截止时间
发布时间:2024-11-07 00:05 浏览量:1
工程应用中,为了追缴尾款或其他工程目的,可使用“锁机程序”,即控制机器或设备在特定条件下锁定(停止运行)的程序。这种程序可能基于时间、操作次数或其他逻辑条件来执行锁定动作。例如,一个锁机程序可能会根据设备的使用期限自动锁定机器,直到用户输入正确的解锁密码或支付相应的费用后才能继续使用。
前文介绍一款基于“时间”的锁机程序,其基本的设计逻辑如下:
设定锁机日期:设置一个初始的锁机日期,当PLC内部时钟到达这个日期时,设备将被锁定。通过输入解锁密码,解除锁定机制,设备可正常运行。这种锁机逻辑,需要人工输入“年、月、日、小时、分、秒”等信息,存在输入时间格式错误的可能,虽然设计了设定时间“防呆”逻辑,并以状态字的形式显示出来,如下图所示。
“时间密码锁”的主体锁定逻辑问题不大,但需要输入“授权截至”时间,智能化程度不足。因此,下文介绍一套“定时密码锁”逻辑,其基本设计逻辑如下:
首次执行时,读取当前系统时间,并根据设定的延迟月数,计算出“授权截止时间”,即锁机日期。当PLC内部时钟到达这个日期时,设备将被锁定。通过输入解锁密码,解除锁定机制,设备可正常运行。主流程图如下:
图1 “定时密码锁”逻辑
图2 程序接口
程序接口分为3个部分:
设定“授权”的月数:默认为6个月。这部分可以组态在触摸屏或SCADA上。逻辑锁密码。密码的输入接口可组态在触摸屏或SCADA上。当输入密码正确时,则解锁所有逻辑,设备无障碍运行;当未输入密码或输入密码错误时,则启用“时间密码锁”逻辑。具体的程序逻辑,可参见图1。Zeller公式,是一个用于计算任意给定日期(1582年10月4日及以后的日期)是星期几的算法。Zeller公式的形式如下:
其中:
h是星期几(0=星期六,1=星期日,2=星期一,……,6=星期五);q是日期(1-31);m是月份(3月=1,4月=2,……,2月=12。注意:1月和2月被视为上一年的13月和14月)。K是世纪年(即年份去掉前两位数字后的部分);J是世纪(即年份的前两位数字)。程序调用格式如下:
通过输入设定的时间:InYear、InMonth、InDay、InHour、InMinute、InSecond直接写入“sSetTime”。设定时间对应的“星期”数,通过Zeller公式(FbWeekCal)计算出来,并写入“sSetTime.WEEKDAY”。这样,“sSetTime”就是包含正确“星期”数的DTL数据类型的数值了。
根据输入的“年”、“月”信息,计算当月的最大天数。主要是判断闰年与非闰年时,2月份的天数。
根据系统当前时间及“授权”的月数“AuthorizedMonths”,计算“授权时间”,但月份直接相加可能跨年、计算出的月份对应的最大天数小于当前时间的“日期值”等,因此,计算出的“授权时间”不能直接使用,需要做一些处理:
新“月”份值大于12,则说明“授权”时间跨年,则“年份”值要“+1”。计算出的月份对应的最大天数小于当前时间的“日期值”,如当前时间为2024年3月31日,授权月份为11个月,直接计算的话,“授权”时间为2025年2月31日,不符合日期格式。因此,需将“授权”时间设置为:2025年3月4日。经过以上对“授权时间”的处理,即可作为“逻辑锁”的截止时间。执行【定时密码锁】逻辑。
首次调用【FbTimeLimitLock】时,通过当前系统时间及给定的授权“月份数”,计算授权截止时间,并启用“时间锁”逻辑。在限时到达之前,设备正常运行。限时到达后,仍未输入密码,程序会因超时而给出锁定逻辑,从而暂时限时设备的正常运行。
设备锁定后,如想继续运行,则需要通过“付尾款”或“购买密钥”的方式,获得密码,取得程序的永久运行权限。
正确的输入一次密码后,程序即永久解锁,即使PLC断电、重启,也无需重新获得密钥。