主题
数据处理与时钟(FNC 140-189)
怎么看「实现状态」这一列
LPPLC 兼容 FX3U 指令集,但不是每一条都做了实现。本章的表格里凡标注 运行时无动作 的指令,设备只会跳过操作数、不做任何动作,也不报错 —— 写了不会红字报错,但也不会有任何效果,请不要用它。标注 未收录 的指令写进程序会被判为非法指令,报错 6506。
数据块运算(FNC 140-149)
| FNC | 助记符 | D | P | 操作数 | 功能 | 状态 |
|---|---|---|---|---|---|---|
| 140 | WSUM | ✔ | ✔ | S D n | 字块累加和 | 实现 |
| 141 | WTOB | ✘ | ✔ | S D n | 字拆成字节 | 实现 |
| 142 | BTOW | ✘ | ✔ | S D n | 字节合成字 | 实现 |
| 143 | UNI | ✘ | ✔ | S D n | 4 位组合(n=1~4) | 实现 |
| 144 | DIS | ✘ | ✔ | S D n | 4 位分离(n=0~4) | 实现 |
| 147 | SWAP | ✔ | ✔ | S/D | 高低字节交换 | 实现 |
| 149 | SORT2 | ✔ | ✘ | S m1 m2 D n | 数据表排序 2 | 实现 |
WSUM D0 D100 K10 ; D0~D9 求和 → D100(32位结果占 D100-D101)
WTOB D0 D10 K4 ; 从 D0 起拆 4 个字节 → D10 起(字→字节)
DIS D0 D10 K4 ; D0 的 4 个半字节 → D10~D13
UNI D10 D0 K4 ; 反过来
SWAP D0 ; D0 高低字节互换- UNI / DIS 的 n 超出 4 报错 6706
- SORT2 行数 1~32(超范围 6782)、列数 1~6(6783)、排序列号 1~列数(6785);用 M8165 选升序/降序,排序完成置 M8029
定位与伺服(FNC 150-159)
| FNC | 助记符 | D | P | 状态 |
|---|---|---|---|---|
| 151 | DVIT | 仅 D | ✘ | 运行时无动作 |
| 152 | DTBL | 仅 D | ✘ | 运行时无动作 |
| 155 | ABS | ✔ | ✘ | 运行时无动作 |
| 156 | ZRN | ✔ | ✘ | 实现(仅 ESP32 版) |
| 157 | PLSV | ✔ | ✘ | 实现(仅 ESP32 版) |
| 158 | DRVI | ✔ | ✘ | 实现(仅 ESP32 版) |
| 159 | DRVA | ✔ | ✘ | 实现(仅 ESP32 版) |
定位指令只有 ESP32 版有
ZRN / DSZR / PLSV / DRVI / DRVA 在 ESP32 版上是用 LEDC 硬件 PWM 实现的,最高约 100kHz,同时最多 8 路高速输出。Linux / 4G(RDA8910)版这些指令整段被注释掉,不可用。
DVIT(中断定位)、DTBL(表定位)、ABS(绝对位置当前值读取)这三条 FX3U 里配合伺服用的指令,在本机运行时不做任何动作。要做绝对定位请直接用 DRVA;DVIT / DTBL 本机型没有对应的定位通道,本站不给写法,需要请与厂家确认。
时钟运算(FNC 160-169)
| FNC | 助记符 | D | P | 操作数 | 功能 | 状态 |
|---|---|---|---|---|---|---|
| 160 | TCMP | ✘ | ✔ | 时 分 秒 S D | 时钟数据比较 | 实现 |
| 161 | TZCP | ✘ | ✔ | S1 S2 S D | 时钟区间比较 | 实现 |
| 162 | TADD | ✘ | ✔ | S1 S2 D | 时钟数据加 | 实现 |
| 163 | TSUB | ✘ | ✔ | S1 S2 D | 时钟数据减 | 实现 |
| 164 | HTOS | ✔ | ✔ | S D | 时分秒→秒 | 实现 |
| 165 | STOH | ✔ | ✔ | S D | 秒→时分秒 | 实现 |
| 166 | TRD | ✘ | ✔ | D | 读实时时钟(7 字) | 实现 |
| 167 | TWR | ✘ | ✔ | S | 写实时时钟(6 字) | 实现 |
| 169 | HOUR | ✔ | ✘ | S D1 D2 | 小时计(运行累时) | 实现 |
TRD D0 ; 读时钟:D0=年 D1=月 D2=日 D3=时 D4=分 D5=秒 D6=星期
TCMP K12 K30 K0 D0 M0 ; 当前时间与 12:30:00 比较 → M0/M1/M2
HOUR K100 D200 M0 ; 累计运行 100 小时后 M0 置位TZCP — 时钟区间比较:三个时间各占 3 个连续字(时/分/秒),结果占连续 3 个位。
LD M8000
TRD D10 ; 先把当前时间读进 D10~D16(D13=时 D14=分 D15=秒)
MOV K8 D20 ; 下限 08:00:00
MOV K0 D21
MOV K0 D22
MOV K18 D30 ; 上限 18:00:00
MOV K0 D31
MOV K0 D32
END
LD M8000
TZCP D20 D30 D13 M3 ; 拿 D13/D14/D15 这个时间和 D20~D22、D30~D32 两个端点比
; 结果:M3=早于下限 M4=在区间内(含端点) M5=晚于上限- HOUR 累计到 32767 小时后停在最大值,不再往上加(这点和三菱到设定值继续计不同)
- LPPLC 的实时时钟由内部 RTC 芯片维持,掉电走后备电,走时精度以硬件为准
其他实用指令(FNC 170-189)
| FNC | 助记符 | D | P | 操作数 | 功能 | 状态 |
|---|---|---|---|---|---|---|
| 170 | GRY | ✔ | ✔ | S D | 二进制→格雷码 | 实现 |
| 171 | GBIN | ✔ | ✔ | S D | 格雷码→二进制 | 实现 |
| 176 | RD3A | ✘ | ✔ | 偏移 个数 D | 读模拟量缓冲区 | 实现(语义改写) |
| 177 | WR3A | ✘ | ✔ | 偏移 个数 S | 写模拟量缓冲区 | 实现(语义改写) |
| 180 | EXTR | ✔ | ✔ | S SD1 SD2 SD3 | 多功能指令(模式由 D8126 决定) | 实现 |
| 182 | COMRD | ✘ | ✔ | — | 读软元件注释 | 运行时无动作 |
| 184 | RND | ✘ | ✔ | D | 随机数 | 实现 |
| 186 | DUTY | ✘ | ✔ | n1 n2 D | 定时脉冲 | 实现 |
| 188 | CRC | ✘ | ✔ | S D n | CRC 校验 | 实现 |
| 197 | DHCMOV | 仅 D | ✔ | — | 高速计数当前值传送 | 运行时无动作 |
RD3A / WR3A 不是三菱的模拟量模块协议
FX3U 的 RD3A / WR3A 是读写 FX0N-3A 特殊模块。LPPLC 把它改成了直接读写本机内部的模拟量缓冲区 —— RD3A 偏移 个数 D 读 AI,WR3A 偏移 个数 S 写 AO,偏移范围 0~100,超范围报 6581/6582。要用本机 AI/AO,用这两条指令,别按三菱手册的接线理解。
- RND 用 ESP32 硬件随机数(
esp_random),值域 0~32767,不需要三菱那样先设种子 - EXTR 是 LPPLC 自己扩展得最多的一条指令,用来配置串口参数、MODBUS 主站、云服务等,具体功能由 D8126 的值决定,同一条 EXTR 在不同 D8126 下做完全不同的事,见 6.3 特殊软元件详细说明。D8126 没设值就执行 EXTR 会报 6599。能直接照抄的整段程序见 B7. MODBUS 串口通讯例程
- DUTY 的输出标志寄存器固定在 D8330~D8334,超出报 6783
- CRC 长度上限 1024(超了静默不算),用 M8161 选 8 位 / 16 位模式
- COMRD(读注释)和 DHCMOV(高速计数当前值传送)在本机运行时不做任何动作,不要用;要读高速计数器当前值,直接读对应的 C 寄存器(如
DMOV C235 D0)
各指令详细说明
WSUM — 字块累加和(结果占 2 个字)
| 项目 | 说明 |
|---|---|
| 格式 | WSUM S(块首址), D(结果首址), n(加几个字) |
| 操作数 | S, D, n |
| 示例 | WSUM D0 D100 K10 |
| 步数 | 7 |
| FNC | FNC 140 |
把 D0~D9 这 10 个字相加。结果是 32 位的,占 D100(低字)和 D101(高字)两格 —— 只读 D100 会在和超过 32767 时得到错的数,这是这条最容易出错的地方。 n 填 0 时什么都不做,也不报错。
WSUM D0 D100 K10 ; D0~D9 求和 → D100(低字) + D101(高字)DWSUM — 双字块累加和(结果占 4 个字)
| 项目 | 说明 |
|---|---|
| 格式 | DWSUM S(块首址), D(结果首址), n(加几个双字) |
| 操作数 | S, D, n(三个操作数都按 32 位取,各占 2 个字) |
| 示例 | DWSUM D0 D100 K10 |
| 步数 | 13 |
| FNC | FNC 140 (D) |
32 位版:加的是 n 个 32 位数(源区实际占 2n 个字,D0~D19),结果是一个 64 位和, 占 D100~D103 四格。用不到 64 位时别为了省事写 DWSUM,源区会多吃掉一倍的字。
UNI — 4 位合并成 1 个字
| 项目 | 说明 |
|---|---|
| 格式 | UNI S(来源首址), D(结果), n(合并几个,1~4) |
| 操作数 | S, D, n |
| 示例 | UNI D10 D0 K4 |
| 步数 | 7 |
| FNC | FNC 143 |
取 S 起始的 n 个字,每个字的低 4 位,依次拼进 D 的第 1~4 个 4 位段。 是 DIS 的反向操作,配合 BCD/BIN 时用来把散在多个寄存器里的一个数拼回去。
UNI D10 D0 K4 ; D10/D11/D12/D13 的低 4 位 → D0 的 4 个 4 位段n超出 4 → 置 M8067、D8067 = 6706,本次不合并n填 0 → 什么都不做,也不报错- 没有 32 位形态(不存在
DUNI)
DIS — 1 个字拆成 4 位
| 项目 | 说明 |
|---|---|
| 格式 | DIS S(要拆的数), D(存放首址), n(拆几个,0~4) |
| 操作数 | S, D, n |
| 示例 | DIS D0 D10 K4 |
| 步数 | 7 |
| FNC | FNC 144 |
把 S 这个 16 位数的 4 个 4 位段分别写到 D、D+1、D+2、D+3(每格只放低 4 位)。 n 决定拆几段:K2 只写 D 和 D+1,K0 什么都不做。约束与 UNI 相同 (n>4 报 6706,没有 32 位形态)。
DIS D0 D10 K4 ; D0 的 4 个 4 位 → D10~D13SWAP — 高低字节互换(16 位)
| 项目 | 说明 |
|---|---|
| 格式 | SWAP 操作数 D |
| 操作数 | 操作数 D |
| 示例 | SWAP D0 |
| 步数 | 3 |
| FNC | FNC 147 |
SWAP D0DRVI — 相对定位(增量方式驱动)(32 位版 DDRVI 见本页末尾「面板里搜得到、但只能看说明不能拖入的指令」那张表)
| 项目 | 说明 |
|---|---|
| 格式 | DRVI 脉冲数 S1, 频率 S2, 脉冲输出 Y, 方向输出 |
| 操作数 | 脉冲数 S1, 频率 S2, 脉冲输出 Y, 方向输出 |
| 示例 | DRVI K10000 K5000 Y0 Y4 |
| 步数 | 9 |
| FNC | FNC 158 |
DRVI K10000 K5000 Y0 Y4DRVA — 绝对定位(绝对方式驱动)(32 位版 DDRVA 见本页末尾「面板里搜得到、但只能看说明不能拖入的指令」那张表)
| 项目 | 说明 |
|---|---|
| 格式 | DRVA 目标位置 S1, 频率 S2, 脉冲输出 Y, 方向输出 |
| 操作数 | 目标位置 S1, 频率 S2, 脉冲输出 Y, 方向输出 |
| 示例 | DRVA K20000 K5000 Y0 Y4 |
| 步数 | 9 |
| FNC | FNC 159 |
DRVA K20000 K5000 Y0 Y4ZRN — 回到原点位置(32 位版 DZRN 见本页末尾「面板里搜得到、但只能看说明不能拖入的指令」那张表)
| 项目 | 说明 |
|---|---|
| 格式 | ZRN 回归速度 S1, 爬行速度 S2, 近点输入 S3, 脉冲输出 Y |
| 操作数 | 回归速度 S1, 爬行速度 S2, 近点输入 S3, 脉冲输出 Y |
| 示例 | ZRN K5000 K500 X0 Y0 |
| 步数 | 9 |
| FNC | FNC 156 |
ZRN K5000 K500 X0 Y0PLSV — 输出频率可随时更改的脉冲(32 位版 DPLSV 见本页末尾「面板里搜得到、但只能看说明不能拖入的指令」那张表)
| 项目 | 说明 |
|---|---|
| 格式 | PLSV 速度 S1, 脉冲输出 Y, 方向输出 |
| 操作数 | 速度 S1, 脉冲输出 Y, 方向输出 |
| 示例 | PLSV K3000 Y0 Y4 |
| 步数 | 7 |
| FNC | FNC 157 |
PLSV K3000 Y0 Y4DSZR — 带 DOG 搜索的原点回归
| 项目 | 说明 |
|---|---|
| 格式 | DSZR 近点 DOG 输入 S1, 零点 Z 相输入 S2, 脉冲输出 Y, 方向输出 |
| 操作数 | 近点 DOG 输入 S1, 零点 Z 相输入 S2, 脉冲输出 Y, 方向输出 |
| 示例 | DSZR X0 X1 Y0 Y4 |
| 步数 | 9 |
| FNC | FNC 150 |
DSZR X0 X1 Y0 Y4TRD — 读取实时时钟数据
| 项目 | 说明 |
|---|---|
| 格式 | TRD 目标 D |
| 操作数 | 目标 D |
| 示例 | TRD D0 |
| 步数 | 3 |
| FNC | FNC 166 |
TRD D0TWR — 写入实时时钟数据
| 项目 | 说明 |
|---|---|
| 格式 | TWR 源 S |
| 操作数 | 源 S |
| 示例 | TWR D0 |
| 步数 | 3 |
| FNC | FNC 167 |
TWR D0TCMP — 时钟数据比较:比较 时S1/分S2/秒S3 与 时间数据S(3字),结果输出到 D 起始的 3 位(>/=/<)
| 项目 | 说明 |
|---|---|
| 格式 | TCMP 时S1, 分S2, 秒S3, 时间数据S(3字), 结果D(3位) |
| 操作数 | 时S1, 分S2, 秒S3, 时间数据S(3字), 结果D(3位) |
| 示例 | TCMP K11 K10 K20 D0 M0 |
| 步数 | 11 |
| FNC | FNC 160 |
TCMP K11 K10 K20 D0 M0TZCP — 时钟区间比较:判断 比较值S3(3字) 是否在 [下限S1, 上限S2] 区间内,结果占 3 位
| 项目 | 说明 |
|---|---|
| 格式 | TZCP 下限S1(3字), 上限S2(3字), 比较值S3(3字), 结果D(3位) |
| 操作数 | 下限S1(3字), 上限S2(3字), 比较值S3(3字), 结果D(3位) |
| 示例 | TZCP D20 D30 D0 M3 |
| 步数 | 9 |
| FNC | FNC 161 |
TZCP D20 D30 D0 M3TADD — 时钟数据加法:S1(3字 时/分/秒) + S2(3字) → D(3字)
| 项目 | 说明 |
|---|---|
| 格式 | TADD S1(3字), S2(3字), D(3字) |
| 操作数 | S1(3字), S2(3字), D(3字) |
| 示例 | TADD D12 D22 D32 |
| 步数 | 7 |
| FNC | FNC 162 |
TADD D12 D22 D32TSUB — 时钟数据减法:S1(3字) − S2(3字) → D(3字)
| 项目 | 说明 |
|---|---|
| 格式 | TSUB S1(3字), S2(3字), D(3字) |
| 操作数 | S1(3字), S2(3字), D(3字) |
| 示例 | TSUB D12 D22 D32 |
| 步数 | 7 |
| FNC | FNC 163 |
TSUB D12 D22 D32HOUR — 小时计(运行累时):累计条件为 ON 的时间,到达 S 小时后置位 D2
| 项目 | 说明 |
|---|---|
| 格式 | HOUR 目标小时数 S, 当前值 D1(字), 输出 D2(位) |
| 操作数 | 目标小时数 S, 当前值 D1(字), 输出 D2(位) |
| 示例 | HOUR K100 D200 M0 |
| 步数 | 7※ |
| FNC | FNC 169 |
HOUR K100 D200 M0DHOUR — 32 位小时计(运行累时)
| 项目 | 说明 |
|---|---|
| 格式 | DHOUR 目标小时数 S, 当前值 D1(双字), 输出 D2(位) |
| 操作数 | 目标小时数 S, 当前值 D1(双字), 输出 D2(位) |
| 示例 | DHOUR K100 D200 M0 |
| 步数 | 13※ |
| FNC | FNC 169 (D) |
DHOUR K100 D200 M0HTOS — 时:分:秒 → 秒 转换(S 占3字 → D=秒数)
| 项目 | 说明 |
|---|---|
| 格式 | HTOS 源 S(3字), 目标 D |
| 操作数 | 源 S(3字), 目标 D |
| 示例 | HTOS D0 D10 |
| 步数 | 5 |
| FNC | FNC 164 |
HTOS D0 D10STOH — 秒 → 时:分:秒 转换(S=秒数 → D 占3字)
| 项目 | 说明 |
|---|---|
| 格式 | STOH 源 S, 目标 D(3字) |
| 操作数 | 源 S, 目标 D(3字) |
| 示例 | STOH D0 D10 |
| 步数 | 5 |
| FNC | FNC 165 |
STOH D0 D10RD3A — 读本机板载 AI 通道值(非外部模块)。操作数顺序:通道, 数据个数, 存入地址
| 项目 | 说明 |
|---|---|
| 格式 | RD3A 偏移量 S(=AI 通道), 数据个数 n, 存入 D |
| 操作数 | 偏移量 S(=AI 通道), 数据个数 n, 存入 D |
| 示例 | RD3A K0 K1 D100 |
| 步数 | 7 |
| FNC | FNC 176 |
RD3A K0 K1 D100WR3A — 写本机板载 AO 通道值(非外部模块)。操作数顺序:通道, 数据个数, 源地址
| 项目 | 说明 |
|---|---|
| 格式 | WR3A 偏移量 S(=AO 通道), 数据个数 n, 源 D |
| 操作数 | 偏移量 S(=AO 通道), 数据个数 n, 源 D |
| 示例 | WR3A K0 K1 D100 |
| 步数 | 7 |
| FNC | FNC 177 |
WR3A K0 K1 D100COMRD — 读软元件注释
| 项目 | 说明 |
|---|---|
| 格式 | COMRD S(软元件), D(目标) |
| 操作数 | S(软元件), D(目标) |
| 示例 | COMRD D0 D10 |
| 步数 | 5 |
| FNC | FNC 182 |
COMRD D0 D10CRC — 计算 CRC 校验码(n 字节数据)
| 项目 | 说明 |
|---|---|
| 格式 | CRC S(源首址), n(长度), D(结果) |
| 操作数 | S(源首址), n(长度), D(结果) |
| 示例 | CRC D0 K10 D20 |
| 步数 | 7 |
| FNC | FNC 188 |
CRC D0 K10 D20ABS — 绝对位置编码器当前值读取
| 项目 | 说明 |
|---|---|
| 格式 | ABS S(ABS 数据输入起始,占 3 点), D1(输出信号起始,占 3 点), D2(保存 32 位当前值) |
| 操作数 | S(ABS 数据输入起始,占 3 点), D1(输出信号起始,占 3 点), D2(保存 32 位当前值) |
| 示例 | ABS X0 Y0 D10 |
| 步数 | 7 |
| FNC | FNC 155 |
ABS X0 Y0 D10BTOW — 位→字:n 个位元件合成 1 个字
| 项目 | 说明 |
|---|---|
| 格式 | BTOW S(位首址), n(位数), D(字) |
| 操作数 | S(位首址), n(位数), D(字) |
| 示例 | BTOW M0 K4 D0 |
| 步数 | 7 |
| FNC | FNC 142 |
BTOW M0 K4 D0WTOB — 字→字节:1 个字拆成 n 个字节
| 项目 | 说明 |
|---|---|
| 格式 | WTOB S(字), D(目标起始), n(个数) |
| 操作数 | S(字), D(目标起始), n(个数) |
| 示例 | WTOB D0 D10 K4 |
| 步数 | 7 |
| FNC | FNC 141 |
WTOB D0 D10 K4GRY — 二进制数转换成格雷码
| 项目 | 说明 |
|---|---|
| 格式 | GRY S, D |
| 操作数 | S, D |
| 示例 | GRY D0 D2 |
| 步数 | 5 |
| FNC | FNC 170 |
GRY D0 D2GBIN — 格雷码转换成二进制数
| 项目 | 说明 |
|---|---|
| 格式 | GBIN S, D |
| 操作数 | S, D |
| 示例 | GBIN D0 D2 |
| 步数 | 5 |
| FNC | FNC 171 |
GBIN D0 D2DVIT — 中断定位(遇到中断输入才开始定位)
| 项目 | 说明 |
|---|---|
| 格式 | DVIT S1(中断后的输出脉冲数), S2(输出脉冲频率), D1(脉冲输出 Y), D2(方向信号输出) |
| 操作数 | S1(中断后的输出脉冲数), S2(输出脉冲频率), D1(脉冲输出 Y), D2(方向信号输出) |
| 示例 | DVIT K1000 K5000 Y0 Y4 |
| 步数 | 9 |
| FNC | FNC 151 |
⚠️ 本机型运行时这条不做任何动作,写法仅供对照三菱程序。替代做法用
DRVI/DRVA。
RND — 随机数生成(把 D 变成一个随机数)
| 项目 | 说明 |
|---|---|
| 格式 | RND D(结果) |
| 操作数 | D(结果) |
| 示例 | RND D0 |
| 步数 | 3 |
| FNC | FNC 184 |
RND D0