CAN 总线故障排查手册
背景描述
在机械臂的运行过程中,可能突然弹出 CAN 总线错误。硬件排查需要一定的硬件知识和专用工具,本文从软件、日志和硬件三个方面介绍初步排查步骤。
软件修复历程
上位机程序在迭代过程中,已经基本解决实际使用和测试中发现的软件 bug,包括但不限于:
- 数据通信阻塞
- CAN 与 CAN FD 的自动检查
- 传输过大字节的报错问题
问题分类
CAN 总线错误弹窗的原因分为以下几类:
- 误操作问题
- 版本不适配问题
- 硬件问题
一、误操作问题
1. 升级固件包之后,弹窗报错“CAN 总线错误”
机械臂原本运行正常,因解决误碰撞、速度跑不满等问题而升级固件,升级后出现报错。这种情况通常是上传的固件升级包不兼容导致的。建议先回退固件版本,保证机械臂正常运行,再与研发人员确认是否需要升级以及升级版本的选择。
二、版本不适配问题
前情提要
机械臂关节主控芯片的 bootloader 从 v1.0.x 升级到 v1.1.x 时进行了改进,但该改进导致固件升级时无法直接从 v1.0.x 升级到 v1.1.x。
涉及到的关节型号有:i 系列所有型号关节、C 系列所有型号关节、iH 系列所有型号关节。
涉及的底座型号为丝印 ROBOT POWER Board V1.2、使用 base_i_C_h120-*.hex 固件的底座。
解决方法
- 使用 J-Link 下载包含
v1.1.x版本 bootloader 的固件包,然后再进行在线升级。 - 重新升级
v1.0.x固件,回退到v1.0.x版本。
相关日志输出
此时固件更新失败,日志会输出如下语句

三、硬件问题
以下列举几个常见硬件问题在日志中的表现。
现象1
机械臂运行过程中突然报“CAN 总线硬件错误”时,首先检查线缆是否连接完好。若连接完好,可能是 CAN 硬件线路存在问题,例如机械运动导致线缆松动,或高温导致固定胶松动,使 CAN 线在机械臂移动过程中接触不稳定。


现象2

这里可以看到 6 个关节全部报错,且工具板、基座板、机器人全部通信断开。 这种也是典型的硬件问题。
现象3
当机械臂线缆过长时,有概率报“CAN 总线错误”,主要是因为信号延时以及不稳定。
现象4


这里可以看上电过程报了工具板找不到的 error,这个也会导致报“CAN bus error”。
CAN 线破损图片

硬件故障详细排查
1. CAN 总线故障——电气问题排查
1.1 背景概述
在整臂下线并交付测试时,其绝缘介电强度、绝缘电阻、系统接地需满足机械臂相关电气安全标准。实际测试中可能发现“电机绕组线对外壳短路”“电源 48V 对外壳短路”,甚至“CAN 总线对外壳短路”等情况。上述问题均会导致 CAN 总线信号波形质量变差,最终引起 CAN 通信故障。另外,各节点 CANH、CANL 是否对电源或地短路,以及终端电阻阻值是否合适,也会引起 CAN 总线故障。因此,排查 CAN 总线故障时,应首先进行电气问题排查。
1.2 测试设备
万用表。
1.3 测试项目及方法
- 电源系统对机械臂外壳阻抗测试:万用表使用电阻档,整臂不上电,分别测试外壳与 48V 正极(红色)、48V 负极(黑色)之间的电阻值。由于关节参考地与外壳之间串联了一颗 1MΩ 电阻(并非所有关节都实际焊接),测得的电阻值应大于 100kΩ。如果测得的电阻值小于 100kΩ,甚至仅为几 Ω,则判定 48V 电源系统与机械臂外壳之间存在短路等问题。
- 各关节绕组对外壳阻抗测试:万用表使用电阻档,整臂不上电,分别测试外壳与各关节电机绕组 U、V、W 之间的电阻值,测得的电阻值应大于 100kΩ。如果测得的电阻值小于 100kΩ,甚至仅为几 Ω,则判定某关节电机绕组与外壳之间存在绝缘失效问题。
- CAN 总线对机械臂外壳阻抗测试:万用表使用电阻档,整臂不上电,分别测试外壳与 CANH、CANL 之间的电阻值,测得的电阻值应大于 100kΩ。如果测得的电阻值小于 100kΩ,甚至仅为几 Ω,则判定 CAN 总线与外壳之间存在短路问题。
- CAN 总线终端电阻阻值测量:万用表使用电阻档,整臂不上电,测试 CANH 与 CANL 之间的电阻值,测得的电阻值应为 60Ω(控制柜端 120Ω、末端 120Ω,并联后为 60Ω)。如果测得的电阻值与目标值偏差过大,则判定终端电阻异常。
- CAN 总线电压值测试:万用表使用直流电压档,整臂上电,分别测试 CANH、CANL 与系统地之间的电压值,测得的电压值应在 2.5V 左右。如果电压值过高或过低,则表明 CAN 总线可能与系统电源或地之间存在短路。
2. 使用 ZPS-CANFD 总线分析仪进行分析排查
2.1 背景概述
借助 ZPS-CANFD 总线分析仪,可对总线模拟信号波形及报文进行测试分析。通过信号幅值和噪声对比,可以确定信号质量。如果存在电气问题,可在波形窗口中观察到异常波形;通过帧过滤和筛选可以快速定位总线问题点。
2.2 测试设备
ZPS-CANFD 总线分析仪或其他品牌的总线分析仪。
2.3 测试项目及方法
检查 CAN 信号波形是否正常:根据波形确认 CANH、CANL 信号幅值是否正确、是否对称,以及 CANdiff(差分)电平信号是否正常。
正常参考波形如下:

