ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

三菱FX系列PLC指令表全解析:从梯形图到实战排错

2026/9/19 6:24:35 拓冰建站 浏览量
三菱FX系列PLC指令表全解析:从梯形图到实战排错 简介三菱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读取指令SFRDFX0S上完全没有如果程序里用了这条指令编译阶段就会直接报错。我在实际项目中吃过这个亏。之前做一个三轴搬运设备用的是FX1N程序里用了SFWR来做料盘数据的先入先出缓存现场调试都通过了。后来客户要求降成本换成FX0N结果程序根本无法编译最终只能改用DECO加变址寄存器Z的轮询方式模拟FIFO。类似这种问题用一份带兼容性列的表就能在前面排查掉。下面这张表整理了几个高频指令在不同FX型号上的支持差异这是从编程软件编译结果和官方指令表综合出来的结论。指令FX0SFX0NFX1SFX1NFX2N/FX2NCCJ条件跳转支持支持支持支持支持FOR/NEXT嵌套不支持不支持支持支持支持BMOV成批传送不支持支持支持支持支持SFWR/SFRD(FIFO)不支持不支持支持支持支持DECO/ENCO支持支持支持支持支持RCR/RCL带进位移位不支持支持支持支持支持ZRST区间复位不支持支持支持支持支持2.3 操作数格式指令能不能跑通的关键指令表里每个助记符后面都跟着功能说明但真正决定怎么写梯形图的是操作数格式。FX系列指令的操作数分为源操作数S和目的操作数D有的指令还需要指定位数或点数。比如MOV指令的完整格式是MOV S DS可以是常数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个连续位。// 梯形图对应的指令表写法 // 条件: X0ON时执行区间比较 LD X0 ZCP K100 K200 D0 M20 // 结果说明: // M20ON 表示D0 100 // M21ON 表示K100 D0 K200 // M22ON 表示D0 200代码逻辑说明这个例子里ZCP将D0的当前值和上下限K100、K200进行比较比较结果直接反映在M20到M22三个位元件的通断状态上。后续程序中如果要根据温度区间做不同动作直接引用M20、M21、M22触点就可以。参数方面要注意上下限必须满足下限小于等于上限否则PLC执行时比较结果无意义程序本身不会报错这属于逻辑层面的错误。3.2 MOV传送指令的位宽与符号处理MOV指令看起来简单但它处理数据时遵循16位二进制原则。源操作数K100会被当作16位二进制0000000001100100整体传送如果目标操作数是D0D0就是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、CMPDD后缀表示处理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或低于-32768M8022就是个重要的判断依据。比如处理两个变频器频率给定值相加一个设定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的上升沿信号转换为一个扫描周期的脉冲M100INC只在脉冲为ON的那个周期执行一次这样D0的数值变化就和按钮的物理按压次数一一对应。这个模式在手工微调、步进点动、配方序号切换等场合会反复用到是FX编程的基本功。4. 循环移位与FIFO读写指令的实战参数配置4.1 ROR ROL RCR RCL的位宽参数n与进位标志循环移位指令有4条ROR循环右移、ROL循环左移、RCR带进位右移、RCL带进位左移。梯形图中统一写作ROR D nn的范围是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和39SFWR负责写入、SFRD负责读出。SFWR的格式是SFWR S D n这里S是写入数据的源寄存器D是FIFO栈底指针寄存器n是栈的深度。比如SFWR D0 D10 K5表示D10是FIFO的总指针D11到D15是实际存储区域共可缓存5个数据。执行一次SFWR时先把D0当前值写入D101指向的寄存器然后把D10的值加1。当D10的值等于n-1即4时FIFO已满M8020置ON再写数据会覆盖栈顶且指针不再增加。SFRD读出指令格式SFRD S D n执行时从S1取出数据存入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为缓存区 // 当D2009时, M8020变为ON, 表示FIFO已满 // FIFO读出示例 LD X4 PLS M103 LD M103 SFRD D200 D110 K10 // 读出的是最先写入的数据 // D200指针减1, 当D2000时, 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 nn表示要解码的位数比如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区域和其他指令的目标寄存器重叠了。此时用交叉引用功能CtrlAltF查找这些寄存器都被哪些指令使用通常能立刻定位到冲突。对于移位指令监控位元件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读取缓存保证数据不丢失。本文还有配套的精品资源点击获取