You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

读取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 23:43:23