组网调试与排障

组网调试与排障

口诀:先物理层,再 NMT/Heartbeat,再 SDO,最后 PDO/402
不要一上来就怀疑算法——大多数现场问题是线、电阻、波特率、Node-ID。


1. 上电前检查清单

  • 总线两端各 120Ω(或确认板载终端开关)
  • 双绞、屏蔽、接法符合厂商建议
  • 所有节点同一波特率
  • Node-ID 无冲突(1~127)
  • 供电足够(多驱动器上电浪涌)
  • USB-CAN / PCI-CAN 驱动正常

2. Linux SocketCAN 快速命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 配置并启动(示例 1M)
sudo ip link set can0 down
sudo ip link set can0 type can bitrate 1000000
sudo ip link set can0 up

# 看状态
ip -details link show can0

# 抓包
candump can0
candump -td can0 # 带时间戳

# 发一帧(示例)
cansend can0 000#0100 # 谨慎:确认含义后再发 NMT

# 统计错误
ip -s link show can0

安装工具包(Debian/Ubuntu 常见):

1
sudo apt install can-utils

3. 分层排障

L0 物理 / 驱动

现象 处理
can0 起不来 驱动、设备树、USB 线、dmesg
大量 error frames 终端电阻、波特率、接触不良、干扰
bus-off 复位接口、查短路/错线

L1 网络管理

现象 处理
无 Heartbeat 节点未上电、波特率错、ID 错、线断
有 Heartbeat 但状态不对 卡在 Pre-Op/Stopped;查 NMT
间歇掉线 电源、接地、线长 vs 波特率

L2 SDO

现象 处理
SDO 超时 节点非 Pre-Op/Op、ID 错、栈未跑
Abort 只读、长度错、对象不支持
读值离谱 字节序/子索引/缩放理解错

L3 PDO / 402

现象 处理
Operational 无 PDO 映射未使能、COB-ID 无效、传输类型
使能失败 Controlword 序列、Fault、限位、模式
抖动大 总线负载、SYNC 周期、USB-CAN 延迟

4. 用 python-canopen 做最小验证(示意)

1
2
3
4
5
6
7
8
9
10
11
12
import canopen

network = canopen.Network()
network.connect(channel='can0', bustype='socketcan')

node = network.add_node(3, 'device.eds') # Node-ID=3
print(node.sdo['Identity']['Vendor-ID'].raw)

node.nmt.state = 'PRE-OPERATIONAL'
# 配置...
node.nmt.state = 'OPERATIONAL'
network.disconnect()

(API 细节以 python-canopen 文档与版本为准。)


5. Wireshark / 逻辑分析

  • Wireshark 可抓 SocketCAN
  • 对照预定义连接集解码 NMT/SDO/PDO
  • 若有厂商 DBC/EDS 插件更好

解码口诀见 03-SDO与PDO通信.md 第 7 节。


6. 性能与负载经验

  • 计算每周期 PDO 字节数 × 节点数,留余量
  • Heartbeat 周期不要过密(常 100~1000 ms)
  • 调试期减少无关 TPDO
  • USB-CAN 不适合硬实时高周期;优先 PCI/ eth-CAN 或板载

7. 与开源项目联调入口

目的 入口
设备端栈 ../开源项目/CANopenNode
Linux 主站 ../开源项目/lely-core
脚本联调 ../开源项目/python-canopen
ROS 2 ../开源项目/ros2_canopen
栈对比 05-开源协议栈对比.md

8. 官方与参考链接

CiA 正式规范 PDF 多数需登录下载;本文整理公开概述与工程实践,不替代正式标准文本。

文章互动

阅读 --

留言

0 条留言

正在加载留言…