
做多轴自动化设备的人迟早会碰上一个硬项目一台机器上十几个伺服加上一堆气缸既要单独调试又要联动生产。我最近盘点的这套欧姆龙 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 程序为什么一定要分层在这个项目里“标准程序”四个字的核心意义就是轴控制逻辑和工艺逻辑拆开。拆开的理由很简单工艺人员改动作顺序不应该碰底层脉冲控制。现场调试时找问题能快速定位是轴的底层控制、工艺逻辑还是报警处理出了问题。我一般分成四层主调度层负责 PLC 启动、初始化、模式切换手动/自动/回零。轴控制层每个轴封装成一个功能块内部包含点动、回零、相对定位、绝对定位、软限位保护。工艺层用状态机描述设备节拍决定哪个轴在什么条件下动作、哪个气缸什么时候夹紧。报警层收集伺服报警、气缸超时、限位触发、原点未完成做分级处理。这个分法不是理论上的花架子是真能救命的。我做过一台机器机械后期改了几轮动作顺序就是因为工艺层独立程序改起来很快。如果当初把所有逻辑都堆在主轴循环里改一次顺序就要从头翻一遍梯形图那才叫痛苦。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 相”完整流程先判断当前位置如果已经在近点狗信号上先低速反向移出近点狗。高速向原点方向移动直到近点狗信号由 OFF 变 ON。接触近点狗后立即减速停止。低速反向移出近点狗也可以不反向取决于机械设计。低速再向原点方向逼近在脱离近点狗后的第一个 Z 相脉冲处停止。当前位置清零并叠加一个原点偏置量。低速找 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 个脉冲滑台走 1mm1 个脉冲对应 0.0001mm。这个计算直接决定了 12 个轴的速度和位置参数。算完之后我习惯写进轴参数表例如轴号机械结构每 mm 脉冲数最大速度(mm/s)对应频率(kHz)01上料丝杠100008080002上料丝杠100008080005装配丝杠100002020009下料丝杠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 气缸和伺服联锁防撞机的最后一道门“气缸没夹紧就进给”是这类项目最贵的错误。我不希望任何人用撞机来学习联锁的重要性。联锁要做到三个层面物理层急停、门开关直接接到伺服驱动器的硬回路上不经过 PLC 程序这是最后一道保险。PLC 程序层每个伺服的“允许启动”条件是本轴相关的气缸到位标志全部为真且相关前级轴已到位写成集中联锁函数。时序层自动状态机里每一步的退出条件必须是确认信号比如夹紧到位信号要稳定 0.5 秒才算完成而不是仅检测到某一个扫描周期的高电平。到位信号的滤波确认在逻辑上很简单真实价值是过滤掉磁性开关抖动、气缸低速爬行带来的间歇信号。这个“稳定若干毫秒再确认”的做法比在梯形图里加一堆复杂逻辑更可靠。4.5 报警分级与 12 轴项目的事后追溯多轴项目的报警不能只有一个“机器停了”的灯。按影响范围分我一般分三级级别处理方式典型报警致命级断使能、停止全部运动急停按下、驱动器过流中级暂停自动流程气缸超时、原点未建立、跟随误差过大提示级记录并继续节拍超过标准、位置偏差预警报警发生时触摸屏要能显示轴号/气缸号 报警码 当前工步 建议处理动作。这样现场人员不用翻图纸也能知道问题大致在哪。12 个轴和 30 多个气缸的报警如果不编号、不分类故障时人脑袋会炸。5. 调试实录与常见问题排查5.1 轴号和机械轴对不上调试第一坑我第一次做 12 轴项目就踩过。程序里点动 Axis_01机械上其实是第 3 台电机在转。原因NC 模块地址映射时反了或者伺服驱动器上的脉冲端子接错位。预防办法调试前做一张“逻辑轴号 - 模块地址 - 电机铭牌 - 机械位置”对照表打印出来贴到电柜里。手动点动是验证手段不是排查工具。验证时用低速点动观察方向、看位置显示是否和机械移动一致。程序里每个轴命名要带机械位置比如 Axis_01_LoaderX不要只叫 Axis1。人脑记不住 12 个数字轴号。5.2 回零原点漂移反复修不到一个固定值常见现象每次回零结束后用千分表打基准面位置差 0.1mm 甚至更大。排查链先看机械丝杠间隙、联轴器松动回零方向不一致会让间隙吃掉不同量的位置。再看回零参数高速接近速度是不是太快导致近点狗信号触发后滑过太多再停车。最后看 Z 相捕捉程序有没有在脱离近点狗后专门低速找 Z 相如果没有每次停在近点狗信号触发那一刻误差自然很大。我自己的经验值爬行/找 Z 相速度控制在 2mm/s 以下重复定位能到 0.01mm 级超过 10mm/s就不要指望 0.05mm 以内的重复稳定。5.3 相对定位不准误差是“固定比例”还是“越来越多”这个排查方法特别好用走 100mm实际走 90mm固定偏 10% → 脉冲当量算错了。重新按 4.1 的公式算或者用实测法手轮走固定脉冲数量实际位移反推每 mm 脉冲数。每次走 100mm误差固定 0.5mm不随距离变化 → 多半是机械间隙或回零方向不一致。走得越远偏得越多比如 100mm 差 0.2mm1000mm 差 2mm → 丢脉冲多半是干扰或频率超限。丢脉冲的进一步排查低速走 100mm 量 20 次高速走 100mm 量 20 次。如果高速下误差明显恶化优先调加减速曲线和降频如果两个速度都偶发丢重点查屏蔽、接地、动力线与信号线间距。5.4 气缸到位信号乱跳干扰还是开关坏气缸磁性开关的线长、电压低最容易受到伺服动力线干扰。我遇到过最邪门的情况伺服一启动旁边气缸的“伸到位”灯就闪程序误判夹紧完成下一步伺服立刻进给直接把工件顶飞。处理顺序加浪涌抑制电磁阀线圈两端并二极管或 RC 吸收。没有这个断电瞬间的反向电动势能干扰几米远。分开走线伺服动力线、脉冲信号线、传感器线分三种线槽间距拉大。输入端滤波PLC 输入点启用滤波时间或者在程序里做抖动过滤。测试重复做“伺服高速启停 气缸动作”100 次确认到位信号无一次抖动再放行自动流程。这条经验的价值在于多轴项目里电气设计和程序设计同样重要。程序写得再漂亮布线一团糟现场照样天天报警。5.5 自动流程卡住不动没有报警最头疼如果机器停在某一步触摸屏什么报警都没有十有八九是“进入下一步”的条件一直不满。排查步骤打开状态机监视锁定当前 Step 值。在触摸屏加一页“联锁状态监视”把所有相关气缸到位、伺服到位、回零完成、安全门状态、急停状态全部显示。找到为 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 多个气缸在一个扫描周期里能不能按顺序、按条件、有保护地配合。回零要稳、联锁要狠、报警要快这是我每次做标准程序都默念的三句话。如果你现在正被回零漂移、气缸误动作、轴号对不上这些事折磨与其继续在旧程序里打补丁不如重新按这套分层架构整理一遍你会发现调试速度反而更快。