简介:三菱PLC指令表PDF,面向PLC编程初学者与工业自动化工程师,是日常编写、调试三菱程序时的高频实用速查文档。内容按功能分类系统编排,涵盖程序流控制指令(如CJ条件跳转、CALL子程序调用、IRET中断返回)、传送与比较指令(如MOV传送、SMOV位传送、BMOV成批传送)、算术逻辑运算指令(如ADD、SUB、MUL、DIV)、循环移位与FIFO读写指令等,并对每条指令对应的FX0S、FX0N、FX1S、FX1N、FX2N、FX2NC等不同型号支持情况做了明确标注。文件包共1个PDF文件,压缩包大小213KB,轻量易携带,可直接在电脑或手机端查阅。已有786人学习使用。指令表既包含助记符和完整功能说明,也列出了区间复位、解码、编码等常用高级指令,能帮助读者在选型与编程时快速比对、准确定位,减少反复翻查手册的时间,尤其适合现场调试和系统化学习参考。
1. 从一张指令表说起:三菱FX系列PLC的编程地图
接触三菱PLC的人手上基本都有一份PDF指令表,但真正把它当成工具书而非收藏文件的并不多。这份表的核心价值不只是罗列助记符,它更像一张型号兼容性地图——同样的功能在FX0S、FX1N、FX2N、FX2NC上能否实现、要不要换方案,表里每一行都写得很清楚。实际调试时经常遇到类似的情况:程序在FX2N上跑得好好的,换到FX0N就报错,原因往往不是逻辑写错,而是某个指令在目标机型上根本没有被编译支持。对用GX Works或GX Developer写梯形图、ST程序的工程师来说,搞清楚指令的功能只是入门,真正影响开发效率的是知道每条指令的适用边界、操作数格式和背后的标志位行为。这篇文章直接围绕指令表展开,把每一类指令族的用法、参数设置和排错方法过一遍,重点是让你能对着表写出可运行的梯形图,而不是只认识助记符。
2. 指令表的分类逻辑与FX系列型号兼容性边界
2.1 为什么指令按类别排列:程序流、传送、运算、移位四条主线
三菱FX系列指令表的结构不是随意排列的,它按照PLC执行程序时的数据流动路径来组织。第00到09号属于程序流程控制,解决的是"程序往哪儿走"的问题——跳转、调用、中断、循环。第10到19号属于传送与比较,解决的是"数据怎么搬、怎么判断"的问题。第20到29号是算术与逻辑运算,让数据发生数值变化。第30到43号则是循环移位、FIFO和编解码,处理的是批量数据的重新排列。
这个分类逻辑直接影响编程习惯。一个典型的控制程序大概是这样的骨架:先用CJ跳转或CALL组织主逻辑块,再用MOV把传感器输入或HMI设定值传送到数据寄存器D区,接着用CMP或ZCP判断当前状态处于哪个区间,之后根据判断结果做ADD、MUL等运算,最后如果需要缓存多个产品数据就用到SFWR和SFRD组成FIFO队列。指令表把这条链路完整覆盖了,所以查表时不应该按助记符去翻,而是先明确当前步骤要完成哪类操作,再到对应分类里找指令。
2.2 同一指令在不同FX型号上的支持差异
这是指令表最容易被忽略的一部分。"对应不同型号的PLC"那一列,直接决定了你写的梯形图能不能在当前CPU上运行。以循环指令FOR/NEXT为例,FX0S和FX0N这代机型不支持FOR/NEXT嵌套循环,FX1S和FX1N虽然支持FOR/NEXT,但不支持循环次数为负数的情况。再比如FIFO读取指令SFRD,FX0S上完全没有,如果程序里用了这条指令,编译阶段就会直接报错。
我在实际项目中吃过这个亏。之前做一个三轴搬运设备,用的是FX1N,程序里用了SFWR来做料盘数据的先入先出缓存,现场调试都通过了。后来客户要求降成本换成FX0N,结果程序根本无法编译,最终只能改用DECO加变址寄存器Z的轮询方式模拟FIFO。类似这种问题,用一份带兼容性列的表就能在前面排查掉。下面这张表整理了几个高频指令在不同FX型号上的支持差异,这是从编程软件编译结果和官方指令表综合出来的结论。
| 指令 | FX0S | FX0N | FX1S | FX1N | FX2N/FX2NC |
|---|---|---|---|---|---|
| CJ条件跳转 | 支持 | 支持 | 支持 | 支持 | 支持 |
| FOR/NEXT嵌套 | 不支持 | 不支持 | 支持 | 支持 | 支持 |
| BMOV成批传送 | 不支持 | 支持 | 支持 | 支持 | 支持 |
| SFWR/SFRD(FIFO) | 不支持 | 不支持 | 支持 | 支持 | 支持 |
| DECO/ENCO | 支持 | 支持 | 支持 | 支持 | 支持 |
| RCR/RCL带进位移位 | 不支持 | 支持 | 支持 | 支持 | 支持 |
| ZRST区间复位 | 不支持 | 支持 | 支持 | 支持 | 支持 |
2.3 操作数格式:指令能不能跑通的关键
指令表里每个助记符后面都跟着功能说明,但真正决定怎么写梯形图的是操作数格式。FX系列指令的操作数分为源操作数S和目的操作数D,有的指令还需要指定位数或点数。比如MOV指令的完整格式是MOV S D,S可以是常数K、H,也可以是数据寄存器D、计数器C、定时器T,甚至可以是位元件组合KnX、KnY、KnM。这里的Kn表示以4位为单位组合位元件,K2M0表示从M0开始的8个位元件M0到M7拼成一个字节数据源。
传送比较指令里最常用到的就是Kn格式的转换。假设要读取X0到X7这8个输入点的状态,直接MOV X0 D0是编译不过的,必须写成MOV K2X0 D0,意思是将X0到X7作为一个8位数据传送到D0。同理,如果要输出一个数值到Y0到Y7,要用MOV D0 K2Y0。这个细节是新手最容易犯的错——漏写Kn前缀导致编译报错,或者写错位组数导致数据截断。位组合指令在传送、比较、运算指令中通用,凡是涉及位元件批量操作的场景都会遇到。
2.3.1 位元件组合与数据寄存器D的对应关系
K1代表4位,K2代表8位,K3代表12位,K4代表16位。FX系列的数据寄存器D是16位存储,所以一个完整的D值对应K4的位组合。如果写K1X0到D0,只能得到X0到X3这4个输入的值,高12位自动补0。反过来从D0传到K1Y0,只输出D0的低4位到Y0到Y3。这在处理模拟量输入模块时很关键,FX2N-4AD读出的数据在D寄存器里是16位带符号数,要输出到12位模拟量模块时需要先做移位和掩码,直接MOV会多出高4位。搞清楚了Kn格式,这类问题的定位就变成了简单的十六进制位宽换算。
3. 传送比较与算术指令的梯形图实现与参数设置
3.1 CMP比较指令的标志位行为与典型应用
CMP指令的完整格式是CMP S1 S2 D,它比较S1和S2的值,结果不是通过M8020、M8021、M8022这三个特殊继电器来体现,而是写入以D为基准的连续3个位元件中。比如CMP D0 K100 M10,当D0小于100时M10为ON,等于时M11为ON,大于时M12为ON。这三个位元件的状态在CMP指令每次执行时都会刷新,即使D0的值没有变化,只要CMP所在的梯级条件成立,结果就一直保持。
这里有个容易犯的错:很多人把CMP的比较结果存储在M10到M12中,然后又在后面的程序里对这些M触点了其他线圈,结果发现CMP指令一执行,M触点的逻辑被强制覆盖,整个控制流程乱掉。正确做法是给CMP的结果位单独划分区域,不要和程序内其他逻辑复用它。我一般习惯用M50、M51、M52来存放CMP结果,预留M10到M49给其他功能。区间比较ZCP指令的行为类似,只是把两个源操作数变成一个下限一个上限,结果同样写入3个连续位。
// 梯形图对应的指令表写法 // 条件: X0=ON时执行区间比较 LD X0 ZCP K100 K200 D0 M20 // 结果说明: // M20=ON 表示D0 < 100 // M21=ON 表示K100 <= D0 <= K200 // M22=ON 表示D0 > 200代码逻辑说明:这个例子里ZCP将D0的当前值和上下限K100、K200进行比较,比较结果直接反映在M20到M22三个位元件的通断状态上。后续程序中如果要根据温度区间做不同动作,直接引用M20、M21、M22触点就可以。参数方面要注意上下限必须满足下限小于等于上限,否则PLC执行时比较结果无意义,程序本身不会报错,这属于逻辑层面的错误。
3.2 MOV传送指令的位宽与符号处理
MOV指令看起来简单,但它处理数据时遵循16位二进制原则。源操作数K100会被当作16位二进制0000000001100100整体传送,如果目标操作数是D0,D0就是100这个数值。但如果你从D0再传送到KnY组合,情况就变了,比如MOV D0 K4Y0,此时Y0到Y15的16个输出点会按照D0的每一位直接输出,D0的第0位对应Y0,第15位对应Y15。这种用法的典型场景是步进电机脉冲方向控制——用MOV给一个16位输出端口赋值,同时控制多路IO电平状态。
符号扩展是MOV需要特别留意的。若存放在D0里的值是-5,也就是16位二进制补码形式FFFFH,执行MOV D0 D10后D10同样是FFFFH。但执行BMOV或FMOV批量传送后再做算术运算,符号位的行为就要小心。三菱FX处理器在16位范围内不会自动扩展符号位,所以如果你把D0传送给32位运算要手动处理高位。超过16位的数值运算需要用32位指令,例如MOVD、CMPD,D后缀表示处理32位数据,占用连续的2个数据寄存器。
// 32位传送示例 // 把D0和D1构成的32位数据传给D10和D11 LD X1 DMOV D0 D10 // 说明: D0存低16位, D1存高16位, D10和D11同理 // 适用场景: 高速计数器当前值读取、伺服绝对位置读取这段程序用于32位数据的整体搬移,FX3U以上型号还支持64位运算,但FX2N系列最高支持32位。实际项目中伺服位置值往往是32位无符号数,用DMOV比两条MOV语句更直观,效率也更高。
3.3 ADD SUB MUL DIV的运算规则与结果寄存器占用
算术指令的梯形图写法是ADD S1 S2 D,执行D的值等于S1加上S2。运算结果超出16位范围时溢出标志M8022会置ON,但D中只保留低16位。做加法时如果两个同号的16位数相加结果超过了32767或低于-32768,M8022就是个重要的判断依据。比如处理两个变频器频率给定值相加,一个设定350Hz一个设定200Hz,结果超过16位表示范围时就要靠M8022捕捉溢出再做限幅处理。
MUL乘法指令比较特殊,它的结果不是存到一个寄存器,而是占用连续两个寄存器。MUL D0 D2 D4的含义是(D0)乘以(D2),结果低16位存入D4,高16位存入D5。如果按照普通指令的惯性只读D4,遇到负数和超过65535的正数结果就会错乱。DIV除法指令则分成商和余数,DIV D0 D2 D4得到(D0)/(D2)的商存D4,余数存D5,除数为0时M8020标志置ON,商保持原值不变。这些边界行为指令表里没写,但排错时几乎每一条都会遇到。
3.4 INC DEC自增自减的死循环陷阱
INC和DEC指令执行时不需要目标操作数的附加条件,但有一个使用习惯要养成:INC D0每执行一次D0加1,如果这个指令所在梯级条件持续为ON,那么每个扫描周期都会加一次,而不是预期中的"执行一次"。很多人在做计数器手动加1功能时,把INC放在X0常开触点后面,按住按钮发现数值快速跳变,就是因为没有考虑扫描周期。正确的做法是给INC的执行条件加上上升沿脉冲,用LDP或PLS指令,让X0从OFF变ON的瞬间只执行一次。
// 正确写法: 只在X0上升沿时D0加1 LD X0 PLS M100 LD M100 INC D0 // 错误写法: 直接LD X0然后INC D0, 会导致按住时快速递增说明:PLS指令将X0的上升沿信号转换为一个扫描周期的脉冲M100,INC只在脉冲为ON的那个周期执行一次,这样D0的数值变化就和按钮的物理按压次数一一对应。这个模式在手工微调、步进点动、配方序号切换等场合会反复用到,是FX编程的基本功。
4. 循环移位与FIFO读写指令的实战参数配置
4.1 ROR ROL RCR RCL的位宽参数n与进位标志
循环移位指令有4条:ROR循环右移、ROL循环左移、RCR带进位右移、RCL带进位左移。梯形图中统一写作ROR D n,n的范围是0到15,超过15按15处理。不带进位的循环右移,是把D的最高位移到最低位和进位标志M8022,同时也把最低位移到最高位;带进位的右移则把M8022这个进位标志纳入移位链条,相当于9位或17位的环形移位。
位宽参数n的选择直接决定移位效率。例如流水线传送带上需要用DO的输出控制16个阀门的开关顺序,用ROL D0 K1每周期左移一位即可实现阀门的逐个开启和关闭。n的取值不同效果完全不同,K1是每次移1位,K4是每次移4位即半个字节。移位指令没有自动计数功能,如果要对移位次数做精确控制,必须配合FOR循环或计数器,循环多少次就执行多少次移位。
// 16位循环左移4位的应用 // 每个扫描周期把D10的低12位左移4位, 高4位移到低4位 LD X10 MOV K4K2M0 D10 ROL D10 K4 // 常用于编码器角度信号的循环解码、流水线工序号轮询实际项目中更常见的用法是用SFTR位右移和SFTL位左移来操作位元件序列。SFTR的格式是SFTR D n M D,它需要指定移位方向、移位位数、参与移位的位元件起始号和移位长度。举例SFTR X0 M0 K4 K10,意思是以X0为输入,M0到M9这10个位每次向高位移4位,相当于给一组连续的M位元件做批量搬运。这个功能在步进工位跟踪里特别好用,产品每前进一个工位,M序列整体移动一次,M0上的状态给下一工位。
4.2 SFWR与SFRD构成FIFO队列的参数和行为
FIFO先入先出在FX指令表里编号38和39,SFWR负责写入、SFRD负责读出。SFWR的格式是SFWR S D n,这里S是写入数据的源寄存器,D是FIFO栈底指针寄存器,n是栈的深度。比如SFWR D0 D10 K5,表示D10是FIFO的总指针,D11到D15是实际存储区域,共可缓存5个数据。执行一次SFWR时,先把D0当前值写入D10+1指向的寄存器,然后把D10的值加1。当D10的值等于n-1即4时,FIFO已满,M8020置ON,再写数据会覆盖栈顶且指针不再增加。
SFRD读出指令格式SFRD S D n,执行时从S+1取出数据存入D,栈内后期数据整体前移,指针D减1。这个机制和堆栈不同,是纯正的先进先出,适合做产品队列缓存。比如涂布机生产线上各工位的产品批次号,可以用SFWR顺序压入队列,到下料工位用SFRD弹出最早批次号做追溯记录。队列满和队列空的判断分别用M8020和M8021标志位,和数据寄存器比较指令不同,不需要额外占用M位。
// FIFO写入示例 // 当X3由OFF变ON时, 将D100当前值写入D200开始的FIFO, 深度10 LD X3 PLS M102 LD M102 SFWR D100 D200 K10 // D200为指针, D201到D210为缓存区 // 当D200=9时, M8020变为ON, 表示FIFO已满 // FIFO读出示例 LD X4 PLS M103 LD M103 SFRD D200 D110 K10 // 读出的是最先写入的数据 // D200指针减1, 当D200=0时, M8021变为ON, 表示FIFO已空参数说明:K10是FIFO的深度,意味着除了指针寄存器D200外,D201到D210这10个寄存器被FIFO占用。如果程序其他地方误用了D201以上的数据寄存器,FIFO数据会被污染,排错极难察觉。建议在程序开头对FIFO区域强制定义注释块,标明哪些D寄存器被FIFO占用。指针寄存器D200在首次使用前必须手动清零,否则栈内残留旧数据,这个初始化步骤很容易遗漏。
4.3 ZRST区间复位与DECO ENCO的配合使用
区间复位ZRST的格式是ZRST D1 D2,把D1到D2连续范围内的元件全部复位。这个指令对M位和D寄存器都适用,比如ZRST M0 M499,把M0到M499共500个中间继电器全部复位。ZRST的效率比逐条RST高很多,但要注意起始编号必须小于等于终止编号,否则不执行。设备启动初、急停恢复后做全量复位时,用ZRST一行能顶几十行RST,程序可读性也好很多。
DECO和ENCO是编码解码指令。DECO的格式是DECO S D n,n表示要解码的位数,比如DECO D0 M10 K3,取D0低3位二进制的值0到7,将M10开始的8个位中对应编号的位置ON,其余清零。这个功能在分度台选中控制中很好用——D0的数值代表工位号,解码后对应的M位为ON,后面的动作逻辑直接引用这个M位执行该工位的加工流程。ENCO是逆过程,输入一组位元件中第一个为ON的位编号写入目标寄存器。
5. 编程软件中的指令表索引与在线调试定位方法
5.1 GX Works指令检索的两种路径
写梯形图时如果记不住指令的完整格式,GX Works的指令面板可以直接按助记符筛选,输入MOV会列出所有含MOV的指令,然后按F1调出该指令的详细说明面板,里面有操作数顺序、适用型号、错误标志三个关键信息。比PDF指令表更方便的是,软件会根据当前CPU型号过滤掉不支持的指令,如果指令面板里某条指令是灰色不可选的,说明当前机型不支持,也就从源头规避了换机型编译报错的问题。
5.2 通过监控窗口验证移位和FIFO的工作状态
在线调试时最常见的问题是指令执行了但结果不对。以FIFO为例,程序跑起来后D200指针不一定是你期望的数值,这时就要用到监控窗口。把D200和D201到D210全部拖入监控窗口,以十进制方式显示,同时观察M8020和M8021的状态。如果每次写入后指针递增,但D201的值不是最新写入值,那大概率是FIFO区域和其他指令的目标寄存器重叠了。此时用交叉引用功能Ctrl+Alt+F查找这些寄存器都被哪些指令使用,通常能立刻定位到冲突。
对于移位指令,监控位元件M序列的状态需要以位为单位查看。在监控窗口把M0到M15按二进制格式显示,或用软元件批量监控视图按16位一组显示。执行单步运行或运行中修改D寄存器值后,观察移位结果是否按预期推进。发现移位方向反了,就把ROR改成ROL,或者把SFTR和SFTL互换,这是最直接的判断。
5.3 针对标志位使用的易错点排查清单
- CMP、ZCP结果占用连续3个点位,避免在程序中和普通线圈触点复用同一区域,建议单独划分M区段。
- MUL结果占2个寄存器,DIV结果商和余数各占1个,不要在后续程序里混淆。
- INC、DEC的执行次数由扫描周期决定,配合PLS或LDP使用才能实现按一次加一的效果。
- RCR、RCL带进位移位时,M8022的初始状态要提前用RST清掉,否则第一次移位结果会多带一个随机进位。
- SFWR满的时候M8020为ON,继续写入数据不会报错但数据会覆盖旧值,需要联锁控制。
- ZRST不能用于位元件组合像K4Y0这种形式,它只支持连续的位元件编号或数据寄存器编号。
- DECO的n参数最大8,对应256个输出位,不要设置大于8否则编译报错。
以FIFO排错为例,如果SFRD读出的数据和写入顺序不一致,优先检查是不是在写入端到读出端之间程序改动了D200指针。有的工程师会在中途对D200执行了MOV或INC,导致指针漂移,队列逻辑瞬间崩掉。用监控窗口确认D200在每次写入或读出前后只变化1,是快速定位这类问题的关键。除了逻辑层面的检查,还要看PLC的RUN灯是否闪烁当数据变化时,如果扫描周期过长,FIFO读写和其他运算的实时性就需要用中断子程序来处理,这时指令表里的EI、DI、IRET这几条中断控制指令就派上用场了,具体用法是在高速计数中断中调用SFRD读取缓存,保证数据不丢失。
本文还有配套的精品资源,点击获取