这两年接运动控制项目,一个特别明显的变化是:客户开口问的不再是“你用什么牌子的PLC”,而是“支不支持CODESYS”“能不能走EtherCAT”。我最早做三菱、西门子脉冲方案出身,后来转到软PLC加总线架构,前前后后调过不少伺服项目——从单轴定位到三轴电子凸轮追剪都落地了。这篇文章就把我在这套架构下踩通的一条完整路径写出来,从工程创建、EtherCAT从站扫描和PDO映射,到轴参数换算、运动控制程序编写,再到伺服三环调试。目标读者是刚接触CODESYS和EtherCAT、想搞懂整套链路而不是只会拖个控件的工程师。读完你至少能独立做完一套“主站扫从站—轴能转—程序能控—伺服不抖”的完整闭环。
1. 为什么是CODESYS+EtherCAT:软PLC与总线架构的现实选择
1.1 CODESYS不只是编程软件:运行时与硬件解耦
很多从传统PLC转过来的工程师第一次打开CODESYS,会以为它就是个“跟GX Works差不多的编程工具”,这个理解其实偏差很大。CODESYS是一整套IEC 61131-3开发环境加运行时(Runtime)体系:你在开发环境里写的程序,最终编译后跑在目标设备的Runtime上,而这个Runtime可以装进各种硬件——工控机、ARM板、树莓派、国产各家PLC,甚至自己做的小板子。
这套“软件和硬件解耦”的架构,带来的直接好处是代码复用率极高。我最早给客户做了一套基于汇川AM401的CODESYS方案,后来另一个项目因为成本原因换成了某国产ARM软PLC,程序从工程导出再导入,运动控制逻辑几乎不用改,只重配了EtherCAT主站和IO映射。这在传统PLC时代是想都不敢想的。
但这里也要说一句公道话:硬件解耦的另一面是“硬件抽象层质量参差不齐”。同样用CODESYS Runtime,有的工业PC上跑EtherCAT主站,250微秒周期稳稳当当;有的运行时不开放总线调度参数,只能跑到1毫秒,多轴同步效果就差一大截。所以选硬件之前,一定问清楚对方的Runtime对EtherCAT周期的支持情况,最好直接要一个跑过8轴以上伺服的项目案例。
1.2 EtherCAT为什么在运动控制里能打
传统脉冲加方向的控制方式,轴少还行,轴一多就是灾难:接线复杂、抗干扰差、每个轴都要独立脉冲口,而且同步精度完全取决于上位机的发脉冲能力。EtherCAT的机制完全不同,它的报文是“飞过”每一个从站的:从站一边转发报文,一边在自己对应的数据段里取数据、插数据,不需要在每个节点上都跑完整的协议栈。
这个“在报文飞行过程中处理数据”的设计,带来的三个实打实的好处:
第一是拓扑灵活。你可以用星型、线型、树型混搭,而且每个从站都有独立的状态诊断,哪个节点断了,报文上直观地能看到掉站位置。
第二是同步精度高。EtherCAT的分布式时钟(DC)机制会让所有从站共享同一个参考时钟,主站周期性发送同步帧,从站之间的同步误差可以做到亚微秒级。这意味着多轴同时运动、电子凸轮、追剪这类场景,轴与轴之间的配合是硬件级别的确定性,而不是靠软件“尽量同步”。
第三是实时性强。我实测过某国产品牌软PLC加EtherCAT主站,驱动8台伺服,总线周期设250微秒,从站实际位置反馈刷新稳定,没有出现丢帧或延迟累积。这个指标在传统脉冲方案里几乎不可能稳定做到。
1.3 市面上常见的CODESYS加EtherCAT组合
现在市场上“CODESYS加EtherCAT”基本成了国产中高端运动控制方案的默认选项。我接触过的设备厂商里,大体是这么几类:
- 汇川:AM系列PLC原生CODESYS,伺服主力走EtherCAT的是IS620N、SV660N,调试软件InoProShop底层也是CODESYS。
- 禾川:X3E、X5S伺服接CODESYS主站很常见,Q系列PLC也是CODESYS内核。
- 台达:AX系列PLC走CODESYS,配合ASDA-A3/B3伺服。
- 通用软PLC:工控机或树莓派装CODESYS Control for Linux,接任何支持CoE协议(CANopen over EtherCAT)的伺服,这是很多自研设备的选型。
这个组合之所以流行,核心原因还是“开放”和“便宜”:CODESYS开发环境免费,Runtime授权按项目买,伺服选型自由度大,不像以前绑定一个品牌就得用到底。
2. 从零搭建EtherCAT工站:扫描从站、PDO映射与轴绑定
2.1 工程创建与运行时目标选型
CODESYS的安装其实不难,去官网下载CODESYS 3.5 SP19以上的安装包就行,装完默认自带EtherCAT主站和SoftMotion运动控制库。如果你用的是汇川、台达这类品牌的PLC,建议先装好对应的设备描述文件包,否则后面选目标设备时会找不到你的硬件型号。
新建工程时,关键一步是选对“目标设备”。比如你用的是汇川AM401,就需要在设备列表里找到对应的型号;如果你用的是工控机装CODESYS Control for Linux,就选这个Runtime。很多人卡在“程序写好了但下载不了”,排查半天发现是目标设备选错了。
选好目标设备之后,建议先去设备树下层里把“应用”名称改成一个有业务含义的名字,比如MainApp。再到连接设置里配置网关:CODESYS要通过网关连接目标设备,网关的IP就是你PLC或工控机的IP。这个IP地址最好在编译之前就确认好,不然后面下载程序时容易因为IP不对连不上。
2.2 添加EtherCAT主站并扫描从站
设备树结构大概是这样的:
- MyPlc(目标设备)
- MainApp(应用)
- EtherCAT_Master(主站)
- 从站1:汇川SV660N伺服
- 从站2:汇川SV660N伺服
- 从站3:数字IO从站
- EtherCAT_Master(主站)
- MainApp(应用)
右键EtherCAT_Master,选择“扫描设备”,CODESYS会自动识别连接在网口上的所有EtherCAT从站。扫描之前有个细节必须确认:伺服驱动器和IO从站都要正常上电,且网线连接正确。EtherCAT是支持线型串联的,比如PLC的ETH1口出来接伺服1的IN,伺服1的OUT再接伺服2的IN,以此类推,最后一个从站不需要终结电阻。
扫描成功后,从站会出现在主站下面,并且带有一个自动分配的站地址。这里我建议你逐个检查一下从站类型、版本号,最好把每个从站的“别名”设置成有含义的编号,比如1号轴、2号轴,方便后面程序里定位。
这里有一个新手必踩的坑:扫描从站之前,如果目标设备上已经运行了旧程序,可能会把总线周期设得很高,导致扫描时从站状态不稳定。建议先把目标设备里的程序清空,或者停掉应用,再执行扫描。
2.3 PDO映射:报文数据如何变成变量
扫描到从站之后,CODESYS已经自动解析了伺服驱动器的从站描述文件(ESI文件),并且默认生成了一组PDO映射。PDO分两种:RxPDO是主站发送给从站的数据,TxPDO是从站反馈给主站的数据。
以汇川SV660N为例,默认PDO里一般已经包含了:
- RxPDO:控制字(Controlword)、目标位置(Target Position)、目标速度(Target Velocity)、运行模式(Mode of operation)等
- TxPDO:状态字(Statusword)、实际位置(Actual Position)、实际速度(Actual Velocity)、跟随误差(Following error)等
这些PDO映射好之后,CODESYS会自动生成对应的过程映像变量,比如你会在IO映射表里看到EtherCAT_Master.Slave1.Controlword这类变量。但直接操作这些裸变量去控制伺服,其实是“寄存器思维”,不是运动控制思维。更常用的做法是,把这些映射好的从站变量作为底层IO,然后在SoftMotion层把从站“绑定”成一个运动控制轴。
有人会问:如果默认PDO不够用怎么办?比如要读伺服的转矩电流、母线电压,或者在线修改伺服内部参数。这种情况下需要自己加PDO。右键从站设备,打开“过程数据”选项卡,手动添加索引映射,比如添加0x6077(实际转矩)、0x60F4(位置偏差)等对象。需要注意,每个从站的PDO内容不能随意乱加,必须以从站手册里的对象字典为准,加了从站不支持的对象会导致总线配置报错。
2.4 不同品牌伺服从站的配置差异
不同品牌伺服走EtherCAT大体遵循CoE规范,基本对象都一样,但细节差别不小。我整理了一个常见的对比表:
| 配置项 | 汇川SV660N | 台达ASDA-A3 | 禾川X3E |
|---|---|---|---|
| 通信协议 | CoE | CoE | CoE |
| 运行模式对象 | 0x6060 | 0x6060 | 0x6060 |
| 电子齿轮分子 | 0x6091-01 | 0x6091-01 | 0x6091-01 |
| 电子齿轮分母 | 0x6091-02 | 0x6091-02 | 0x6091-02 |
| 恢复出厂对象 | 0x1011-01 | 0x1011-01 | 0x1011-01 |
| 常用默认周期 | 250us-1ms | 250us-1ms | 250us-1ms |
实操里的一个建议:第一次上电调试时,先把伺服切到“面板模式”,也就是通过伺服驱动器自己的操作面板或品牌调试软件先确认电机能不能正常点动,再切回EtherCAT通信模式。这样可以快速排除供电、急停、编码器接线等基础问题,避免把通信问题混在一起排查。
还有一个通用经验:伺服在EtherCAT模式下,旋转方向、编码器分辨率、刹车释放这些参数通常既可以在伺服驱动器里预设,也可以通过CoE对象在线写入。但要注意,一旦从站被主站管理,伺服驱动器面板上的一些按键操作可能被锁定,这是正常现象,不是故障。
3. 轴配置的心智模型:把机械参数翻译成运动学参数
3.1 单位换算的完整推导
轴配置是所有运动控制里最容易出错、也最容易被忽略的一步。很多抖动、定位不准、速度飞了的问题,追根溯源都是单位换算错了。
先说一个最核心的概念:我倾向于把运动控制的单位体系统一成“用户单位”。也就是说,位置单位是毫米还是度,速度单位是毫米每秒还是度每秒,全由你定义,CODESYS SoftMotion只是按照你设定的缩放关系去解释轴数据。
举个例子。某设备用模组:伺服电机配5比1减速器,带动5毫米导程的丝杠,负载移动速度要求0.8米每秒。
- 电机每转一圈,经过5比1减速后,丝杠转0.2圈。
- 丝杠导程5毫米,所以电机转一圈,负载移动距离 = 5 / 5 = 1毫米。
- 如果编码器是17位绝对值编码器,那就是131072脉冲每圈。
在CODESYS SoftMotion里,我们可以把Axis1的“每圈单位”设成1毫米,同时把电机的“编码器分辨率”关联到从站的实际编码器数据。这样,程序里写目标位置100,含义就是让负载移动100毫米;写速度800,含义就是800毫米每秒。对应到0.8米每秒的现场要求,就是800毫米每秒。
但这里有一个更常见的做法:为了兼容伺服驱动器内部的电子齿轮比,很多人会把轴的单位设成“圈”。比如程序里发10000个单位代表10000圈?那显然不对。正确做法是:先把伺服的电子齿轮设成“上位机每发10000个单位,电机转一圈”,然后把CODESYS轴的“每圈单位”设成1圈或者10000。这样PLC侧写10000,电机转一圈,负载移动1毫米,换算关系一目了然。
这个“先定齿轮比,再定轴单位”的顺序,我建议每个项目开始前把计算过程写在项目笔记里,否则半年后回来看程序,谁都不记得10000到底是圈还是毫米。
3.2 方向、限位、抱闸与回零
方向是另一个高频坑点。伺服驱动器和CODESYS轴参数里都有方向反转选项,但很多人只改一处,结果就是PLC显示位置在增加、实际机械在反向移动。建议这样处理:以机械运动方向为准,先把伺服驱动器里的方向设成实际需要的,CODESYS轴的方向保持默认,只在某一处定义方向,不要两头都改,否则后期逻辑判断会非常混乱。
限位信号的处理也要在这里规划清楚。硬限位一般接伺服驱动器的CN1端子或者独立IO从站,极性NC(常闭)最常见,因为断线时会被当成触发限位,安全冗余更好。在CODESYS里,轴参数中有“硬限位”和“软件限位”两个层面:硬限位依赖输入信号,软件限位靠程序里设定软限位位置值。我习惯的做法是机械硬限位一定接,软件限位作为第二道保护,两套都设上。
抱闸控制容易被忽略。很多伺服电机带刹车,但刹车并不是默认自动打开的。EtherCAT从站没有专门的抱闸输出时,一般通过MC_Power功能块的bDriveStart输出信号去驱动一个中间继电器,再由继电器控制抱闸线圈。逻辑上应该做到:轴准备好(Power)且伺服使能后才松闸;触发急停或程序停止时立即抱闸。这个逻辑如果你放到PLC程序里自己写,千万不要做成“先停轴再松闸”,那样设备会因为惯性滑行造成安全事故。
回零方式也要按编码器类型区分:绝对值编码器不需要每次上电找原点,只需设定一次绝对原点;增量编码器则要依赖限位开关加Z相脉冲找零点。CODESYS里通过MC_Home功能块和“回零模式”参数来配置,常见的模式有:
mcDirect:把当前实际位置直接设成原点,适合绝对值编码器首次标定。mcLimitSwitch+Z:先找限位开关,再找编码器Z相脉冲,精度高,适合增量编码器。mcStopOnLimitSwitch:直接碰到硬限位停止并设为原点,机械上需要限位块有足够的缓冲。
3.3 用SoftMotion通用轴还是CNC轴
CODESYS里有两种轴概念容易混淆:普通SoftMotion轴和CNC插补轴。
普通轴(AXIS_REF)适合单轴定位、速度控制、电子齿轮、简单同步这类场景,程序里直接调用MC_MoveAbsolute、MC_MoveVelocity等指令。它也可以做多轴联动,但相对于CNC轴,轨迹规划的灵活性差一些。
CNC轴则是一组专门为了插补而设计的概念,配合G代码、路径规划、圆弧插补、样条插补等功能。如果你要做两轴或三轴联动走直线、圆弧、自由曲线,比如点胶机、激光切割、三轴平台,建议用CNC轴。它的优势在于:轨迹缓冲区可以连续预读处理,多个运动段之间不会停顿,运动更平滑。
选型的经验是:如果项目只需要点到点定位,用普通轴就够了,非要用CNC轴反而把程序复杂化;如果需要连续轨迹、多段曲线、速度前瞻,那一定要用CNC轴。
4. 写运动控制程序:从点动到连续轨迹的一次成型
4.1 MC指令集的基本编排
CODESYS SoftMotion提供了一套标准的MC指令集,命名和PLCopen规范基本一致。刚上手时只要掌握七个指令就足够应付大部分单轴项目:MC_Power、MC_Home、MC_Stop、MC_MoveAbsolute、MC_MoveRelative、MC_MoveVelocity、MC_Reset。
先说MC_Power。它负责建立轴的使能状态,一般参数有三个要管:Enable(功能块长期使能)、bRegulatorOn(伺服调节器开关)、bDriveStart(驱动器启动信号)。这个功能块跟其他运动指令不一样,它不是“触发一次”而是“持续保持”的,所以一般用周期调用,Enable接一个按钮状态或者急停链路的正常状态。
然后是MC_Home。绝对值编码器的项目里,MC_Home往往只需要上电执行一次,把当前位置设成原点。增量编码器项目里,MC_Home通常要在每次上电后执行,而且要注意:执行MC_Home之前轴必须已经使能(MC_Power处于激活状态)。
单轴定位最简单的一段ST程序大概长这样:
PROGRAM PRG_MoveAx VAR bPower: BOOL := FALSE; bHome: BOOL := FALSE; bStart: BOOL := FALSE; bStop: BOOL := FALSE; Axis1: AXIS_REF; MC_Power_0: MC_Power; MC_Home_0: MC_Home; MC_MoveAbsolute_0: MC_MoveAbsolute; MC_Stop_0: MC_Stop; rPosition: LREAL := 100.0; rVelocity: LREAL := 50.0; rAcc: LREAL := 200.0; rDec: LREAL := 200.0; END_VAR MC_Power_0( Axis := Axis1, Enable := bPower, bRegulatorOn := bPower, bDriveStart := bPower); MC_Home_0( Axis := Axis1, Execute := bHome, Position := 0.0, Mode := mcDirect); MC_MoveAbsolute_0( Axis := Axis1, Execute := bStart, Position := rPosition, Velocity := rVelocity, Acceleration := rAcc, Deceleration := rDec, Jerk := 0.0, BufferMode := mcAborting); MC_Stop_0( Axis := Axis1, Execute := bStop, Deceleration := 500.0, Jerk := 0.0);这里特别注意:MC_MoveAbsolute的Execute参数需要是上升沿触发,不能在PLC扫描周期里一直为TRUE,否则每扫描一次就重新触发一次定位。常规做法是:在状态机里把启动按钮的上升沿信号赋给这个Execute变量,并且在功能块执行完毕(Done输出为TRUE)之后立即清掉Execute。
4.2 两轴直线插补的最小示例
单轴会了,两轴联动并不复杂,核心是理解两个概念:目标位置的坐标系含义和缓冲区模式。
假设一个XY直角坐标平台,要从原点走到(100, 50),速度50毫米每秒,加速度200毫米每秒平方,用ST也就是:
MC_MoveLinear_0( Axis1 := AxisX, Axis2 := AxisY, Execute := bStart, Position1 := 100.0, Position2 := 50.0, Velocity := 50.0, Acceleration := 200.0, Deceleration := 200.0, Jerk := 0.0, BufferMode := mcBuffered);这里BufferMode是最容易被忽略的参数。mcAborting表示新指令立即中断当前指令,适合JOG、急停;mcBuffered表示等当前指令执行完再自动执行下一条,适合连续轨迹拼接。如果删掉这个参数,两轴指令之间一旦有间隙,平台就会在拐点停顿,影响轨迹质量。
写轨迹程序时还有一个经验:不要在一个函数块实例里反复触发不同目标位置,尤其是“到位后再修改Position值”这种操作,容易造成功能块内部状态错乱。更稳妥的做法是,运动指令按“目标参数”和“触发信号”分离设计:先给Position、Velocity等参数赋值,再给Execute一个上升沿。参数变了、信号没来,不会触发误动作。
4.3 状态机与异常处理
运动控制程序最终一定要落在状态机上,不能想怎么写就怎么写。我最常用的轴状态机大概是:
- 初始化态:复位轴状态,清报警。
- 待机态:轴已使能,等待指令。
- 运行态:轴正在定位或走轨迹。
- 暂停态:通过MC_Stop暂停,等待恢复。
- 故障态:报警触发,安全停止。
状态切换全部靠移位寄存器和置位复位逻辑,不允许直接在多个运动指令的Enable脚上做并联。原因是CODESYS功能块的内部状态机是独立的,多个运动指令同时对同一个轴操作,优先级和缓冲区模式会变得不可控。
异常处理里最关键的是“急停”和“工程师在调试时的F8退出”。程序停止不代表机械停止:当你在CODESYS里停止应用时,EtherCAT主站会停止刷新输出,伺服驱动器通常会锁轴或者按照驱动器设置进入停止状态。如果在停止程序前没有触发MC_Stop,而又没有外部急停回路,设备可能保持使能状态,甚至因为输出冻结而出现危险。所以我的项目里,急停回路永远是“硬接线优先”,PLC程序只做第二道保护。
5. 伺服三环调试:增益、滤波、前馈的实战调法
5.1 先记住三环的次序
伺服驱动器内部有三层控制环:电流环最内层,速度环在中间,位置环最外层。物理上的关系是:位置环输出目标速度,速度环输出目标电流,电流环最终驱动电机。
很多刚从PLC转过来的工程师容易一上来就猛调“位置环增益”,调高之后发现电机嗡嗡响、定位过冲、甚至机械共振,然后就怀疑伺服坏掉了。其实三环调试有固定的顺序:先保证电流环与速度环稳,再调位置环。电流环一般由驱动器厂商设好,用户很少动;真正需要用户调的是速度环增益/积分、位置环增益,以及各类前馈和滤波器。
你可以把三环理解成一个团队三层汇报:位置环相当于项目经理,速度环相当于执行组长,电流环相当于一线工人。项目经理的指令再准确,执行组长和工人如果不稳,项目照样乱;反过来,底层稳了,项目经理才能放手提高效率。
5.2 从速度环增益开始调的完整顺序
我常用的调试办法是一套“从低往高加,从快到稳退”的操作流程:
第一步,把所有高级功能关掉:前馈设为0,滤波器先不启用,位置环增益设一个保守值(比如20到30 1/s)。速度环增益也给一个偏小的起始值,积分时间常数设默认。
第二步,让轴以较低速度做往复运动,比如目标速度100毫米每秒,行程为正负5毫米。然后逐步提高速度环增益,观察两个信号:电机是否有高频啸叫、运动时是否有共振。每当增益升到某个值出现啸叫,立刻退回20%到30%。
第三步,速度环稳定之后,再把位置环增益从低往上加。判定标准是:定位时间短、没有明显过冲、停止后没有残余抖动。出现定位过冲,就回调位置环增益。
第四步,加入速度前馈和加速度前馈,用来消除匀速段和加减速段的跟随误差。
这里给一份我常用的起始参数表,注意只是起始值,实际要按机械刚性和负载惯量调整:
| 参数 | 起始建议值 | 调试方向 |
|---|---|---|
| 速度环增益 | 500~800 1/s | 提高响应,过高啸叫 |
| 速度环积分时间 | 5~10ms | 消除稳态误差,过小振荡 |
| 位置环增益 | 20~50 1/s | 提高定位刚性,过高过冲 |
| 速度前馈 | 0~50% | 降低匀速段跟随误差 |
| 加速度前馈 | 0~80% | 降低加减速段滞后 |
调试过程中最好配合CODESYS的Trace工具,同时采集目标位置、实际位置、跟随误差、速度给定和电流反馈。不要只靠眼睛看电机动不动,很多时候肉眼看着正常,Trace一拉发现跟随误差已经大得离谱了。
5.3 滤波与振动抑制
滤波是很多调试工程师最陌生的环节,但在一些刚性差、惯量大的设备上,不做滤波基本没法用。
机械共振最常见的表现是某个特定速度段电机啸叫或设备抖动。这时用示波器或CODESYS Trace看速度反馈,能明显看到一个特定频率的振动分量叠加在正常速度信号上。处理方法是加陷波滤波器(Notch Filter),把共振频率附近的增益压下去。陷波滤波器需要设置两个关键参数:中心频率就是共振点的频率,带宽就是需要抑制的频率范围。
实操里,我发现很多共振在100到500赫兹之间。比如某次调试一个龙门结构,电机一加速就听到“嗡”一声,Trace分析发现180赫兹处有明显尖峰。我设置了中心频率180赫兹、带宽4赫兹的陷波器,啸叫立刻消失,位置环增益还能继续往上加。
如果振动是高频噪声引起的,比如编码器反馈噪声、伺服电流采样噪声,通常用低通滤波器处理。低通滤波器的截止频率设得太低会让速度环响应变慢,设得太高又起不到滤波作用。我的经验是:先看噪声频率,截止频率一般取振动频率的1/5到1/2,然后边调边看速度环增益还能不能承受。
5.4 前馈:把跟随误差压缩到接近零
前馈的本质是“不走反馈回路,直接按目标值的前置变化量去补一段控制指令”。它不能单独使用,必须和反馈闭环配合。
速度前馈的作用是减小匀速段跟随误差。位置环有增益就一定有滞后,目标匀速运动时,实际位置总是落后目标位置一个固定量,这个量大致正比于速度除以位置环增益。速度前馈会直接把目标速度的设定比例叠加到速度给定上,从而补偿掉这个滞后。调节方法很简单:让轴做匀速运动,拉Trace看跟随误差的稳态值,然后逐步加大速度前馈百分比,直到稳态误差接近零。
加速度前馈解决的是加减速段的滞后。加减速过程中,位置环不仅要克服跟随滞后,还要提供额外力矩克服惯性。加速度前馈就是提前把这个力矩指令补上。调试步骤是:先让轴做往复梯形速度运动,观察加减速段的跟随误差尖峰,然后逐步增大加速度前馈。
前馈调试有一个容易踩的坑:前馈百分比不是越大越好,过大的速度前馈会造成位置超调,过大的加速度前馈会造成加减速结束时的冲击。最终判断标准永远是“跟随误差曲线是否平坦、定位是否无过冲”,而不是把某个前馈值调到100%。我通常会在项目里把速度前馈和加速度前馈做成运行时变量,方便现场人员微调而不用重新编译。
6. 实测中那些坑:掉线、抖动与编码器报警的完整排查链路
6.1 EtherCAT从站周期性掉线的排查
这是EtherCAT项目里最让人头疼的问题:设备运行十分钟或半小时,突然报“从站丢失”“EtherCAT通信中断”,重新上电又正常。这种偶发问题之所以难查,因为它不是每次都能复现,而且往往是多个因素叠加导致的。
我的排查顺序是固定的一套,建议你也按这个顺序走,不要跳步:
第一步,检查线缆和连接器。这是比例最高的原因。EtherCAT网线建议用超五类及以上屏蔽线,水晶头必须带屏蔽壳,而且屏蔽层要可靠接地。我曾遇到一个项目总是运行中偶尔掉线,最后发现是PLC侧网口的水晶头压线不合格,金属弹片没压到屏蔽层。
第二步,确认供电容量。伺服驱动器上电瞬间冲击电流很大,如果24V开关电源容量不足,驱动多个伺服时电压会瞬时跌落,导致从站主控掉电重启,主站就会报从站丢失。这个情况有一个非常典型的现象:掉线时间点恰好在一台伺服执行抱闸释放或者大加速度运动时。
第三步,检查拓扑距离和分支。EtherCAT虽然拓扑灵活,但两个从站之间的网线长度一般建议不超过100米,而且尽量不要星型分支多级串联。工业现场如果走线太长,建议增加中继器或者调整拓扑结构。
第四步,看分布式时钟(DC)是否稳定。在CODESYS的EtherCAT主站诊断里,可以查看每个从站的DC漂移和同步误差。如果某个从站的同步误差持续变大,说明它的DC基准有问题,往往是该从站时钟芯片的晶振精度差,可以尝试在从站上下文中更换“参考时钟”到另一个从站,看是否会改善。
第五步,更新从站固件或主站驱动。国产伺服从站固件更新很快,有些掉线问题是早期固件bug,找厂商要最新固件刷一下可能就好了。
6.2 电机抖动与轴振动的逐步定位
抖动问题要区分机、电、还是参数。这个排查手法很重要:先把位置环增益调小,或者干脆让轴断电不收(如果机械允许),用手推动模组感觉有没有异常阻力。如果断电推动时就有卡顿、异响,那是机械问题,调整丝杠预压、导轨滑块或联轴器。
如果断电推动很顺滑,上电后才抖动,那基本是电气或参数问题。这时先用最简单的办法:把轴用固定速度运行,听声音、摸电机座。如果低速运行时抖动,多半是编码器反馈噪声或者电流环参数问题;如果只有高速运行才抖,多半是机械共振或位置环增益过大。
我自己调试的一个案例是这样的:模组上电,轴静止时电机就发出高频噪音,手摸电机外壳有明显高频振动。我先用Trace看速度反馈,发现静止时速度反馈有高频扰动。检查发现编码器线使用了普通网线,没有屏蔽层,且与伺服动力线走在同一个线槽里,干扰串进了编码器反馈。换了屏蔽编码器线并重新布线后,高频噪音消失。这是电磁兼容问题而不是参数问题,光调滤波治标不治本。
还有一类抖动是“走停抖动”:定位完成后轴有明显的来回震荡。这种通常是位置环增益过高或速度环积分时间过短,造成闭环阻尼不足。处理办法是先降低位置环增益,如果设备刚性要求高,再加速度前馈补偿,而不是一味追求高增益。
6.3 绝对值编码器电池与报警处理
绝对值伺服编码器分单圈和多圈两种,多圈绝对值需要电池或者超级电容供电来保持断电后的多圈位置数据。最常见的报警是“编码器电池电压低”。
这里要特别提醒:更换编码器电池时,不要先把电池线拔掉!正确流程是:先让伺服驱动器上电,再拆旧电池、换新电池,这样可以避免在更换过程中丢失多圈位置数据。换完电池后,通常需要重新执行一次绝对原点设定。
如果出现“编码器过温”报警,要检查电机是否长时间过载、环境温度是否过高、编码器线束是否接触不良。编码器线束的问题容易被误判成编码器本体故障,建议先检查线束两端的接头有没有松动、针脚有没有氧化。
另外一个常见情况是:更换了伺服电机之后,原来的绝对原点数据失效。我在现场吃过这个亏:电工换完电机后没告诉我,产线一开机所有轴位置都偏了,找了一上午原因。所以项目验收时要跟现场运维强调:更换电机或编码器后,必须通知程序人员重新标定原点。
6.4 软件层面的风险:程序停止后轴失控的预防
最后单独说一说软件层面的风险,因为这个问题平时调试很容易忽略,出了事就是大事故。
在CODESYS里,当你在线修改程序并下载、或者意外断开连接、或者应用被停止时,EtherCAT主站会停止发送周期报文。这时伺服驱动器会按自己的“通信丢失”行为配置来处理,有的是保持当前位置不动,有的是急停,有的是继续按最后指令运行。这个行为驱动器面板上有一个参数可以设置,我建议所有项目统一设置为“通信丢失后急停”。
在PLC程序侧,有几个细节建议:
- 急停信号必须硬接线进伺服驱动器的急停输入,而不是只靠PLC程序处理。硬接线优先级最高,即使PLC程序死掉,急停仍然有效。
- 轴使能逻辑要和模式选择开关联动:手动调试模式、自动运行模式分开,手动模式下不允许执行自动定位指令。
- 程序里每个轴的运动指令都要有超时保护。最简单的方法是:轴在运行状态下,如果超过设定时间还没到“到位”状态,就触发报警并调用MC_Stop。
我个人习惯在项目的系统变量里加一个“Heartbeat”运行心跳:PLC主任务每50毫秒翻转一次这个布尔变量,如果上位机或者触摸屏在500毫秒内没有看到心跳翻转,就判定PLC程序假死,触发外部硬接线的安全继电器断开伺服使能。这个设计花不了多少钱,但能把故障损失压到最低。
调试EtherCAT加CODESYS这类项目,我最大的体会是:这套架构本身能力很强,但能不能发挥出来,取决于基础环节是否扎实——PDO映射是否清晰、机械参数换算是否正确、三环调试是否按顺序。只要把链路里的每一环都弄明白,后面各种项目基本就是同一个套路换个从站型号而已。上面这些内容都是我在现场一次次踩坑、抓Trace、查线缆之后沉淀下来的,希望能帮你少走一些弯路。