Skip to content

块操作与栈操作 ​

ANB — 回路块串联 ​

将两个回路块串联连接(块与)。无操作数。

LD  X0
OR  X1          ; 回路块 A
LD  X2
OR  X3          ; 回路块 B
ANB             ; A 串联 B
OUT Y0

ORB — 回路块并联 ​

将两个回路块并联连接(块或)。无操作数。

梯形图:与下方指令表同一段程序

LD  X0
AND X1          ; 回路块 A
LD  X2
AND X3          ; 回路块 B
ORB             ; A 并联 B
OUT Y0

MPS — 进栈 ​

MRD — 读栈 ​

MPP — 出栈 ​

指令名称功能
MPS进栈将当前运算结果压入栈(栈指针+1)
MRD读栈读取栈顶内容(栈指针不变)
MPP出栈弹出栈顶内容(栈指针-1)

用于多分支输出时保存中间逻辑结果。

MPS/MRD/MPP 栈操作:梯形图分支点与栈状态快照对应关系

梯形图:MPS/MRD/MPP 把 X0 的能流分三路,分别串 X1/X2/X3 输出 Y0/Y1/Y2

LD  X0
MPS             ; 保存 X0 状态
AND X1
OUT Y0          ; 第一路输出:X0 AND X1
MRD             ; 读取 X0 状态
AND X2
OUT Y1          ; 第二路输出:X0 AND X2
MPP             ; 恢复 X0 状态
AND X3
OUT Y2          ; 第三路输出:X0 AND X3

变址寄存器栈:ZPUSH / ZPOP ​

上面那三个栈存的是运算结果(通断状态)。ZPUSH/ZPOP 存的是变址寄存器 Z0~Z7、V0~V7 里的数, 用在子程序和中断程序里:进去之前压一次,出来之前弹一次,主程序用着的 Z/V 就不会被子程序改掉。

ZPUSH — 把 Z0~Z7、V0~V7 压进栈 ​

项目说明
格式ZPUSH S(S = 栈头所在的数据寄存器)
操作数1 个,字软元件(D/R),不能用常数
示例ZPUSH D100
步数3
FNCFNC 102

S 那一格存的是已经压了几层(第一次用之前要先 MOV K0 D100 清成 0),数据从 S+1 开始往下排: 第 1 层占 S+1 ~ S+16,第 2 层占 S+17 ~ S+32,依此类推。每层 16 个字的顺序固定是 Z0 V0 Z1 V1 Z2 V2 … Z7 V7。压完栈层数自动 +1。

ZPUSH D100      ; 现场进栈,D100 记着现在几层

数据区要按最深层数留够,越界不报错

压 N 层就要用掉 1 + N×16 个连续的 D。固件不检查这一片有没有超出 D 的范围, 超出后会写到 D 区之外的元件上 —— 表现是别处的数据莫名其妙变了,很难查。 按您实际最深会用几层来算:压 4 层就是 D100~D164 共 65 个字。

ZPOP — 弹出并恢复 Z/V ​

项目说明
格式ZPOP S(与 ZPUSH 同一个栈头)
操作数1 个,字软元件
示例ZPOP D100
步数3
FNCFNC 103

按"后压的先弹"恢复:把 S 记的层数减 1,取那一层的 16 个字写回 Z0~Z7、V0~V7。

栈空了还弹会报错

层数已经是 0 时再执行 ZPOP,置 M8067(运算错误)、D8067 = 6781,本次不做任何恢复。 配对写:ZPUSH 和 ZPOP 用同一个栈头软元件,且都在同一条执行路径上 —— 跳转跳过 ZPUSH 却没跳过 ZPOP,层数就会一路减到 0 然后报 6781。

这两条没有 32 位形态(不存在 DZPUSH),只搬 Z/V 这一组;D 寄存器要自己 BMOV 保存。


LPPLC 工业物联网云平台 · 软硬件与云平台全栈自研