quote:以下是引用n次看你的背影在2013-04-22 14:47:46的发言:
可以的,利用PLC程序不断循环的特点,可以这样处理一下。先把存储器分配到你的表达式里面DB1.DBD8=DB1.DBD4—DB1.DBD0,DBD4存储的是本周期数据、DBD0存储的是上周期数据、用本周期的数据减去上周期的数据存储在DBD8里面。这样每个周期都执行一次,也就实现了你上面的功能。就举这个例子吧,你可以参考一下:
L DB1.DBD4 //装载上周期的数据DB1.DBD4到ACCU1里面
T DB1.DBD0 //将ACCU1里面的内容存储到DB1.DBD0里面
L MD100 //装载当前过程数据MD100(比如是FC105的输出)到ACCU1里面
T DB1.DBD4 //将ACCU1里面的内容保存到DB1.DBD4里面
L DB1.DBD0 //装载上周期的数据DB1.DBD0到ACCU1里面
-R //ACCU2减去ACCU1=DB1.DBD4—DB1.DBD0
T DB1.DBD8 //存储本周期减去上一周期差值的数据
初学,对STL语句不熟悉,编程模拟了下,有一个问题需要解决。比如,假设数据采集周期为1S,即每1S更新MD 100,主程序循环扫描周期为0.1S(一般小于0.1s)。
在0S,初始化DB1.DBD0=0.0, DB1.DBD4=0.0同时采集到MD= 20.0,则有
L DB1.DBD4 =0.0
T DB1.DBD0 =0.0
L MD100 =20.0
T DB1.DBD4 =20.0
L DB1.DBD0 =0.0
-R
T DB1.DBD8 =20.0
此时MD1.DBD8=20.0,结果正确。
但是,0.1s时,PLC再次扫描,此时未到数据采集周期,数据MD100=20.0保持不变,则有
L DB1.DBD4 =20.0
T DB1.DBD0 =20.0
L MD100 =20.0
T DB1.DBD4 =20.0
L DB1.DBD0 =20.0
-R
T DB1.DBD8 =0.0
此时DB1.DBD8=0.0,不是我想要的结果,以此类推。直到1S时,MD才有第二次采集数据, DB1.DBD8结果发生相应改变,但其数据在PLC下一个循环周期发生变化。此问题如何解决?