组网调试与排障
口诀:先物理层,再 NMT/Heartbeat,再 SDO,最后 PDO/402
不要一上来就怀疑算法——大多数现场问题是线、电阻、波特率、Node-ID。
1. 上电前检查清单
2. Linux SocketCAN 快速命令
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| 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
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') 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 多数需登录下载;本文整理公开概述与工程实践,不替代正式标准文本。
正在加载留言…