尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

CiA402伺服协议详解:状态机、对象字典、九种工作模式与调试

CiA402伺服协议详解:状态机、对象字典、九种工作模式与调试 1. 为什么一台伺服上电之后真正决定它听不听话的是CiA402干了几年运动控制的人大概都有过这种体验硬件接线没问题总线能扫到节点SDO 也能读写可电机就是不转或者一给使能就报警。折腾半天最后发现是状态机里某个位没对上或者模式切换的顺序不对。这类问题的根源几乎都绕不开一套东西——CiA402 伺服协议。CiA402 是 CANopen 体系里针对驱动与运动控制设备的一份设备行规Device Profile后来被纳入 IEC 61800-7-201/202 标准成为工业伺服、变频器、步进驱动器之间事实上的通用语言。它规定了驱动器的状态机、对象字典、工作模式、控制字与状态字的位定义。换句话说不管你是用 CANopen、EtherCATCoE还是别的基于这套行规的实时以太网只要驱动器标称符合 CiA402那么它的使能流程、模式切换、参数结构就是同一套逻辑。学会了它你换一个品牌的驱动器可能只需要改几个厂商特定的对象索引核心操作几乎不用重学。我写这篇东西的出发点很简单网上讲 CiA402 的资料要么是直接把标准文档翻译一遍术语满天飞看完比不看还懵要么是某一家驱动器的说明书只讲自己那个型号换台设备就抓瞎。而真正在项目里踩过的坑——比如为什么模式切换非要先失能再切、PP 模式里 target reached 到底什么时候置位、CSP 模式下不给同步信号电机为什么会飞车——这些很少有人系统讲清楚。这篇文章适合三类人刚接触伺服调试、想搞懂状态机每一步在干嘛的新手做过 CANopen 但不熟悉多模式切换的工程师以及想从 PLC 逻辑控制转向运动控制、需要补这块知识的人。我不打算照本宣科地复述标准而是按照一个真实项目的落地顺序把状态机怎么走、对象字典要背哪些、九种工作模式怎么选、模式切换怎么实现、出问题怎么排查这几件事讲透。每一段我都会补上为什么这么做和我当时是怎么做的能直接抄作业的地方尽量给到参数和时序。2. 状态机是整套协议的骨架先把这台变速箱吃透再谈模式2.1 八个状态与四条跃迁路径CiA402 最核心、也是最容易被忽略的东西不是工作模式而是状态机。你可以把它理解成汽车的变速箱挡位模式是你要往哪个方向开而状态机是现在挂的是空挡、前进挡还是已经熄火。挡位不对方向再对车也不动。标准定义了八个状态Not Ready to Switch On驱动器内部自检、初始化阶段外部控制字此时无效。Switch On Disabled初始化完成等待上位机指令此时功率级是断开的。Ready to Switch On已经允许上电但功率输出还没使能。Switched On功率级已供电但电机轴仍然处于自由状态无力矩输出。Operation Enabled真正的工作状态电机通电并跟随指令这是所有运动模式运行的前提。Quick Stop Active接收到快速停止命令后的减速状态。Fault Reaction Active检测到故障后的处理状态会执行厂商定义的停机动作。Fault故障已锁定必须通过复位命令才能退出。这八个状态之间的迁移全部由**控制字Controlword索引 0x6040的位组合触发而当前处于哪个状态则通过状态字Statusword索引 0x6041**读回。这就是为什么调试伺服时你总在写 0x6040、读 0x6041——它们俩就是你和驱动器对话的遥控器与反馈表盘。很多人第一次看状态图会觉得线很多、很乱其实抓住主干就够了从上电到能跑只有一条最短路径。Switch On Disabled → Ready to Switch On → Switched On → Operation Enabled四步对应四个控制字命令我后面会给出具体的十六进制值。2.2 控制字与状态字的位级对照要能一眼看懂调试软件里那一串十六进制必须把位的含义记牢。控制字 0x6040 里最常用的几位如下位名称含义bit0Switch On请求进入 Switched Onbit1Enable Voltage允许功率级上电bit2Quick Stop写 0 触发快速停止低有效bit3Enable Operation使能运行进入 Operation Enabledbit4~bit6模式相关不同工作模式下含义不同bit7Fault Reset故障复位上升沿有效bit8Halt暂停按停机斜坡减速bit9模式相关例如 PV/CSP 下的不减速停止状态字 0x6041 里对应的关键位位名称含义bit0Ready to Switch On已准备好上电bit1Switched On已进入 Switched Onbit2Operation Enabled已使能运行bit3Fault故障标志bit4Voltage Enabled主回路电压已建立bit5Quick Stop快速停止未激活正常时为 1bit6Switch On Disabled处于禁止上电状态bit7Warning警告bit9Remote远程控制有效bit10Target Reached目标到达bit11Internal Limit Active内部限制生效bit12/bit13模式相关见各模式说明注意状态字 bit5 是低有效的反向逻辑。正常情况下它应该读到 1如果读成 0说明 Quick Stop 被触发了此时无论你怎么写控制字都使能不起来。我见过不止一个人卡在这里盯着控制字看半天问题出在状态字。2.3 上电使能的完整时序推演现在把上面两张表拼起来走一遍最经典的使能流程。假设驱动器已经把状态字报回了0x0250bit6 Switch On Disabled 1bit4 Voltage Enabled 1说明初始化完成、主回路已上电等待指令。第一步发Shutdown控制字写0x0006bit1 bit2。bit2 Quick Stop 写 1 表示取消快速停止bit1 允许电压。执行后状态字应该变成0x0021即 Ready to Switch On。第二步发Switch On控制字写0x0007bit0 bit1 bit2。执行后状态字变成0x0023进入 Switched On功率级已供电但电机还没出力。第三步发Enable Operation控制字写0x000Fbit0~bit3 全 1。执行后状态字变成0x0027此时 bit2 Operation Enabled 置位电机开始跟随指令。这三步之间的间隔很多驱动器并不要求严格延时但我在项目里习惯每步之间给 10~20ms 的余量。原因是有一次用某个品牌的驱动器连续无延时下发这三个命令偶发出现状态字还在过渡中就收到下一条命令导致跳到 Fault。后来加了小延时再没出现过。这是经验不是标准要求但值得留意。如果中途要停机正常停走Disable Operation0x0007回到 Switched On要彻底断电走Disable Voltage0x0000回到 Switch On Disabled。3. 对象字典三千条真正要背下来的其实就十几个3.1 通用对象与模式专属对象分层CiA402 的对象字典条目很多但按使用频率分你会发现常用的就那么十几个。我把它们分成两层通用层所有模式都用和模式专属层只在特定模式下有意义。通用层里你几乎每次通讯都要碰的0x6040Controlword、0x6041Statusword状态机遥控器。0x6060Modes of Operation写入设定当前工作模式。0x6061Modes of Operation Display读回确认模式真的切过去了。0x6064Position Actual Value、0x606CVelocity Actual Value、0x6077Torque Actual Value三个实际值反馈。0x603FError Code故障码报警时第一个要查的。0x607DSoftware Position Limit软件限位sub1 是最小值、sub2 是最大值防止机械撞限位。0x6502Supported Drive Modes读回驱动器支持哪些模式选型时非常有用的一个对象。模式专属层按模式分PP 模式关心0x607A目标位置、0x6081轮廓速度、0x6083加速度、0x6084减速度PV 模式关心0x60FF目标速度PT 模式关心0x6071目标转矩、0x6087转矩斜坡HM 回零关心0x6098回零方法、0x6099回零速度、0x609A回零加速度CSP/CSV/CST 这几种周期同步模式则关心0x60C2插值周期以及各自的目标值对象。提示0x6502这个对象在新设备上手时特别值钱。它用位掩码告诉你驱动器到底支持哪几种模式比如 bit0 表示支持 PPbit3 表示支持 PVbit8 表示支持 CSP。有一次我拿到一台驱动器怎么配 CSP 都不动读了这个对象才发现它根本不支持 CSP白折腾一下午。3.2 用户单位换算位置和速度到底怎么算新手最容易栽的一个坑是我明明写了目标位置 10000为什么电机转了好大一圈。这背后就是**用户单位User Unit**的换算问题。CiA402 里位置、速度都用用户单位表达而这个单位是由减速比0x6091和进给常数0x6092决定的。0x6091Gear Ratiosub1 是电机转数、sub2 是负载轴转数也就是电机转 sub1 圈负载转 sub2 圈。0x6092Feed Constantsub1 是进给量、sub2 是负载轴转数意思是负载轴转 sub2 圈负载移动 sub1 个单位。我拿一个具体例子算一遍。假设编码器是 20 位即每圈 1048576 个计数count电机和负载之间减速比是 1:1我用旋转台我把进给常数设成一圈对应 3600 个用户单位也就是每个单位 0.1 度。那么每转一圈的用户单位数 3600。每个用户单位对应多少计数 1048576 / 3600 ≈ 291.3 个计数。反过来如果你想让电机以 10 圈/秒转动目标速度0x60FF或0x6081就应该写 36000 单位/秒。这套换算看起来麻烦但好处是一旦设好上层的控制器就完全按工程单位思考——角度用 0.1 度、直线轴用微米、速度用单位/秒不用关心底层编码器分辨率。这也是 CiA402 设计用户单位的初衷让机械工程师用机械的语言描述运动让驱动器去做底层换算。我建议在项目一开始就把0x6091和0x6092按机械参数配好后面所有目标值都按用户单位给别中途改否则所有已配好的数值都要重新算。3.3 SDO 与 PDO 的分工决定了系统的实时性对象字典里的数据怎么读写靠 SDO 和 PDO 两套机制。SDO 是配置通道一问一答可靠但有握手开销PDO 是数据通道周期广播实时性高但不保证送达。原则很简单参数配置用 SDO实时指令用 PDO。具体来说模式选择0x6060、加减速0x6083/0x6084、限位0x607D这些改一次就长期不变的全部走 SDO而控制字0x6040、目标位置0x607A、目标速度0x60FF这些每个周期都要刷新的必须走 PDO。控制字如果不走 PDO靠 SDO 一条条发那响应速度根本撑不起运动控制一秒钟也就几条命令电机只会一顿一顿的。PDO 的映射在通信初始化阶段Pre-Operational 状态用 SDO 配置好包括传输类型、映射对象、映射长度。映射长度尤其要小心比如把0x604016 位和0x607A32 位映射到同一个 TPDO要清楚哪个在前哪个在后、总共占几个字节。有一次我做主站PDO 映射顺序和从站预期的对不上控制字和位置值错位结果电机收到的控制字其实是位置的半个字直接乱套。这个教训后面排查部分还会展开。4. 九种工作模式逐一拆解什么时候用哪种心里得有数4.1 点位模式 PP 与插值模式 IP定长运动选谁PP 模式Profile Position模式号 1是定长运动里用得最多的一种。上位机给一个目标位置驱动器按照你设的轮廓速度、加速度、减速度自己规划一条梯形或 S 形速度曲线走完置位 Target Reached。它最大的好处是运动规划下放到驱动器主站只要发指令不用每个周期算轨迹总线负载低。PP 模式下控制字 bit4 是 New Set-point需要上升沿触发bit5 是 Change Set Immediately决定当前点走到一半时来了新点是停下来重新规划还是走到当前点再走新点bit6 是绝对/相对位置选择。状态字 bit10 是 Target Reachedbit12 是 Set-point Acknowledge这两个位的时序关系是判断驱动器有没有收到新点的关键——bit12 会随着你 bit4 的上升沿翻转可以用来确认我发的新点驱动器真的吃了。IP 模式Interpolated Position模式号 7则是另一条路主站把每个插值周期的位置点连续下发驱动器做插值平滑。它适合轨迹已知、需要严格同步的场合比如多轴联动的曲线插补。缺点是对主站周期性要求高主站一卡轨迹就抖。选型逻辑很清楚单轴定长、主站压力大选 PP多轴联动、轨迹预先规划选 IP。我在做单轴模组上下料时一律用 PP简单稳做龙门双轴同步才会上 IP 或后面要讲的 CSP。4.2 速度与转矩PV、PT 各自的适用面PV 模式Profile Velocity模式号 3只有速度目标0x60FF外加加减速0x6083/0x6084速度本身靠驱动器做斜坡。它适合连续运转类应用比如传送带、卷绕、风机。控制简单但位置不闭环不能停到确定位置。PT 模式Profile Torque模式号 4目标对象是0x6071可以理解成我要让电机输出多少力矩。它常用于张力控制、压装、力控场合比如拧螺丝、压合。用 PT 一定要慎重因为转矩是直接控制量参数给大了就是硬撞机械上要有限位和缓冲保护。我个人的经验是能用位置控制就别用转矩控制转矩模式对机械刚性和参数整定要求高得多。实在需要力控也尽量在 PT 外面套一层位置或速度环做外环让机器有兜底。4.3 回零 HM机器每次上电的起手式增量式系统上电后不知道自己在哪必须回零。HM 模式Homing模式号 6就是干这个的。核心对象是0x6098回零方法标准里定义了 1~35 号方法还有负数是厂商特定方法对应往哪个方向找、找到哪个信号作为零点、要不要找 Z 相等等组合。常见的比如方法 17 是往负方向找限位开关、方法 35 是以当前位置为零点。0x6099是两段回零速度sub1 是寻找开关时的速度sub2 是找到开关后精找 Z 相的速度。0x609A是回零加速度。HM 模式下控制字 bit4 是 Start Homing状态字 bit12 是 Homing Attained、bit13 是 Homing Error。回零这块最常见的坑是速度太快。高速撞限位机械冲击大还有可能过冲导致 Z 相信号错过。我的习惯是找开关速度设为额定速度的 1/5 左右精找 Z 相速度再降到 1/20宁可慢一点稳。4.4 周期同步 CSP、CSV、CST真正意义上的实时运动前面几种模式驱动器都在做自主规划主站给的是终点或段。而CSPCyclic Synchronous Position模式号 8、CSV模式号 9、CST模式号 10是另一套哲学主站每个同步周期下发一次目标值驱动器只负责插值和执行不做规划。CSP 下主站每个周期写0x607A目标位置驱动器读0x6064实际位置两者之间的偏差由驱动器内部的位置环去追。同步周期由0x60C2的插值周期决定常见配置是 1ms。这类模式下同步信号一旦中断驱动器得不到新目标值通常会按最后一次目标保持或者报同步错误具体行为看厂商实现。CSP 是数控、机器人这类要求多轴严格插补场合的首选。但它对主站的实时性和总线抖动极其敏感。我踩过最惨的一次坑主站因为一个任务调度问题同步周期偶尔抖到 5ms结果多轴插补出来的轨迹出现明显的接刀痕肉眼就能看到。后来把通信任务优先级调到最高、用实时系统才解决。到这里九种模式过完了。我整理了一张对照表方便选型时快速定位模式编号目标对象典型场景规划方PP10x607A单轴定点、上下料驱动器PV30x60FF传送带、卷绕驱动器PT40x6071张力、压装驱动器HM60x6098上电回零驱动器IP70x60C1多轴插补主站驱动器CSP80x607A数控、机器人主站CSV90x60FF速度同步轴主站CST100x6071力控协同、牵引主站5. 多模式切换实战从状态机到 PDO 的完整落地5.1 为什么模式切换必须先失能、再改、后使能这是个新手最容易问的问题我能不能在 Operation Enabled 状态下直接改0x6060答案基本是不行或者说能做也千万别做。原因在于状态机本身。0x6060写入只在特定状态下被驱动器接受生效而且切换模式会改变目标对象比如从0x607A变成0x60FF如果电机还在使能状态运行瞬间换了目标对象含义驱动器内部的位置环/速度环会收到一个不连续的目标跳变轻则电机猛窜、报警重则伤机械。我在标准里看到的是模式切换应在 Operation Enabled 之前完成落到实操上稳妥的范式是这样发 Disable Operation0x0007从 Operation Enabled 退回 Switched On通过 SDO 写0x6060目标模式读回0x6061确认模式真的切过去了切换与该模式相关的 PDO 映射这一步在 Pre-Operational 阶段做或者用动态映射发 Enable Operation0x000F进入 Operation Enabled。注意第 3 步读0x6061是必须的不能写完就假设切成功。有些驱动器不支持某些模式写0x6060会被忽略0x6061还是旧值。不检查的话你以为切到了 CSP其实还在 PP后面发目标值自然对不上。5.2 一次 PP 到 CSP 的完整切换时序记录我拿项目里一次真实的切换过程记录一下场景是设备上电先做 PP 模式的回零定位然后切到 CSP 做多轴插补。上电后状态字0x0250走标准使能0x0006→0x00210x0007→0x00230x000F→0x0027。此时0x6060写 1PP设0x6081为 36000、0x6083为 360000、0x6084为 3600000x607D限位设 -360000 到 360000。写0x607A目标位置 18000控制字发0x000F | 0x0030bit4 New Set-point bit5 Change Immediately观察状态字 bit10 置位后定位完成。现在切 CSP。先0x0007失能状态字回0x0023。SDO 写0x6060 8读回0x6061 8确认。此时如果 CSP 的 PDO 映射和 PP 不一样就要重新配置。我把 RPDO 映射从控制字 目标位置保持不变其实这俩对象两个模式共用TPDO 加了状态字 实际位置 实际速度。重新进 Pre-Operational、配 PDO、回 Operational。然后写0x60C2sub1 1插值周期 1mssub2 -3表示 10 的 -3 次方秒。最后0x000F使能进入 CSP。从这一刻起每个 1ms 周期主站往0x607A写新目标位置。第一帧目标值我习惯写成当前实际位置读0x6064避免切换瞬间位置环有一个大偏差导致猛冲。这是个小技巧但很管用。5.3 PDO 映射的实操细节与动态切换PDO 映射配置英文叫 mapping本质是告诉驱动器这个 PDO 里按顺序装了哪几个对象、每个多长。它在 Pre-Operational 状态下用 SDO 写0x1600RPDO 映射和0x1A00TPDO 映射完成。配置顺序有个讲究先把映射条目数0x1600sub0 写成 0清空再逐条写 sub1、sub2……最后写回条目数。为什么因为如果你先写了条目数、再改里面的对象驱动器可能认为映射非法或者实际生效的是旧的那一版。顺序反了症状是我明明映射了新对象可 PDO 里传的还是旧的。这个坑我踩过后来养成习惯先清零再配。映射长度要自己算清楚。比如映射三个对象0x604016 位、0x607A32 位、0x60FF32 位总长度就是 24410 字节。如果映射长度和实际对象长度对不上或者各个 PDO 之间字节数冲突驱动器会报映射错误。有些驱动器支持动态 PDO 映射在 Operational 状态下也能改有些不支持配置前最好查手册。不支持动态映射的就得走CSP 用一套固定 PDO、所有模式共用同一套映射的路子把所有可能用到的对象都映射进来虽然浪费几个字节但省去了每次切换都要回 Pre-Operational 的麻烦。6. 常见问题与排查技巧实录6.1 问题速查表调试这么久问题看着五花八门其实类型高度集中。我把最常遇到的整理成表现象可能原因排查方向使能不起来状态字停在 0x0040主回路电压没建立查 bit4 Voltage Enabled状态字 bit3 置位跳 Fault过流、编码器、参数错误读 0x603F 故障码写完控制字状态字无变化PDO 没映射控制字或映射错位抓总线看 PDO 原始字节模式切了但行为没变0x6061 没确认或驱动器不支持读回 0x6061、读 0x6502PP 模式目标走了但 Target Reached 不置位到位窗口、速度过冲查到位窗口参数、减速设置CSP 下电机抖动或飞车同步周期抖动、目标值跳变用实际位置作为首帧目标回零找不到开关速度过快、方向反、信号极性降 0x6099 速度、查信号6.2 那些文档上不写的坑第一个坑控制字的写一次和每周期写是两回事。有些驱动器要求控制字即使在 Operation Enabled 下也要每个同步周期都写一遍哪怕是同样的值否则会超时报警。这在大网关上做转发时特别容易被忽略。我的做法是只要走 PDO控制字固定挂在 RPDO 里每个周期都刷不做变化才发的优化。第二个坑状态字要边沿采集别只看当前值。Target Reached、Set-point Acknowledge 这类位是瞬时的尤其是 Acknowledge它会翻转。如果你的主站采样周期比总线周期慢很可能漏掉一次翻转就误判成驱动器没收到新点。稳妥的做法是在从站侧做边沿锁存或者主站用比总线快得多的周期轮询。第三个坑故障复位的时序。Fault Reset 是 bit7上升沿有效。很多人写0x008F保持 bit7 为 1结果故障复位不了因为驱动器等的是上升沿——你要先写0x0080再写0x0000形成一次 0→1→0。而且复位命令最好在状态字确实显示 Fault 之后再发有时候故障刚发生、状态字还没来得及更新你提前复位等于没发。第四个坑不要轻易在运行中改软件限位和回零参数。这类对象属于配置类改了要断电重载或者重新初始化才生效具体看厂商。我见过有人在运行中改0x607D限位以为能实时生效结果不生效还差点撞机。配置类的参数改完老老实实走一遍重新初始化。最后分享一个我个人的排查套路用一根 USB 转总线工具直接挂在驱动器上绕过 PLC用上位机软件逐条发 SDO、看状态字。这样能把问题定位到到底是驱动器的问题还是主站程序的问题。程序里全是对的、但就是不转九成是 PDO 映射或时序问题手动发 SDO 都不转那就是驱动器配置或硬件问题。左右一对比方向立刻就清晰了。这个方法帮我在好几次数小时的死磕里快速找到了病根比盯着程序日志猜要高效得多。
返回列表