一、Q 系列数学运算(BIN 整数 + 浮点)
1. 基础规则
数据寄存器:D(16 位)、D+D(32 位,如 D0 = 低 16,D1 = 高 16)
后缀 P:上升沿执行一次(常用);不带 P:每个扫描周期都执行
16 位 BIN:-32768~+32767
32 位 BIN:-2147483648~+2147483647
浮点:E 系列指令(EADD/ESUB/EMUL/EDIV),32 位单精度
2. 16 位整数四则运算(最常用)
plaintext
+P S D ; (D) = (D) + (S) -P S D ; (D) = (D) - (S) *P S1 S2 D ; (D) = (S1) × (S2) /P S1 S2 D ; (D) = (S1) ÷ (S2),余数在D+1
例子:
plaintext
LD X0 +P D0 D10 ; D10 = D10 + D0 *P K100 D20 ; D20 = D20 × 100
3. 32 位整数(D+D)
指令前加 D:
plaintext
D+P S D D-P S D D*P S1 S2 D D/P S1 S2 D
S、D 都占连续 2 个 D(如 D0 = 低,D1 = 高)。
4. 浮点运算(E 开头,模拟量 / PID 常用)
plaintext
EADD S1 S2 D ; D = S1 + S2(浮点) ESUB S1 S2 D ; 减 EMUL S1 S2 D ; 乘 EDIV S1 S2 D ; 除
注意:S1/S2/D 都占2 个 D,且必须用浮点格式存入(如 FLT 指令把整数转浮点)。
5. 常用配合指令
MOVP K123 D0:把常数送入 DFLT D0 D10:D0(整数)→ D10/D11(浮点)INT D10 D0:浮点→整数CMP D0 D1 M0:比较 D0、D1,结果→M0/M1/M2(>、=、<)
二、子程序调用(CALL / RET / FEND 核心三件套)
1. 基本结构(必须严格遵守)
plaintext
; ---------- 主程序 ---------- LD X0 CALL P1 ; 调用P1子程序(X0=ON时) ... FEND ; 主程序结束!下面全是子程序 ; ---------- 子程序P1 ---------- P1 ; 子程序入口(母线左边,无LD) LD D0 OUT Y0 ... RET ; 子程序返回,回到CALL下一行 END ; 整个程序结束
2. 指令详解
FEND:主程序结束标记,必须在所有子程序之前。
CALL Pn:调用指针 Pn 的子程序;Pn 范围:P0~P255。
RET:子程序返回;每个子程序必须有且只有一个 RET。
CALLP Pn:上升沿调用一次(常用,避免反复进子程序)。
3. 带参数调用(高级,Q 系列支持)
plaintext
CALL P1 D0 D10 ; 把D0、D10传给P1子程序
子程序里用 **S1、S2…** 接收参数(自动映射)。
4. 多子程序示例
plaintext
LD X1 CALL P2 ; 调用P2 FEND P2 LD D1 OUT Y1 CALL P3 ; 子程序里再调用另一个子程序(允许嵌套) RET P3 ... RET
嵌套深度:最多 8 层。
三、常见错误与注意事项
数学运算
溢出:16 位超过 ±32767 → 用 32 位(D+);32 位超范围→浮点。
除法为 0:/P 时 S2=0 → 报错停机,务必加判断。
浮点混用整数:E 指令只能用浮点,否则乱码。
子程序
FEND 位置错:写在子程序后面→编译报错。
无 RET 或多个 RET→报错。
Pn 重复:两个子程序用同一个 Pn→报错。
主程序漏 END→程序不运行。
四、总结
数学运算:16 位用
+P/*P,32 位加D,浮点用EADD;注意溢出与数据类型。子程序:主程序→
CALL Pn→FEND→Pn子程序→RET→END;用于复用代码、减少步数。


