FANUC PMC 跳转指令是顺序程序里控制流程的核心工具。写在梯形图里,条件判断靠触点串联就够了。但总有些场景触点接不出来——比如”某条件成立时,跳过中间连续 20 行去执行后面的动作”。
这时候就得用跳转指令。
FANUC PMC 顺序程序里的跳转主力是 JMP(无条件跳转)和 LBL(标号),配合 CJMP(条件跳转)完成条件分支。
但也是它最容易用出死循环和漏执行。 我见过太多程序逻辑全对,因为一个 JMP 写错,整个顺序程序卡死。
这篇把 4 种写法讲透,把坑提前标出来。
一、JMP / LBL 指令格式解析
FANUC PMC 跳转指令的书写格式:
JMP LBL n
CJMP LBL n
LBL n
| 指令 | 名称 | 作用 |
|---|---|---|
| JMP n | 无条件跳转 | 忽略条件,直接跳到标号 n |
| CJMP n | 条件跳转 | 条件成立时跳到标号 n,否则继续往下 |
| LBL n | 标号 | 跳转目标,一个号只能标一次 |
工作逻辑一句话说清:
JMP 是”无条件回头”,LBL 是”回头后的落脚点”。两者必须成对使用,JMP 找不到对应 LBL 就报错,JMP 指向的位置不当就会漏执行或死循环。
标号 n 是跳转的唯一线索。同一个程序里,一个标号只能写一次,重复标号是常见低级错误。
安全警示:跳转指令属于顺序程序控制逻辑,修改后可能直接改变机床动作时序。请在机床处于安全状态(各轴静止、急停生效)时进行,或确保有资深工程师在场指导。修改前务必备份原始梯形图与顺序程序! 逻辑错误的跳转可能导致设备异常动作或进入死循环。
二、FANUC PMC 跳转指令第 1 种写法:无条件跳转 JMP
最简单的形式:执行到 JMP,就直接跳到对应 LBL 继续。
…
JMP LBL 20 ← 无条件跳
… ← 这段被跳过,不执行
…
LBL 20 ← 落脚点
…
实际用途:跳过暂时不需要执行的成段功能。
比如某台机床加了客户定制的可选功能,普通机型不需要,用 JMP 跳过:
JMP LBL 30 ← 非本机型配置,直接跳过
(可选功能 A 的完整逻辑,约 15 行)
LBL 30
这个写法有个前提条件必须讲清楚:跳过的那段内容里,不能有”跳转出口”以外的分支。
如果被跳过的段里还有别的 JMP 指向段外,跳过的同时那些 JMP 也失效了,可能造成后面找不到落脚点。
三、FANUC PMC 跳转指令第 2 种写法:条件跳转 CJMP
最常用的一种。 条件成立跳过去,不成立继续往下。
CJMP LBL 50 ← 条件成立,跳到 50
(条件成立时要执行的逻辑)
LBL 50
典型场景——按机床配置选择执行路径:
X10.0(配置开关)
CJMP LBL 60
(标准配置逻辑)
JMP LBL 70
LBL 60
(特殊配置逻辑)
LBL 70
注意这个结构里CJMP 和 JMP 必须配套:CJMP 跳走了,如果不在中间补一个 JMP 直接落到 LBL 70,那么条件不成立时会顺着往下执行 LBL 60 的内容,产生逻辑错乱。
记住这个规律:CJMP 跳走,就必须有一道 JMP 兜底回来,否则两条分支会串在一起。
四、FANUC PMC 跳转指令第 3 种写法:循环控制(死循环重灾区)
这是 JMP 最强大的用法,也是最容易写成死循环的地方。
标准循环结构:
LBL 100 ← 循环起点
(循环体,一圈要做的事)
(计数器累加 / 条件判断)
CJMP LBL 100 ← 条件未完成,跳回起点,再来一圈
(循环结束后执行)
逻辑:条件未完成就跳回起点重来,完成了才往下走。
这个结构的核心是退出条件必须存在。只要退出条件不成立,程序就在 LBL 100 和 CJMP 之间无限循环。
死循环是怎么产生的
现场几种典型死循环成因:
| 成因 | 表现 | 排查方法 |
|---|---|---|
| 循环体内没有退出条件 | PMC 卡死,机床无响应 | 检查 CJMP 条件来源地址 |
| 退出条件用错地址 | 循环永远不结束 | 在线监控该地址是否真会变 |
| 退出条件只在循环内赋值 | 第一次判断时条件恒成立 | 把状态位放到循环外 |
| 计数器永远到不了预置 | 循环不退出 | 查计数是否真在累加 |
最容易踩的是第二种:退出条件引用的状态位,在循环内被清掉了,等于每次判断都是”没完成”,于是无限循环。
一个实用建议
在循环体里加一个计数器或超次数保护,做兜底:
LBL 100
(循环体)
(累加循环次数计数器)
(次数超过预设值 → 强制退出并报警)
CJMP LBL 100
这样即使现场条件异常,也不会把 PMC 彻底卡死,而是给出报警让人去查原因。这一条在现场非常实用。
五、FANUC PMC 跳转指令第 4 种写法:子程序调用与返回
当某段逻辑需要在多处重复调用时,与其复制粘贴,不如做成子程序。
FANUC PMC 用 SUB 定义子程序起点,ENDSUB 定义结束。在顺序程序里用 CALL 调用。
(主程序)
CALL 1 ← 调用 1 号子程序
…
SUB 1 ← 1 号子程序开始
(要重复使用的逻辑)
ENDSUB ← 子程序结束,自动返回调用处
这个写法解决的核心问题是”重复代码的维护成本”。
如果同一段”换刀到位检测 + 超时报警”的逻辑在 5 个地方用到,用子程序就是写一遍;不用子程序就要改 5 处——漏改一处,就是隐蔽的隐患。
注意:部分 FANUC 系统顺序程序对子程序嵌套层数有严格限制,具体可嵌套层数与地址范围请查阅本机手册确认,不要凭经验假设。另外要注意子程序里不要写会改变主程序执行路径的跳转,否则返回位置会错乱。
六、4 种写法速查表
| 写法 | 指令组合 | 典型用途 | 最容易错在哪 |
|---|

