主题
浮点数运算(FNC 110-137)
浮点数运算指令使用 IEEE 754 单精度浮点格式,每个浮点数占 2 个连续 D 寄存器。
浮点比较与传送
实用例程
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把上面的地址、主题、引脚替换成你项目里的即可。
DECMP — 浮点比较(FNC 110)
| 项目 | 说明 |
|---|---|
| 格式 | DECMP S1 S2 D |
比较两个浮点数 S1 和 S2,结果输出到 D、D+1、D+2(同 CMP 规则)。
FLT D0 D10 ; 先将整数转为浮点
FLT D2 D12
DECMP D10 D12 M0 ; 浮点比较 → M0/M1/M2DEZCP — 浮点区间比较(FNC 111)
| 项目 | 说明 |
|---|---|
| 格式 | DEZCP S1 S2 S D |
浮点数 S 与区间 [S1, S2] 比较,结果输出到 D、D+1、D+2。
DEZCP D0 D2 D4 M0 ; D4 这个浮点数落在 [D0,D2] 区间吗 → M0/M1/M2浮点版的区间比较:D0/D2 是下限和上限,D4 是被判的浮点数,结果占 M0~M2 三个位 (分别对应 小于下限 / 在区间内 / 大于上限)。 四个操作数都是浮点,每个占两个数据寄存器 —— D0 实际用掉 D0+D1,相邻那格不能再放别的数据。
DEMOV — 浮点传送(FNC 112)
| 项目 | 说明 |
|---|---|
| 格式 | DEMOV S D |
浮点数传送,将 S 起始的 2 个寄存器浮点值传送到 D。
DEMOV D10 D20 ; D10-D11 → D20-D21(浮点传送)浮点转换
DEBCD — 浮点转 BCD 浮点(FNC 118)
| 项目 | 说明 |
|---|---|
| 格式 | DEBCD S D |
将二进制浮点数 S 转换为十进制浮点数存入 D。
DEBCD D0 D2 ; 二进制浮点 → 十进制浮点(BCD 形态)浮点版的 BCD。用在要把浮点数按"一位一位"送进只认 BCD 的显示表头/老设备时。 反方向是 DEBIN。
DEBIN — BCD 浮点转二进制浮点(FNC 119)
| 项目 | 说明 |
|---|---|
| 格式 | DEBIN S D |
将十进制浮点数 S 转换为二进制浮点数存入 D。
DEBIN D0 D2 ; 十进制浮点(BCD 形态)→ 二进制浮点DEBCD 的反向。读进来的 BCD 形态浮点要先 DEBIN 转回二进制浮点,才能交给 DEADD 这类运算指令, 直接拿去加会得到完全不对的数。
INT — 浮点取整(FNC 129)
| 项目 | 说明 |
|---|---|
| 格式 | INT S D |
将浮点数 S 取整后存入 D(16 位整数)。
INT D10 D0 ; D10-D11 浮点取整 → D0DENEG — 浮点取负(FNC 128)
| 项目 | 说明 |
|---|---|
| 格式 | DENEG D |
只有 32 位形态、只有 1 个操作数:读出 D 起的双字浮点值、乘 -1 后写回同一地址(原位变号)。
LD M8000
DENEG D10 ; D10-D11 的浮点数取反符号,仍写回 D10-D11DESTR — 浮点转字符串(FNC 116)
| 项目 | 说明 |
|---|---|
| 格式 | DESTR S1 S2 D |
把浮点数按指定格式转成字符串。三个操作数各管一件事,S2 要占连续 3 个字:
| 操作数 | 含义 |
|---|---|
S1 | 要转换的浮点数(占 S1 与 S1+1 两个字) |
S2 | 输出方式:0 = 小数形式,非 0 = 指数形式 |
S2+1 | 总位数 |
S2+2 | 小数位数 |
D | 字符串存放的起始地址 |
LD M8000
FLT D0 D10 ; 先把 D0 的整数转成浮点放 D10-D11
MOV K0 D20 ; 方式:0 = 小数形式
MOV K8 D21 ; 总位数 8
MOV K2 D22 ; 小数位 2
DESTR D10 D20 D100 ; 按 %8.2f 格式化 → 字符串存到 D100 起
END别和 STR 混用
STR(FNC 200)取的是 16 位整数源、格式块只读 2 个字(总位数、小数位数); DESTR 是浮点源、格式块读 3 个字(多一个"小数/指数形式"方式位)。 把浮点值交给 STR 转,它只会按 16 位整数读低字 —— 编得过、转出来的数字却是错的,这类故障最难查。
DEVAL — 字符串转浮点(FNC 117)
| 项目 | 说明 |
|---|---|
| 格式 | DEVAL S D |
把字符串转成浮点数,结果写入 D 与 D+1。只有 2 个操作数(少写/多写都在编译期报错)。
LD M8000
DEVAL D100 D10 ; D100 起的字符串 → 浮点写入 D10-D11
END浮点四则运算
| FNC | 指令 | 功能 |
|---|---|---|
| 120 | DEADD S1 S2 D | S1 + S2 → D(浮点) |
| 121 | DESUB S1 S2 D | S1 - S2 → D(浮点) |
| 122 | DEMUL S1 S2 D | S1 × S2 → D(浮点) |
| 123 | DEDIV S1 S2 D | S1 ÷ S2 → D(浮点),除数为0出错 |
FLT D0 D10 ; D0 整数 → D10-D11 浮点
FLT D2 D12 ; D2 整数 → D12-D13 浮点
DEADD D10 D12 D20 ; D20-D21 = D10 + D12(浮点加)
DEMUL D10 D12 D22 ; D22-D23 = D10 × D12(浮点乘)实用例程
DMOV D25 D27
DEADD D26 E0 D27
AND M8029
RST M45
LD= K7 D150
SET M40
SET M41
SET M42
SET M43
SET M44
SET M45
MOV K0 D150
LD M8000
MOV K30 D80
FLT D80 D82
DECMP D22 D82 M18
LDI M10
ANI M11
INV
OUT M16
LD M8000
MOV K30 D84
FLT D84 D86
DECMP D2 D86 M10
LD M8000
MOV K30 D88
FLT D88 D90
DECMP D2 D90 M11把上面的地址、主题、引脚替换成你项目里的即可。
浮点数学运算
| FNC | 指令 | 功能 |
|---|---|---|
| 124 | DEXP S D | e^S → D(浮点) |
| 125 | DLOGE S D | ln(S) → D(浮点) |
| 126 | DLOG10 S D | log₁₀(S) → D(浮点) |
| 127 | DESQR S D | 浮点开方,S<0 出错 |
| 136 | DRAD S D | 角度 → 弧度 |
| 137 | DDEG S D | 弧度 → 角度 |
浮点三角函数
| FNC | 指令 | 功能 |
|---|---|---|
| 130 | DSIN S D | 正弦,S 为弧度 |
| 131 | DCOS S D | 余弦,S 为弧度 |
| 132 | DTAN S D | 正切,S 为弧度 |
| 133 | DASIN S D | 反正弦,-1≦S≦1 |
| 134 | DACOS S D | 反余弦,-1≦S≦1 |
| 135 | DATAN S D | 反正切 |
本机浮点数一律占两个数据寄存器,所以这一族只有 32 位形态,三菱给的名字就是上表这一列(
DSIN、DEADD…),不带D。 老程序里能看到DSIN、DEADD这种前面多一个D的写法,编码器把它当成同一条指令接受、占的步数完全一样; 但一条指令只有一个名字,写程序、让 AI 生成程序都请照上表这一列敲,别两套混着用。FNC 号按三菱 FX3U 的记法给出。
注意:三角函数输入为弧度,角度需先转换:弧度 = 角度 × π / 180。
FLT D0 D10 ; 角度值转浮点
DEMUL D10 D20 D30 ; D20 存放 π/180 的浮点值
DSIN D30 D40 ; sin(弧度) → D40-D41各指令详细说明
FLT — 整数转换成二进制浮点数
| 项目 | 说明 |
|---|---|
| 格式 | FLT 源 S, 目标 D |
| 操作数 | 源 S, 目标 D |
| 示例 | FLT D0 D10 |
| 步数 | 5 |
| FNC | FNC 49 |
FLT D0 D10DFLT — 32 位整数 → 浮点数
| 项目 | 说明 |
|---|---|
| 格式 | DFLT 源 S, 目标 D |
| 操作数 | 源 S, 目标 D |
| 示例 | DFLT D0 D10 |
| 步数 | 9 |
| FNC | FNC 49 (D) |
DFLT D0 D10DSIN — 二进制浮点数 Sin 运算
| 项目 | 说明 |
|---|---|
| 格式 | DSIN 源 S, 目标 D |
| 操作数 | 源 S, 目标 D |
| 示例 | DSIN D0 D2 |
| 步数 | 9 |
| FNC | FNC 130 |
DSIN D0 D2DCOS — 二进制浮点数 Cos 运算
| 项目 | 说明 |
|---|---|
| 格式 | DCOS 源 S, 目标 D |
| 操作数 | 源 S, 目标 D |
| 示例 | DCOS D0 D2 |
| 步数 | 9 |
| FNC | FNC 131 |
DCOS D0 D2DTAN — 二进制浮点数 Tan 运算
| 项目 | 说明 |
|---|---|
| 格式 | DTAN 源 S, 目标 D |
| 操作数 | 源 S, 目标 D |
| 示例 | DTAN D0 D2 |
| 步数 | 9 |
| FNC | FNC 132 |
DTAN D0 D2DASIN — 浮点反正弦
| 项目 | 说明 |
|---|---|
| 格式 | DASIN 源 S, 目标 D |
| 操作数 | 源 S, 目标 D |
| 示例 | DASIN D0 D2 |
| 步数 | 9 |
| FNC | FNC 133 |
DASIN D0 D2DACOS — 浮点反余弦
| 项目 | 说明 |
|---|---|
| 格式 | DACOS 源 S, 目标 D |
| 操作数 | 源 S, 目标 D |
| 示例 | DACOS D0 D2 |
| 步数 | 9 |
| FNC | FNC 134 |
DACOS D0 D2DATAN — 浮点反正切
| 项目 | 说明 |
|---|---|
| 格式 | DATAN 源 S, 目标 D |
| 操作数 | 源 S, 目标 D |
| 示例 | DATAN D0 D2 |
| 步数 | 9 |
| FNC | FNC 135 |
DATAN D0 D2DEXP — 浮点数 e 的指数运算
| 项目 | 说明 |
|---|---|
| 格式 | DEXP 源 S, 目标 D |
| 操作数 | 源 S, 目标 D |
| 示例 | DEXP D0 D2 |
| 步数 | 9 |
| FNC | FNC 124 |
DEXP D0 D2DLOG10 — 浮点数常用对数(以 10 为底)
| 项目 | 说明 |
|---|---|
| 格式 | DLOG10 源 S, 目标 D |
| 操作数 | 源 S, 目标 D |
| 示例 | DLOG10 D0 D2 |
| 步数 | 9 |
| FNC | FNC 126 |
DLOG10 D0 D2DLOGE — 浮点数自然对数(以 e 为底)
| 项目 | 说明 |
|---|---|
| 格式 | DLOGE 源 S, 目标 D |
| 操作数 | 源 S, 目标 D |
| 示例 | DLOGE D0 D2 |
| 步数 | 9 |
| FNC | FNC 125 |
DLOGE D0 D2DRAD — 角度 → 弧度(浮点)
| 项目 | 说明 |
|---|---|
| 格式 | DRAD 源 S(浮点角度), 目标 D(浮点弧度) |
| 操作数 | 源 S, 目标 D(各占 2 个数据寄存器) |
| 示例 | DRAD D0 D2 |
| 步数 | 9 |
| FNC | FNC 136 |
D = S × π / 180。给 DSIN/DCOS/DTAN 喂角度值之前先过这一条,否则三角函数按弧度算, 90° 会被当成 90 弧度,结果完全不对。
DDEG — 弧度 → 角度(浮点)
| 项目 | 说明 |
|---|---|
| 格式 | DDEG 源 S(浮点弧度), 目标 D(浮点角度) |
| 操作数 | 源 S, 目标 D(各占 2 个数据寄存器) |
| 示例 | DDEG D0 D2 |
| 步数 | 9 |
| FNC | FNC 137 |
D = S × 180 / π。DASIN/DACOS/DATAN 出来的是弧度,要显示成度数就接这一条。
这两条也只有 32 位形态
本机浮点数占两个数据寄存器,所以 DRAD/DDEG 本来就是 32 位的,前面不加 D (老资料/手册正文里的 RAD、DEG 是不带 D 的行文短名,本站不并列 —— 正名是 DRAD、DDEG)。 运算用的是单精度浮点、π 取 3.1415926,来回转一次(DRAD 后面再接 DDEG)结果不会正好等于原值, 末几位总有出入。所以别拿浮点结果直接判等(AND= 很容易判不上),要比较请先用 INT 取整, 或者判一个允许的偏差范围。
DEADD — 二进制浮点数加法
| 项目 | 说明 |
|---|---|
| 格式 | DEADD S1, S2, D |
| 操作数 | S1, S2, D |
| 示例 | DEADD D0 D2 D4 |
| 步数 | 13 |
| FNC | FNC 120 |
DEADD D0 D2 D4DESUB — 二进制浮点数减法
| 项目 | 说明 |
|---|---|
| 格式 | DESUB S1, S2, D |
| 操作数 | S1, S2, D |
| 示例 | DESUB D0 D2 D4 |
| 步数 | 13 |
| FNC | FNC 121 |
DESUB D0 D2 D4DEMUL — 二进制浮点数乘法
| 项目 | 说明 |
|---|---|
| 格式 | DEMUL S1, S2, D |
| 操作数 | S1, S2, D |
| 示例 | DEMUL D0 D2 D4 |
| 步数 | 13 |
| FNC | FNC 122 |
DEMUL D0 D2 D4DEDIV — 二进制浮点数除法
| 项目 | 说明 |
|---|---|
| 格式 | DEDIV S1, S2, D |
| 操作数 | S1, S2, D |
| 示例 | DEDIV D0 D2 D4 |
| 步数 | 13 |
| FNC | FNC 123 |
DEDIV D0 D2 D4DESQR — 二进制浮点数开平方
| 项目 | 说明 |
|---|---|
| 格式 | DESQR S, D |
| 操作数 | S, D |
| 示例 | DESQR D0 D2 |
| 步数 | 9 |
| FNC | FNC 127 |
DESQR D0 D2