CANH、CANL 应呈对称方波信号,电压幅值正常,Diff(差分信号)电平信号正常。
过滤、筛选帧错误:将获得的总线数据进行分析,过滤、筛选出错误帧,由软件人员进一步分析并确认总线问题点。
3. CAN 总线各节点配置参数一致性排查
3.1 背景概述
目前产品存在由传统 CAN 迭代到 CAN FD 的过程。相比传统 CAN 总线,CAN FD 提升了传输速率,相应地,底座、关节和末端等各节点需要重新匹配 CAN 发送时延、采样点等配置参数。如果某一末端未按 CAN FD 进行参数配置,可能导致第 4、5、6 关节报“CAN 总线硬件故障”。
3.2 测试设备
ZPS-CANFD 总线分析仪。
3.3 测试项目及方法
- 根据上位机确认整臂 CAN 总线的类型(普通 CAN 或 CAN FD)。
- 确认底座、各关节和末端的 CAN 总线配置参数是否一致。
- 使用 ZPS-CANFD 总线分析仪确认具体问题模块,可通过过滤错误帧进行定位。
4. CAN 总线故障快速排查
4.1 背景概述
适用于生产、测试人员进行快速排查和问题定位。
4.2 测试设备
48V 可调电源、CAN 线,以及与报错关节同类型的关节。
4.3 测试项目及方法
更换机械臂航插线缆重新测试,使用标准长度线缆(5m)进行测试。
排除 CAN 线错误:区分机械臂是单路 CAN 信号还是双路 CAN 信号。若为单路 CAN 信号,则将所有关节中心引线中的 CAN 线替换为新的 CAN 线;若为双路 CAN 信号(1、2、3 关节一路 CAN 信号,4、5、6 关节一路 CAN 信号),则根据报错关节 ID 号更换对应链路的 CAN 线。例如 ID2 报错时,更换 1、2、3 关节的 CAN 线。机械臂上电后查看故障是否消除。若故障消除,再分别测试各关节 CAN 线,找到问题 CAN 线并更换;若故障仍存在,则继续排查下一步。
排除关节错误:根据报错关节 ID 号,找到相同类型的关节并设置为相同 ID。将与报错关节相连的 CAN 线连接到新关节上,并断开报错关节的 CAN 线连接。新关节接通 48V 电源后,机械臂整臂上电,查看故障是否消除。若故障消除,则更换关节;若故障仍存在,则更换控制柜对整臂进行测试。
如果仍未定位到具体原因,则交由研发人员排查硬件问题。
5. CAN 总线故障波形参考
CAN 总线电气异常时,通常可在波形窗口中观察到信号幅值、对称性或差分电平异常。参考示例如下:

6. 使用周立功 ZCAN 抓取 CAN 总线数据
打开 ZCANPRO 软件,设备类型选择“USBCANFD-200U”。

点击“打开设备”,按图设置参数。仲裁域波特率选择“自定义”,自定义波特率设置为
1.0Mbps(75%),5.0Mbps(75%),(60,03800001,00800001)(可直接输入)。终端电阻根据实际情况选择“禁能”或“使能”,默认选择“禁能”。
点击“设置”,将时间格式设为“系统时间”,最大帧数设为 100000(最大值)。至此,参数全部设置完成,可以抓取 CAN 数据。

