跳转到内容

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 固件的底座。

[详细说明文档]

解决方法 ​

  1. 使用 J-Link 下载包含 v1.1.x 版本 bootloader 的固件包,然后再进行在线升级。
  2. 重新升级 v1.0.x 固件,回退到 v1.0.x 版本。

相关日志输出 ​

此时固件更新失败,日志会输出如下语句

固件更新失败日志

三、硬件问题 ​

以下列举几个常见硬件问题在日志中的表现。

现象1 ​

机械臂运行过程中突然报“CAN 总线硬件错误”时,首先检查线缆是否连接完好。若连接完好,可能是 CAN 硬件线路存在问题,例如机械运动导致线缆松动,或高温导致固定胶松动,使 CAN 线在机械臂移动过程中接触不稳定。

CAN 总线硬件错误现象一

CAN 总线硬件错误现象二

现象2 ​

硬件断开日志

这里可以看到 6 个关节全部报错,且工具板、基座板、机器人全部通信断开。 这种也是典型的硬件问题。

现象3 ​

当机械臂线缆过长时,有概率报“CAN 总线错误”,主要是因为信号延时以及不稳定。

现象4 ​

工具板断开日志

CAN 总线错误日志

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

CAN 线破损图片 ​

CAN 线破损示例

硬件故障详细排查 ​

1. CAN 总线故障——电气问题排查 ​

1.1 背景概述 ​

在整臂下线并交付测试时,其绝缘介电强度、绝缘电阻、系统接地需满足机械臂相关电气安全标准。实际测试中可能发现“电机绕组线对外壳短路”“电源 48V 对外壳短路”,甚至“CAN 总线对外壳短路”等情况。上述问题均会导致 CAN 总线信号波形质量变差,最终引起 CAN 通信故障。另外,各节点 CANH、CANL 是否对电源或地短路,以及终端电阻阻值是否合适,也会引起 CAN 总线故障。因此,排查 CAN 总线故障时,应首先进行电气问题排查。

1.2 测试设备 ​

万用表。

1.3 测试项目及方法 ​
  1. 电源系统对机械臂外壳阻抗测试:万用表使用电阻档,整臂不上电,分别测试外壳与 48V 正极(红色)、48V 负极(黑色)之间的电阻值。由于关节参考地与外壳之间串联了一颗 1MΩ 电阻(并非所有关节都实际焊接),测得的电阻值应大于 100kΩ。如果测得的电阻值小于 100kΩ,甚至仅为几 Ω,则判定 48V 电源系统与机械臂外壳之间存在短路等问题。
  2. 各关节绕组对外壳阻抗测试:万用表使用电阻档,整臂不上电,分别测试外壳与各关节电机绕组 U、V、W 之间的电阻值,测得的电阻值应大于 100kΩ。如果测得的电阻值小于 100kΩ,甚至仅为几 Ω,则判定某关节电机绕组与外壳之间存在绝缘失效问题。
  3. CAN 总线对机械臂外壳阻抗测试:万用表使用电阻档,整臂不上电,分别测试外壳与 CANH、CANL 之间的电阻值,测得的电阻值应大于 100kΩ。如果测得的电阻值小于 100kΩ,甚至仅为几 Ω,则判定 CAN 总线与外壳之间存在短路问题。
  4. CAN 总线终端电阻阻值测量:万用表使用电阻档,整臂不上电,测试 CANH 与 CANL 之间的电阻值,测得的电阻值应为 60Ω(控制柜端 120Ω、末端 120Ω,并联后为 60Ω)。如果测得的电阻值与目标值偏差过大,则判定终端电阻异常。
  5. CAN 总线电压值测试:万用表使用直流电压档,整臂上电,分别测试 CANH、CANL 与系统地之间的电压值,测得的电压值应在 2.5V 左右。如果电压值过高或过低,则表明 CAN 总线可能与系统电源或地之间存在短路。

2. 使用 ZPS-CANFD 总线分析仪进行分析排查 ​

2.1 背景概述 ​

借助 ZPS-CANFD 总线分析仪,可对总线模拟信号波形及报文进行测试分析。通过信号幅值和噪声对比,可以确定信号质量。如果存在电气问题,可在波形窗口中观察到异常波形;通过帧过滤和筛选可以快速定位总线问题点。

2.2 测试设备 ​

