三菱 Q 系列浮点数比较有两套常用写法:1)ECMP/EZCP(功能指令,结果输出到 M/Y/S);2)E=、E>、E<…(直接触点比较,直观)。
一、先明确:Q 系列浮点数格式
32 位单精度浮点数:占用连续 2 个 D 寄存器(如 D0 = 低 16、D1 = 高 16)。
常数写法:E1.23(浮点 1.23),可直接用在指令里。
整数转浮点:FLT(16 位→浮点)、DFLT(32 位→浮点)。
二、方法一:ECMP(FNC110)—— 最常用
1. 指令格式(32 位)
plaintext
DECMP S1 S2 D DECMPP S1 S2 D ; 上升沿执行一次(推荐)
S1、S2:比较的两个浮点数(D/D+D、E 常数、K/H)。
D:结果起始位,占用连续 3 个位(D、D+1、D+2)。
2. 结果对应关系
D=ON → S1 > S2
D+1=ON → S1 = S2
D+2=ON → S1 < S2
3. 示例程序
plaintext
; 把D0(整数)转浮点到D10/D11 FLT D0 D10 ; 比较D10/D11 与 E50.0 LD X0 DECMPP D10 E50.0 M0 ; M0=M0(>), M1=(=), M2=(<) ; 应用结果 LD M0 ; D10 > 50.0 OUT Y0 LD M1 ; D10 = 50.0 OUT Y1 LD M2 ; D10 < 50.0 OUT Y2
三、方法二:EZCP(FNC111)—— 区间比较
1. 指令格式
plaintext
DEZCP S S1 S2 D DEZCPP S S1 S2 D
S:被测浮点数;S1:下限;S2:上限(S1 < S2)。
D:结果位,占 3 个连续位。
2. 结果
D=ON → S < S1(低于下限)
D+1=ON → S1 ≤ S ≤ S2(在区间内)
D+2=ON → S > S2(高于上限)
3. 示例
plaintext
LD X1 DEZCPP D10 E0.0 E100.0 M10 LD M11 ; 0 ≤ D10 ≤ 100 OUT Y3
四、方法三:直接触点比较(E=、E>、E<…)—— 最直观
Q 系列支持浮点直接比较触点,不用额外 M 点,直接写在梯形图上。
1. 指令表(32 位浮点)
E= S1 S2 ;等于
E<> S1 S2 ;不等于
E> S1 S2 ;大于
E>= S1 S2 ;大于等于
E< S1 S2 ;小于
E<= S1 S2 ;小于等于
2. 示例(直接触点)
plaintext
; D10/D11 > E50.0 时Y0输出 LD E> D10 E50.0 OUT Y0 ; D10/D11 = E50.0 时Y1输出 LD E= D10 E50.0 OUT Y1 ; D10/D11 < E50.0 时Y2输出 LD E< D10 E50.0 OUT Y2
这种写法最简洁,日常编程优先用。
五、常见坑与注意事项
必须 32 位指令:ECMP/DECMP、EZCP/DEZCP、E=/E>… 都是32 位,操作数要占连续 2 个 D。
浮点精度问题:
浮点数等于(=)比较不可靠(有微小误差)。
建议用范围判断:如
E>= E49.99 AND E<= E50.01代替E= E50.0。数据类型一致:不要整数(D0)直接和浮点(E50.0)比,先FLT 转浮点。
常数自动转换:K100、H64 会自动转浮点,可直接用在 S1/S2。
六、总结
简单比较:用 E=、E>、E<… 直接触点,最省事。
需要结果位:用 DECMP。
区间判断:用 DEZCP。
切记:等于比较用区间替代,避免精度误判。


