恭喜,你发布的帖子
发布于 2018-03-12 09:31:22
25楼
就是用 “西山炮台” 说的方法,自己做减法了。
#iTemp := RD_SYS_T(OUT=>#ACTUAL_TIME); //读取当前系统时间
IF #ACTUAL_TIME.YEAR=#LAST_TIME.YEAR
AND #ACTUAL_TIME.MONTH=#LAST_TIME.MONTH
AND #ACTUAL_TIME.DAY=#LAST_TIME.DAY
AND #ACTUAL_TIME.HOUR=#LAST_TIME.HOUR
AND #ACTUAL_TIME.MINUTE=#LAST_TIME.MINUTE
THEN
#rCycleTime := LREAL_TO_REAL(#ACTUAL_TIME.SECOND-#LAST_TIME.SECOND+LReal#1.0E-9*(UDINT_TO_LREAL(#ACTUAL_TIME.NANOSECOND)-UDINT_TO_LREAL(#LAST_TIME.NANOSECOND)));
END_IF;
#rDeltaTime := 1.0E-3*DINT_TO_REAL(TIME_TO_DINT(T_DIFF(IN1:=#ACTUAL_TIME, IN2:=#LAST_TIME)));
#LAST_TIME := #ACTUAL_TIME; //为下一次调用做准备
测试程序在附件内。
@伊默 ,伊大侠,上面的程序,考虑到刚好进位的情况了吗?
年=年;月=月;日=日;时=时;分=分;的情况下进行计算。
如果不相等呢?
比如前一次时间刚好为2017年12月31日23时59秒,本次采样时是2018年1月1日00时01秒。
虽然扫描周期是毫秒级,但也会有进位时,我只是拿秒为单位做说明,实际程序可以以纳秒为单位。
我的方法是不管什么时刻,只需比较秒即可。
IF 本次秒 >= 上次秒 THEN
周期:= 本次秒 - 上次秒;
ELSE
周期:= 60 + 本次秒 - 上次秒; //若为纳秒时,此处的60应更改为纳秒的最大值+1;
END_IF
因为我们是需要采集扫描周期,而扫描周期不可能出现纳秒的两次进位的情况,如果出现两次进位,那PLC早就因扫描周期太长而进入STOP了。
请填写推广理由:
分享
只看
楼主