☰
欧姆龙CJ2M十二轴伺服与气缸控制项目实战解析
2026/10/21 10:16:48 网站建设 项目流程

做多轴自动化设备的人,迟早会碰上一个硬项目:一台机器上十几个伺服,加上一堆气缸,既要单独调试又要联动生产。我最近盘点的这套欧姆龙 PLC CJ2M 标准程序,就是典型的 12 台伺服电机 + 若干气缸的多工位控制项目。它的轴功能覆盖了点动、回零、相对定位,实际落地时还补上了绝对定位、气缸联锁、状态机调度和报警分级。这篇文章我就按项目落地的顺序,把硬件选型、程序分层、脉冲当量计算、回零方案、气缸联锁以及调试排错整个链路拆开讲,给准备上手多轴伺服项目的同行一份可以参考的实战笔记。

1. 项目全景与需求拆解

1.1 12 台伺服电机和一堆气缸组成的设备,到底长什么样

这种“12 轴伺服 + 气缸若干”的配置最常见的地方,是多工位转盘组装机、长行程在线装配线、高速上下料工作站。我接触过的一类典型结构是这样拆的:

  • 4 个伺服轴负责上料和移载:把工件从料盘搬到定位工位,两个方向移动,精度一般在 1mm 以内。
  • 4 个伺服轴负责装配压装:比如轴承压入、销钉压装,要求位置重复精度 0.02mm 甚至更高。
  • 4 个伺服轴负责下料和检测:把产品带到检测工位,检测完成后分料。

气缸承担夹紧、阻挡、定位销插拔、压紧等辅助动作。气缸在很多设备里看着不起眼,但它们在夹紧、压装、换位这些动作上和伺服的配合时序一旦出错,轻则卡料,重则撞机。所以 12 轴 + 若干气缸不是一个简单数字问题,而是一套需要仔细设计的机电协同问题。

从机架上看,这类设备通常还有一个整体框架:PLC 电柜、伺服驱动器柜、操作台、气动元件柜四部分。伺服驱动器因为发热大,一般单独一个柜或者分布在机架两侧;气缸电磁阀组集中在一个汇流板上,方便接气管和检查气压。我调过不少项目,最大的教训是:电气布局没规划好,后面干扰问题能把你折磨到怀疑人生。这个后面在调试篇专门讲。

1.2 从“点动、回零、相对”反推完整控制需求

标题把核心功能列出来了:轴点动、回零、相对定位。但一个能上生产线的“标准程序”还要补齐几块硬骨头:

绝对定位。相对定位是从当前点走增量,绝对定位是直接去某个绝对坐标。12 个轴同时干活时,必须有一个统一的坐标基准,绝对定位是安全基础。标题里那个“相对...”后面多半是“相对定位”,但完整项目里绝对定位同样绕不开。

原点建立后的防错逻辑。回零没完成,绝对禁止执行自动定位。这是程序里的硬条件,不能靠操作员自觉。

限位与急停。每个轴的正负硬限位、软限位都要处理;急停回路必须硬件直连到伺服驱动器的使能端,不能只靠 PLC 程序里写一句“急停时停止”。

报警分级。驱动器报警、气缸超时、原点超时、跟随误差过大,这些要归类处理,不能一报警就全线停。

配方与节拍。不同产品型号对应的速度、位置参数要能快速切换,不然换型时一个个改参数既慢又容易出错。

这些需求在我做架构设计时都会一并考虑进去。第 3 章讲程序框架时你就知道,标题里三个看似简单的功能,最后会演变成一整套可复用的轴控制库。

2. 硬件选型与控制架构

2.1 为什么是欧姆龙 CJ2M 而不是更小或更大的系列

CJ2M 在欧姆龙家族里是一个“中小型但能干中型活”的定位。

  • 体积和成本合适:比 NJ/NX 系列便宜不少,性能又比 CP1H 这种小机型强得多。
  • 扩展能力够:CPU 扩展机架能带模拟量、I/O 模块、位置控制模块、通信模块,12 轴规模刚好够用。
  • 网络配置方便:很多 CPU 自带 EtherNet/IP 口,触摸屏、上位机、远程 IO 通信用起来很顺手。
  • 编程维护门槛低:老工程师熟梯形图,CJ2M 支持梯形图和结构化文本混编,现场维护人员上手快。

