主题
触点比较与数据处理(FNC 224-299)
触点型比较指令(FNC 224-246)
这一组是最常用的一类 FX3U 应用指令——把「比较」直接当成一个触点用,省掉先 CMP 再判位的两步。LPPLC 18 条全部实现,且都有 32 位形态(D 插在助记符中间,如 ANDD= / LDD>)。
这 18 条在面板里能查到,但要在指令表里输入才能落图
设备端与编辑器都认这 18 条:在指令表里按助记符敲 LD= LD> LD< LD<> LD<= LD>=、 AND= … AND>=、OR= … OR>=,梯形图里会画成比较触点,切回指令表也能还原。 上位机右侧「指令」面板里已列出这 18 条(可以直接搜助记符),但它们是参考条目、暂不支持拖入; 双击/拖拽没有反应是正常的,请在指令表里敲。
32 位的 D 写在中间,只有一个名字(实测编码结果与前缀式完全相同,前缀式是别名):
ANDD= D10 D20 ; D 插在中间 —— 本手册与上载回来都是这个形态
DAND= D10 D20 ; D 放在最前 —— 编得过、与上面同一条,本站不并列,别跟着抄现场程序里几乎全都写成 ANDD= / ANDD> / ANDD<> 这种"D 在中间"的形式 (统计 522 份客户程序:ANDD= 105 次、ANDD> 99 次、ANDD<> 40 次),照这一列敲就对了。 LD / OR 两族同理(LDD>、ORD=)。
按接入位置分三族:
| 位置 | 助记符 | 相当于 |
|---|---|---|
| 母线开始 | LD= LD> LD< LD<> LD<= LD>= | 一个起始触点 |
| 串联 | AND= AND> AND< AND<> AND<= AND>= | 一个串联触点 |
| 并联 | OR= OR> OR< OR<> OR<= OR>= | 一个并联触点 |
把 18 条摊开写全(同一列的六条只差比较条件,操作数、步数、写法完全一样):
| 条件 | 母线起始 | 串联 | 并联 | FNC(母线 / 串联 / 并联) |
|---|---|---|---|---|
| 等于 | LD= | AND= | OR= | 224 / 232 / 240 |
| 大于 | LD> | AND> | OR> | 225 / 233 / 241 |
| 小于 | LD< | AND< | OR< | 226 / 234 / 242 |
| 不等于 | LD<> | AND<> | OR<> | 228 / 236 / 244 |
| 小于等于 | LD<= | AND<= | OR<= | 229 / 237 / 245 |
| 大于等于 | LD>= | AND>= | OR>= | 230 / 238 / 246 |
这 18 条共同的规矩,一次讲清:
- 操作数固定 2 个(
S1、S2),比较S1与S2,成立则这个触点通。取值范围与CMP一样 (K/H常数、D/R/T当前值/C当前值、KnX这类位组合都行)。 - 按有符号数比:
-1 < 1,HFFFF在这几条里是 -1(最小负数那一侧),不是 65535。 要判"够大不够大"请给数留出正数范围,或改用DCMP那类 32 位比较。 - 占 5 步(16 位形态)。32 位形态占 9 步,两个操作数各按双字取(
D10实际用D10+D11)。 - 不支持 P 修饰 —— 它本来就是每个扫描周期重新判一次的触点。
- 32 位形态只有一个名字,
D写在中间:LDD=、ANDD>、ORD<=。把D放最前面的DAND=是别名,编得过但本站不并列(见本页开头那条)。 - FNC 227 / 235 / 243 本机型没有这三条,敲进去会报非法指令 6506。
LD= D0 K100 ; D0 == 100 时接通这一段
OUT Y0
LD> C0 K50 ; 计数器 C0 > 50
AND<= D2 D4 ; 串联条件:D2 <= D4
OUT Y1
LDD> D10 D12 ; 32位比较:(D11 D10) > (D13 D12)
OUT Y2
END一行只能写一条指令
别把 LD= 和 OUT 挤在同一行 —— 编译器会把第二个词当成操作数,报 步号0(第1行): 无法识别的操作数: OUT。指令表是"一行一条"的文本格式。
实用例程
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把上面的地址、主题、引脚替换成你项目里的即可。
数据限幅与转换(FNC 256-269)
| FNC | 助记符 | D | P | 操作数 | 功能 | 状态 |
|---|---|---|---|---|---|---|
| 256 | LIMIT | ✔ | ✔ | 下限 上限 S D | 上下限限幅 | 实现 |
| 257 | BAND | ✔ | ✔ | 下限 上限 S D | 死区处理 | 实现 |
| 258 | ZONE | ✔ | ✔ | 负偏 正偏 S D | 区域偏置 | 实现 |
| 259 | SCL | ✘ | ✔ | S1 S2 D | 定坐标缩放 | 运行时无动作 |
| 260 | DABIN | ✔ | ✔ | S D | ASCII→BIN | 实现 |
| 261 | BINDA | ✔ | ✔ | S D | BIN→ASCII | 实现 |
| 269 | SCL2 | ✘ | ✔ | S1 S2 D | 定坐标缩放 2 | 运行时无动作 |
LIMIT K0 K4000 D0 D10 ; 把 D0 限制在 0~4000 → D10
BAND K-10 K10 D0 D10 ; ±10 死区,区内输出 0SCL / SCL2 在本机运行时不做任何动作,做量程换算请用别的办法
SCL(三菱用「折线表」做非线性缩放)在本机运行时不做任何动作,写了不报错,也不会有输出;SCL2 本机型没有对应的折线功能,本站不给写法。做线性量程换算请直接用乘除法,例如 4000 对应 100.0:
MUL D0 K1000 D10 ; D0(0~4000) × 1000
DIV D10 K4000 D12 ; ÷4000 → 0~1000(即 0~100.0)要做多段折线,用 LIMIT 分段 + 乘除法组合,或者交给 Lua。这两条也没有 32 位写法(DSCL / DSCL2 本站不提供)。
- LIMIT / BAND 会检查下限 > 上限并报 6706;ZONE 不做这个检查,参数写反了不会报错,用的时候自己保证 负偏 ≤ 正偏
- DABIN 用 C 库
atoi转换,遇到非法字符静默返回 0、不报错、不置进位标志,和三菱严格校验的行为不同——转换前最好自己确认字符串合法
变频器通讯(FNC 270-274)—— 已改成扩展模块访问
这一组在 LPPLC 上不是变频器通讯
FX3U 的 IVCK/IVDR/IVRD/IVWR/IVBWR 是走 RS-485 读写三菱变频器。LPPLC 只保留了 IVRD/IVWR 两条,并且把它们改成了读写扩展模块的寄存器,其余三条(IVCK/IVDR/IVBWR)在本机运行时不做任何动作。要连三菱变频器请用下面的 ADPRW(MODBUS 主站)。 IVCK / IVDR / IVBWR 本机型没有对应的变频器通道,运行时不做任何动作;读写扩展模块寄存器请用 FROM / TO。
| FNC | 助记符 | 操作数 | 状态 |
|---|---|---|---|
| 270 | IVCK | — | 运行时无动作 |
| 271 | IVDR | — | 运行时无动作 |
| 272 | IVRD | 模块地址 寄存器地址 D n | 实现(读扩展模块寄存器,仅带扩展口的机型) |
| 273 | IVWR | 模块地址 寄存器地址 S n | 实现(写扩展模块寄存器,仅带扩展口的机型) |
| 274 | IVBWR | — | 运行时无动作 |
这两条需要外接扩展模块才有效,本站不提供写法(等价做法是 FROM / TO),需要请与厂家确认。 IVRD / IVWR 的 n 是连续读写的寄存器个数(不是三菱的通讯通道号)。在没有扩展口的机型上,这两条也是运行时无动作。一般不用直接写它们,用 FROM / TO 访问扩展模块更直观,见 扩展模块。
实用例程
LDP X0
MOV K1 D0
OUT T0 K600
LD T0
MOV K0 D0
RST T0
END把上面的地址、主题、引脚替换成你项目里的即可。
MODBUS 主站 ADPRW(FNC 276)
| FNC | 助记符 | 状态 |
|---|---|---|
| 276 | ADPRW | 实现(MODBUS RTU/多功能主站) |
ADPRW 是 LPPLC 做 MODBUS 主站、配置网络参数、访问云服务的核心指令,功能同样由参数区分。用法见 外部设备 IO 和 特殊软元件详细说明。
特殊模块 BFM(FNC 278-280)—— 本机不动作
| FNC | 助记符 | 状态 |
|---|---|---|
| 278 | RBFM | 运行时无动作 |
| 279 | WBFM | 运行时无动作 |
| 280 | DHSCT | 运行时无动作 |
RBFM / WBFM(分次读写 BFM)和 DHSCT(高速计数比较表)在本机运行时不做任何动作。访问扩展模块缓冲区请用 FROM / TO(见扩展模块);高速计数比较用高速计数器配合比较指令。
掉电保持寄存器 R / ER(FNC 290-295)
| FNC | 助记符 | P | 操作数 | 功能 |
|---|---|---|---|---|
| 290 | LOADR | ✔ | S n | 从 ER 读到 R |
| 291 | SAVER | ✔ | S n D | 从 R 写入 ER(按扇区分次) |
| 292 | INITR | ✔ | S n | 初始化 R 与扇区 |
| 293 | LOGR | ✔ | S m D1 n D2 | 数据登录(循环记录) |
| 294 | RWER | ✔ | S n | R 与 ER 互写 |
| 295 | INITER | ✔ | S n | 初始化 ER 扇区 |
R 是文件寄存器(32768 个),ER 在三菱上是「存储盒」里的一份独立副本。LPPLC 两个平台的做法不一样,这点必须注意:
ESP32 版上 R 和 ER 是同一份数据
ESP32 版把 R 和 ER 都映射到同一块 NVS 存储,er_get / er_set 就是 r_get / r_set。也就是说:
- R 写进去就已经掉电保持了,不需要再
SAVER LOADR/SAVER/RWER在 ESP32 上等于空转,不会出错但也没有实际搬移动作- 不存在「电池保持区」和「存储盒区」的区别
Linux / 4G(RDA8910)版则是两份独立存储(R 走文件、ER 走参数区),这几条指令在那边是真的在搬数据。
需要真正的历史数据存储,用 Lua 的 fdb
R 寄存器适合存少量配置和累计量。要存曲线、报警记录、批次数据这类成规模的历史数据,请用 Lua 的 FlashDB 接口(fdb),它有 KV 和时序两种存储、带磨损均衡,比往 R 里堆数据靠谱得多。见 fdb 数据存储。
参数约束(两个平台一致):
SAVER/INITR/INITER/LOGR的起始 R 编号必须是 1024 的整数倍(扇区首位),否则报 6581 / 6781 / 6783- 扇区号范围 1~32,超出报 6782 / 6784
SAVER每个扫描周期最多搬 1024 个,写满一个扇区后置 M8029INITR把整个扇区的 R 清成0xFFFF(不是 0)
运行时无动作的指令汇总
下面这些 FX3U 指令在本机是运行时无动作——写了不报错,但运行时不产生任何结果,请用替代做法:
| FNC | 助记符 | 替代做法 |
|---|---|---|
| 151 | DVIT | 用 DRVI / DRVA |
| 152 | DTBL | 自己写多段定位逻辑 |
| 155 | ABS | 用 DRVA 绝对定位 |
| 182 | COMRD | 无(注释只在编程软件里) |
| 197 | DHCMOV | 直接 DMOV C235 D0 读计数器 |
| 259 | SCL | 用乘除法做线性换算 |
| 269 | SCL2 | 同上 |
| 270 | IVCK | 用 ADPRW 走 MODBUS |
| 271 | IVDR | 同上 |
| 274 | IVBWR | 同上 |
| 278 | RBFM | 用 FROM |
| 279 | WBFM | 用 TO |
| 280 | DHSCT | 高速计数器 + 比较指令 |
这类指令不报错,这是最容易出错的地方
上面这些指令通断都一样、结果寄存器不会被写入。如果您从三菱程序移植过来,程序能编译能下载能运行,但某个数就是不变化,先来查一下是不是用到了这一列里的指令。
各指令详细说明
IVCK — 变频器/智能模块状态监控
| 项目 | 说明 |
|---|---|
| 格式 | IVCK S1(站号 K0~K31), S2(指令代码), D(保存读出值), n(通道 K1/K2) |
| 操作数 | S1(站号 K0~K31), S2(指令代码), D(保存读出值), n(通道 K1/K2) |
| 示例 | IVCK K1 K0 D0 K1 |
| 步数 | 9 |
| FNC | FNC 270 |
⚠️ 本机型运行时这条不做任何动作,写法仅供对照三菱程序。
IVRD — 变频器/智能模块参数读出
| 项目 | 说明 |
|---|---|
| 格式 | IVRD S1(模块地址), S2(寄存器地址), D(读出值存放首址), n(连续个数) |
| 操作数 | S1(模块地址), S2(寄存器地址), D(读出值存放首址), n(连续个数) |
| 示例 | IVRD K1 K0 D10 K1 |
| 步数 | 9 |
| FNC | FNC 272 |
⚠️ 这条读写的是扩展模块寄存器,只在带扩展口的机型上有动作;没有扩展口时运行时不做任何动作。日常访问扩展模块用
FROM/TO更直观。
IVWR — 变频器/智能模块参数写入
| 项目 | 说明 |
|---|---|
| 格式 | IVWR S1(模块地址), S2(寄存器地址), S(待写入数据首址), n(连续个数) |
| 操作数 | S1(模块地址), S2(寄存器地址), S(待写入数据首址), n(连续个数) |
| 示例 | IVWR K1 K0 D10 K1 |
| 步数 | 9 |
| FNC | FNC 273 |
⚠️ 这条读写的是扩展模块寄存器,只在带扩展口的机型上有动作;没有扩展口时运行时不做任何动作。日常访问扩展模块用
FROM/TO更直观。
IVDR — 变频器/智能模块运行中写入
| 项目 | 说明 |
|---|---|
| 格式 | IVDR S1(站号 K0~K31), S2(指令代码), S3(设定值或保存它的软元件), n(通道 K1/K2) |
| 操作数 | S1(站号 K0~K31), S2(指令代码), S3(设定值或保存它的软元件), n(通道 K1/K2) |
| 示例 | IVDR K1 K0 D0 K1 |
| 步数 | 9 |
| FNC | FNC 271 |
⚠️ 本机型运行时这条不做任何动作,写法仅供对照三菱程序。
IVBWR — 变频器/智能模块成批写入
| 项目 | 说明 |
|---|---|
| 格式 | IVBWR S1(站号 K0~K31), S2(写入个数), S3(参数表起始软元件), n(通道 K1/K2) |
| 操作数 | S1(站号 K0~K31), S2(写入个数), S3(参数表起始软元件), n(通道 K1/K2) |
| 示例 | IVBWR K1 K2 D0 K1 |
| 步数 | 9 |
| FNC | FNC 274 |
⚠️ 本机型运行时这条不做任何动作,写法仅供对照三菱程序。
RBFM — 特殊模块 BFM 成批读出
| 项目 | 说明 |
|---|---|
| 格式 | RBFM m1(单元号 0~7), m2(BFM 起始编号), D(读出目标首址), n1(总点数), n2(每个扫描周期的传送点数) |
| 操作数 | m1(单元号 0~7), m2(BFM 起始编号), D(读出目标首址), n1(总点数), n2(每个扫描周期的传送点数) |
| 示例 | RBFM K0 K0 D10 K4 K1 |
| 步数 | 11 |
| FNC | FNC 278 |
⚠️ 本机型运行时这条不做任何动作,写法仅供对照三菱程序。
WBFM — 特殊模块 BFM 成批写入
| 项目 | 说明 |
|---|---|
| 格式 | WBFM m1(单元号 0~7), m2(BFM 起始编号), S(写入数据来源首址), n1(总点数), n2(每个扫描周期的传送点数) |
| 操作数 | m1(单元号 0~7), m2(BFM 起始编号), S(写入数据来源首址), n1(总点数), n2(每个扫描周期的传送点数) |
| 示例 | WBFM K0 K0 D10 K4 K1 |
| 步数 | 11 |
| FNC | FNC 279 |
⚠️ 本机型运行时这条不做任何动作,写法仅供对照三菱程序。
LIMIT — 上下限限位:把 D 限制在 [S1,S2] 区间
| 项目 | 说明 |
|---|---|
| 格式 | LIMIT S1(下限), S2(上限), S3(待限位的输入值), D(限位后的输出) |
| 操作数 | S1(下限), S2(上限), S3(待限位的输入值), D(限位后的输出) |
| 示例 | LIMIT D0 D10 D20 D30 |
| 步数 | 9 |
| FNC | FNC 256 |
LIMIT D0 D10 D20 D30ZONE — 区域控制:D 落在 [S1,S2] 区间内外时输出不同状态
| 项目 | 说明 |
|---|---|
| 格式 | ZONE S1(死区下限), S2(死区上限), S3(输入值), D(输出) |
| 操作数 | S1(死区下限), S2(死区上限), S3(输入值), D(输出) |
| 示例 | ZONE D0 D10 D20 D30 |
| 步数 | 9 |
| FNC | FNC 258 |
ZONE D0 D10 D20 D30SCL — 标度变换(按参数表把 BIN 值折算成工程量)
| 项目 | 说明 |
|---|---|
| 格式 | SCL S(源), D(目标), n(参数首址) |
| 操作数 | S(源), D(目标), n(参数首址) |
| 示例 | SCL D0 D10 K1 |
| 步数 | 7 |
| FNC | FNC 259 |
SCL D0 D10 K1SCL2 — 标度变换 2(带偏移与反向的折算)
| 项目 | 说明 |
|---|---|
| 格式 | SCL2 S(源), D(目标), n(参数表首址) |
| 操作数 | S(源), D(目标), n(参数表首址) |
| 示例 | SCL2 D0 D10 K1 |
| 步数 | 7 |
| FNC | FNC 269 |
⚠️ 本机型运行时这条不做任何动作,写法仅供对照三菱程序。
BAND — 死区控制:区间内输出 0,区间外输出超出量
| 项目 | 说明 |
|---|---|
| 格式 | BAND S1(下限), S2(上限), S3(输入), D(输出) |
| 操作数 | 下限, 上限, 输入, 输出 |
| 示例 | BAND D0 D10 D20 D30 |
| 步数 | 9 |
| FNC | FNC 257 |
D0 放下限、D10 放上限、D20 是待判的输入,结果写到 D30:
| 输入落在 | 输出 |
|---|---|
| 比下限小 | 输入 − 下限(负数) |
| 下限~上限之间 | 0 |
| 比上限大 | 输入 − 上限(正数) |
它不是限幅,别和 LIMIT 混
BAND 给的是偏离死区多少(判断"超了多少"用它),LIMIT 给的才是把输入夹进区间 (做上下限保护用那个)。两条操作数顺序一样,结果含义完全两回事。
- 下限大于上限时置 M8067、D8067 = 6706(本次结果照样写出去,数值没有意义,请当错误处理)
- 32 位版
DBAND(4 个操作数各占 2 个字,占 17 步)见 5.11 32 位扩展指令详解
DABIN — 字符串转成 BIN 数
| 项目 | 说明 |
|---|---|
| 格式 | DABIN S(字符串首址), D(结果) |
| 操作数 | 源字符串, 目标 |
| 示例 | DABIN D0 D10 |
| 步数 | 5 |
| FNC | FNC 260 |
把 D0 起那串十进制字符("1234")转成数值写进 D10。字符串在 D 里的存法与 LEN/$MOV 一致: 每字 2 个字符、低字节在前、\0 结尾。
- 结果按 16 位写,超过 ±32767 会被截断 —— 要转大数用 32 位版
DDABIN - 串里混了非数字字符时,按开头能认的部分取,不报错,请自己保证送进来的串是干净的数字
- 反过来(数值→字符串)是
BINDA
BINDA — BIN 数转成字符串
| 项目 | 说明 |
|---|---|
| 格式 | BINDA S(数值), D(字符串首址) |
| 操作数 | 源, 目标字符串 |
| 示例 | BINDA D0 D10 |
| 步数 | 5 |
| FNC | FNC 261 |
把 D0 的数值按十进制写成字符串放进 D10 起的区(负数带 - 号,占一个字符)。 目标要留够字数:5 位数加负号是 6 个字符 = 3 个字。32 位版 DBINDA 见 5.11。
BINDA D0 D10 ; D0 = -1234 → D10 起放 "-1234"R / ER 寄存器指令逐条说明
用之前先看一眼您那块机器上这几条到底动不动数据
本页掉电保持寄存器 R / ER(FNC 290-295)那一节已经说过:ESP32 版上 R 和 ER 是同一份存储, LOADR / SAVER / RWER 执行完 R 里的内容不会有任何变化(不报错,但也不搬数据), INITER 是运行时无动作。下面逐条给的是写法与约束,别照示例写完就当功能已经生效。
LOADR — 从 ER 读到 R
| 项目 | 说明 |
|---|---|
| 格式 | LOADR S(R 起始), n(个数) |
| 操作数 | R 起始编号, 个数 |
| 示例 | LOADR R0 K1024 |
| 步数 | 5 |
| FNC | FNC 290 |
SAVER — 从 R 写入 ER
| 项目 | 说明 |
|---|---|
| 格式 | SAVER S(R 起始), n(个数), D(已写计数) |
| 操作数 | R 起始编号, 个数, 计数 |
| 示例 | SAVER R0 K1024 D0 |
| 步数 | 7 |
| FNC | FNC 291 |
起始编号必须是 1024 的整数倍(扇区首位),否则报 6581;一个扫描周期最多搬 1024 个, 搬满置 M8029。
INITR — 初始化 R 与扇区
| 项目 | 说明 |
|---|---|
| 格式 | INITR S(R 起始), n(扇区数) |
| 操作数 | R 起始编号, 扇区数 |
| 示例 | INITR R0 K1 |
| 步数 | 5 |
| FNC | FNC 292 |
起始不是 1024 整数倍报 6781,扇区数不在 1~32 报 6782。 这条是把 R 清成 0xFFFF(不是 0),别指望它清零。
LOGR — 数据登录(循环记录)
| 项目 | 说明 |
|---|---|
| 格式 | LOGR S(数据源首址), m(数据长度), D1(R 起始), n(扇区数), D2(已记录计数) |
| 操作数 | 5 个,见左列 |
| 示例 | LOGR D0 K1 R1024 K1 D1 |
| 步数 | 11 |
| FNC | FNC 293 |
把 S 起的 m 个字追加记进从 D1 起、共 n 个扇区的 R 区,写满自动回到开头覆盖, D2 记着当前写到哪。约束:m 小于 1 报 6782、R 起始不是 1024 整数倍报 6783、 扇区数不在 1~32 报 6784。
要存成规模的历史数据请用 Lua 的 fdb
LOGR 的容量就是那几个扇区。曲线、报警记录这类请走 Lua 的 fdb 数据存储。
RWER — R 与 ER 互写
| 项目 | 说明 |
|---|---|
| 格式 | RWER S(R 起始), n(个数) |
| 操作数 | R 起始编号, 个数 |
| 示例 | RWER R0 K1024 |
| 步数 | 5 |
| FNC | FNC 294 |
INITER — 初始化 ER 扇区
| 项目 | 说明 |
|---|---|
| 格式 | INITER S(R 起始), n(扇区数) |
| 操作数 | R 起始编号, 扇区数 |
| 示例 | INITER R0 K1 |
| 步数 | 5 |
| FNC | FNC 295 |
ESP32 版上 INITER 运行时无动作
程序编得进去、下载不报错、运行时没有任何效果。要清 ER 请改用 INITR。