求解,在400里面的ENT功能(进入ACCU堆栈)怎样在300里面实现,有具体的程序参考吗?
最佳答案
以前收集的他人之作,在此转帖:
ENT是入累加器堆栈指令,对于400来说,PLC有4个运算累加器,进入堆栈是将ACC3复制给ACC4,把ACC2复制给ACC3,这样的复制可以操作将运算结果暂存。可以加快部分运算的运算速度。
由于300只有2个运算累加器,因此ENT指令压堆栈是不可行的,所以,对于300来说,只能采取传出传入数据的方式来保存部分临时变量。。
例如这个实例
STL解释
LDBD0//从数据双字DBD0中将值载入ACCU1。(该值必须以浮点格式表示)。
LDBD4//将值从ACCU1复制到ACCU2。从数据双字DBD4中将值载入ACCU1。(该值必须以浮点格式表示)。
+R//将ACCU1和ACCU2的内容作为浮点数(32位,IEEE754)相加,并将结果保存到ACCU1中。
LDBD8//将值从ACCU1复制到ACCU2,并从数据双字DBD8中将值载入ACCU1。
ENT//将ACCU3的内容复制到ACCU4。将ACCU2的内容(中间结果)复制到ACCU3。
LDBD12//从数据双字DBD12中将值载入ACCU1。
-R//从ACCU2的内容中减去ACCU1的内容,并将结果保存在ACCU1中。将ACCU3的内容复制到ACCU2。将ACCU4的内容复制到ACCU3。
/R//将ACCU2(DBD0+DBD4)的内容除以ACCU1(DBD8–DBD12)的内容。将结果保存在ACCU1中。
TDBD16//将结果(ACCU1)传送到数据双字DBD16。
对于这个实例,如果是在300的时候,ENT是不能用的,因此在LDBD8的之前将结果传出,也就是例如TLD20之类的。然后再载入运算。。不知道您是否明白了
也就是如果要改写例子上的400程序
应该这样改写
LDBD0
LDBD4
+R
TLD40
LDBD8
LDBD12
-R
LLD40
TAK
/R
TDBD16
由于传入传出是要内存、数据块或者是临时存储区写操作和读操作,因此指令的执行时间将会比在寄存器中操作要慢一些,上段程序的执行时间将比原来的程序长,但是由于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的结果不必输出到临时变量或者是临时存储区等,保证了性能不进一步下降。这在语句表编程中相当常见,语句表编程一定要掌握累加器中的值的存储和传送方式。特别对于西门子S7400这个有着4个累加器的PLC更是如此。
提问者对于答案的评价:
谢谢!