主题
一、程序流程(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 Y0P63 是特殊的 END 跳转指针,跳转到 P63 等同于跳转到 END 指令。
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 结束;不得自调用。
SRET — 子程序返回(FNC 02)
| 项目 | 说明 |
|---|---|
| 格式 | SRET(无操作数) |
| 用在哪 | 子程序段的最后一句 |
和 CALL 配对:扫到 SRET 就结束当前子程序段、回到那句 CALL 的下一句继续。子程序段写在 FEND 与 END 之间, 写错位置(放进主程序段里)会被当普通逻辑扫一遍,等于白写。
P20
LD X1
OUT Y0
SRETIRET — 中断返回(FNC 03)
IRET ; 中断服务程序必须以它结尾中断段(放在 FEND 之后那一段)的收尾。少了它,中断返回后接着往下执行子程序之外的指令, 逻辑就乱了。执行 IRET 后中断许可自动恢复。
EI — 允许中断(FNC 04)
LD M8000
EI ; 打开中断响应窗口PLC 默认不响应中断,要用 EI 打开。它和 DI 之间的这一段是允许中断的窗口, 窗口外的输入事件不会被当作中断处理。
DI — 禁止中断(FNC 05)
| 指令 | 功能 |
|---|---|
| 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 成对使用,别只写一个。
FEND — 主程序结束(FNC 06)
标记主程序结束,返回第 0 步开始下一扫描周期。子程序和中断服务程序须放在 FEND 之后。
FEND 与 END 的区别:FEND 后还有子程序/中断;END 标记整个程序结束。
LD M8000
OUT Y0
FEND ; 主程序到此为止
LD M8001
CALL P10 ; 子程序/中断段放在 FEND 之后
ENDFEND 是主程序和子程序/中断程序的分界:它之前的每个周期都扫,它之后的只有被调用/被触发才执行。 整个程序的最后一句仍然是 END。只用 END 不用 FEND 的程序,子程序段会被当主程序扫一遍 —— 这是移植三菱程序时最常见的错。
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
ENDFOR~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
NEXTSTL — 步进梯形图
RET — 步进梯形图
| 指令 | 功能 |
|---|---|
| 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
RETSTL 区限制:不能使用 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