Skip to content

一、程序流程(FNC 00-09) ​

CJ — 条件跳转(FNC 00) ​

项目说明
格式CJ Pn
LP3U 范围P0~P4095(P63 为 END 跳转)

当驱动条件 ON 时跳转到 Pn 处执行;OFF 时顺序执行。

LD  X0
CJ  P10          ; X0=ON 时跳转到 P10
; ... 被跳过的程序
P10
LD  X1
OUT Y0

P63 是特殊的 END 跳转指针,跳转到 P63 等同于跳转到 END 指令。

程序分段:条件跳转在主程序段内跳,别跳到 FEND 之后的子程序段上

CALL — 子程序调用(FNC 01) ​

项目说明
格式CALL Pn
P 范围P0~P62、P64~P4095(P63 是特殊的 END 跳转指针)
嵌套层数最多 5 层

在主程序段里写 CALL Pn,执行到这里就跳去跑 Pn 那一段,跑到段尾的 SRET 再回来继续往下扫。

LD  X0
CALL P20         ; 调用 P20 子程序
FEND

P20
LD  X1
OUT Y0
SRET             ; 子程序返回

规则:子程序段必须放在 FEND 之后(见下面的分段图),段尾以 SRET 结束;不得自调用。

程序分段:CALL Pn 调用的是 FEND 之后那一段,段尾必须 SRET

SRET — 子程序返回(FNC 02) ​

项目说明
格式SRET(无操作数)
用在哪子程序段的最后一句

和 CALL 配对:扫到 SRET 就结束当前子程序段、回到那句 CALL 的下一句继续。子程序段写在 FEND 与 END 之间, 写错位置(放进主程序段里)会被当普通逻辑扫一遍,等于白写。

P20
LD  X1
OUT Y0
SRET

程序分段:子程序段以 SRET 收尾,段本体放在 FEND 之后

IRET — 中断返回(FNC 03) ​

IRET                ; 中断服务程序必须以它结尾

中断段(放在 FEND 之后那一段)的收尾。少了它,中断返回后接着往下执行子程序之外的指令, 逻辑就乱了。执行 IRET 后中断许可自动恢复。

程序分段:中断段以 IRET 收尾,段本体放在 FEND 之后

EI — 允许中断(FNC 04) ​

LD   M8000
EI                  ; 打开中断响应窗口

PLC 默认不响应中断,要用 EI 打开。它和 DI 之间的这一段是允许中断的窗口, 窗口外的输入事件不会被当作中断处理。

程序分段:EI / DI 在主程序段里圈出允许响应中断的窗口

DI — 禁止中断(FNC 05) ​

程序结构与中断机制:FEND 划界 + EI/DI 控制中断窗口

指令功能
EI允许中断
DI禁止中断
IRET中断返回

PLC 默认中断禁止,需用 EI 开启。

中断类型格式说明
输入中断I□0□ / I□1□X000~X005 上升沿(1)/下降沿(0)
定时器中断I6□□ / I7□□ / I8□□周期 1-99ms(STM32 版为 10-99ms)
计数器中断I010-I060高速计数器中断(6个)

中断屏蔽:M8050~M8059 控制各中断的使能/禁止

中断的完整用法、屏蔽标志对照表和注意事项见 4.4 中断。

LD   M8000
DI                  ; 关掉中断响应窗口

禁止中断。用在"这一段绝不能被中断打断"的地方(比如改一串参数、写一串输出)。 和 EI 成对使用,别只写一个。

程序分段:DI 关掉中断窗口,和 EI 成对使用

FEND — 主程序结束(FNC 06) ​

标记主程序结束,返回第 0 步开始下一扫描周期。子程序和中断服务程序须放在 FEND 之后。

FEND 与 END 的区别:FEND 后还有子程序/中断;END 标记整个程序结束。

LD   M8000
OUT  Y0
FEND                ; 主程序到此为止
LD   M8001
CALL P10            ; 子程序/中断段放在 FEND 之后
END

FEND 是主程序和子程序/中断程序的分界:它之前的每个周期都扫,它之后的只有被调用/被触发才执行。 整个程序的最后一句仍然是 END。只用 END 不用 FEND 的程序,子程序段会被当主程序扫一遍 —— 这是移植三菱程序时最常见的错。

程序分段:FEND 之前每周期扫描,之后只在被 CALL / 被中断触发时执行

WDT — 看门狗刷新(FNC 07) ​

刷新看门狗定时器,防止超时。默认看门狗时间 D8000(200ms)。

LPPLC 特有:可修改 D8000 调整看门狗时间。

梯形图:与下方指令表同一段程序

LD   M8000
WDT                 ; 把看门狗计时清零,接着算下一大段

看门狗是"一个扫描周期太长就停机报错"的保护。程序里有耗时很长的一段(大表查找、大量浮点运算)时, 在它中间插一句 WDT 续命。监视时间就是特殊寄存器 D8000。 没有超时的担心就不用写它 —— WDT 只占 1 步,但插错位置会掩盖真正的死循环。

FOR — 循环范围开始(FNC 08) ​

梯形图:与下方指令表同一段程序

LD   M8002
MOV  K0  D0
LD   M8000
FOR  K5             ; 下面这一段循环 5 次
INC  D0
NEXT
END

FOR~NEXT 之间的那段执行 S 次(K1~K32767,填 0 或负数按 1 次处理)。 最多嵌套 5 层,超了会报错。循环体里配合变址寄存器 Z 才能碰到数组式的数据区, 否则每次循环都在动同一个元件,等于白循环。

NEXT — 循环范围结束(FNC 09) ​

项目说明
FOR 格式FOR S
S 范围K1~K32767(-32768~0 视为 1)
嵌套层数最多 5 层
LD  X0
FOR K5
    INC D0
NEXT

STL — 步进梯形图 ​

RET — 步进梯形图 ​

STL 步进:指令表 ↔ 步进链 ↔ S 状态位时序,SET 下一步瞬间上一步自动复位

指令功能
STL S□□□步进梯形图开始
RET步进梯形图返回
STL S20
LD  X1
SET S21            ; S20 → S21

STL S21
LD  X2
OUT Y0
SET S22

STL S22
LD  X3
SET S20            ; 返回 S20

RET

STL 区限制:不能使用 MC/MCR/I/SRET/IRET。最多同时 9 个连续 STL。


实用例程 ​

梯形图:与下方指令表同一段程序

LD M8002
ORP X0
ORF X0
OR M114
ZRST D41 D47
ZRST M100 M107
ZRST S0 S100
LD X6
OR X7
AND X0
AND M60
ANDD= K8S0 K0
ANDD= K8S31 K0
SET S0
STL S0
LD S0
SET S20
STL S20
LD S20
SET M100
OUT T11 K150
LD T11
MPS
AND M51
OUT S21
MPP
ANI M51
OUT S22
RET
END

把上面的地址、主题、引脚替换成你项目里的即可。

各指令详细说明 ​

END — 程序结束:主程序执行到此返回,必须独占一行且直连左母线 ​

项目说明
格式END (无操作数)
操作数(无操作数)
示例END
步数见 2.7
FNC基本
END

程序分段:END 永远是最后一句,子程序与中断段放在 FEND 之后、END 之前

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