1. 为什么八个字节值得单独写一篇如果你拆过协作机器人的关节模组或者自己搭过基于CAN总线的多轴运动平台大概率见过这样的场景上位机发下去一帧标准数据帧8个字节关节那边电机就动了。看起来简单得不行但真到自己写协议对接的时候问题就来了——这8个字节里哪几个是位置哪几个是速度电流和位置能不能同时下发第7个字节到底是保留位还是使能标志我见过太多人卡在这一步。硬件接线没问题CAN分析仪也能抓到波形波特率对得上终端电阻也焊了但电机就是不动或者动一下方向反了或者转着转着突然报错。最后查来查去问题往往不在电路而在对那8个字节的理解上——协议到底约定了什么发送端和接收端的理解是不是一致。这篇内容就是围绕这个核心问题展开的。我会从CAN帧的基础结构讲起然后拆解关节电机控制里常见的几种数据布局方式再结合实际的收发流程说明每一段字节通常承载什么语义、为什么这样分配、以及对接时最容易踩的坑。不管你是做机器人控制的软件工程师还是搞机电一体化的嵌入式开发者只要你的工作里出现过“CAN总线控制电机”这个组合这篇内容应该都能帮你省下不少调试时间。需要提前说明的是不同厂家的关节模组协议细节肯定有差异我不会去绑定某一个具体型号而是把这类协议设计背后的通用逻辑讲清楚。你拿着这套思路去看自己手头的协议文档会顺畅很多。2. 八个字节的物理边界与协议分层2.1 经典CAN帧的数据场为什么是8字节经典CANCAN 2.0A/B的数据场长度固定为0到8个字节这是协议标准定死的。很多人会问为什么不是16个、32个这跟CAN的设计年代和应用场景有关。CAN最早是给汽车电子用的要在一根总线上挂几十个节点每个节点定期广播状态帧不能太长否则总线占用时间过久实时性就崩了。8个字节是在“信息量够用”和“总线延迟可控”之间折中的结果。到了关节电机控制这个场景8个字节其实挺紧张的。你想一个关节要控制位置、速度、电流还要读回编码器值、温度、错误码如果全塞进一帧根本不够。所以实际协议设计里通常会把“控制指令”和“状态反馈”分成不同的帧来处理或者用多帧拼接。但单帧控制指令8个字节是上限怎么在这8个字节里塞下最关键的几个量就是协议设计的核心问题。这里有个容易混淆的点CAN FD灵活数据速率把数据场扩展到了64字节但很多关节模组仍然用经典CAN因为成本低、生态成熟。你拿到一个模组第一件事就是确认它用的是经典CAN还是CAN FD这直接决定了你能在一帧里塞多少东西。2.2 仲裁段、控制段和数据段各管什么一帧标准CAN数据帧从前往后大致分几块帧起始、仲裁段包含11位标识符和RTR位、控制段包含IDE、DLC等、数据段0到8字节、CRC段、ACK段、帧结束。对于写应用层协议的人来说最需要关注的是仲裁段里的标识符和数据段。标识符决定了这帧报文被哪个节点接收也决定了优先级。在关节控制里通常会把关节ID编进标识符。比如标识符0x100到0x10F分别对应1到16号关节这样每个关节只需要监听自己ID对应的标识符过滤逻辑很简单。数据段就是那8个字节具体怎么解释完全由应用层协议约定。控制段里的DLC数据长度码告诉接收方这帧实际用了几个字节。有些协议固定用满8字节有些则根据指令类型动态变化。我个人的经验是固定8字节更省心因为接收方不用处理变长解析缓冲区也好管理。但如果你要兼容多种指令变长也有它的灵活性。注意DLC和实际数据长度必须匹配。我遇到过有人DLC写了8但只填了4个字节的数据接收方读出来的后4个字节是缓冲区里的随机值导致电机收到莫名其妙的指令。这种问题用CAN分析仪看波形不一定能发现因为波形上DLC就是8得看接收端的解析日志才能定位。2.3 应用层协议才是真正要约定的东西物理层和链路层由CAN标准保证真正需要收发双方坐下来谈的是应用层协议。这8个字节里第1字节是什么含义第2字节是什么含义字节序是大端还是小端有符号还是无符号缩放因子是多少这些统统属于应用层约定。我习惯把应用层协议分成三个层次来描述帧类型层、字段布局层、数值编码层。帧类型层决定这帧是控制指令、参数配置还是状态查询字段布局层决定每个字节或每几个字节对应哪个物理量数值编码层决定物理量怎么转成二进制。这三层任何一层对不上电机都不会按你预期的方式动。很多协议文档写得含糊只给一张表说“字节0-1是位置”但没说清是目标位置还是当前位置是绝对位置还是增量位置单位是度还是弧度还是脉冲数。这种模糊地带就是调试时最耗时间的地方。我的做法是拿到文档后先自己画一张完整的字节映射表把每个字节的每一位都标清楚然后拿这张表去跟实际收发数据对照确认理解无误再往下做。3. 关节控制里常见的字节分配方案3.1 位置加使能型最简控制帧这是最常见的一种控制帧布局适合对实时性要求高、但控制精度要求不那么极致的场景。8个字节大致这样分字节0到3是目标位置4个字节的整型或浮点字节4到5是目标速度2个字节的整型字节6是使能标志和模式选择字节7是校验或保留。为什么位置用4个字节因为关节位置通常需要较高的分辨率。假设关节转动范围是0到360度你要精确到0.01度那需要36000个刻度2个字节最大65535勉强够但如果你要表示多圈绝对位置比如±100圈那2个字节就完全不够了。4个字节的整型可以表示±21亿足够覆盖绝大多数场景。如果用浮点4个字节的IEEE 754单精度浮点也能提供约7位有效数字对位置控制来说通常够用。速度用2个字节是因为速度的精度要求通常比位置低一个数量级。而且速度往往作为前馈或限幅用不需要太精细。使能标志放在字节6是因为它需要跟位置、速度同时下发保证电机在收到目标值的同一时刻被使能避免先使能再给目标值导致的抖动。这种布局的坑在于字节序。4个字节的位置值到底是大端还是小端我见过同一家公司的不同型号模组固件版本不一样字节序居然变了。所以对接时一定要用已知值去测试比如发一个0x00000064看电机是不是转到100对应的位置如果不是就试试字节反序。3.2 电流加位置型力控场景的取舍在力控或阻抗控制场景里电流环的指令比速度环更直接。这时候协议可能会把电流放在显眼的位置。一种常见的布局是字节0到1是目标电流2个字节的有符号整型字节2到5是目标位置4个字节字节6是刚度或阻尼系数字节7是使能和错误复位。为什么电流用2个字节因为电流环的带宽通常很高但绝对精度要求不一定高。而且电流值容易受到温度和母线电压影响给太高的分辨率意义不大。2个字节的整型配合一个缩放因子比如1LSB等于10mA可以表示±327.67A的范围对大多数关节电机来说绰绰有余。这种布局的难点在于电流和位置的协同。如果你同时下发电流和位置电机到底听谁的这取决于关节内部的控制模式。有些模组是电流环为内环、位置环为外环你给的位置是外环目标电流是内环前馈有些则是纯电流模式位置只用来做限幅。协议文档里如果不写清楚你就得自己试。我的建议是先单独发电流指令确认电机能出力再叠加位置指令观察响应变化。3.3 多关节广播型一帧控制多个轴有些紧凑型机器人会把多个关节挂在同一组CAN标识符下用一帧的8个字节控制多个关节的少量参数。比如字节0到1控制关节1的位置增量字节2到3控制关节2的位置增量以此类推。这种方案适合对每个关节的控制精度要求不高、但同步性要求高的场景。这种布局的代价是每个关节能分到的位数很少。2个字节表示位置增量如果增量范围是±180度分辨率大概在0.0055度看起来还行但如果你要表示绝对位置2个字节就不够了。所以广播型协议通常只用于周期性同步信号比如每个控制周期发一个增量关节自己累加。这种方案最大的坑是同步丢失。如果某一帧因为总线冲突或错误被丢弃某个关节的增量就丢了位置就会累积误差。所以广播型协议通常需要配合周期性的绝对位置校准帧或者依赖关节内部的编码器做闭环。我在一个多轴同步项目里用过类似方案后来发现必须每100毫秒插入一帧绝对位置查询否则运行几分钟后各关节的位置偏差就肉眼可见了。3.4 状态反馈帧的字节安排控制帧是从上位机到关节反馈帧是从关节到上位机。反馈帧的8个字节通常包含当前位置4字节、当前速度2字节、电流或力矩1到2字节、状态标志1字节。如果空间不够可能会把速度和电流压缩或者分两帧发送。反馈帧的解析比控制帧更麻烦因为你要处理实时性。如果上位机每1毫秒收到一帧反馈解析代码必须足够快不能有阻塞操作。我见过有人在CAN接收中断里做浮点运算和打印日志结果中断处理时间过长导致后续帧丢失。正确的做法是在中断里只做数据拷贝把解析放到主循环或单独的任务里。另外反馈帧里的状态标志位往往包含错误码、使能状态、限位触发等信息。这些位的定义必须跟控制帧的使能位对应上否则会出现“我明明发了使能反馈却说没使能”的情况。这种问题通常是字节偏移搞错了比如控制帧的使能位在字节6的bit0反馈帧的状态位在字节7的bit3你如果按同一个位置去读肯定对不上。4. 字节序、缩放与校验的实操细节4.1 大端小端的判断与转换字节序是CAN协议对接里最经典的坑。假设目标位置是1000用4字节整型表示大端是0x00 0x00 0x03 0xE8小端是0xE8 0x03 0x00 0x00。如果你发反了电机收到的值可能是0xE8030000也就是一个巨大的数直接触发限位或者报错。判断字节序的方法很简单发一个已知值比如1然后看接收端解析出来是多少。如果接收端解析出167772160x01000000那就是字节序反了。但前提是接收端有办法告诉你它解析出的原始值比如通过调试串口打印。如果接收端没有调试接口你就只能通过电机的实际动作来推断这就比较费劲了。我的习惯是在协议对接的初期先写一个简单的回环测试上位机发一帧关节收到后原样返回上位机对比发送和接收的字节。这样能快速确认字节序和字段偏移。很多关节模组支持这种回环模式或者你可以临时刷一个测试固件。4.2 物理量到整数的缩放因子协议里通常不会直接传浮点数而是传整数然后约定一个缩放因子。比如位置单位是0.001度那你传1000就代表1度。缩放因子的选择要在精度和范围之间权衡。缩放因子太小范围不够太大精度不够。举个例子关节转动范围是±180度你要精确到0.01度那需要表示±180002字节有符号整型范围是±32767刚好够。但如果你的关节是多圈的范围是±100圈也就是±36000度精确到0.01度需要±36000002字节就不够了必须用4字节。缩放因子还影响溢出处理。如果你发的值超过了协议约定的范围接收端是截断、饱和还是报错这必须在协议里写清楚。我遇到过接收端直接截断的结果我发了一个超范围的值电机转到了完全错误的位置差点撞机。后来我在发送端加了一层饱和判断超过范围就钳位到边界值同时上报一个警告。4.3 校验和与滚动计数器的取舍8个字节里要不要留一个字节做校验这取决于总线环境和可靠性要求。如果总线很短、节点很少、干扰很小可以不校验把8个字节全用于数据。但如果总线较长、节点多、有电机等干扰源建议留一个字节做校验比如简单的累加和或CRC8。校验的代价是少一个字节的数据容量。对于控制帧来说少一个字节可能意味着速度值没法传了或者使能位没地方放。这时候可以考虑把校验放到标识符里或者用CAN本身的CRC校验。经典CAN的CRC是15位能检测大部分错误但它保护的是整帧的位流不能防止应用层的数据被错误解释。所以如果应用层数据本身有冗余比如位置值的高字节和低字节有固定关系也可以用来做简单校验。滚动计数器是另一个常用的可靠性手段。在字节7里放一个0到255循环的计数器接收端检查计数器是否连续。如果发现跳变说明中间丢了帧可以采取相应措施比如保持上一帧指令或触发安全停止。这个机制在高速控制里很有用因为CAN总线在负载高的时候确实会丢帧。提示滚动计数器的初值和步长要在协议里约定好。我见过发送端从0开始接收端从1开始判断结果第一帧就被认为是丢帧电机直接进入安全状态。这种问题查起来很隐蔽因为逻辑上双方都没错只是约定不一致。5. 从抓到的一帧数据反推协议5.1 用CAN分析仪抓包后的解读流程当你拿到一个不熟悉的关节模组没有协议文档或者文档写得很烂最直接的办法就是抓包反推。你需要一个CAN分析仪能实时显示每帧的标识符、DLC和数据字节。然后让模组在上位机软件的控制下做几个典型动作比如使能、正转、反转、停止同时观察数据变化。解读流程大致是这样先找出哪些标识符是控制帧哪些是反馈帧。通常控制帧的标识符比较固定反馈帧的标识符可能跟关节ID相关。然后看控制帧的数据字节在电机使能前后哪个字节发生了变化那个字节很可能包含使能位。在电机正转和反转时哪个字节或哪几个字节的数值变了而且变化方向跟转向相关那可能就是位置或速度指令。这个过程需要耐心因为有些字节的变化可能只是滚动计数器或校验和。我的经验是先关注那些变化幅度大、跟动作明显相关的字节把它们的值记录下来画成曲线跟电机的实际位置或速度做对比。如果某个4字节的值跟电机位置呈线性关系那基本可以确定是位置指令。5.2 用已知动作做对照实验对照实验是反推协议最有效的方法。比如你想确认位置指令的缩放因子可以发一个值让电机转到一个大概的位置然后测量实际转角。假设你发的位置值是10000电机转了大约90度那缩放因子大概是90/100000.009度每LSB。多试几个值取平均就能得到比较准的缩放因子。但要注意有些模组的位置指令是增量式的你发10000电机在当前基础上转10000个LSB而不是转到绝对位置10000。区分方法是发同一个值两次如果电机第二次不动说明是绝对位置如果第二次又转了同样的角度说明是增量位置。这个区别在协议文档里经常被忽略但对接时影响很大。速度指令的对照实验类似但速度的测量需要编码器反馈或者外部测量设备。如果你有反馈帧可以直接读反馈里的速度值跟发送值做对比。如果没有反馈可以用示波器测电机的相电流频率或者用激光测速仪但这就比较麻烦了。5.3 边界值测试暴露协议边界边界值测试能帮你快速找到协议的取值范围和异常处理逻辑。比如位置指令你可以发0、最大值、最小值、最大值加1、最小值减1观察电机的反应。如果发最大值加1时电机报错说明接收端有范围检查如果电机直接按溢出后的值动作说明接收端没有检查你需要在发送端自己做钳位。使能位的边界测试也很重要。有些模组的使能位是电平触发有些是边沿触发。电平触发是只要使能位为1就一直使能边沿触发是检测到0到1的跳变才使能。如果你按边沿触发的逻辑去发但模组是电平触发那电机可能会在你不期望的时候保持使能。反过来如果模组是边沿触发你一直发1它可能只使能一次后面就不响应了。错误复位位也值得测试。有些模组要求错误复位位先置1再置0才能清除错误有些则是置1保持一段时间。如果你只置1不置0错误可能一直清不掉。这些细节在协议文档里往往一笔带过但实际调试时能卡你半天。6. 对接过程中最容易翻车的几个点6.1 使能位与目标值不同帧导致的抖动这是一个非常典型的坑。有些协议设计里使能位在控制帧的字节6目标位置在字节0到3。如果你先发一帧使能位为1、目标位置为0的帧再发一帧使能位为0、目标位置为1000的帧电机会先使能然后立刻收到目标位置1000但因为使能位又变成0了电机可能只动了一下就停了或者干脆不动。正确的做法是使能位和目标值必须在同一帧里下发而且使能位要保持为1直到你确实想关闭使能。我见过有人为了省事把使能位单独放在一帧里发结果电机行为完全不可预测。后来改成每帧都带使能位问题就消失了。还有一种情况是模组内部有使能延时。你发了使能位为1的帧但电机要过几十毫秒才真正使能。在这几十毫秒里如果你发了目标值电机可能还没使能目标值就被忽略了。所以有些协议会要求先发使能帧等待一段时间再发目标值帧。这个等待时间必须在协议里约定或者通过反馈帧的使能状态来确认。6.2 反馈帧解析错位导致的假错误反馈帧的解析错位是另一个高频问题。假设反馈帧的字节0到3是位置字节4到5是速度字节6是电流字节7是状态。如果你把字节4到5当成位置的高16位那解析出来的位置就会完全错误可能触发位置超限报警。但电机实际上运行正常只是你的解析错了。这种问题的排查方法是先确认反馈帧的DLC和实际数据长度是否一致然后逐个字节跟已知状态对照。比如电机静止时速度字节应该是0或接近0电机使能时状态字节的某一位应该是1。通过这些已知状态去反推每个字节的含义比盲目猜测靠谱得多。另外反馈帧的更新频率也要注意。如果反馈帧是每1毫秒一帧但你的解析任务每10毫秒才跑一次那你读到的可能是旧数据。在高速控制里这种延迟会导致控制环路不稳定。我的做法是在CAN接收中断里直接更新一个全局结构体主循环只读这个结构体保证数据是最新的。6.3 总线负载过高时的丢帧与对策CAN总线在负载超过70%的时候丢帧概率会明显上升。关节控制里如果每个关节每1毫秒发一帧控制帧同时每1毫秒回一帧反馈帧6个关节就是12帧每毫秒总线负载很容易超标。这时候你会看到电机偶尔抖动或者反馈数据跳变。对策有几个一是降低控制频率比如从1kHz降到500Hz看电机性能是否还能接受二是合并帧把多个关节的控制指令合并到一帧里用不同的标识符区分三是提高波特率从500kbps提到1Mbps但前提是总线长度和节点数允许。我个人的经验是在关节数量超过4个的时候就要开始关注总线负载了。用CAN分析仪的统计功能看一下负载率如果超过60%就要考虑优化。优化的时候优先考虑合并帧因为降低频率会影响控制性能提高波特率受硬件限制。6.4 终端电阻与线缆长度的隐形影响终端电阻和线缆长度虽然属于物理层但它们对协议对接的影响是隐形的。如果终端电阻没接或者接错波形反射会导致位错误接收端可能收到错误的数据但CAN控制器会通过CRC检测到并丢弃表现就是丢帧率上升。你如果只盯着应用层协议看永远找不到问题。标准做法是在总线两端各接一个120欧姆的终端电阻。如果总线很短小于1米有时候不接也能凑合但我不建议省这个电阻。线缆长度方面500kbps下建议不超过100米1Mbps下不超过40米。如果超过这个长度要么降波特率要么加CAN中继器。还有一个容易忽略的点是分支线长度。如果从主干线分出的支线太长也会引起反射。建议支线长度不超过0.3米。我在一个项目里因为支线太长导致某个关节偶尔丢帧查了两天才发现是线缆布局问题。7. 一套可复用的协议对接检查清单7.1 上电前的静态检查项在给关节上电之前先做一遍静态检查能避免很多低级错误。检查项包括CAN_H和CAN_L有没有接反终端电阻是否焊在总线两端波特率是否跟模组匹配节点ID是否冲突电源电压是否在模组允许范围内。波特率匹配这一项特别容易出错。有些模组出厂默认是500kbps有些是1Mbps如果你按500kbps去发模组根本收不到。确认波特率的方法通常是看模组手册或者用CAN分析仪的自动波特率检测功能。如果模组支持波特率配置最好在第一次上电时就改成你常用的值避免以后混淆。节点ID冲突也很常见。如果你有两个关节的ID都是1它们会同时响应标识符0x100的帧导致动作混乱。解决方法是逐个上电用配置帧修改ID确保每个关节的ID唯一。7.2 首次通信的最小验证集第一次通信不要急着发复杂的控制指令先做最小验证。最小验证集包括发一帧使能指令看反馈帧的使能状态位是否变化发一帧位置指令看电机是否朝预期方向转动发一帧停止指令看电机是否停止。如果使能指令没反应先检查标识符和DLC是否正确再检查数据字节的使能位是否在正确的位置。如果位置指令方向反了检查位置值的符号位或者字节序。如果停止指令无效检查停止指令的优先级是否低于控制指令有些模组要求停止指令连续发几帧才生效。最小验证通过后再逐步增加控制复杂度比如加入速度前馈、电流限幅、轨迹规划。每增加一个功能都回到最小验证集确认基础功能没被破坏。7.3 长时间运行的老化观察点短时间跑通不代表协议对接没问题很多问题要在长时间运行后才暴露。老化观察的重点包括丢帧率是否随时间上升电机温度是否异常位置是否有累积误差错误码是否偶尔出现。丢帧率可以用CAN分析仪的统计功能看如果运行一小时后丢帧率从0.1%升到1%说明可能有热漂移或者电源波动。位置累积误差可以通过定期回零来检查如果每次回零的偏差越来越大说明增量式位置指令的累积误差在增加需要改用绝对位置指令。错误码偶尔出现是最难查的因为它可能跟温度、振动、电源质量都有关。我的做法是记录每次错误出现时的上下文包括时间、温度、当前指令、反馈数据然后找规律。如果错误总是在电机加速时出现可能是电流限幅设置得太紧如果总是在特定位置出现可能是编码器在该位置有干扰。7.4 协议版本变更时的回归测试关节模组的固件升级后协议可能发生变化。我遇到过升级后字节序变了、缩放因子变了、甚至标识符分配变了的情况。所以每次固件升级后都要做一遍回归测试把之前的最小验证集和老化观察点重新跑一遍。回归测试的重点是确认之前调好的参数是否还有效。比如你之前标定的位置缩放因子升级后可能就不准了。这时候不要想当然地沿用旧参数要用已知值重新标定。标定方法很简单发一个已知位置值测量实际转角计算新的缩放因子。如果协议变更较大建议保留旧版本的对接代码用条件编译或配置项区分。这样在升级出问题时可以快速回退到旧版本不影响生产。8. 从协议约定到代码落地的几个习惯8.1 把字节映射写成结构体而不是魔法数字很多人在写CAN收发代码时直接操作数组下标比如data[0] pos 0xFF。这种写法在协议简单时没问题但一旦协议变复杂或者需要同时处理多个关节代码就会变得难以维护。我的习惯是定义一个结构体把每个字段映射到结构体成员然后用联合体或者序列化函数在结构体和字节数组之间转换。比如typedef struct { int32_t target_position; int16_t target_velocity; uint8_t enable : 1; uint8_t mode : 3; uint8_t reserved : 4; uint8_t checksum; } JointControlFrame;这样代码的可读性会好很多而且修改协议时只需要改结构体定义和序列化函数不用满篇找魔法数字。当然结构体的字节对齐和字节序要特别注意最好用#pragma pack或者手动序列化来保证布局跟协议一致。8.2 用配置表管理不同关节的协议差异如果你同时对接多个型号的关节或者同一个型号的不同固件版本协议差异会让人头疼。这时候可以用配置表来管理差异。配置表里记录每个型号的字节序、缩放因子、字段偏移、标识符基址等信息代码根据配置表动态解析。配置表可以用JSON或CSV文件存储运行时加载。这样增加新型号时只需要加一行配置不用改代码。我在一个多型号混用的项目里用过这个方案效果很好切换型号只需要改配置文件重新编译都不用。配置表的一个关键点是版本管理。每个配置项要标注适用的固件版本范围避免用错配置。如果固件版本不在配置表的范围内代码应该报错而不是猜测。8.3 日志里保留原始字节和解析结果调试CAN协议时日志是最重要的工具。我的习惯是在日志里同时保留原始字节和解析结果格式大概是时间戳、方向发/收、标识符、DLC、原始字节的十六进制、解析后的各字段值。这样出问题时可以对照原始字节和解析结果快速定位是解析错了还是数据本身错了。日志的存储要注意性能。如果控制频率是1kHz每帧都打日志磁盘IO可能跟不上。我的做法是正常运行时只记录关键事件和错误调试时再打开全量日志。全量日志可以写到内存缓冲区定期刷到磁盘避免阻塞控制循环。另外日志里最好带上滚动计数器的值这样能快速看出是否丢帧。如果发送端的计数器是连续的接收端的日志里缺了几个值那就说明中间丢了帧。8.4 异常时的安全回退策略协议对接的最终目标是让电机安全地动起来。所以代码里必须有异常时的安全回退策略。常见的异常包括反馈帧超时、错误码置位、位置超限、总线关闭。每种异常都要有对应的处理动作比如超时后自动发送零速指令错误码置位后自动断使能位置超限后触发急停。安全回退策略要在协议对接的初期就设计好不要等到出事了再补。我见过有人在电机飞车后才想起来加超时保护但那时候已经撞坏东西了。超时保护的阈值要根据控制周期来定比如控制周期是1毫秒超时阈值可以设5毫秒连续5帧没收到反馈就触发保护。还有一个容易忽略的点是回退策略的恢复条件。触发保护后不能自动恢复必须等人工确认或者满足特定条件后才能恢复。否则如果异常是间歇性的电机会在保护和运行之间反复切换反而更危险。
阅读完成 · 觉得有帮助?