主题
循环与移位(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 位ROL — 循环左移(FNC 31)
| 项目 | 说明 |
|---|---|
| 格式 | ROL D n |
| 16/32位 | ROL / DROL |
将 D 的 16 位整体向左循环移位 n 位,b15 绕回 b0,一位都不丢。标志位与 n 的范围同 ROR。
ROLP D0 K4 ; D0 循环左移 4 位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。
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 的进位环。
SFTR — 位右移(FNC 34)
| 项目 | 说明 |
|---|---|
| 格式 | SFTR S D n1 n2 |
将 S 起始的 n2 位数据右移入 D 起始的 n1 位区域。
SFTR X0 M0 K16 K4 ; X0-X3 的4位右移入 M0-M15SFTL — 位左移(FNC 35)
| 项目 | 说明 |
|---|---|
| 格式 | SFTL S D n1 n2 |
将 S 起始的 n2 位数据左移入 D 起始的 n1 位区域。
SFTL X0 M0 K16 K4 ; X0-X3 的4位左移入 M0-M15WSFR — 字右移(FNC 36)
| 项目 | 说明 |
|---|---|
| 格式 | WSFR S D n1 n2 |
将 S 起始的 n2 个字右移入 D 起始的 n1 个字区域。
WSFR D0 D10 K10 K4 ; D0-D3 的4个字右移入 D10-D19WSFL — 字左移(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。
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 个数据)SFRD — 先入先出读出(FNC 39)
| 项目 | 说明 |
|---|---|
| 格式 | SFRD S D n |
从以 S 为头的 FIFO 队列读出最早写入的那个数据送到 D。S 存的是队列里已有的数据个数(指针),S+1~S+n-1 是数据区;n 是整个缓冲区的字数(含指针)。队列为空时不读出,并置零标志 M8020。
SFRD D100 D200 K10 ; 从以 D100 为头的 FIFO 读出最早的数据到 D200SFWR/SFRD 配合实现先进先出数据缓冲,常用于数据采集缓存。
各指令详细说明
DROL — 32 位循环左移
| 项目 | 说明 |
|---|---|
| 格式 | DROL D(目标), n(移位数) |
| 操作数 | D(目标), n(移位数) |
| 示例 | DROL D0 K4 |
| 步数 | 9 |
| FNC | FNC 31 (D) |
DROL D0 K4DROR — 32 位循环右移
| 项目 | 说明 |
|---|---|
| 格式 | DROR D(目标), n(移位数) |
| 操作数 | D(目标), n(移位数) |
| 示例 | DROR D0 K4 |
| 步数 | 9 |
| FNC | FNC 30 (D) |
DROR D0 K4DRCL — 32 位带进位循环左移
| 项目 | 说明 |
|---|---|
| 格式 | DRCL D(目标), n(移位数) |
| 操作数 | D(目标), n(移位数) |
| 示例 | DRCL D0 K4 |
| 步数 | 9 |
| FNC | FNC 33 (D) |
DRCL D0 K4DRCR — 32 位带进位循环右移
| 项目 | 说明 |
|---|---|
| 格式 | DRCR D(目标), n(移位数) |
| 操作数 | D(目标), n(移位数) |
| 示例 | DRCR D0 K4 |
| 步数 | 9 |
| FNC | FNC 32 (D) |
DRCR D0 K4