PLC的堆栈数据是布尔数据类型,也就是说每层只能是1或者是0。操作方式是先进后出,类似于弹夹,先压入的子弹只能最后射出。堆栈存储的数据都是位运算的中间结果。
西门子的堆栈有九层,第一层存放最近的位运算结,共有8条操作指令。
指令LD和LDN:每执行一次装载指令,结果如图2示,最底端的IV8值被抛弃。
例如执行LD I0.0 栈中的i值可能是1或者0,这与I0.0的状态有关。
指令ALD:指令采用逻辑AND(与)操作将堆栈第一级和第二级中的数值组合,并将结果载入堆栈顶部。执行ALD后,堆栈深度减1。
指令OLD:指令采用逻辑OR(或)操作将堆栈第一级和第二级中的数值组合,并将结果载入堆栈顶部。执行OLD后,堆栈深度减1。
总计对内存的操作就是对堆栈的操作。
核心提示: LDS (Load Stack):载入堆栈指令,它的功能是复制堆栈中的第n个值到栈顶,而栈底丢失。LDS指令的格式:LDS n(n为0~8的整数)。 LPS (Logic Push);逻辑入栈指令(分支电路开始指令)。在梯形图的分支结构中,可以形象地看出,它用于生成一条新的母线,其左侧为原来的主逻辑块,右侧为新的从 逻辑块。因此可以直接编程。从
LDS (Load Stack):
载入堆栈指令,它的功能是复制堆栈中的第n个值到栈顶,而栈底丢失。LDS指令的格式:LDS n(n为0~8的整数)。
LPS (Logic Push)
;逻辑入栈指令(分支电路开始指令)。在梯形图的分支结构中,可以形象地看出,它用于生成一条新的母线,其左侧为原来的主逻辑块,右侧为新的从逻辑块。因此可以直接编程。从堆栈使用上来讲,LPS指令的作用是复制堆栈顶部的数值,并将此数值推到堆栈中。堆栈底部被推出或丢失。
LRD (Logic Read)
:逻辑堆栈指令。在梯形图分支结构中,当新母线左侧为主逻辑块时LPS开始右侧的第一个从逻辑块编程,LRD开始第二个以后的从逻缉块编程。从堆栈使用上来讲,LRD将第二个堆栈值复制到堆栈顶部。堆栈没有被推出或弹出,但堆栈顶部的旧数值及被复制的数值破坏。
LPP (Logic Push):
逻辑出栈指令(分支电路结束指令)。在梯形图分支结构中,LPP用于LPS产生的新母线右侧的最后一个从逻辑块编程。它在读取完离它最近的LPS压入堆栈的内容同时复位该条新母线,转移至上一条母线。从堆栈使用上来讲,LPP将堆栈的一个数值弹出堆栈,第二个堆栈数值成为堆栈数值的新顶部。
如图4-5所示为S7-200使用逻辑堆栈指令来解决控制逻辑问题。图中,“iv0”到“iv7”标识逻辑堆栈的初始值,而“S0”标识存储在逻辑堆栈中的计算后数值。
表4-22是LPS、LRD、LPP指令的例子。其中有3个输出Q0.0,Q0.1,Q0.2都需要用到I0.0的动合触点,则可以用逻辑堆栈指令,以减少输入触点。在母线开始处连接I0.0,然后利用LPS指令将此位置的逻辑状态压入堆栈保存,然后利用I0.1和I0.2的动合触点控制Q0.0的状态。若要控制Q0.1,则用LRD指令将I0.0处逻辑状态从堆栈中读出利用,控制Q0.2时,是程序中最后一个利用I0.0目前的逻辑状态,因此采用LPP,从堆栈中弹出此处的逻辑状态。
表4-22 LPS、LRD、LPP指令的例子
嵌套时必须先出最外边的栈