Skip to content

触点比较与数据处理(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助记符DP操作数功能状态
256LIMIT✔✔下限 上限 S D上下限限幅实现
257BAND✔✔下限 上限 S D死区处理实现
258ZONE✔✔负偏 正偏 S D区域偏置实现
259SCL✘✔S1 S2 D定坐标缩放运行时无动作
260DABIN✔✔S DASCII→BIN实现
261BINDA✔✔S DBIN→ASCII实现
269SCL2✘✔S1 S2 D定坐标缩放 2运行时无动作
LIMIT  K0 K4000 D0 D10       ; 把 D0 限制在 0~4000 → D10
BAND   K-10 K10 D0 D10       ; ±10 死区,区内输出 0

SCL / 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助记符操作数状态
270IVCK—运行时无动作
271IVDR—运行时无动作
272IVRD模块地址 寄存器地址 D n实现(读扩展模块寄存器,仅带扩展口的机型)
273IVWR模块地址 寄存器地址 S n实现(写扩展模块寄存器,仅带扩展口的机型)
274IVBWR—运行时无动作

这两条需要外接扩展模块才有效,本站不提供写法(等价做法是 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助记符状态
276ADPRW实现(MODBUS RTU/多功能主站)

ADPRW 是 LPPLC 做 MODBUS 主站、配置网络参数、访问云服务的核心指令,功能同样由参数区分。用法见 外部设备 IO 和 特殊软元件详细说明。

特殊模块 BFM(FNC 278-280)—— 本机不动作 ​

FNC助记符状态
278RBFM运行时无动作
279WBFM运行时无动作
280DHSCT运行时无动作

RBFM / WBFM(分次读写 BFM)和 DHSCT(高速计数比较表)在本机运行时不做任何动作。访问扩展模块缓冲区请用 FROM / TO(见扩展模块);高速计数比较用高速计数器配合比较指令。

掉电保持寄存器 R / ER(FNC 290-295) ​

FNC助记符P操作数功能
290LOADR✔S n从 ER 读到 R
291SAVER✔S n D从 R 写入 ER(按扇区分次)
292INITR✔S n初始化 R 与扇区
293LOGR✔S m D1 n D2数据登录(循环记录)
294RWER✔S nR 与 ER 互写
295INITER✔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 个,写满一个扇区后置 M8029
  • INITR 把整个扇区的 R 清成 0xFFFF(不是 0)

运行时无动作的指令汇总 ​

下面这些 FX3U 指令在本机是运行时无动作——写了不报错,但运行时不产生任何结果,请用替代做法:

FNC助记符替代做法
151DVIT用 DRVI / DRVA
152DTBL自己写多段定位逻辑
155ABS用 DRVA 绝对定位
182COMRD无(注释只在编程软件里)
197DHCMOV直接 DMOV C235 D0 读计数器
259SCL用乘除法做线性换算
269SCL2同上
270IVCK用 ADPRW 走 MODBUS
271IVDR同上
274IVBWR同上
278RBFM用 FROM
279WBFM用 TO
280DHSCT高速计数器 + 比较指令

这类指令不报错,这是最容易出错的地方

上面这些指令通断都一样、结果寄存器不会被写入。如果您从三菱程序移植过来,程序能编译能下载能运行,但某个数就是不变化,先来查一下是不是用到了这一列里的指令。


各指令详细说明 ​

IVCK — 变频器/智能模块状态监控 ​

项目说明
格式IVCK S1(站号 K0~K31), S2(指令代码), D(保存读出值), n(通道 K1/K2)
操作数S1(站号 K0~K31), S2(指令代码), D(保存读出值), n(通道 K1/K2)
示例IVCK K1 K0 D0 K1
步数9
FNCFNC 270

⚠️ 本机型运行时这条不做任何动作,写法仅供对照三菱程序。

IVRD — 变频器/智能模块参数读出 ​

项目说明
格式IVRD S1(模块地址), S2(寄存器地址), D(读出值存放首址), n(连续个数)
操作数S1(模块地址), S2(寄存器地址), D(读出值存放首址), n(连续个数)
示例IVRD K1 K0 D10 K1
步数9
FNCFNC 272

⚠️ 这条读写的是扩展模块寄存器,只在带扩展口的机型上有动作;没有扩展口时运行时不做任何动作。日常访问扩展模块用 FROM / TO 更直观。

IVWR — 变频器/智能模块参数写入 ​

项目说明
格式IVWR S1(模块地址), S2(寄存器地址), S(待写入数据首址), n(连续个数)
操作数S1(模块地址), S2(寄存器地址), S(待写入数据首址), n(连续个数)
示例IVWR K1 K0 D10 K1
步数9
FNCFNC 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
FNCFNC 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
FNCFNC 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
FNCFNC 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
FNCFNC 279

⚠️ 本机型运行时这条不做任何动作,写法仅供对照三菱程序。

LIMIT — 上下限限位:把 D 限制在 [S1,S2] 区间 ​

项目说明
格式LIMIT S1(下限), S2(上限), S3(待限位的输入值), D(限位后的输出)
操作数S1(下限), S2(上限), S3(待限位的输入值), D(限位后的输出)
示例LIMIT D0 D10 D20 D30
步数9
FNCFNC 256
LIMIT D0 D10 D20 D30

LIMIT 限幅曲线:区间内原样输出,区间外输出边界值

ZONE — 区域控制:D 落在 [S1,S2] 区间内外时输出不同状态 ​

项目说明
格式ZONE S1(死区下限), S2(死区上限), S3(输入值), D(输出)
操作数S1(死区下限), S2(死区上限), S3(输入值), D(输出)
示例ZONE D0 D10 D20 D30
步数9
FNCFNC 258
ZONE D0 D10 D20 D30

ZONE 本机算法:输入正负决定加下限还是上限,不检查上下限颠倒

SCL — 标度变换(按参数表把 BIN 值折算成工程量) ​

项目说明
格式SCL S(源), D(目标), n(参数首址)
操作数S(源), D(目标), n(参数首址)
示例SCL D0 D10 K1
步数7
FNCFNC 259
SCL D0 D10 K1

SCL2 — 标度变换 2(带偏移与反向的折算) ​

项目说明
格式SCL2 S(源), D(目标), n(参数表首址)
操作数S(源), D(目标), n(参数表首址)
示例SCL2 D0 D10 K1
步数7
FNCFNC 269

⚠️ 本机型运行时这条不做任何动作,写法仅供对照三菱程序。

BAND — 死区控制:区间内输出 0,区间外输出超出量 ​

项目说明
格式BAND S1(下限), S2(上限), S3(输入), D(输出)
操作数下限, 上限, 输入, 输出
示例BAND D0 D10 D20 D30
步数9
FNCFNC 257

D0 放下限、D10 放上限、D20 是待判的输入,结果写到 D30:

输入落在输出
比下限小输入 − 下限(负数)
下限~上限之间0
比上限大输入 − 上限(正数)

它不是限幅,别和 LIMIT 混

BAND 给的是偏离死区多少(判断"超了多少"用它),LIMIT 给的才是把输入夹进区间 (做上下限保护用那个)。两条操作数顺序一样,结果含义完全两回事。

  • 下限大于上限时置 M8067、D8067 = 6706(本次结果照样写出去,数值没有意义,请当错误处理)
  • 32 位版 DBAND(4 个操作数各占 2 个字,占 17 步)见 5.11 32 位扩展指令详解

BAND 死区曲线:区间内输出 0,区间外输出偏离量

DABIN — 字符串转成 BIN 数 ​

项目说明
格式DABIN S(字符串首址), D(结果)
操作数源字符串, 目标
示例DABIN D0 D10
步数5
FNCFNC 260

把 D0 起那串十进制字符("1234")转成数值写进 D10。字符串在 D 里的存法与 LEN/$MOV 一致: 每字 2 个字符、低字节在前、\0 结尾。

  • 结果按 16 位写,超过 ±32767 会被截断 —— 要转大数用 32 位版 DDABIN
  • 串里混了非数字字符时,按开头能认的部分取,不报错,请自己保证送进来的串是干净的数字
  • 反过来(数值→字符串)是 BINDA

BINDA — BIN 数转成字符串 ​

项目说明
格式BINDA S(数值), D(字符串首址)
操作数源, 目标字符串
示例BINDA D0 D10
步数5
FNCFNC 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
FNCFNC 290

SAVER — 从 R 写入 ER ​

项目说明
格式SAVER S(R 起始), n(个数), D(已写计数)
操作数R 起始编号, 个数, 计数
示例SAVER R0 K1024 D0
步数7
FNCFNC 291

起始编号必须是 1024 的整数倍(扇区首位),否则报 6581;一个扫描周期最多搬 1024 个, 搬满置 M8029。

INITR — 初始化 R 与扇区 ​

项目说明
格式INITR S(R 起始), n(扇区数)
操作数R 起始编号, 扇区数
示例INITR R0 K1
步数5
FNCFNC 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
FNCFNC 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
FNCFNC 294

INITER — 初始化 ER 扇区 ​

项目说明
格式INITER S(R 起始), n(扇区数)
操作数R 起始编号, 扇区数
示例INITER R0 K1
步数5
FNCFNC 295

ESP32 版上 INITER 运行时无动作

程序编得进去、下载不报错、运行时没有任何效果。要清 ER 请改用 INITR。

LPPLC 工业物联网云平台 · 软硬件与云平台全栈自研