在非标自动化这个圈子里,CJ2M算是一台“能扛事”的老朋友:不贵、稳定、售后资料齐全,而且技术栈熟悉。可一旦设备上有12个伺服电机再加一堆气缸,很多人上来就慌——轴太多,线太乱,程序越写越长,最后连自己都不敢改。这篇文章就围绕欧姆龙CJ2M PLC,讲讲怎么用模块化的思路把12个伺服和气缸控制做成一套标准程序。我会把硬件选型、I/O与数据区规划、功能块封装、多轴联动逻辑、气缸联锁、HMI通讯以及现场排故这几个环节全部拆开讲,读完你基本可以照着搭一套自己的模板,而不是每次做新设备都从零开始。
这个方案适合谁?正准备用CJ2M做多轴设备的新手工程师,以及手头有老设备、被一坨梯形图困住想重构程序的维护人员。12轴听起来很多,但只要把“轴”和“气缸”都抽象成可复用的功能块,程序量和控制2个轴差别不大,真正考验人的反而是地址规划和安全联锁。下面开始讲正题。
1. 项目整体思路:为什么非要用“模块化”来做12轴程序
1.1 12轴设备的真实痛点
先说说我以前见过的一台设备,12个轴分别负责上料、分度、压装、检测和下料,气缸大概有20多个。第一版程序是用梯形图一撸到底的:每个轴一段逻辑,气缸动作散落在各段程序里,触摸屏变量直接写死地址。结果一上电就出问题——某个气缸电磁阀没动作,排查了半小时发现是有个中间变量被另一个轴误清了。更可怕的是调试阶段改一个轴的速度,旁边的轴也跟着抽风,因为程序里大量使用了未初始化的内部继电器和DM区。
这种问题不是偶发,是多轴设备的通病。12个伺服意味着至少有12组“命令-反馈”信号,20个气缸意味着至少40个传感器信号,再加上各种模式切换、报警、急停、安全门,程序规模轻松上千行。如果不做模块化,逻辑之间会互相污染,调试就像拆炸弹。
1.2 控制12个伺服的两条路线
要先明确一点:单纯的CJ2M CPU,它自带的高速脉冲输出轴数是有限的。实际项目中控制12个伺服,我见过两条主流路线:
- 路线A:CJ2M CPU + 3块CJ1W-NC413位置控制单元。NC413是4轴脉冲输出模块,3块就是12轴。CPU只管逻辑、气缸和触摸屏通讯,轴的位置、速度、加减速、原点搜索全部交给NC单元自己完成。这种方案结构清晰,调试方便,适合大多数以点位定位为主的设备。
- 路线B:CJ2M CPU + 运动控制单元(如MCH系列),通过运动控制总线挂伺服驱动器。总线方案接线少、同步性能好,适合对多轴插补、电子凸轮有要求的设备。但代价是配置复杂、对工程师要求高,而且成本明显上升。
如果你现在做的是上料机械手、多工位转盘、点胶设备这种“点到点快速定位”场景,我强烈建议走路线A。因为NC413有自己独立的CPU,你设定好目标位置和速度,它自己负责生成脉冲,PLC不需要每个扫描周期去盯脉冲输出,程序压力小很多。标题既然是CJ2M标准程序,那路线A就是最贴合“标准程序”这个词的做法。
1.3 模块化到底要达成什么效果
我的目标很简单:把整台设备抽象成“12个伺服轴 + N个气缸 + M个辅助逻辑块”。每个轴是一个轴功能块,每个气缸是一个气缸功能块,我复制粘贴就能新增一个轴,参数全部通过结构体传入,程序内部几乎不出现直接地址操作。
模块化不是写个功能块那么简单,它需要一套约定:轴号怎么排、报警怎么编码、传感器信号怎么命名、HMI地址怎么分配。约定越清晰,后期维护越轻松。8个月后客户说要加一个轴,你应该能在半天内完成硬件接线和程序扩展,而不是把整个程序翻一遍。
2. 硬件选型与地址规划
2.1 CPU、电源与I/O模块怎么选
CJ2M的CPU型号很多,选型主要看程序容量、IO点数和通讯需求。12轴方案里,CPU本身不需要负责脉冲生成,所以选基础型就能跑,但程序容量建议留足余量,数据库、触摸屏变量、报警信息都会占用数据内存。我自己一般会把程序容量用到70%以上就直接升级一档CPU,价格差不了多少,后期躲过不少扩容痛苦。
电源模块要特别算一下:PLC系统不仅有CPU,还有3个NC413、若干输入输出模块,每个模块都有内部功耗。再加上输出模块驱动的中间继电器、指示灯,电流需求很容易被低估。计算方式不复杂——把每个模块手册里标称的5V和24V电流加到一起,电源模块的容量留出30%以上余量。我踩过坑:电源容量勉强够,结果所有输出同时动作时电压跌落,伺服使能继电器抖了一下,整机报警。从那以后我选电源一律往上跳一档。
2.2 NC413与伺服驱动器的接线要点
NC413是集电极开路脉冲输出,每个轴有脉冲和方向两个信号,通过端子排映射到伺服驱动器的脉冲输入。接线时最重要的一点是公共端不要接错,特别是不同厂家的伺服驱动器,脉冲输入端子定义五花八门。接好线后先别急着上伺服使能,用万用表量一下NC413输出端和控制器的脉冲输入端正负极,确认没有短路,再给驱动器上电。
另一个经常被忽略的是输出类型设置。NC413可以配置成“CW/CCW双脉冲”或者“脉冲+方向”,这必须和伺服驱动器的电子齿轮输入模式一一对应。很多现场问题看起来是“偶尔丢脉冲”,实际就是脉冲输出方式和驱动器设置不匹配,导致高速时信号不稳定。
2.3 I/O点表与地址分配规范
12轴设备至少有几百个物理I/O,如果不做地址规划,编程就是灾难。我习惯把所有I/O做成一张Excel主清单,每一行包含:设备名称、信号名称、PLC机架位置、模块槽位、端子号、全局变量名、注释。这张清单既是接线图校对依据,也是程序符号表的来源。
地址分配要有规律。比如:CIO区输入按功能分组,气缸传感器全部集中在固定区域,伺服报警、原点、正限位、负限位也各自占固定区段,不交叉使用。D区更严格,轴命令字、轴状态字、报警代码、配方参数全部按索引划分。建立这个约定后,新增设备时只需要改变量映射,梯形图几乎不用动。
3. 控制程序框架与任务分层
3.1 扫描周期、任务与数据刷新
CJ2M支持周期任务、中断任务等多种任务结构。在12轴方案里,优先级最高的是安全联锁和急停处理,这些代码要防止被低速任务阻塞。一般的做法是:急停、安全门、伺服报警这些硬联锁信号放在最高优先级任务中,用纯梯形图实现“一旦断开立即停止”的硬逻辑;而正常的轴定位、气缸顺序控制放在主周期任务中。
NC413和PLC之间通过I/O内存区域交换数据。每个轴有命令字、状态字、当前位置、目标位置、速度等一堆字。这些数据在每次扫描开始时由PLC统一刷新。所以程序里不要在一个扫描周期里重复多次读写相同轴的数据,最好先把所有NC单元的数据读入到内部的“轴结构体”,逻辑处理完再一次写回,保证程序各处拿到的是同一时刻的数据。
3.2 轴数据结构与功能块封装
用欧姆龙CX-Programmer的话,可以直接自定义结构体(UDT),把12个轴整成一个数组。每个轴的结构体大概长这样:
- 轴号、使能、忙标志、完成标志、报警标志
- 目标位置、实际位置、速度、加减速时间
- 原点返回模式、正负限位状态
- 报警代码
然后写一个轴控制功能块,输入参数是“轴结构体”,内部按状态机处理:空闲 → 运行中 → 完成/失败。由于所有轴共用同一个功能块,逻辑只存在一份,改一个地方等于改所有轴,这才是模块化最大的价值。
3.3 三层逻辑模型
我习惯把整机程序分成三层。最上层是“决策层”,处理设备模式、自动流程顺序、配方切换;中间层是“执行层”,由轴功能块和气缸功能块组成,只处理单轴单气缸的控制;最底层是“硬件抽象层”,把NC413的数据读写、I/O驱动全部封装起来,上层永远不直接操作物理地址。这样分层之后,HMI上的一个“启动自动运行”按钮,只是给决策层一个布尔量;决策层判断权限后,向各个执行层功能块下发命令;执行层自己去和硬件打交道。
4. 12轴伺服控制的编程实现
4.1 NC413轴参数设置:先把“机械坐标”算明白
编程之前,轴参数必须先在CX-Position或模块配置里设好。核心是单位换算:伺服电机转一圈编码器发多少脉冲、机械减速比是多少、丝杠导程是多少,最终要确定“脉冲数/毫米”这个比例。比如伺服每转脉冲数设定为10000,减速比1:10,丝杠导程5mm,那么移动1毫米需要的脉冲数就是10000×10÷5=20000。这个数值要写进NC413的电子齿轮参数里,后面程序里目标的单位才是“毫米”,而不是“脉冲”。
这里最容易犯的错是把电子齿轮比只设了一遍,但程序又用另一个换算值直接给位置,结果轴实际上跑了错误距离。我的做法是:所有轴的目标位置在程序里统一用毫米,NC413内部做换算,伺服驱动器的电子齿轮比再独立设一套,层层分明,调试时根据实际移动距离反推是哪一层错了。
4.2 一个通用单轴定位功能块的编写思路
有了轴数据结构,接下来就是写状态机。以ST语言做一个伪代码示范:
CASE state OF 0: // 空闲 IF cmd_start THEN IF NOT alarm AND enable THEN 写命令字:目标位置、速度、加减速 触发启动 state := 1 ELSE error := TRUE END_IF END_IF 1: // 运行中 IF busy THEN // 等待NC单元完成 ELSE IF 当前位置=目标位置 AND 无报警 THEN flag_done := TRUE state := 0 ELSE flag_error := TRUE state := 0 END_IF END_IF END_CASE实际项目中状态机会更复杂:启动时要先检查伺服使能、正负限位、原点已建立、模式允许;运行中要支持暂停/继续;失败后要能复位。但核心逻辑就是“命令给出去、等反馈、判断结果”。把这些都封装进FB,主程序里调用12次就行。
4.3 多轴协同:别把一个动作拆成12段顺序梯形图
写12轴程序最忌讳的是让轴一个一个排队启动。比如转盘第4工位要同时压装,第7工位同时检测,你如果在梯形图里逐轴发送启动命令,扫描周期几百微秒差别不大,但NC413每次执行启动命令还要处理内部总线通信,实际轴与轴的启动时间差可能拉到几十毫秒甚至更多,对有的工艺来说这已经算“不同步”了。
正确做法是利用NC413的“同时启动组”功能。多个轴可以组成一个启动组,配置好各自的运动参数,运行时用一个命令字同时触发。NC413自己负责让这组轴在同一时刻开始加减速和脉冲输出。程序里只需要把每个轴的目标数据先填好,再置位组启动命令。如果设备确实要求“先启动A轴,等A轴到位后B轴再动”,那才用“A轴完成标志”作为B轴的触发条件,但这是顺序动作,不叫协同运动。
4.4 原点返回与断点记忆
伺服设备上电后第一件事通常是回原点。NC413的原点搜索逻辑可以配置成:先以高速找原点接近开关,再以低速找Z相脉冲,最后停在Z相清零后的第一个位置。这里要特别注意“原点偏置”,如果机械零点不在原点开关位置,必须在参数里设置偏置量,否则每台机装出来原点位置不一致。
如果伺服电机配的是绝对值编码器,很多设备直接不设原点开关,靠控制器读取绝对值位置建立坐标系。这样做的好处是断电再上电不需要回原点,节拍快不少。代价是绝对值编码器的电池和通讯配置要维护好。我的建议是:能上绝对值就上绝对值,省下的回原点时间一年下来非常可观;如果没有绝对值编码器,程序里至少要记录“回原点已完成”标志,防止没回原点就启动自动模式。
4.5 电子齿轮与同步跟随:够用就好
12个轴的点到点控制不需要太复杂的插补。但有些设备会让两个轴保持固定比例运动,例如送料轴和切料轴同步。NC413支持简单的同步功能,可以通过从动轴跟随主轴的编码器信号运行,也可以用脉冲输出方式做电子齿轮。同步轴编程时,重点是先把比例参数做成HMI可调,别固化在程序里,因为现场机械调整后比例一定会变。
5. 气缸动作与安全联锁逻辑
5.1 气缸控制的硬件与接线习惯
气缸控制看起来简单,但数量多了之后,电磁阀驱动方式和传感器接线规范就变得很重要。我一般不用PLC输出模块直接驱动电磁阀线圈,而是通过中间继电器过渡。原因很简单:电磁阀线圈是电感负载,关断瞬间会产生反向电动势,不加中间继电器直接接模块,模块输出点容易被打坏。加了中间继电器后,PLC输出点只承受继电器线圈的微小电流,寿命长很多。
磁性开关的接线要特别注意:气缸磁性开关有PNP和NPN之分,必须和PLC输入模块的公共端匹配。很多现场莫名其妙的“气缸到位信号时有时无”,最后查下来是磁性开关型号和输入模块接线方式不兼容。另外一个细节是磁性开关不能直接和电磁阀线圈共用电源,开关信号是给PLC的,电源要干净,否则电磁阀动作时电压跌落会导致信号抖动。
5.2 气缸动作表、互锁与超时保护
程序里每个气缸都做成一个功能块,输入是“伸出/缩回”命令,输出是“伸出到位/缩回到位/忙/超时报警”。内部逻辑包括:确认当前状态不是目标状态,才输出电磁阀动作;收到到位信号后自动断开输出;等待到位的时间超过设定值就报超时。
气缸数量一多,最大的危害是“两个气缸同时伸出会撞”。这不能用梯形图里随便写两行互锁就完事,最好做一张“气缸互锁矩阵表”,在Excel里把哪些气缸组合不允许同时动作整理出来,然后程序里做一个通用互锁检查功能块:任何气缸功能块启动前,先检查互锁矩阵,如果发现冲突则拒绝执行并输出冲突编号。这是安全设计,不是效率优化。
5.3 急停、安全门与复位使能机制
急停必须采用硬接线:急停按钮直接串在伺服使能回路和气源电磁阀控制回路的电源中,不经过PLC。软件只能在安全链路上做辅助停机,不能替代硬回路。这是设备安全最基本的原则。
程序里,急停复位之后不要自动恢复运行。我习惯做一个“复位使能”握手流程:急停复位后,操作员必须按一次“故障复位”按钮,程序再检查所有轴和气缸都在安全位置,才允许进入待机状态。安全门信号同样参与逻辑:门开时自动流程立即暂停,且所有运动轴进入停止状态;门关后不自动继续,必须由操作员手动确认。这样的设计虽然看起来多了一步操作,但能避免无数次“门刚关上,轴突然猛跑”的事故。
6. 人机界面与变量体系的整体规划
6.1 从PLC到HMI的变量命名与地址映射
12个轴加一堆气缸,触摸屏页面上变量的数量会非常夸张。如果不规划,HMI开发和PLC程序经常对不上号。我建议在PLC里把所有HMI需要的变量集中放到一段连续的D区,每轴占固定数量的字,气缸也占固定数量。例如,1号轴的命令字、状态字、目标位置、实际位置、报警码各占一个D字,2号轴紧跟着排下去。这样HMI侧Modbus地址直接按偏移量计算,程序里简单错位都能快速发现。
变量命名也要统一。轴用AXIS01_TARGET_POS、AXIS01_ACTUAL_POS这种格式,气缸用CYL01_EXTEND_CMD、CYL01_EXTEND_SENSOR这种格式。命名统一之后,HMI画面组态可以批量复制,新增一个轴只需要复制一列变量再改编号,大幅减少人为手误。
6.2 画面结构与操作逻辑
HMI页面我习惯分成五大块:
- 主画面:整机状态、生产节拍、当前工步、急停/安全门状态
- 自动画面:自动运行实时状态,每个轴的当前位置和完成状态,当前气缸动作流程步骤
- 手动调试画面:每个轴的点动、步进、回原点、目标位置测试;气缸的单独伸出缩回
- 参数画面:伺服速度、加减速时间、气缸超时时间、配方参数,带权限密码
- 报警画面:当前报警列表、历史报警、报警详情与处理建议
手动调试画面特别重要,因为设备调试阶段90%的时间都在操作它。每个轴的手动JOG按钮最好直接调用和自动模式一样的轴功能块,只是命令来源不是流程而是按钮。这样手动和自动逻辑完全一致,不会出现手动能走、自动死活的怪问题。
6.3 报警代码体系与故障定位
12轴设备的报警必须规范化。我的方案是报警码用一个整数表示:前两位是类别(01伺服、02气缸、03安全、99系统),后三位是对象编号。例如01102表示1号轴伺服报警的某类故障,02005表示5号气缸超时。报警码不仅在HMI上显示,还要让程序能自动关联到功能块输出,这样现场维护人员看到代码就知道去哪里查。
HMI报警页面不要只显示一行字。我习惯在报警详情里包含:报警发生时该轴的目标位置、实际位置、速度、气缸状态、设备累计运行时间。这些数据全部来自PLC里事先做好的报警快照缓冲区,一旦触发报警,PLC先把这些数据冻结存入固定的D区,HMI再从这些地址读取显示。这对售后排查有巨大的帮助,好几回客户发来一张报警截图,我从快照数据里直接看出了气缸卡死的位置。
7. 现场调试心得与常见故障排查
7.1 脉冲伺服不动作:五层排查法
伺服不上电或者不动,新手最容易乱。我总结了一个固定排查顺序:
- 看PLC输出状态:通道是否有输出,指示灯是否亮
- 看NC413单元状态:模块的轴忙信号、报警标志是否变化
- 看伺服驱动器显示:是否有运行命令接收、是否报警
- 看接线和脉冲输入:万用表测量脉冲端子有电压变化吗,接线有没有反
- 看伺服参数:电子齿轮比、指令脉冲模式、使能信号类型是否正确
只要按这个顺序走,90%的问题在前三层就能找到。特别提醒一点,很多“不动”其实是“没有使能信号”,伺服驱动器显示“RUN”但电机不转,十有八九是使能继电器没吸合,而PLC程序里使能条件又没满足,这时候别去盯脉冲,先查使能链路。
7.2 回原点位置偏移和定位尺寸不稳
定位尺寸不稳定,优先怀疑不是程序而是机械和电气的边界问题。先检查丝杠联轴器有没有松动,这是我们遇到最高频的原因:联轴器打滑,位置每次都不一样。排除机械后,看伺服电子齿轮比是否错误,尤其是你换了伺服驱动器型号但参数没迁移的情况。第三位要考虑的是反向间隙,机械间隙不一致会造成正反方向到达位置不同,NC413或驱动器补偿参数可以解决一部分,但严重的只能靠机械调。
脉冲信号受干扰也会表现出“尺寸偶尔差一点”。排查干扰的方法很简单:把轴停在固定位置,观察NC413或驱动器显示的剩余脉冲值,如果数值反复跳动,说明脉冲信号被噪声污染。处理办法是脉冲线用双绞屏蔽线,屏蔽层在驱动器侧单端接地,并和动力线分开走线槽。
7.3 气缸误动作、到位信号异常的排查
气缸偶尔不动作,优先量磁性开关供电电压。电磁阀没有单独供电回路时,几个气缸同时动作会造成气压跌落或电压跌落,磁性开关动作就变得不可靠。我在新设备上已经强制要求:电磁阀电源单独一路开关电源给,PLC传感器电源另一路,彼此隔离,故障率立刻降了一大截。
程序里的气缸超时报警不是越低越好,要结合气源压力和气缸缸径设置合理的到位时间。我见过有人把所有气缸超时都设成1秒,现场气源压力一波动就报警停线,最后其实是管路漏气导致上升时间变慢。正确做法是初次调试时实测每个气缸的正常到位时间,再把它加50%的余量写入参数。
7.4 关于模块化程序的三大核心理念
最后分享几个我这几年做模块化最深的体会。
第一,功能块接口不要贪多。每个轴功能块输入输出控制在二十个以内,接口越多,调用时越容易传错,检查起来越累。有些内部参数不需要外部改,就放在功能块私有变量里。
第二,改程序必须同步改文档。12轴设备的程序不是只给电脑看的,是给半年后的自己看的。我每加一个工艺动作,就会在程序文件的备注区更新动作时序表和地址分配表,哪怕只加了一行互锁。省得后面调试时翻开程序满脑子问号。
第三,先“仿真”再上电。欧姆龙CX-Simulator或类似工具可以粗略模拟程序逻辑,新写的轴切换、气缸互锁流程先在软件里跑通,再去碰真机。12个轴的真机调试时间是宝贵的,少一次因为逻辑顺序错误造成的撞机,就能省下大半天清理。
如果你问我做完这套标准程序最值钱的是什么,我的答案是:它让设备从一台“只能按固定动作走”的机器,变成了一个可以随时加轴、改流程、换配方的工具平台。后面再接到类似项目,我通常花一半时间在硬件安装,另一半时间主要在陪现场调试,程序框架基本不动。这种底气,就是靠前期把每个轴、每个气缸都放进同一个规矩里换来的。