ZPS-CANFD 总线分析仪或其他品牌的总线分析仪。

2.3 测试项目及方法 ​
  1. 检查 CAN 信号波形是否正常:根据波形确认 CANH、CANL 信号幅值是否正确、是否对称,以及 CANdiff(差分)电平信号是否正常。

    正常参考波形如下:

    CAN 总线正常参考波形

    CANH、CANL 应呈对称方波信号,电压幅值正常,Diff(差分信号)电平信号正常。

  2. 过滤、筛选帧错误:将获得的总线数据进行分析,过滤、筛选出错误帧,由软件人员进一步分析并确认总线问题点。

3. CAN 总线各节点配置参数一致性排查 ​

3.1 背景概述 ​

目前产品存在由传统 CAN 迭代到 CAN FD 的过程。相比传统 CAN 总线,CAN FD 提升了传输速率,相应地,底座、关节和末端等各节点需要重新匹配 CAN 发送时延、采样点等配置参数。如果某一末端未按 CAN FD 进行参数配置,可能导致第 4、5、6 关节报“CAN 总线硬件故障”。

3.2 测试设备 ​

ZPS-CANFD 总线分析仪。

3.3 测试项目及方法 ​
  1. 根据上位机确认整臂 CAN 总线的类型(普通 CAN 或 CAN FD)。
  2. 确认底座、各关节和末端的 CAN 总线配置参数是否一致。
  3. 使用 ZPS-CANFD 总线分析仪确认具体问题模块,可通过过滤错误帧进行定位。

4. CAN 总线故障快速排查 ​

4.1 背景概述 ​

适用于生产、测试人员进行快速排查和问题定位。

4.2 测试设备 ​

48V 可调电源、CAN 线,以及与报错关节同类型的关节。

4.3 测试项目及方法 ​
  1. 更换机械臂航插线缆重新测试,使用标准长度线缆(5m)进行测试。

  2. 排除 CAN 线错误:区分机械臂是单路 CAN 信号还是双路 CAN 信号。若为单路 CAN 信号,则将所有关节中心引线中的 CAN 线替换为新的 CAN 线;若为双路 CAN 信号(1、2、3 关节一路 CAN 信号,4、5、6 关节一路 CAN 信号),则根据报错关节 ID 号更换对应链路的 CAN 线。例如 ID2 报错时,更换 1、2、3 关节的 CAN 线。机械臂上电后查看故障是否消除。若故障消除,再分别测试各关节 CAN 线,找到问题 CAN 线并更换;若故障仍存在,则继续排查下一步。

  3. 排除关节错误:根据报错关节 ID 号,找到相同类型的关节并设置为相同 ID。将与报错关节相连的 CAN 线连接到新关节上,并断开报错关节的 CAN 线连接。新关节接通 48V 电源后,机械臂整臂上电,查看故障是否消除。若故障消除,则更换关节;若故障仍存在,则更换控制柜对整臂进行测试。

  4. 如果仍未定位到具体原因,则交由研发人员排查硬件问题。

5. CAN 总线故障波形参考 ​

CAN 总线电气异常时,通常可在波形窗口中观察到信号幅值、对称性或差分电平异常。参考示例如下:

CAN 总线电气异常波形

6. 使用周立功 ZCAN 抓取 CAN 总线数据 ​

  1. 打开 ZCANPRO 软件,设备类型选择“USBCANFD-200U”。

    ZCANPRO 设备类型设置

  2. 点击“打开设备”,按图设置参数。仲裁域波特率选择“自定义”,自定义波特率设置为 1.0Mbps(75%),5.0Mbps(75%),(60,03800001,00800001)(可直接输入)。终端电阻根据实际情况选择“禁能”或“使能”,默认选择“禁能”。

    ZCANPRO 波特率和终端电阻设置

  3. 点击“设置”,将时间格式设为“系统时间”,最大帧数设为 100000(最大值)。至此,参数全部设置完成,可以抓取 CAN 数据。

    ZCANPRO 数据记录设置

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

    ZCANPRO 数据保存

若现场具备条件,可按照上述步骤进行先期硬件排查;若无法排查或问题仍未定位,则安排返厂维修,并交由研发人员进一步分析。

四、日志错误码分类及其解析 ​

c++
/// 错误码
#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硬件错误

条件允许的话,可以拆开机械臂查看对应硬件是否有问题,否则建议返厂维修。