读取RPDO配置遇Canopen SdoCommunicationError及自收发消息异常求助
CANopen无法捕获自身发送的SDO请求消息问题排查与解决
问题背景
使用PEAK CAN适配器连接CANopen设备,基于Python 3.10.0搭配canopen库2.1.0搭建网络、添加带EDS文件的节点后,仅能捕获设备发送的0x701、0x581消息,无法捕获自身发出的SDO请求(对应COB-ID 0x601)。已在connect()方法中设置receive_own_messages=True(适配器硬件支持该功能),但问题仍未解决。
相关代码:
import canopen import can nw = canopen.Network() node = nw.add_node(1, r"C:\path\to\eds") nw.listeners += [can.Printer()] nw.connect(interface='pcan', bitrate=125000, channel='PCAN_USBBUS1', receive_own_messages=True) node.rpdo.read()
CAN trace显示总线存在0x601帧,但未被当前代码捕获。
解决方案
1. 给底层CAN总线接口添加监听器
canopen库的Network对象监听器可能无法捕获内部协议(如SDO)的发送帧,需直接给底层总线实例添加监听器:
import canopen import can nw = canopen.Network() node = nw.add_node(1, r"C:\path\to\eds") printer = can.Printer() # 先建立总线连接 nw.connect(interface='pcan', bitrate=125000, channel='PCAN_USBBUS1', receive_own_messages=True) # 给底层总线添加监听器 nw.bus.listeners.append(printer) node.rpdo.read()
2. 手动激活PEAK适配器的回环功能
部分PEAK适配器默认未开启"接收自身发送消息"的硬件回环,需通过PCAN-View工具手动开启该选项:
- 打开PCAN-View,选中对应总线通道
- 进入设置界面,勾选"Receive own messages"选项并保存
3. 独立线程监听总线
使用python-can库单独启动监听线程,绕开canopen库的内部链路限制:
import canopen import can import threading def bus_monitor(): bus = can.Bus(interface='pcan', channel='PCAN_USBBUS1', bitrate=125000, receive_own_messages=True) for msg in bus: print(msg) # 启动后台监听线程 threading.Thread(target=bus_monitor, daemon=True).start() nw = canopen.Network() node = nw.add_node(1, r"C:\path\to\eds") nw.connect(interface='pcan', bitrate=125000, channel='PCAN_USBBUS1', receive_own_messages=True) node.rpdo.read()
4. 升级库版本解决兼容性问题
canopen 2.1.0可能存在与python-can或PEAK驱动的兼容性问题,执行以下命令升级到最新稳定版:
pip install --upgrade canopen python-can
内容的提问来源于stack exchange,提问作者rodoso
相关产品推荐
相关产品推荐

