主题
二、比较与传送(FNC 10-19)
CMP — 比较(FNC 10)
| 项目 | 说明 |
|---|---|
| 格式 | CMP S1 S2 D |
| 16/32位 | CMP / DCMP |
| D 占用 | 3 个连续位元件 |
| 条件 | D | D+1 | D+2 |
|---|---|---|---|
| S1 > S2 | ON | OFF | OFF |
| S1 = S2 | OFF | ON | OFF |
| S1 < S2 | OFF | OFF | ON |
LD X0
CMP K100 C23 M0 ; K100 与 C23 比较X0=OFF 时不执行 CMP,M0~M2 保持之前状态。需 ≧、≦、≠ 时可串并联 M0~M2。
实用例程
LD M8002
MOV K0 D0
MOV K0 D1
LD M8000
CMP D8031 K960 M0
MPS
AND M0
SET M10
MPP
CMP D8032 K890 M20
AND M20
SET M30
LD M10
OUT T0 K300
MOV K1 D0
AND T0
MOV K0 D0
RST M10
LD M30
OUT T1 K300
MOV K1 D1
AND T1
MOV K0 D1
RST M30
END把上面的地址、主题、引脚替换成你项目里的即可。
ZCP — 区间比较(FNC 11)
| 项目 | 说明 |
|---|---|
| 格式 | ZCP S1 S2 S D |
| 16/32位 | ZCP / DZCP |
比较 S 是否在 [S1, S2] 区间内,结果输出到 D、D+1、D+2。S1 必须小于 S2,S1 ≥ S2 时报错误 6582(两值相等也不行)。
实用例程
LD M8000
MOV D8031 D0
MOV D8032 D2
END把上面的地址、主题、引脚替换成你项目里的即可。
MOV — 传送(FNC 12)
| 项目 | 说明 |
|---|---|
| 格式 | MOV S D |
| 16/32位 | MOV / DMOV |
MOV K100 D0 ; D0 = 100
MOV D0 D10 ; D10 = D0
DMOV K123456 D100 ; D100-D101 = 123456SMOV — 移位传送(FNC 13)
| 项目 | 说明 |
|---|---|
| 格式 | SMOV S m1 m2 D n |
以 4 位(digit)为单位移位传送。
SMOV D0 K4 K1 D10 K2 ; D0 的第 4~3 位 → D10 的第 1~2 位,D10 其余位不动按 BCD 位搬数据:S 的第 m1 位起、共 n 个 BCD 位,搬到 D 的第 m2 位起, D 上没被覆盖的位保持原值。位号从最高位往低数:1 = 千位、4 = 个位。
m1、m2、n都只接受 1~4:越界分别报 6582(m1)、6583(m2)、6585(n)- 默认按 BCD 处理(内部会先转 BCD 再搬)。
M8168为 ON 时跳过 BCD 转换,直接按 16 位二进制搬位
CML — 取反传送(FNC 14)
| 项目 | 说明 |
|---|---|
| 格式 | CML S D |
| 16/32位 | CML / DCML |
CML D0 D10 ; D0 按位取反 → D10和 MOV 一样是单点传送,只多了一步按位取反:D0 = H1234 时 D10 得到 HEDCB。 32 位版 DCML 的源和目标各占两个数据寄存器。
BMOV — 成批传送(FNC 15)
| 项目 | 说明 |
|---|---|
| 格式 | BMOV S D n |
BMOV D0 D100 K10 ; D0~D9 → D100~D109FMOV — 多点传送(FNC 16)
| 项目 | 说明 |
|---|---|
| 格式 | FMOV S D n |
| 16/32位 | FMOV / DFMOV |
FMOV K0 D100 K20 ; D100~D119 全部清零XCH — 交换(FNC 17)
| 项目 | 说明 |
|---|---|
| 格式 | XCH D1 D2 |
| 16/32位 | XCH / DXCH |
应使用脉冲执行 XCHP,否则每个扫描周期都交换一次。
LDP X0
XCH D0 D10 ; 只在 X0 上升沿那一周期交换一次交换两个软元件的内容。注意它只要通条件成立,每个扫描周期都交换一次 —— 两个数会来回倒,所以实际几乎都用脉冲执行形式(XCHP,或像上面那样自己套 LDP)。
BCD — BCD 转换(FNC 18)
| 项目 | 说明 |
|---|---|
| 格式 | BCD S D |
| 16/32位 | BCD / DBCD |
二进制 → BCD 码。常用于 BCD 数码管输出。
BCD D0 D10 ; D0 = 1234(二进制)→ D10 = H1234(BCD)二进制 → BCD 码。驱动 BCD 数码管、把数送进只认 BCD 的老设备时用。 16 位版最大表达 9999,超出的值请直接用 32 位版 DBCD(4 位以上 BCD 用它)。
BIN — BIN 转换(FNC 19)
| 项目 | 说明 |
|---|---|
| 格式 | BIN S D |
| 16/32位 | BIN / DBIN |
BCD 码 → 二进制。常用于读取 BCD 拨码开关。
BIN D0 D10 ; D0 里是 BCD 的 1234 → D10 得到二进制 1234BCD 码 → 二进制。接 BCD 拨码开关、BCD 设定器这类输入时用。16 位版表达范围是 4 位 BCD(0~9999), 位数更多请改用 32 位版 DBIN。源里出现不是 BCD 的 4 位(A~F)时结果没有意义, 别拿它去转普通二进制数 —— 那种情况直接用 MOV。
触点比较指令 (LD/AND/OR 比较)(FNC 224-246)
触点比较指令把「比较运算」直接做成一个触点,比较结果为真时触点导通。相比 CMP/ZCP 需要占用位元件再串并联,触点比较指令更直观、更省元件。共 18 条,分为 LD(母线开始)、AND(串联)、OR(并联)三组,每组 6 种比较关系。
- LD 类:直接与左母线连接,作为一行的起始触点。
- AND 类:与前面的触点串联(逻辑与)。
- OR 类:与前面的触点并联(逻辑或)。
所有触点比较指令均无 P(脉冲)修饰,但支持 D(32 位)修饰,例如 DLD>、DAND<=。
| 指令 | FNC | 组别 | 导通条件 |
|---|---|---|---|
| LD= | FNC224 | 母线起始 | S1 = S2 |
| LD> | FNC225 | 母线起始 | S1 > S2 |
| LD< | FNC226 | 母线起始 | S1 < S2 |
| LD<> | FNC228 | 母线起始 | S1 ≠ S2 |
| LD<= | FNC229 | 母线起始 | S1 ≤ S2 |
| LD>= | FNC230 | 母线起始 | S1 ≥ S2 |
| AND= | FNC232 | 串联 | S1 = S2 |
| AND> | FNC233 | 串联 | S1 > S2 |
| AND< | FNC234 | 串联 | S1 < S2 |
| AND<> | FNC236 | 串联 | S1 ≠ S2 |
| AND<= | FNC237 | 串联 | S1 ≤ S2 |
| AND>= | FNC238 | 串联 | S1 ≥ S2 |
| OR= | FNC240 | 并联 | S1 = S2 |
| OR> | FNC241 | 并联 | S1 > S2 |
| OR< | FNC242 | 并联 | S1 < S2 |
| OR<> | FNC244 | 并联 | S1 ≠ S2 |
| OR<= | FNC245 | 并联 | S1 ≤ S2 |
| OR>= | FNC246 | 并联 | S1 ≥ S2 |
应用示例:当 D0 的值 ≥ 100 时驱动 Y0。
LD>= D0 K100 ; D0 >= 100 时该触点导通
OUT Y0 ; 驱动 Y0串联示例:D0 ≥ 100 且 D2 < 50 时驱动 Y1。
LD>= D0 K100 ; 母线起始比较
AND< D2 K50 ; 串联比较
OUT Y1并联示例:D0 = 0 或 D0 > 1000 时驱动 Y2。
LD= D0 K0 ; 母线起始比较
OR> D0 K1000 ; 并联比较
OUT Y232 位比较请使用 D 修饰,例如
DLD>= D0 K100000,此时 S1 占用 D0、D1 两个寄存器。
各指令详细说明
DMOV — 32 位数据传送,占用 D 与 D+1
| 项目 | 说明 |
|---|---|
| 格式 | DMOV 源 S, 目标 D |
| 操作数 | 源 S, 目标 D |
| 示例 | DMOV D0 D10 |
| 步数 | 9 |
| FNC | FNC 12 (D) |
DMOV D0 D10DCML — 32 位取反传送
| 项目 | 说明 |
|---|---|
| 格式 | DCML 源 S, 目标 D |
| 操作数 | 源 S, 目标 D |
| 示例 | DCML D0 D10 |
| 步数 | 9 |
| FNC | FNC 14 (D) |
DCML D0 D10DXCH — 32 位交换
| 项目 | 说明 |
|---|---|
| 格式 | DXCH S, D |
| 操作数 | S, D |
| 示例 | DXCH D0 D2 |
| 步数 | 9 |
| FNC | FNC 17 (D) |
DXCH D0 D2DFMOV — 32 位多点传送(将 S 起的 n 个双字成批复制到 D 起)
| 项目 | 说明 |
|---|---|
| 格式 | DFMOV S(源), D(目标), n(点数) |
| 操作数 | S(源), D(目标), n(点数) |
| 示例 | DFMOV D0 D10 K5 |
| 步数 | 13 |
| FNC | FNC 16 (D) |
DFMOV D0 D10 K5DCMP — 32 位数据比较
| 项目 | 说明 |
|---|---|
| 格式 | DCMP S1, S2, 结果 D |
| 操作数 | S1, S2, 结果 D |
| 示例 | DCMP D0 D10 M0 |
| 步数 | 13 |
| FNC | FNC 10 (D) |
DCMP D0 D10 M0DZCP — 32 位区间比较
| 项目 | 说明 |
|---|---|
| 格式 | DZCP 下限 S1, 上限 S2, 值 S3, 结果 D |
| 操作数 | 下限 S1, 上限 S2, 值 S3, 结果 D |
| 示例 | DZCP D0 D2 D4 M0 |
| 步数 | 17 |
| FNC | FNC 11 (D) |
DZCP D0 D2 D4 M0DBIN — 32 位 BCD → BIN
| 项目 | 说明 |
|---|---|
| 格式 | DBIN 源 S, 目标 D |
| 操作数 | 源 S, 目标 D |
| 示例 | DBIN D0 D10 |
| 步数 | 9 |
| FNC | FNC 19 (D) |
DBIN D0 D10DBCD — 32 位 BIN → BCD
| 项目 | 说明 |
|---|---|
| 格式 | DBCD 源 S, 目标 D |
| 操作数 | 源 S, 目标 D |
| 示例 | DBCD D0 D10 |
| 步数 | 9 |
| FNC | FNC 18 (D) |
DBCD D0 D10