Skip to content

循环与移位(FNC 30-39) ​

这一族四条经常被当成"只差一个进位位",其实本机的 RCR / RCL 和三菱不是一回事: 进位位不参与回填,而且每移一次会丢掉一位。下面每条各配一张实际走位图。

ROR — 循环右移(FNC 30) ​

项目说明
格式ROR D n
16/32位ROR / DROR

将 D 的 16 位整体向右循环移位 n 位,b0 绕回 b15,一位都不丢。执行后如果结果的最高位是 1 就置 M8022, 它是给后面程序看的标志,不参与回填。n 只接受 0~16,越界报 6582。

RORP D0 K4            ; D0 循环右移 4 位

ROR 循环右移:16 位闭环,b0 绕回 b15,M8022 只是标志

ROL — 循环左移(FNC 31) ​

项目说明
格式ROL D n
16/32位ROL / DROL

将 D 的 16 位整体向左循环移位 n 位,b15 绕回 b0,一位都不丢。标志位与 n 的范围同 ROR。

ROLP D0 K4            ; D0 循环左移 4 位

ROL 循环左移:16 位闭环,方向与 ROR 相反,M8022 只是标志

RCR — 带进位循环右移(FNC 32) ​

项目说明
格式RCR D n
16/32位RCR / DRCR

本机的 RCR 不是"带进位循环右移":实际做的是「右移 n 位,只有低 n-1 位绕回高位,第 n 位丢掉」, 丢掉那一位的值送 M8022。进位位不参与回填,M8020 也不参与。

LDP  X0
RCR  D0  K4         ; 右移 4 位:低 3 位绕回高位,第 4 位丢掉(值送 M8022)

和三菱资料不一致的地方

三菱的 RCR 是 17 位环(M8022 当第 17 位),本机型不是:会丢一位,且 n = 1 时就是普通右移、最高位补 0。 所以「先 RCL 再 RCR 原样移回来」这种三菱写法在本机不成立。要一位不丢地转圈请用 ROR / ROL; 要接住被挤掉的那一位,移位后立刻读 M8022。

本机 RCR 的实际走位:右移 n 位、低 n-1 位绕回、第 n 位丢掉并把值送 M8022

RCL — 带进位循环左移(FNC 33) ​

项目说明
格式RCL D n
16/32位RCL / DRCL

与 RCR 同形:实际做的是「左移 n 位,只有高 n-1 位绕回低位,第 n 位丢掉」,丢掉那一位的值送 M8022。

LDP  X0
RCL  D0  K4         ; 左移 4 位:高 3 位绕回低位,第 4 位丢掉(值送 M8022)

和三菱资料不一致的地方

同 RCR:本机 RCL 进位位不参与回填、每移一次丢一位,M8020 也不参与。 想把一个位"存起来下次用",请显式用一个 M 点,别依赖 RCL / RCR 的进位环。

本机 RCL 的实际走位:左移 n 位、高 n-1 位绕回、丢一位的值送 M8022

SFTR — 位右移(FNC 34) ​

项目说明
格式SFTR S D n1 n2

将 S 起始的 n2 位数据右移入 D 起始的 n1 位区域。

SFTR X0 M0 K16 K4     ; X0-X3 的4位右移入 M0-M15

SFTR 位右移:方向与 SFTL 相反

SFTL — 位左移(FNC 35) ​

项目说明
格式SFTL S D n1 n2

将 S 起始的 n2 位数据左移入 D 起始的 n1 位区域。

SFTL X0 M0 K16 K4     ; X0-X3 的4位左移入 M0-M15

SFTL 位左移:M10 起一整排位元件,状态往位号大的方向走

WSFR — 字右移(FNC 36) ​

项目说明
格式WSFR S D n1 n2

将 S 起始的 n2 个字右移入 D 起始的 n1 个字区域。

WSFR D0 D10 K10 K4    ; D0-D3 的4个字右移入 D10-D19

WSFR 字右移:内容往地址小的方向走,源补在高地址那一头

WSFL — 字左移(FNC 37) ​

项目说明
格式WSFL S D n1 n2

将 S 起始的 n2 个字左移入 D 起始的 n1 个字区域。

LDP  X0
WSFL  D0  D10  K4  K2   ; D10~D13 整体左移,源 D0~D1 从右边补进来

以字为单位移位:D 起的 n1 个字整体左移,S 起的 n2 个字从右端补入, 移出的最高字丢掉。做"最近几个值的历史队列"用它,比 SFWR 省事。 反方向是 WSFR。

WSFL 字左移:内容往地址大的方向走,源补在低地址那一头

SFWR — 先入先出写入(FNC 38) ​

项目说明
格式SFWR S D n

把 S 写入以 D 为头的 FIFO 队列。D 存的是队列里已有的数据个数(指针),D+1~D+n-1 是数据区;n 是整个缓冲区的字数(含指针那一个字),取值范围 2~512。队列写满时不再写入,并置进位标志 M8022。

SFWR D0 D100 K10      ; 把 D0 写入以 D100 为头的 FIFO(缓冲区 10 个字 = 1 个指针 + 9 个数据)

SFWR / SFRD 队列:第 0 格是计数格,可容条数是 n−1

SFRD — 先入先出读出(FNC 39) ​

项目说明
格式SFRD S D n

从以 S 为头的 FIFO 队列读出最早写入的那个数据送到 D。S 存的是队列里已有的数据个数(指针),S+1~S+n-1 是数据区;n 是整个缓冲区的字数(含指针)。队列为空时不读出,并置零标志 M8020。

SFRD D100 D200 K10    ; 从以 D100 为头的 FIFO 读出最早的数据到 D200

SFWR/SFRD 配合实现先进先出数据缓冲,常用于数据采集缓存。


SFRD 从队头取一条,剩下的往低格搬;空表不写 D

各指令详细说明 ​

DROL — 32 位循环左移 ​

项目说明
格式DROL D(目标), n(移位数)
操作数D(目标), n(移位数)
示例DROL D0 K4
步数9
FNCFNC 31 (D)
DROL D0 K4

DROL(32 位版):32 位整体循环左移,一位不丢

DROR — 32 位循环右移 ​

项目说明
格式DROR D(目标), n(移位数)
操作数D(目标), n(移位数)
示例DROR D0 K4
步数9
FNCFNC 30 (D)
DROR D0 K4

DROR(32 位版):32 位整体循环右移,一位不丢

DRCL — 32 位带进位循环左移 ​

项目说明
格式DRCL D(目标), n(移位数)
操作数D(目标), n(移位数)
示例DRCL D0 K4
步数9
FNCFNC 33 (D)
DRCL D0 K4

DRCL(32 位版):本机同样进位位不参与、每移一次丢一位

DRCR — 32 位带进位循环右移 ​

项目说明
格式DRCR D(目标), n(移位数)
操作数D(目标), n(移位数)
示例DRCR D0 K4
步数9
FNCFNC 32 (D)
DRCR D0 K4

DRCR(32 位版):本机同样进位位不参与、每移一次丢一位

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