12 这个数字,用 CJ2M 正好踩在“再往上一级就浪费”的线上。如果项目要求真正的高速高精度插补,那得考虑 NJ/NX 或专用运动控制器;如果只是 4 轴以内、精度要求不高的设备,CP1H 也够。选型阶段把这些边界想清楚,能省不少预算。

2.2 12 个伺服:脉冲控制还是总线控制,先把这个想清楚

这是整个方案里最影响后续工作量的决定。

用脉冲方式控制 12 个轴,PLC 这边至少需要多个位置控制模块,每个轴要接脉冲 + 方向 + 使能 + 报警 + 原点 + 限位等信号,接线量非常大。优点也很明显:部件便宜、调试直观、很多工厂维护电工都懂。用 MECHATROLINK-II 这类总线方式,PLC 侧一个运动控制模块,通过一根屏蔽双绞线串联所有伺服驱动器,省线、抗干扰、能回读驱动器状态、在线诊断方便。缺点:驱动器要有总线选件,成本高一点,调试要学通信参数配置。

对比项脉冲方式MECHATROLINK-II 总线方式
单轴接线量8~12 根/轴一根双绞线串接
12 轴总接线量上百根信号线一条总线路由
抗干扰高频脉冲易受干扰数字通信抗干扰好
故障诊断逐轴量信号驱动器状态实时回读
成本相对低相对高
维护门槛传统电工熟悉需要掌握通信概念

我现在的经验是:12 轴这种规模,预算允许就尽量走总线;预算紧才考虑脉冲,并且把屏蔽、接地这些事提前设计好。后面第 4 章算脉冲频率时你也会看到,速度要求一上来,脉冲方式很快就到瓶颈。

2.3 轴分组与模块容量规划

如果最终选了脉冲方式,12 个轴不能随便挂在一两个模块上。分组原则有三条:

  • 机械区位近的轴归一组,调试时好找线、好对机械。
  • 同步要求高的轴尽量放在同一个运动控制模块或同一个 CPU 脉冲口组,编程时能统一启停。
  • 高速轴和低速轴分开,降低互扰。

举例:上料 4 轴一组(速度一般,精度一般)、装配 4 轴一组(低速高精度)、下料 4 轴一组(高速轻载)。每组挂一个 4 轴模块,模块责任清晰。如果走总线,轴分组的压力小很多,但要在伺服驱动器上把站号编好,逻辑轴号与站号映射清楚。

2.4 I/O 点估算和气缸控制资源

12 个伺服,即使大部分状态走通信,仍然建议给每个轴保留硬线“伺服报警”和“急停”回路。气缸方面,假设 30 个气缸,每个气缸要 2 个到位输入(伸到位、缩到位)+ 1 个电磁阀输出,这就是 3 个点起步,30 个气缸就是 90 个 I/O 点。再加上安全门、启动/停止按钮、三色灯、节拍器等,一台中型 CJ2M 主框架加一两个 I/O 扩展机架是标配。

我做项目的第一步永远是做一张完整的 I/O 点表,把每个点分配给哪个轴、哪个气缸写清楚。没有这张表,12 轴 + 30 缸的线就是一团乱麻,调试时一个人看不懂、两个人说不清。

3. 标准程序架构设计

3.1 程序为什么一定要分层

在这个项目里,“标准程序”四个字的核心意义就是:轴控制逻辑和工艺逻辑拆开。拆开的理由很简单:

  • 工艺人员改动作顺序,不应该碰底层脉冲控制。
  • 现场调试时找问题,能快速定位是轴的底层控制、工艺逻辑还是报警处理出了问题。

我一般分成四层:

  1. 主调度层:负责 PLC 启动、初始化、模式切换(手动/自动/回零)。
  2. 轴控制层:每个轴封装成一个功能块,内部包含点动、回零、相对定位、绝对定位、软限位保护。
  3. 工艺层:用状态机描述设备节拍,决定哪个轴在什么条件下动作、哪个气缸什么时候夹紧。
  4. 报警层:收集伺服报警、气缸超时、限位触发、原点未完成,做分级处理。

