求解,在400里面的ENT功能(进入ACCU堆栈)怎样在300里面实现,有具体的程序参考吗?
最佳答案
以前收集的他人之作,在此转帖:
ENT是入累加器堆栈指令,对于400来说,PLC有4个运算累加器,进入堆栈是将ACC3复制给ACC4,把ACC2复制给ACC3,这样的复制可以操作将运算结果暂存。可以加快部分运算的运算速度。
由于300只有2个运算累加器,因此ENT指令压堆栈是不可行的,所以,对于300来说,只能采取传出传入数据的方式来保存部分临时变量。。
例如这个实例
STL 解释
L DBD0 //从数据双字DBD0中将值载入ACCU 1。(该值必须以浮点格式表示)。
L DBD4 //将值从ACCU 1复制到ACCU2。从数据双字DBD4中将值载入ACCU 1。(该值必须以浮点格式表示)。
+R //将ACCU 1和ACCU 2的内容作为浮点数(32位,IEEE 754)相加,并将结果保存到ACCU 1中。
L DBD8 //将值从ACCU 1复制到ACCU 2,并从数据双字DBD8中将值载入ACCU 1。
ENT //将ACCU 3的内容复制到ACCU 4。将ACCU 2的内容(中间结果)复制到ACCU 3。
L DBD12 //从数据双字DBD12中将值载入ACCU 1。
-R //从ACCU 2的内容中减去ACCU 1的内容,并将结果保存在ACCU 1中。将ACCU 3的内容复制到ACCU 2。将ACCU 4的内容复制到ACCU 3。
/R //将ACCU 2 (DBD0 + DBD4)的内容除以ACCU 1 (DBD8 - DBD12)的内容。将结果保存在ACCU 1中。
T DBD16 //将结果(ACCU 1)传送到数据双字DBD16。
对于这个实例,如果是在300的时候,ENT是不能用的,因此在L DBD8的之前将结果传出,也就是例如T LD20之类的。然后再载入运算。。不知道您是否明白了
也就是如果要改写例子上的400程序
应该这样改写
L DBD0
L DBD4
+R
T LD40
L DBD8
L DBD12
-R
L LD40
TAK
/R
T DBD16
由于传入传出是要内存、数据块或者是临时存储区写操作和读操作,因此指令的执行时间将会比在寄存器中操作要慢一些,上段程序的执行时间将比原来的程序长,但是由于300没有四个寄存器操作,因此临时结果只能放在内存区、数据块或者临时存储区中了。
注意这里使用了TAK交换累加器指令,也就是说,当-R后,DBD8-DBD12的结果是放在ACC1里面的,载入LD40之后,ACC1的内容为LD40(也就是DBD0+DBD4),ACC2的内容是DBD8-DBD12,由于这时候如果用直接浮点数除法的指令,那么就变成了(DBD8-DBD12)÷(DBD0+DBD4)与原程序不符,使用了TAK指令后,ACC1内容将和ACC2的内容交换,也就似乎ACC1的内容进入了ACC2,ACC2的内容进入了ACC1,这样再用浮点数除指令的时候,就相当于分子和分母对调,与原题目就吻合了。这里使用TAK指令的目的,就是为了使得DBD8-DBD12的结果不必输出到临时变量或者是临时存储区等,保证了性能不进一步下降。这在语句表编程中相当常见,语句表编程一定要掌握累加器中的值的存储和传送方式。特别对于西门子S7 400这个有着4个累加器的PLC更是如此。
提问者对于答案的评价:
谢谢!
原创文章,作者:more0621,如若转载,请注明出处:https://www.zhaoplc.com/plc203065.html