数据抓取完成后,点击“保存”,将数据保存到指定目录。

若现场具备条件,可按照上述步骤进行先期硬件排查;若无法排查或问题仍未定位,则安排返厂维修,并交由研发人员进一步分析。
四、日志错误码分类及其解析
/// 错误码
#define ERR_OVER_CURRENT_BIT (((uint32_t)0x01) << 0) ///< 过流
#define ERR_OVER_VOLTAGE_BIT (((uint32_t)0x01) << 1) ///< 过压
#define ERR_OVER_TEMPRATURE_BIT (((uint32_t)0x01) << 2) ///< 过温
#define ERR_COMMUNICATION (((uint32_t)0x01) << 3) ///< 通信
#define ERR_LOW_VOLTAGE (((uint32_t)0x01) << 4) ///< 欠压
#define ERR_UVW_LOGIC_INVALID (((uint32_t)0x01) << 5) ///< UVW逻辑无效
#define ERR_UVW_ABZ_FAULT (((uint32_t)0x01) << 6) ///< ABZ 相错误
#define ERR_ABS_ENC_COMM_FAULT (((uint32_t)0x01) << 7) ///< 绝对编码器错误
#define ERR_ADC_ZERO_OFFSET_FAULT (((uint32_t)0x01) << 8) ///< ADC 零点偏移错误
#define ERR_ENC_POLLUTE (((uint32_t)0x01) << 9) ///< 编码器污染等级错误
#define ERR_ENC_Z_LOST (((uint32_t)0x01) << 10) ///< Z 相丢失
#define ERR_ENC_CALI_FAULT (((uint32_t)0x01) << 11) ///< 编码器校准错误
#define ERR_IMU_FAULT (((uint32_t)0x01) << 12) ///< 惯性测量单元故障
#define ERR_IPM_NTC_FAULT (((uint32_t)0x01) << 13) ///< NTC 故障
#define ERR_ABS_ENC_LOW_VOLT (((uint32_t)0x01) << 14) ///< 绝对编码器电压低
#define ERR_SHROT_CIRCUIT_FAULT (((uint32_t)0x01) << 15) ///< 短路故障
#define ERR_POS_OVER_LIMIT (((uint32_t)0x01) << 16) ///< 位置超限
#define ERR_MOTOR_STALL (((uint32_t)0x01) << 17) ///< 电机堵转
#define ERR_ABS_MT_FAULT (((uint32_t)0x01) << 18) ///< 绝对编码器多圈故障
#define ERR_MOTOR_PHASE_LOSE (((uint32_t)0x01) << 19) ///< 电机缺相
#define ERR_BRAKE_FAULT (((uint32_t)0x01) << 20) ///< 刹车故障
#define ERR_REDUCER_OVER_TEMP (((uint32_t)0x01) << 21) ///< 减速机过温
#define ERR_REDUCER_NTC_FAULT (((uint32_t)0x01) << 22) ///< 减速机NTC 故障
#define ERR_FIRMWARE_UPDATE_FAULT (((uint32_t)0x01) << 23) ///< 固件升级错误
#define ERR_FLASH_OP_FAIL (((uint32_t)0x01) << 24) ///< FLASH 操作故障
#define ERR_EXT_ABS_ENC_COMMFAULT \
(((uint32_t)0x01) << 25) ///< 减速器端编码器通信故障
#define ERR_BATTERY_LOW (((uint32_t)0x01) << 26) ///< battery low power
#define ERR_PHASE_ALIGN_FAIL (((uint32_t)0x01) << 27) ///< lock magnet pole
#define ERR_CAN_BUS (((uint32_t)0x01) << 28) ///< CAN硬件错误
#define ERR_POS_CMD (((uint32_t)0x01) << 29) ///< 位置指令不连续
#define ERR_POS_INIT (((uint32_t)0x01) << 30) ///< 位置初始化失败
#define ERR_TORQUE_SENSOR (((uint32_t)0x01) << 31) ///< 力矩传感器故障错误码使用举例说明
日志报错如下

日志这里输出错误码 0x10000008,这里为16进制,我们转换为二进制,再对照错误码表

可以看到二进制下,第 3 个 bit 和第 28 bit 的值为 1(从 0 开始),即代表:
- 通信问题
- CAN硬件错误
条件允许的话,可以拆开机械臂查看对应硬件是否有问题,否则建议返厂维修。