这个分法不是理论上的花架子,是真能救命的。我做过一台机器,机械后期改了几轮动作顺序,就是因为工艺层独立,程序改起来很快。如果当初把所有逻辑都堆在主轴循环里,改一次顺序就要从头翻一遍梯形图,那才叫痛苦。

3.2 用数据结构把 12 个轴管起来

CJ2M 虽然没有完整意义的面向对象,但它支持用户定义数据类型。把“一个轴”抽象成一个结构体,是标准程序的关键:

TYPE ST_AXIS : STRUCT AxisNo : INT; (* 逻辑轴号 *) PulsePerMM : REAL; (* 脉冲当量: 脉冲/mm *) SpeedMMps : REAL; (* 运行速度 mm/s *) AccelMS : REAL; (* 加速时间 ms *) CurrentPosMM : REAL; (* 当前坐标 mm *) HomeDone : BOOL; (* 是否已回零 *) Alarmed : BOOL; (* 本轴报警 *) END_STRUCT END_TYPE

这只是示意,具体语法按你用的软件版本微调。定义好之后,12 个轴就是 12 个同样结构的实例,底层功能块只需要写一遍,靠“轴号”区分。这样程序量小、统一,也不容易手滑写错变量名。

3.3 轴点动功能块:调试时离不开的手动动作

点动听着简单,实际有几个细节必须处理:

  • 高频检测按键:按住正转、松开停止,速度要能单独设定。低速点动用于靠原点,高速点动用于快速走大范围。
  • 换向保护:正转过程中如果突然按反转,必须先停止再走反向,否则对机械冲击很大。
  • 限位逻辑:点动方向如果已经压到软限位,这个方向要直接禁止。
  • 伺服没有使能时,点动按钮要无效。

CJ2M 里我会用一个 FB_JOG 功能块,输入是使能、正转、反转、速度,输出是运行状态。手动画面直接映射到 FB 的输入。这样 12 个轴共用一个手动画面模板,轴上哪个有问题,切到那页看状态就行。

3.4 回零功能块:设备开机第一步,也是最容易出问题的一步

常用回零方式是“近点狗 + Z 相”,完整流程:

  1. 先判断当前位置:如果已经在近点狗信号上,先低速反向移出近点狗。
  2. 高速向原点方向移动,直到近点狗信号由 OFF 变 ON。
  3. 接触近点狗后立即减速停止。
  4. 低速反向移出近点狗,也可以不反向,取决于机械设计。
  5. 低速再向原点方向逼近,在脱离近点狗后的第一个 Z 相脉冲处停止。
  6. 当前位置清零,并叠加一个原点偏置量。

低速找 Z 相是精度关键。原因很直接:Z 相是伺服电机编码器每转一圈发一次的固定信号,速度越低越容易在一个扫描周期内稳定捕捉。高速回零时,你看到的 Z 相位置会随着 PLC 扫描周期和电机当前速度漂移。

如果项目用绝对值编码器伺服,理论上不用每次上电回零,但标准程序里我还是会在首次上电时做一次“建立绝对坐标系统”的流程,防止电池没电或编码器多圈值异常。

3.5 相对定位和绝对定位其实同一套底层

相对定位:目标位置 = 当前坐标 + 增量。绝对定位:目标位置 = 给定坐标,然后计算增量。把两种模式放到同一个“轴定位功能块”里,输入参数加一个模式选择,底层执行步骤都是计算目标位置 → 启动运动 → 等待到位。这样做的好处是 12 轴共用一个定位 FB,复制粘贴能降低修改出错率。

到位判断不能只看“指令发完了”,还要看“实际位置是否进入允许窗口”。窗口大小一般设成重复精度的 3~5 倍。这条做不好,报警或者撞机的时候你都不知道是位置偏了还是信号错了。

3.6 气缸通用控制:把联锁写在最底层

气缸控制逻辑我建议也封成 FB_CYL。输入:气缸编号、伸出/缩回指令;输出:电磁阀、伸到位/缩到位、超时报警。

一个气缸的标准状态流:

  • 原位:电磁阀不输出,缩到位信号 OK。
  • 伸出中:输出电磁阀,等待伸到位信号。
  • 伸出到位:伸到位信号稳定确认后,保持夹紧。
  • 缩回中:关电磁阀,等待缩到位。
  • 超时保护:任何从命令到到位信号超过设定时间(通常 2~5s),直接报警。

