做锂电设备这几年,最绕不开的工艺就是激光焊接。今年接手了一套动力电池模组的焊接线,拿到需求清单时看了一遍轴表,当场有点头皮发麻——26根伺服轴,全部走EtherCAT总线,配欧姆龙NJ501运动CPU。项目本身不复杂,但这么多轴要在同一套程序里管好、调好、干出稳定的焊缝,靠传统的“PLC发脉冲+专用控制卡”那套思路,基本走不通。
这篇文章不打算把完整程序贴出来,那也没法贴,毕竟每个项目都有自己的工艺细节。我重点想聊的是:26轴系统到底该怎么规划拓扑、运动控制逻辑怎么写、EtherCAT怎么调、激光焊接对控制有什么特殊要求,以及调试过程中踩过哪些坑。适合正在做新能源锂电设备、或正准备把多轴系统从脉冲方案切换到总线方案的朋友参考。
1. 为什么是NJ501加EtherCAT:这个方案的选型逻辑
1.1 26轴系统用传统脉冲方案会怎样
很多人对EtherCAT总线的第一反应是“接线少”,这确实是好处,但远不是关键好处。拿脉冲方案来说,26个伺服轴意味着每个轴至少需要脉冲、方向、使能、报警等几根信号线。一个伺服驱动器脉冲口接PLC高速输出口,组态时还得数点数够不够,26个轴高速输出口全部算下来,一个中型PLC基本不够,要加扩展模块,加完模块还得考虑输出频率上限、脉冲丢失、线缆干扰。
更头疼的是同步精度。激光焊接这个工艺,尤其是走连续轨迹时,各轴之间的协同性直接决定焊缝质量。脉冲方式下每个轴的脉冲输出是独立定时器生成的,轴多了以后,定时器抢占、扫描周期波动都会造成轴与轴之间的微小错位。焊缝跑出来粗细不均、拐角处有堆积,最后拆下来看就是过焊或虚焊。
所以这个项目从方案阶段我就确定,必须走总线,而且是EtherCAT。
1.2 EtherCAT的核心优势:分布式时钟与同步机制
EtherCAT有一个很关键的特性叫分布式时钟(DC,Distributed Clock)。说白了就是,主站发一个同步帧,所有从站在同一时刻采集输入、锁存输出。不同伺服驱动器虽然物理上分散在网络各处,但在逻辑上它们的控制周期是严格对齐的。这个同步抖动可以做到微秒级甚至亚微秒级。
对于26轴的焊接设备,这个级别的同步意味着什么?意味着你在程序里同时触发10个轴做插补,它们在物理世界里的启动时刻几乎完全一致,不会因为你扫描周期多跑了几个毫秒就出现一前一后。焊接轨迹是多轴插补时,这一点尤其重要。
另外,EtherCAT的数据帧是边收边转发的,“processing on the fly”机制让从站对帧的延迟只有纳秒级。26个伺服再加若干IO模块,一个周期跑1毫秒完全没问题,实际项目里我用的是1ms主站周期,后续如果想提精度,改到0.5ms或0.25ms也留有余量。
1.3 NJ501作为主站和运动控制核心的定位
欧姆龙NJ501是NJ系列里运动控制能力较强的一款,Sysmac Studio开发环境,支持IEC 61131-3标准的ST、梯形图、FBD这些语言。它内部集成了EtherCAT主站和运动控制引擎,PLC程序和运动控制不需要两套软件来回导,一个工程搞定。
这个选型跟项目整体架构有很大关系。设备里除了26个伺服轴,还有几十个气缸、十几个真空传感器、若干模拟量输入(激光功率反馈、温度变送器)、视觉拍照结果,这些逻辑如果放到独立的运动控制卡里做,PLC和运动控制卡之间的数据交换就是个大麻烦。NJ501的定位是“逻辑+运动”合一的控制器,一个CPU包干所有工作,省去了中间通信的不确定性。
我把几种方案放在一起对比过,结论比较直观:
| 对比维度 | 传统脉冲方案 | 运动控制卡+PLC双系统 | NJ501+EtherCAT |
|---|---|---|---|
| 26轴接线量 | 数百根 | 双系统间通信复杂 | 一根网线串联所有从站 |
| 同步精度 | 依赖定时器,轴多易漂移 | 主站与控制卡间有延时风险 | 分布式时钟,微秒级同步 |
| 程序框架 | 梯形图为主,运动控制弱 | 两套软件、两套程序 | 单软件、单程序 |
| 故障诊断 | 需要逐点查线 | 跨系统查问题很难 | EtherCAT从站诊断信息直接读 |
| 后期维护 | 节点多,易松动 | 版本匹配麻烦 | 拓扑清晰,替换方便 |
当然,NJ501不是唯一选择,倍福Twincat或者西门子1500T也都能做类似的事。但项目本身是欧姆龙体系的现有配套,而且欧姆龙1S伺服配合NJ使用,参数自动配置,省了很多手动调参的时间。所以最终定了这套方案。
2. 26轴到底是谁:功能分组与拓扑规划
2.1 轴清单:每一根轴都不是白来的
很多朋友看到“26轴”就觉得夸张,但你把设备拆开看就知道,锂电焊接设备里的轴就是这么细碎。我这套设备的轴分配如下:
| 轴组 | 轴数量 | 具体用途 |
|---|---|---|
| 焊接龙门组 | 5轴 | X轴、Y1/Y2龙门双驱、Z轴、焊接旋转轴 |
| 模组输送定位组 | 6轴 | 输送线体2轴、顶升定位2轴、侧向夹紧2轴 |
| 上料/下料机械手组 | 6轴 | 左右两个三轴机械手,分别负责上料和下料 |
| 视觉检测平台 | 3轴 | XY平面移动加旋转调整,用于焊缝检测定位 |
| 压装组 | 2轴 | 极柱压装、端板压装,伺服力控 |
| 辅助调整组 | 4轴 | 焊接工装微调、料盒切换、挡停机构等 |
合计正好26轴。
从功能上看,这26根轴的地位完全不一样。焊接龙门组是设备的核心,它的轨迹控制精度直接决定焊接品质,所以是“主站轴”。输送定位组、上下料机械手这些虽然也要定位准确,但要求没焊接那么变态。辅助调整组就是纯粹的位置控制,精度要求一般。
这种差异决定了程序里不能一刀切地用一个标准去调所有轴。我规划时的思路是:把轴分为三个等级,A类焊接轴(高同步、高精度)、B类定位轴(重复精度要求高但无轨迹要求)、C类辅助轴(逻辑简单、开环定位),等级不同,伺服增益、速度规划、调试标准都不同。
2.2 EtherCAT拓扑设计:主干菊花链与分支
26个伺服驱动器的网络拓扑需要提前规划好,不能随手串联。EtherCAT理论上支持线型、树型、星型多种拓扑,NJ501作为主站也支持这些结构。但实际项目中我建议尽量用菊花链(线型)主干,不要搞太多分支。分支越多,网络状态越难排查,一旦掉站,你得挨个找是哪个分支出的问题。
我的网络结构大概是这样:
- 主站NJ501的EtherCAT口出来,第一段网线到焊接工位区,龙门X/Y/Z/旋转轴四个伺服用短网线串在一起;
- 然后出线到输送定位区,输送、顶升、夹紧、压装这些轴串下去;
- 再到上下料机械手区,两组三轴机械手中的6个伺服串好;
- 最后接视觉平台的3个轴和一组远程IO模块作为网络末端。
全程没有做星形分支,全是链式。这样做的好处是网线走向跟设备走线槽完全一致,排查故障时从主站往下逐段测就行。实际工程中,每个伺服驱动器旁边我会留一个稍长的网线环,方便把驱动器拉出来测试,这个细节不值钱但很实用。
2.3 从站设备选型与远程IO
伺服这块用了欧姆龙1S系列,因为NJ501和1S之间通过Sysmac Studio做功能块对接特别方便,很多参数自动映射。1S的双轴型还能在一个驱动器里同时带两台电机,对空间紧张的电柜帮助很大。我这个项目里,部分工位就是这么干的,省了一排驱动器。
除了伺服,EtherCAT网络上还挂了一些远程IO从站和阀岛。气缸的电磁阀、真空传感器、报警灯、按钮信号,统统通过EtherCAT从站模块接入。这里有个经验:不要图省事把所有IO都挂到网络末端,与安全相关的信号(急停、门开关、光栅)我全部走了硬接线到安全继电器,PLC程序里再通过网络读状态做二次确认。网络IO再稳定,也不能成为唯一的安全保障。
3. 激光焊接工艺对运动控制的核心要求
3.1 焊接为什么不是“动一动”那么简单
激光焊接在锂电行业的应用场景很多,Busbar焊接、顶盖焊接、防爆阀焊接、极耳焊接都有。焊接本身看着也简单——激光出光,轴走轨迹,就完了。但实际搞工艺的朋友都懂,焊接质量的好坏,70%在运动控制上。
光纤激光器出光后,焊接熔池的状态跟焊接速度、激光功率、焦点位置直接相关。速度不稳,焊缝宽度就会不均匀;轨迹轮廓偏差大,焊缝就偏出预定位置;出光和运动的时序配合不行,起焊点和收焊点就会出现焊穿或虚焊。
所以这套系统的核心不是“让轴动起来”,而是“让轴在正确的时刻、以正确的速度、走到正确的位置,同时激光在正确的时机开和关”。
3.2 轨迹规划:连续轨迹与拐角处理
焊接轨迹通常不是简单的一条直线。比如Busbar焊接,往往是一条矩形或异形路径,有直线段、有圆弧、有拐角。运动控制里最怕的就是拐角——轴在拐角处需要减速,速度如果降得太多,相当于局部焊接速度变慢,焊得太深或太宽;如果减速不够,轨迹轮廓超差,焊偏。
NJ501的运动控制指令里,MC_MoveLinear支持直线插补,MC_MoveCircular支持圆弧插补。在程序里把整条焊缝拆成若干段路径,然后通过连续的插补指令衔接。关键在每段衔接时可以做“拐角过渡”处理,允许系统在精度允许范围内提前规划下一条轨迹的速度,而不是每条指令都从头加速到尾。同一条焊缝尽量在同一个运动任务里连续执行,不要拆到多个任务里,否则任务间切换会带来微小的时间间隙。
实际调试时,我给焊缝的每个拐角设置了不同的过渡速度。比如直线段目标速度120mm/s,拐角处允许的轨迹误差0.05mm,系统会自动计算一个合理的拐角速度,大概是60-70mm/s。这个值不能一刀切,拐角大的慢点,拐角小的快点,要对着CCD拍出来的焊缝一点点调。
3.3 激光开光时序:位置触发比时间触发靠谱
激光开光这个问题,新手最容易忽略。很多人写程序时是“轴动起来之后延时几毫秒,然后把激光打开”,这种做法在简单的点位焊接里可能能用,但在连续轨迹焊接里就露馅了。
时间触发的本质问题是,轴的启动延迟不是常数。伺服使能、摩擦力、负载大小都会影响轴从指令发出到实际运动到位的时间。你固定的延时可能这次刚好,下次负载变了就不行。起焊点要么提前出光烧了个大坑,要么晚了没焊上。
我在这个项目里的方案是用位置触发。Sysmac Studio里,运动控制指令本身带有触发输出的功能,可以配置当轴的实际位置到达某个设定值时,自动置位一个输出信号,这个输出直接接到激光器的出光控制端。这样无论轴跑得快还是慢,出光时刻始终以轴的位置为基准,彻底摆脱了时间延时的不确定性。
激光器的功率控制也是一样。通过模拟量输出给定的激光功率,不是简单给个固定值,而是让功率设定值跟当前焊接速度做联动。速度慢了自动降功率,速度快了自动升功率,保证单位长度焊缝上的激光能量密度基本恒定。这个逻辑用ST写成一个速度-功率映射函数块,是整套程序里对焊接质量贡献最大的模块之一。
3.4 龙门双驱同步:Y1和Y2的协作
焊接龙门里有一对很关键的轴——Y1和Y2,它们是典型的龙门双驱结构。两根轴共用一根横梁,一左一右,如果这两个轴运动不同步,横梁就会扭斜,焊接轨迹自然就偏了。
NJ501做龙门同步的常规做法是设置一个主轴和一个从轴,从轴通过跟随指令(类似MC_GearIn)以1:1的位置比跟随主轴。这样程序里只需要给主轴发运动指令,从轴会自动跟随。
但这里有两个坑。第一,龙门两侧的机械结构如果刚性不一致,从轴只按位置跟随会导致两侧受力不均,时间长了机械精度下降。所以我在龙门同步里加了扭矩补偿,从轴在位置跟随的基础上,叠加一个由两侧扭矩差计算的修正量。第二,龙门同步必须设置到位偏差监控,一旦Y1和Y2的偏差超过0.1mm,立即停机报警,防止把横梁扭坏。这个监控阈值可以通过Sysmac Studio的轴监视参数设置。
4. 程序骨架:任务分配、轴管理与工艺模块
4.1 Sysmac Studio的任务配置:主任务、辅助任务和事件任务
NJ501的程序结构核心是“任务”。任务其实就是不同扫描周期的程序执行分支。这个项目的任务分配方式很有代表性,如果任务规划乱了,26轴的运动控制逻辑会变得一团糟。
主任务我设置为1ms周期,负责运行所有跟运动控制、激光同步、插补相关的代码。1ms的周期内要完成所有A类轴的位置处理和插补计算,这也是EtherCAT的周期设定,PLC运动和网络刷新完全同步。
辅助任务设置为10ms周期,负责HMI通信、配方管理、数据统计、普通数字量逻辑。这些逻辑不需要那么高的实时性,放在1ms任务里反而会干扰运动控制——比如在1ms任务里处理一条HMI读写操作,可能阻塞几个扫描周期,对焊接连续性不利。
事件任务则用来处理报警、急停后的恢复流程。事件任务的特点是触发优先级高、执行时间短,适合做故障后的快速锁定和伺服禁能。
这种任务划分最核心的原则是:运动控制相关代码必须独占最高优先级的实时任务,其他所有非实时逻辑都往外挪。很多朋友26轴系统跑起来总有莫名其妙的问题,先看看是不是任务里混了太多非运动逻辑。
4.2 用ST语言写运动控制逻辑:从轴使能到插补
NJ501的运动控制功能块遵循PLCopen标准,MC_Power(使能)、MC_Home(回原点)、MC_MoveAbsolute(绝对定位)、MC_MoveLinear(直线插补)这些功能块的名字和接口跟其他支持PLCopen的平台基本一致。如果你以前用过倍福或西门子的运动控制库,上手几乎零成本。
我习惯用ST语言写运动控制模块,简洁直观。下面是一段典型的焊接轴直线插补逻辑,结构大家可以参考:
// 开启焊接X轴电源 MC_Power_Inst_X( Enable := bXServoEnable, bRegulatorOn := bXServoEnable, bDriveStart := TRUE, Axis := Axis_X, Status => wXPowerStatus, Error => bXPowerError, ErrorID => wXPowerErrorID ); // 插补指令:从当前位置走到目标位置,速度为120mm/s IF bStartWeldPath THEN MC_MoveLinear_Inst( Execute := bStartWeldPath, Axis := Axis_X, Destination := rWeldEndX, Velocity := 120.0, Acceleration := 500.0, Deceleration := 500.0, Jerk := 2000.0, BufferMode := eAborting, Done => bWeldPathDone, Error => bWeldPathError, ErrorID => wWeldPathErrorID ); END_IF;需要注意几个细节。第一,MC_Power的Enable和bRegulatorOn都要置TRUE才能稳定使能,很多初次用NJ的人只置了Enable,结果发现轴没有真正进入伺服使能状态。第二,BufferMode参数很关键。如果是一段连续轨迹中的多个插补指令,前一段还没结束时后一段就Executed,这里必须选合适的缓冲模式(比如缓冲模式为连续),否则轨迹会断开。第三,Jerk(加加速度)对激光焊接影响很大,设得太高会有机械振动,设得太低焊速提不起来,需要反复试。
4.3 HMI数据交换与配方管理
26轴的设备,HMI上要监控的状态数非常多。每个轴的位置、速度、报警、IO状态都要实时显示。NJ501和NB或NS系列HMI之间通过EtherNet/IP标签通信,这个很方便——PLC里的全局变量可以直接被HMI引用,不需要像传统方案那样在HMI里做变量映射表。
但方便归方便,也要注意数据规划。我的做法是专门建立一个叫HmiData的全局结构体,里面把所有要在HMI上显示和修改的数据集中起来。这样HMI只跟这个结构体交互,不会出现程序里零散变量被改乱的情况。
配方管理是焊接设备的重要需求。不同规格的电池模组,焊接速度、激光功率、焦点位置、压装力度都不一样。我把所有工艺参数按配方编号存储,HMI上可以选择当前生产配方。PLC启动时根据配方号加载对应参数,运动指令里的速度、位置、加速度全部取自配方变量,而不是硬编码在程序里。这样换型时不需要改程序,操作工在HMI上输个配方号就完事。
4.4 与激光器的握手时序:出光不是只管开和关
激光器控制不是单纯给个开信号就完了。激光器内部有自检、预燃、出光、关光、故障几个状态,PLC和激光器之间要做完整的状态握手。
我这套设备的激光器控制逻辑是:
- PLC发出激光器启动命令,等待激光器返回“准备好”信号;
- PLC给激光器发送模拟量功率设定值,并确认功率反馈值在合理范围内;
- 运动轴开始运动,当到达起焊触发位置时,位置触发模块输出出光信号;
- 焊接过程中持续监控激光器“出光中”状态信号和反射光监测信号;
- 焊接轨迹走完后,位置触发模块撤销出光信号,激光器关光;
- PLC收到“关光完成”信号后,才允许轴进行下一步动作。
这个时序里最容易出问题的就是第5步。如果出光信号撤销得太早,焊缝尾部会缺一段;太晚,薄片材料直接焊穿。配合位置触发模块来做,出光时长完全由运动轨迹长度和速度决定,跟程序执行耗时无关,非常可靠。
5. 调试阶段避坑:EtherCAT、伺服与工艺的实战问题
5.1 EtherCAT网络扫描与从站状态排查
接好线之后第一步就是扫描网络。Sysmac Studio里可以直接扫描EtherCAT从站,列出所有设备。这里有个新手容易踩的坑:扫描结果顺序和物理连接顺序不一定完全一致。EtherCAT从站的地址是主站分配的逻辑地址,跟网线顺序无关。所以你看到扫描列表里的从站名称顺序变了,不要惊讶,按每个从站的站号(Node Address)去核对物理位置。
如果某个从站扫描不到,排查顺序是:先看该从站之前的网络段是否正常(前一个从站的Link/Active指示灯)、再看网线是否插紧(很多总线断线是接头松了不是网线坏了)、然后看终端电阻是否在该从站出口正确设置(串行链路中间节点的OUT口要继续连接,末端节点必须配备终端电阻)。
26轴系统里有一种典型的掉站情况:某个伺服驱动器的网线接口氧化或虚接,设备跑着跑着这个轴突然掉线,EtherCAT网络报错。排查这类问题,我习惯在程序里做“从站在线监控”,周期读取每个从站的AL状态。一旦某个从站离线,立刻记录下站号和时间,并在HMI上提示操作工检查哪个位置的从站。有了这个监控,比靠感觉找故障要快得多。
5.2 伺服参数调整:26轴同时使能的电流冲击
26个伺服同时上电是一大考验。电柜的进线容量、伺服母线的电容充电电流、各路断路器整定值都要考虑。我第一次做类似项目时,直接所有轴同时使能,结果瞬间电流太大,DC24V控制电源电压被拉低,PLC通信直接卡死。
后来改进为分批使能方案。程序启动时,先使能焊接工位核心轴(A类轴),等母线电压稳定后,再依次使能B类定位轴,最后使能C类辅助轴。每个批次之间间隔500ms。这个分批逻辑我写成了一个标准功能块,在程序启动阶段调用。
伺服增益调试也是个体力活。1S伺服配合NJ501有个好处:Sysmac Studio里有半自动的伺服调整向导,会通过试运行自动算出比较合理的增益值。但它给的只是初值,激光焊接对速度稳定性要求高,我最终还是在自动计算的基础上手动微调了每根轴的速度环增益和积分时间常数,确保焊接过程中速度反馈波动控制在目标范围内。
5.3 焊接轨迹的实际问题:末端振痕与过烧
调试焊接轨迹时,最容易看到的问题就是焊缝末端出现振痕或过烧。这通常是因为轴在轨迹末尾急停。速度瞬间降到0,但激光功率还没来得及跟随下调,末端的激光能量密度突然增大。
解决思路有两步。第一步,在轨迹末尾增加一段减速距离,让速度平滑下降到较低值再执行收光。第二步,把速度-功率映射曲线末尾的功率下限调低,这样速度降下来后,功率也同步降下来,末端能量密度就能控制在稳定范围内。
另外,我强烈建议在程序里给每条焊缝加上“焊接质量自检”逻辑——通过读取激光器反馈功率和实际焊接时间的乘积,计算每段焊缝的激光能量总量。如果某段焊缝的能量总量超过设定范围,说明工艺参数漂移了,程序自动标记该产品为可疑品。这个逻辑看着简单,但在产线上能帮你拦住不少批量报废。
5.4 程序下载与固件版本的兼容性
最后一个坑,说大不大但很烦人:Sysmac Studio软件版本和NJ501固件版本不匹配时,有些运动控制功能块的参数会不同。比如老版本里MC_MoveLinear没有Jerk参数,新版本加了,你用新版本软件写了程序,下载到旧固件的PLC里会直接报错。
所以我的习惯是:项目开始时先确认PLC固件版本和Sysmac Studio版本,记录在项目文档里;后续修改程序时尽量用同一版本的软件;如果必须升级软件,先升级PLC固件并验证所有功能块行为一致后再继续开发。这个习惯帮我避免过很多次“程序昨天还好好的,今天突然下不进去”的尴尬。
调试阶段还遇到过程序刷写时轴报警的问题——程序下载过程中,PLC的运动控制引擎会暂时停止,所有轴处于无指令状态,此时如果伺服还在使能状态,轴会因失去目标位置而报警。现在我的做法是:下载程序前先通过HMI或软件把所有轴置于Servo Off状态,下载完成后再统一恢复。这个流程看着多了一步,但能避免大量重复报警和复位操作。
最后再分享一点个人体会
整套26轴的激光焊接程序从上位设计方案到调试稳定,用了大概两个月的时间。回过头来看,最难的不是某个功能块的用法,也不是EtherCAT网络的搭建,而是如何把设备工艺、机械设计、激光器特性和运动控制四样东西融合在一套程序里。
我个人这几年做项目的体会是:多轴系统控制,尤其是带激光焊接这种高动态工艺的控制,程序架构比代码本身更重要。任务怎么分、轴怎么分级、数据怎么规划、故障怎么监控,这些框架性问题如果在项目初期没想清楚,后面调试时会是无穷无尽的返工。反过来,先把架构理清楚,哪怕细节代码写得糙一点,调试过程反而顺很多。
希望这篇分享对正在做锂电焊接设备或者准备上EtherCAT多轴项目的朋友有帮助。如果你也在做类似的东西,遇到什么好玩的坑或者好用的方法,欢迎一起交流,这些经验都是一个个项目磨出来的,比教科书上的理论实在得多。