最近在项目里面,涉及到了定时器的设定时间是变量的情况。
S5定时器的一旦开始计时,定时器的内部只计算剩余时间,而不计算已用时间,这样就造成,在定时器运行中改变设定时间,定时器依然按照启动时的设定时间运行。并且S5定时器只能用到9990S,这个有时候会不够用。
SFB4计算的就是已用时间,也就是它的输出ET,它利用的是SFC64的系统时间,STIME为起始时间,STATE为状态(0为还没使用,1为计时中,2为计时结束),但是它也有缺点。一个是每个计时器都需要一个背景数据块,还有一个在OB100需要对所有计时器初始化。
针对这些问题,我仿造SFB4,重新编了个计时器FC,变量和SFB4基本一致。
需要1个UDT,里面是STATE BYTE STIME TIME ET TIME三个变量共10字节。可以在1个DB块里面最多建6553个这种UDT的数组,一般都够供普通程序使用。
需要在OB1开始调用SFC64,将输出保存到某一变量。
需要在OB100使某变量置True,然后在OB1结束置False。
FC的输入变量为:
Initial BOOL //初始化
In BOOL//变量
PT TIME//设定时间
ATIME TIME//SFC64输出的系统时间
输出变量为:
Q BOOL//计时器的输出
输入输出变量为:
IN_OUT 上面提到的UDT
程序如下:
A #Initial
JCN a0
JU a5
a0: A #IN
JCN res
L #IN_OUT.STATE
L B#16#1
==I
JC a1
TAK
L B#16#2
==I
JC a4
L T#0MS
T #IN_OUT.ET
L #PT
L T#0MS
<=D
JC res
L #ATIME
T #IN_OUT.STIME
L B#16#1
T #IN_OUT.STATE
JU res1
a1: L #ATIME
L #IN_OUT.STIME
>D
JCN a2
-D
JU a3
a2: L L#2147483647
L #IN_OUT.STIME
-D
L #ATIME
+D
a3: T #IN_OUT.ET
L #PT
>=D
JCN res1
a4: SET
= #Q
L B#16#2
T #IN_OUT.STATE
JU end
a5: L T#0MS
T #IN_OUT.ET
res: L B#16#0
T #IN_OUT.STATE
res1: CLR
= #Q
end: SET
SAVE
希望能帮助到一些朋友们
PS:电脑是加密的,没法传STL源程序,请见谅
还有可能会有误差,最大误差是最长的扫描周期。我不清楚是不是SFB4也有这个问题