在“允许伸出”和“允许缩回”的使能里,把联锁条件都写进来。比如夹紧气缸的“允许伸出”必须包含:相关联伺服已在安全位、安全门关闭、没有急停。这个写进气缸 FB 内部,比在工艺层里到处勾画要安全得多。

4. 核心功能实现与参数计算

4.1 脉冲当量计算:先把这个算对,后面才有讨论的意义

我见过太多项目调试一大部分时间耗在“位置不对”。根子上都是脉冲当量没算对,或者算对了但单位用乱。

举一个标准例子:

  • 伺服电机:增量编码器 2500 脉冲/圈,经 4 倍频后分辨率是 10000 脉冲/圈。
  • 减速机:减速比 10:1(电机转 10 圈,丝杠转 1 圈)。
  • 丝杠导程:10mm(丝杠转一圈,滑台移动 10mm)。

每毫米脉冲数 = 编码器分辨率 × 减速比 ÷ 导程 = 10000 × 10 ÷ 10 = 10000 脉冲/mm。

也就是说,PLC 输出 10000 个脉冲,滑台走 1mm;1 个脉冲对应 0.0001mm。这个计算直接决定了 12 个轴的速度和位置参数。算完之后我习惯写进轴参数表,例如:

轴号机械结构每 mm 脉冲数最大速度(mm/s)对应频率(kHz)
01上料丝杠1000080800
02上料丝杠1000080800
05装配丝杠1000020200
09下料丝杠100001201200

如果丝杠导程不是整数、编码器分辨率又大,比如 17 位编码器 131072 脉冲/圈,导程 10mm,每 mm = 13107.2 脉冲,程序里会出现小数取整误差。这种情况就把“电子齿轮比”放在伺服驱动器上配,让 PLC 侧始终保持一个方便的整数脉冲当量。电子齿轮比本质上是分子/分母比例,伺服驱动器根据比例把 PLC 脉冲换算成电机实际需要的编码器脉冲数。

4.2 速度、频率与选型的关系

继续上面的参数:如果要求最大速度 120mm/s,脉冲当量 10000 脉冲/mm,那么 PLC 需要输出的频率是:

f = 速度 × 每 mm 脉冲数 = 120 × 10000 = 1,200,000 Hz = 1.2MHz。

这个频率已经超过普通内置脉冲输出能力(常见 100k~200kHz),普通位置控制模块也不一定凑合。所以在选型阶段就要把“目标速度 × 脉冲当量 = 脉冲频率”算出来。频率不够,就得:

  • 降低速度;
  • 增加导程或改变减速比;
  • 换更高频率的模块;
  • 或者直接改成总线控制。

总线控制下,位置指令以通信帧下发,脉冲频率这个概念出现在伺服内部,PLC 不再受这个限制。这也是为什么高速多轴项目我越来越喜欢总线的原因。

4.3 多轴协同:状态机把 12 个轴和气缸串成一条节拍线

在 CJ2M 这类 PLC 里,要清醒地认识到:它不是实时运动控制器,12 个轴各自运动没问题,但如果你要做真正的插补、两轴严格同步联动,脉冲方式很难保证同步精度。普通多工位装配,轴和轴之间的关系是“顺序配合”而不是“同步插补”,用状态机完全可以搞定。

状态机示意(节选):

CASE Step OF 10: (* 轴1走相对定位到上料位 *) IF Axis1.PositioningDone THEN Step := 20; END_IF; 20: (* 气缸A伸出夹紧 *) IF CylA.ClampDone THEN Step := 30; END_IF; 30: (* 轴2走绝对定位到压装位 *) IF Axis2.PositioningDone THEN Step := 40; END_IF; 40: (* 气缸B压装 *) IF CylB.PressDone THEN Step := 50; END_IF; ... ELSE Step := 999; (* 未知步骤,报警 *) END_CASE

每个步骤都配有超时计时器,超过设定节拍上限立即报警并停在当前步。状态机的最大优点是:你永远知道机器现在在哪个工步,条件不满足是哪一个标志,定位问题和时序问题一眼能查。

4.4 气缸和伺服联锁:防撞机的最后一道门

