简介:面向工业自动化工程师与PLC初学者的欧姆龙PLC指令速查文档,系统梳理LD、AND、OR、NOT、OUT等基本指令,以及ADD、SUB、MUL、DIV、MOV、CONV、FOR...NEXT、CALL、JMP等功能指令,并扩展串行通信、PID控制、高速计数、模拟量处理等高级应用。资源以单一Word文档形式提供,共1个文件,docx格式,压缩包大小3.66MB,便于离线查阅与检索。目前已有223人学习下载,适合在编程调试时快速定位指令用法。文档内容覆盖从逻辑控制到复杂运算、从定时计数到闭环调节的完整指令体系,并结合CX-Programmer/CX-One编程环境说明,可帮助读者理解欧姆龙PLC的指令逻辑与应用场景,提升工业控制程序的设计与排错效率。 把《欧姆龙OMRON PLC指令大全》这类文档从头翻一遍,我估计有三成的人会直接放弃。原因很简单,厚厚几百页的指令手册把所有指令按字母和功能码排列,但根本没有告诉你哪些指令值得先掌握、哪些指令之间会互相干扰、实际调设备时又会踩到什么坑。我在现场从CP1E一路用到CJ2M和NJ,最大的体会是:PLC指令不是背出来的,而是按“确认分类→常用优先→带着坑验证”这样一轮一轮用出来的。这篇博文就按这个思路,把欧姆龙PLC指令体系拆开讲一遍。适合刚入门PLC梯形图的初学者,也适合那些已经会写LD和OUT、但一遇到CMP标志位读不到、TIM和CNT编号冲突就卡壳的工程师。
1. 拿到《指令大全》之后,先搞懂欧姆龙的指令分类逻辑
1.1 一个系列一套体系:CP、CJ、CS和NJ的差异
很多人问我,欧姆龙PLC指令是不是全系列通用。答案是不完全通用。CP系列(CP1E、CP1H、CP1L)属于小型一体机,CJ系列和CS系列是模块式中型机,NJ/NX系列则是走EtherCAT、偏向IEC 61131-3编程方式的控制器。前面几个系列在CX-Programmer里使用同一套梯形图指令体系,NJ/NX则主要在Sysmac Studio里用ST、LD方式编程,指令风格已经有明显变化。
所以当你拿到一份叫“欧姆龙指令大全”的文档时,第一件事不是从头看,而是确认它对应哪个系列。我见过不少初学者拿CJ2的指令手册去查CP1E的指令,结果发现指令不在指令列表里,又或者指令名称对得上但数据区范围对不上。CX-Programmer本身会在你输入指令时根据当前CPU型号过滤掉不支持的指令,所以如果软件里敲不出那个助记符,多半就是该CPU不支持,而不是你操作有问题。
1.2 基础指令与功能指令:先会走路再学跑步
欧姆龙的梯形图指令可以简单分成两大类。一类是基础指令,比如LD(常开触点)、AND(串联)、OR(并联)、OUT(线圈)、SET/RESET这些,它们没有所谓的“功能码”,直接靠助记符输入。另一类是功能指令,比如MOV、CMP、ADD这些,在传统手册里往往写成MOV(021)、CMP(020)这种带功能码的形式,括号里的数字就是历史沿革下来的功能号。
为什么手册要强调功能码?因为老PLC程序员看程序的时候,不只看助记符,还看功能码判断指令版本和兼容性。现在的CX-Programmer虽然已经弱化了功能码的使用,但你在老图纸、老程序里依然会看到这些写法。理解了基础指令和功能指令的差别,后面看指令手册会轻松很多。
按照我自己的习惯,欧姆龙指令可以按用途分这么几大块:触点与线圈指令、定时器/计数器指令、数据传送与比较指令、算术与逻辑运算指令、移位循环指令、程序流程控制指令、中断与通信指令、高速计数与脉冲输出指令。初学阶段,先把前六类中的常用子集吃透,就足够应付绝大多数设备维护和小型单机项目了。别指望把几百页手册全部背下来,那既不现实也没必要。
2. 触点、线圈与置位复位:梯形图上最常写的指令
2.1 LD/AND/OR和AND LD/OR LD的区别要用手画一遍
触点指令是梯形图的地基。LD是加载常开触点,LD NOT是加载常闭触点;AND是把触点串联进当前回路,AND NOT是串联常闭;OR是把触点并联,OR NOT是并联常闭。这些概念大部分人一看就懂,但真正让新手卡住的是AND LD和OR LD这两个处理“块”的指令。
AND LD用于“块与块串联”。比如左边有一个并联块(X0和X1并联),右边有另一个并联块(X2和X3并联),两边的结果要串联在一起,就必须在串接点位置使用AND LD。OR LD则相反,它处理的是“块与块并联”。很多初学者不理解为什么不能直接用一个AND或OR把它们连起来,那是因为AND和OR只能作用于单个触点,不能作用于一个已经有逻辑组合的“块”。
我建议你拿张纸,把这两种结构各画三遍,然后用CX-Programmer实际编译试一次。这个知识点不靠背,靠手感。生产中大量的电机起保停电路、双条件互锁电路,本质都是这种触点组合的堆叠。
2.2 SET、RESET、KEEP与边沿检测:保持和瞬动是两回事
OUT线圈的输出状态取决于输入条件,条件一断开输出就释放。但在很多设备控制里,我们需要“一旦条件满足,输出一直保持,直到另一个条件把它复位”,这就轮到SET和RESET上场。SET是置位线圈,RESET是复位线圈,两者配合可以实现锁存功能。注意SET/RESET本身不保存到掉电保持区,如果设备断电后还要求保持这个状态,数据必须落在H区这类保持区域里,或者用PLC参数把对应W区设为掉电保持。现场最常见的错误是把重要的机床状态放在W区,断电再上电后状态丢失,设备流程全乱。
KEEP(011)是欧姆龙传统意义上的锁存继电器指令,功能上等价于一组SET和RESET,但在老图纸里出现频率非常高,遇到老程序还是要能看懂。
边沿检测指令是另一个高频但容易被轻视的点。DIFU(013)检测到输入条件从OFF变ON的上升沿时,输出一个扫描周期的ON;DIFD(014)检测下降沿。CX-Programmer里更现代的写法是用UP和DOWN指令,或者在操作数前面加@和%前缀。比如@MOV表示“仅在上升沿那一扫描周期执行一次MOV”,这类写法在传送数据、触发单次动作时非常有用。我调程序时经常用@前缀控制数据初始化,避免每个扫描周期都反复传送、把前一次的结果覆盖掉。
3. 定时器与计数器:TIM/CNT的核心机制和常见坑
3.1 共用编号池:为什么TIM000和CNT000不能同时用
新手看欧姆龙手册时,最容易忽略的是定时器和计数器共用一个编号池。也就是说,TIM000和CNT000不能同时出现在程序里,因为它们占用的是同一个编号资源。老款机型确实会因此直接报重复定义错误,新款机型虽然软件层面可能允许,但逻辑上也会互相干扰,需要尽量避开。
这个设计其实源于早期PLC硬件上的定时器/计数器共用电路。你现在用CX-Programmer编程时,就算编号重复导致编译出了个警告,也别不当回事。我处理过一台老设备,程序里TIM001在子程序A里用,CNT001在子程序B里用,两个子程序互相独立,平时不报错,一旦同时触发就会导致计数器跳动异常,排查了很久才定位到编号冲突上。养成习惯:每个项目里都单独列一个“已用编号表”,把TIM和CNT放在同一张表里管理,就不会踩这个坑。
3.2 定时器设定值的BCD与BIN问题:设10秒变成6.4秒
欧姆龙定时器有个历史包袱——老式TIM指令的设定值按BCD(二-十进制)解释,而带X的指令TIMX则按BIN(二进制)解释。如果你用MOV指令往D区里送一个“100”,然后把这个D区作为TIM的设定值,会发现定时时间经常对不上。原因是“100”在二进制里是0x0064,BCD解释时按每4位一位十进制数,就变成了64,对应6.4秒,而不是10秒。
我现在的习惯是:新项目一律用TIMX、TIMHX、CNTX这类带X的指令,设定值按二进制处理,和触摸屏传过来的数值天然一致,省掉很多BCD和BIN转换的麻烦。老项目维护时就看清楚原程序用的是TIM还是TIMX,再决定D区里的数怎么填。别小看这个细节,现场“定时不准”的问题里,至少有两成根因是这个。
还有个实用技巧:定时器的设定值不一定是常数,可以是D区地址。这样你就能在触摸屏上直接修改定时时间,而不需要每次改程序。比如TIMX 000 D100,D100的值由人机界面写入。这个用法在很多需要现场调节工艺时间的设备上是刚需。
3.3 定时器串联的经典应用:交通灯和循环控制
定时器最经典的应用就是延时和循环。以带左转的交通灯控制为例,整个时序可以分解为东西直行、东西左转、南北直行、南北左转四个主阶段,每阶段之间加黄灯过渡。实现方式就是把多个定时器串联:第一个定时器计时到,驱动第一组灯并启动第二个定时器;第二个定时器计时到,驱动第二组灯并启动第三个定时器。每个定时器的常开触点既控制输出,又作为下一个定时器的启动条件。
这种“定时器链”的思路,比用很多SET/RESET硬写逻辑要清晰得多。搅拌机控制、电机星三角切换、传送带顺序启动,本质上也都是定时器链或定时器+计数器的组合。计数器CNT常用于产品计数,比如每检测到5个工件就启动一次气缸动作,检测信号接在计数器的计数输入上,到位信号作为复位条件。掌握了TIM和CNT的组合,你能解决现场一大半的时序控制问题。
4. 数据传送与比较指令:让PLC真正“会计算”
4.1 MOV家族的日常:不只是把一个数搬过去
MOV(021)是最基础、也是最高频的数据传送指令,作用是把源数据复制到目的地址。举例来说,设备切换配方时,可以把一组配方参数从数据区批量搬到工艺参数区;触摸屏上修改的设定值,可以通过MOV指令实时写入到定时器SV区或模拟量输出通道里。
MOV的变体也值得了解一下:MOVL处理32位双字数据,适合处理更大的数值;MOVD可以只移动一个16位字中的某几位,在老式BCD数据处理中经常用到;XFER用于块传送,可以一次把连续N个字的数据搬走;BSET则是把一片连续数据区全部设置为同一个值,常用于数组初始化。这些指令不需要全部精通,但遇到了要知道还有别的选择,否则就会像我刚开始一样,遇到连续数据复制只能写一排MOV,程序又长又难维护。
4.2 CMP指令与判断标志位:为什么标志位“读不到”
CMP(020)是比较指令的核心,它比较两个通道的值,但并不直接把比较结果送给线圈,而是反映到系统的标志位上。在CX-Programmer里,你可以在程序中使用P_EQ(相等)、P_GT(大于)、P_LT(小于)这些系统符号来读取比较结果。很多刚上手的人困惑“CMP没有输出”,其实就是没理解标志位这个机制。
这里有一个极其重要的坑:这些比较标志是全局共用的,意味着下一次执行CMP或者其他比较类指令时,上一次的结果会被覆盖。正确的写法是CMP执行完之后,在下一个扫描周期、且没有其他比较指令插入的情况下,立即读取标志位。如果中间隔了别的比较,或者你想把结果留到后面的程序段用,就必须先把标志位状态保存到W区或内部辅助继电器里。我在处理一个多工位检测程序时,就因为两个CMP之间夹了一条数据传送指令,导致标志位被刷新,排查了整整半天。
下面这个表是CMP最常用的几个判断标志:
| 标志 | 含义 | 说明 |
|---|---|---|
| P_EQ | 相等 | 源1 = 源2 |
| P_GT | 大于 | 源1 > 源2 |
| P_LT | 小于 | 源1 < 源2 |
| P_GE | 大于等于 | 源1 ≥ 源2 |
| P_LE | 小于等于 | 源1 ≤ 源2 |
| P_NE | 不等 | 源1 ≠ 源2 |
如果你的CPU型号支持,更推荐使用带等号的新版比较指令,比如CMPE、CMPNE、CMPGT这类。它们直接比较并把结果送线圈,不需要再去查全局标志位,程序的可读性和可靠性都高很多。缺点是老机型不支持,写程序前要在软件里确认一下指令列表。
4.3 数据类型意识:字、位、通道和间接寻址
欧姆龙PLC的数据区分为CIO区、W区、H区、D区、E区等。CIO区对应外部输入输出,W区是内部辅助继电器,H区是断电保持区,D区是数据存储器。这些区中,CIO和W区可以按位访问(如W0.00),而D区在传统指令体系里不能直接位访问,必须用字处理或者配合位测试指令来实现。
这就引出一个常见问题:为什么D100.0这种写法在很多欧姆龙机型上是不合法的。如果需要判断D区数据的某一位,正确做法是用ANDW指令把整个字和0x0001做与运算,或者用位测试类指令把结果送到标志位。理解“字”和“位”的关系,是阅读欧姆龙手册的基础。此外还有间接寻址的写法,比如@D100表示D100中保存的数值是真正的目标地址,这在查表、配方管理时非常高效,但对新手来说容易绕晕,建议先把直接寻址玩熟再接触。
5. 程序流程控制与子程序:小项目先别急着用
5.1 IL/ILC与JMP/JME:两种“大开关”的区别
程序流程控制指令里,IL/ILC和JMP/JME是两对容易混淆的指令。IL(连锁)和ILC(连锁结束)配合使用,当IL前面的条件不满足时,IL到ILC之间的所有输出都强制复位。JMP(跳转)和JME(跳转结束)配合使用,当JMP前面的条件不满足时,跳转区间的指令不执行,但输出状态保持跳转前的状态不变。
怎么选?如果急停按下后要求这一段的输出全部断电,用IL/ILC;如果某段工艺条件不满足时你要跳过它、但已经启动的设备要保持当前状态,用JMP/JME。注意JMP/JME区域内如果写到定时器指令,在跳转期间定时器不计时,恢复后继续从原值开始。这个行为在实际调试中会造成“时间突然变慢”的感觉,要心里有数。
FOR/NEXT是循环指令,配合索引寄存器可以对连续数据做批量处理,例如把D100到D200全部清零。但PLC里的循环不像PC里那样随便用,因为每多一层循环,扫描周期就变长,循环次数写大了容易导致看门狗超时报警。我的原则是:能用传送指令批量处理的就不用循环,非用循环不可时,循环次数必须写死在程序里或者做上下限限制。
5.2 子程序、功能块与网上流传的ECALL/WL指令误区
子程序在欧姆龙里的用法是SBS(调用)、SBN(定义开始)、RET(返回)。比如设备初始化动作可以封装成一个子程序,主程序在启动时调用一次。使用子程序的好处是主程序逻辑清晰,某个功能模块要修改时不用在主程序一大片梯形图里翻找。功能块FB则是比子程序更高级的封装,带自己的接口参数和内部变量,创建后在CX-Programmer里通过拖拽实例来调用,本质上已经不是“指令”层面的东西了。
这里我想专门提醒一句:最近网上流传的“欧姆龙指令大全”资料里,经常混进一些奇怪的名字,比如ECALL、WL这类写法。你在欧姆龙官方手册和CX-Programmer的指令索引里,是查不到这些标准指令名的。ECALL更常出现在嵌入式CPU指令集语境里,WL指令也大多来自其他领域。遇到这种情况,别硬往自己程序里套,先确认资料对应的平台和CPU型号。判断方法很简单:在CX-Programmer指令输入框里敲一下助记符,能高亮出来就能用,敲不出来就说明这个指令名不属于当前机型。
6. 我的使用心得:如何让一本指令手册物尽其用
6.1 按“设备-场景-指令”做你的个人速查表
官方《指令参考手册》是按字母或功能码排列的,这是工具书的查法,不是学习的顺序。我建议你拿到一份Word版指令大全之后,先花一个下午把它重新结构化成自己的速查表。表格可以分这么几列:指令用途分类、指令名、功能码(如果有)、一句话功能说明、常见坑点。比如“传送”分类下记MOV/MOVL/MOVD/XFER;“比较”分类下记CMP和带条件比较指令;“定时计数”分类下记TIM/TIMX/CNT/CNTR,并把“编号共用”写在备注里。
做这个速查表的过程,本身就是一次主动学习。我现在的习惯是:每次现场调试遇到一个新的坑或者新的指令用法,回来就更新这个表。几年下来,这本“自己的指令大全”比官方手册翻得勤得多。工具书的价值不在于从头到尾读,而在于你遇到问题时能快速找到答案。
6.2 遇到查不到指令时的排查思路
用欧姆龙PLC时,如果一段功能不知道用哪条指令实现,我一般按这个顺序排查。第一步,确认CPU具体型号,因为指令支持范围随型号差异很大。第二步,打开CX-Programmer的指令帮助或官方PDF指令手册,先用英文学名搜索,因为中文翻译在不同资料里不统一,比如“互锁”“连锁”可能对应IL/ILC。第三步,在CX-Programmer的梯形图输入界面直接输入可能的功能码或助记符,看软件能不能自动补全。第四步,如果功能确实很偏,就到官方论坛或文档库搜对应机型的编程手册,而不是在二手问答平台找答案,因为那里经常混着西门子、三菱的指令名。
还有一个很实用的经验:欧姆龙很多功能不是靠一条指令,而是靠“指令+特殊辅助继电器+数据区”配合完成。比如高速计数、脉宽调制,你光找指令是找不到完整答案的,必须先看对应CPU型号的功能说明章节,理清数据区配置规则,再看指令部分。这也解释了为什么单纯背指令手册解决不了实际问题——指令只是整套控制方案中的一环。
6.3 一个尝到甜头的操作习惯
最后分享一个我用了很多年的习惯:每次新项目开工,我会把项目里用到的所有指令整理成一个简易清单,包括指令名、用途、设定参数含义。这样做有三个好处。第一,写注释的时候不用反复翻手册;第二,交接给下一个工程师时,对方能快速接手程序;第三,也是最重要的,当你把指令名称、参数和实际设备动作一一对应起来时,那些纸面上的指令才真正变成了你自己会用的工具。
我现在调欧姆龙PLC程序,已经很少整本翻手册了,但刚入门那两年,一本被翻出毛边的指令手册确实帮我解决过太多现场问题。你可以从今天开始,把手上那份指令大全当作字典去用,再花点时间做成自己的速查表。等你也到了“想到控制逻辑就能顺手写出对应指令”的阶段,就会发现这个“读薄”再“读厚”的过程,其实就是PLC编程能力实实在在增长的过程。
本文还有配套的精品资源,点击获取