尾款锁机程序——“时间密码锁”,部分逻辑说明
发布时间:2024-11-04 23:53 浏览量:1
“时间密码锁”的核心逻辑是比较给定时间与当前系统时间,当当前系统时间大于给定时间时,认定为超时,锁定逻辑。
图1 “日期和时间”指令
获得系统本地时间:RD_LOC_T;时间值相减:T_DIFF。图2 指令“T_DIFF” 参数
“T_DIFF”的输入参数数据类型如下图所示。由于指令“RD_LOC_T”获得的时间格式是DTL,为简便逻辑,“T_DIFF”的输入参数的数据类型也选择DTL格式。其代码如下:
其中:
sSetTime为给定时间;sLocTime为“RD_LOC_T”指令读取的实时系统时间。数据类型DTL的操作数长度为12个字节,以预定义结构存储日期和时间形象,其结构如下图所示。
图3 数据类型:DTL
设定时间以“年-月-日-时-分-秒”的格式给定,如下图所示。
图4 “时间密码锁”逻辑调用
实际应用中,在设定时间时,不会特地查询并输入设定时间的“星期”值。而“DTL”数据类型中,有记录“星期”值的字节。为了用指令“T_DIFF”正确的比较设定时间与当前系统时间,需要计算设定时间对应的“星期”值,并写入“sSetTime”中。
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是世纪(即年份的前两位数字)。程序调用格式如下:
图5 Zeller公式及其调用
通过输入设定的时间:InYear、InMonth、InDay、InHour、InMinute、InSecond直接写入“sSetTime”。设定时间对应的“星期”数,通过Zeller公式(FbWeekCal)计算出来,并写入“sSetTime.WEEKDAY”。这样,“sSetTime”就是包含正确“星期”数的DTL数据类型的数值了。