“气缸没夹紧就进给”是这类项目最贵的错误。我不希望任何人用撞机来学习联锁的重要性。联锁要做到三个层面:

  1. 物理层:急停、门开关直接接到伺服驱动器的硬回路上,不经过 PLC 程序,这是最后一道保险。
  2. PLC 程序层:每个伺服的“允许启动”条件是本轴相关的气缸到位标志全部为真,且相关前级轴已到位,写成集中联锁函数。
  3. 时序层:自动状态机里,每一步的退出条件必须是确认信号,比如夹紧到位信号要稳定 0.5 秒才算完成,而不是仅检测到某一个扫描周期的高电平。

到位信号的滤波确认在逻辑上很简单,真实价值是过滤掉磁性开关抖动、气缸低速爬行带来的间歇信号。这个“稳定若干毫秒再确认”的做法,比在梯形图里加一堆复杂逻辑更可靠。

4.5 报警分级与 12 轴项目的事后追溯

多轴项目的报警不能只有一个“机器停了”的灯。按影响范围分,我一般分三级:

级别处理方式典型报警
致命级断使能、停止全部运动急停按下、驱动器过流
中级暂停自动流程气缸超时、原点未建立、跟随误差过大
提示级记录并继续节拍超过标准、位置偏差预警

报警发生时,触摸屏要能显示:轴号/气缸号 + 报警码 + 当前工步 + 建议处理动作。这样现场人员不用翻图纸也能知道问题大致在哪。12 个轴和 30 多个气缸的报警如果不编号、不分类,故障时人脑袋会炸。

5. 调试实录与常见问题排查

5.1 轴号和机械轴对不上:调试第一坑

我第一次做 12 轴项目就踩过。程序里点动 Axis_01,机械上其实是第 3 台电机在转。原因:NC 模块地址映射时反了,或者伺服驱动器上的脉冲端子接错位。

预防办法:

  • 调试前做一张“逻辑轴号 - 模块地址 - 电机铭牌 - 机械位置”对照表,打印出来贴到电柜里。
  • 手动点动是验证手段,不是排查工具。验证时用低速点动,观察方向、看位置显示是否和机械移动一致。
  • 程序里每个轴命名要带机械位置,比如 Axis_01_LoaderX,不要只叫 Axis1。人脑记不住 12 个数字轴号。

5.2 回零原点漂移,反复修不到一个固定值

常见现象:每次回零结束后,用千分表打基准面,位置差 0.1mm 甚至更大。

排查链:

  1. 先看机械:丝杠间隙、联轴器松动,回零方向不一致会让间隙吃掉不同量的位置。
  2. 再看回零参数:高速接近速度是不是太快,导致近点狗信号触发后滑过太多再停车。
  3. 最后看 Z 相捕捉:程序有没有在脱离近点狗后专门低速找 Z 相?如果没有,每次停在近点狗信号触发那一刻,误差自然很大。

我自己的经验值:爬行/找 Z 相速度控制在 2mm/s 以下,重复定位能到 0.01mm 级;超过 10mm/s,就不要指望 0.05mm 以内的重复稳定。

5.3 相对定位不准:误差是“固定比例”还是“越来越多”

这个排查方法特别好用:

  • 走 100mm,实际走 90mm,固定偏 10% → 脉冲当量算错了。重新按 4.1 的公式算,或者用实测法:手轮走固定脉冲数,量实际位移,反推每 mm 脉冲数。
  • 每次走 100mm,误差固定 0.5mm,不随距离变化 → 多半是机械间隙或回零方向不一致。
  • 走得越远偏得越多,比如 100mm 差 0.2mm,1000mm 差 2mm → 丢脉冲,多半是干扰或频率超限。

丢脉冲的进一步排查:低速走 100mm 量 20 次,高速走 100mm 量 20 次。如果高速下误差明显恶化,优先调加减速曲线和降频;如果两个速度都偶发丢,重点查屏蔽、接地、动力线与信号线间距。

5.4 气缸到位信号乱跳:干扰还是开关坏

气缸磁性开关的线长、电压低,最容易受到伺服动力线干扰。我遇到过最邪门的情况:伺服一启动,旁边气缸的“伸到位”灯就闪,程序误判夹紧完成,下一步伺服立刻进给,直接把工件顶飞。