| 无条件跳转 | JMP n + LBL n | 跳过可选功能段 | 跳过的段里藏了别的出口 |
|---|---|---|---|
| 条件跳转 | CJMP n + LBL n | 按配置选路径 | 漏写兜底 JMP,两分支串行 |
| 循环控制 | LBL n … CJMP n | 轮询等待条件成立 | 无退出条件 → 死循环 |
| 子程序调用 | CALL n + SUB n + ENDSUB | 多处复用同一段逻辑 | 嵌套超层、影响返回位置 |
七、FANUC PMC 跳转指令常见故障速查表
| 现象 | 可能原因 | 排查方向 |
|---|

| PMC 卡死,机床无动作响应 | 死循环,退出条件不成立 | 查 CJMP 的条件地址与赋值时机 |
|---|---|---|
| 跳过了本该执行的逻辑 | 跳转目标选错,或标号写错位 | 核对 LBL 号与 JMP 号一一对应 |
| 分支逻辑串在一起执行 | CJMP 后没写兜底 JMP | 补上JMP 落到另一分支起点 |
| 提示找不到标号 | JMP 的号与 LBL 的号不一致 | 全局搜索该号确认是否成对 |
| 编译报错,标号重复 | 同一个 LBL 写了多次 | 一个号只能标一次 |
| 子程序执行完不返回 | 程序末尾缺 ENDSUB | 补齐子程序结束指令 |
| 改了一个地方其他位置全乱 | 复制代码导致标号冲突 | 用子程序替代复制粘贴 |
关于”提示找不到标号”这条:这类报错系统一般能直接看出来,现场更多的情况是编译能过但运行不对——那基本就是标号号对了、位置错了,属于逻辑问题而非语法问题。
八、与梯形图配合使用的注意事项
JMP/LBL 是顺序程序指令,但很多工程师习惯从梯形图角度理解,这里有个常见混淆要澄清:
| 混淆点 | 正确认知 |
|---|---|
| 把 JMP 当成梯形图的触点串联 | 两者机制不同,JMP 是顺序程序层面的流程控制 |
| 以为 JMP 能替代所有条件判断 | 简单条件用触点串联更清晰,JMP 用于触点接不出的复杂流程 |
| 在 JMP 循环里直接操作 Y 输出不检查限位 | 循环内必须有退出保护和超时报警 |
一条经验:能用梯形图触点解决的,别用 JMP。JMP 是复杂度溢出时的工具,不是常规写法。 顺序程序越短、跳转越少,故障排查越容易——这是现场血泪教训。
小结
FANUC PMC 跳转指令写对,只记四条:
- JMP 与 LBL 必须成对,一个标号只能标一次
- CJMP 跳走要配 JMP 兜底,否则分支串行
- 循环必须有退出条件,再加一个超次数保护更稳
- 能用触点解决的别用 JMP,短程序是好程序
把这篇和 FANUC PMC 定时器 TMR 指令详解、FANUC PMC 计数器 CTR 指令详解连起来看,会更清楚 FANUC PMC 指令体系的分工:TMR 管时间,CTR 管次数,JMP/LBL 管流程。循环里用计数器做退出计数,正好是两者的典型配合。
如果 JMP/LBL 之外还有指令想搞清楚的,推荐从 零基础学习发那科PMC 梯形图教程 这篇开始,把顺序程序和梯形图的基本结构搞熟,再啃跳转、循环这些进阶内容会顺很多。遇到具体报警或者程序跑不通,也可以翻 FANUC PMC 故障排查实战 里的实例对照分析。
标签: FANUC系统 · 机床梯形图 · 学习内容 · 基础知识 · 维修案例
免责声明:本文内容基于 CNCShare 团队实战经验整理,仅供参考。不同机床配置、系统版本可能存在差异,实际操作请以设备官方手册为准。因据此操作导致的损失,CNCShare 不承担责任。文中标号、指令写法与嵌套层数限制仅用于说明通用逻辑,具体配置需现场验证。
























暂无评论内容