处理顺序:

  1. 加浪涌抑制:电磁阀线圈两端并二极管或 RC 吸收。没有这个,断电瞬间的反向电动势能干扰几米远。
  2. 分开走线:伺服动力线、脉冲信号线、传感器线分三种线槽,间距拉大。
  3. 输入端滤波:PLC 输入点启用滤波时间,或者在程序里做抖动过滤。
  4. 测试:重复做“伺服高速启停 + 气缸动作”100 次,确认到位信号无一次抖动再放行自动流程。

这条经验的价值在于:多轴项目里,电气设计和程序设计同样重要。程序写得再漂亮,布线一团糟,现场照样天天报警。

5.5 自动流程卡住不动:没有报警最头疼

如果机器停在某一步,触摸屏什么报警都没有,十有八九是“进入下一步”的条件一直不满。

排查步骤:

  1. 打开状态机监视,锁定当前 Step 值。
  2. 在触摸屏加一页“联锁状态监视”,把所有相关气缸到位、伺服到位、回零完成、安全门状态、急停状态全部显示。
  3. 找到为 0 的那个标志,那就是卡点。

这条简单但真的能省大量时间。每次调试我都会加这个画面,不是可有可无的功能,是必做功能。

5.6 常见问题速查表

现象可能原因排查/处理
点动反向或轴不对接线/映射错误对照轴表,对线,改地址
回零重复性差近点狗处理、Z 相捕捉、速度太快低速找 Z 相,参考 5.2
定位误差固定比例脉冲当量错重算并修正参数
定位误差越来越大丢脉冲/干扰降频、调加减速、屏蔽接地
气缸误动作干扰/开关损坏浪涌抑制、分开走线、输入滤波
自动流程卡死联锁条件不满足状态机监视页找 0
跟随误差报警负载重或加减速太猛减速、调增益、查机械卡阻

6. 架构经验与功能扩展

6.1 标准程序不是“写一次”,是“沉淀成模板”

这套 12 轴 + 气缸的 CJ2M 标准程序,真正值钱的不是某一段代码,而是可复用的骨架:轴结构体、FB_JOG、FB_HOME、FB_MOVE、FB_CYL、报警框架、状态机模板。下次换一台机器,只要机械结构差不太多,把轴参数和气缸参数改一改就能上线。这也是我为什么一直坚持“标准程序”这个概念——不只为一台设备服务,而是为后续所有相似设备铺路。

6.2 命名、地址和注释,是维护工程师的命

12 轴和几十个气缸,地址规划不好就是灾难。我用的规则:

  • 轴区:D1000 开始,每个轴固定 20 字,依次存放脉冲当量、速度、当前位置、目标位置、状态字等。
  • 气缸区:CIO 输出直接按气缸编号分,比如输出 0 号到 9 号给前 10 个气缸,输入 10 号到 29 号给到位信号,一一对应。
  • 命名:Cylinder_01_ClampReady 这种,一看就知道是什么。
  • 注释:能写英文写英文,中文注释在导入导出和跨版本打开时容易乱码。老程序员的习惯是把关键的注释直接写进名字里。

6.3 还能怎么扩展

CJ2M 自带以太网口,把每个轴的位置、速度、报警状态、当前工步传到 MES 或上位机大屏很容易。多产品换型时,12 个轴的目标位置、速度、加速度、气缸时序如果都能存成配方,触摸屏上选配方一键写入,可以减少大量换型参数设定时间。节假日维护时,通过上位机远程看轴状态、清报警、记录运行日志,也算给设备加了数字化能力。

这部分是加分项,但我建议先把基础架构打牢。架构不行,扩展一个功能乱一堆,反而得不偿失。

把我整套做法从头写一遍之后,说点我在实际项目里最深的体会。多轴项目真正的难点,从来不是某一个轴能不能动,而是 12 个轴和 20 多个气缸在一个扫描周期里能不能按顺序、按条件、有保护地配合。回零要稳、联锁要狠、报警要快,这是我每次做标准程序都默念的三句话。如果你现在正被回零漂移、气缸误动作、轴号对不上这些事折磨,与其继续在旧程序里打补丁,不如重新按这套分层架构整理一遍,你会发现调试速度反而更快。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询