学习CANopen --- [12] Abort报文

当我们使用SDO进行读写操作时,有时device会返回abort报文,意味着本次SDO读写失败。本文使用例子来讲解Abort报文,以及如何解读失败原因。


一 Device例子

下面是device的python代码,文件名叫device.py,device的CANopen id是6,

python 复制代码
import signal
import canopen


running = True

def sigint_handler(signum, frame):
	global running
	print('')
	running = False
	exit(0)


## 创建自定义的对象字典
def createOD():
    od = canopen.ObjectDictionary()
    
    # 添加单个项 --- 0x1009,类型是字符串
    var = canopen.objectdictionary.Variable('Manufacturer hardware version', 0x1009)
    var.data_type = canopen.objectdictionary.VISIBLE_STRING
    od.add_object(var)


    # 添加单个项 --- 0x1017,类型是unsigned int16
    var = canopen.objectdictionary.Variable('Producer heartbeat time', 0x1017)
    var.data_type = canopen.objectdictionary.UNSIGNED16
    od.add_object(var)

    return od


# 处理按键发送的信号,优雅的关闭程序
signal.signal(signal.SIGINT,  sigint_handler)
signal.signal(signal.SIGHUP,  sigint_handler)
signal.signal(signal.SIGTERM, sigint_handler)

# 创建一个网络用来表示CAN总线
network = canopen.Network()

# 连接到CAN总线
network.connect(bustype='socketcan', channel='vcan0')

# 创建slave节点,其id是6,对象字典为CANopenSocket.eds
node = network.create_node(6, createOD())

# 向CAN总线上发送启动消息
node.nmt.send_command(0)

# 发送心跳报文,每隔1s发送一次
node.nmt.start_heartbeat(1000) # 1000ms


# 循环
while running:
	time.sleep(0.05) # 降低CPU使用率

代码里自定义了对象字典,只添加了2个OD项 --- 0x1009和0x1017


二 报文分析

首先开启一个终端,使用python运行device.py;接着再开一个终端运行candump vcan0,这个用来观察CAN报文。

最后再开一个终端,使用cansend去发送读SDO的命令,这里读0x1018_00,很明显这个OD项不在Device的对象字典里,
cansend vcan0 606#4018100000000000

最后观察到的报文如下,

图中红框就是Abort报文,586h是Abort报文的COB-id,报文内容解释如下,

可以看出该Abort报文的CS值是0x80,OD项的Index是0x1018,SubIndex是0(通过Index和SubIndex可以帮助我们知道是哪条SDO报文出错),Abort code是0x06020000

而abort code的释义如下,

所以0x06020000对应的含义是device的对象字典里不存在该OD项,对应本文例子就是device的对象字典不存在0x1018_00


三 总结

本文通过例子来讲解abort报文,以及如何分析它,这样当出现其它的abort报文都可以很容易理解了。

相关推荐
STLearner8 小时前
AI论文速读 | U-Cast:学习高维时间序列预测的层次结构
大数据·论文阅读·人工智能·深度学习·学习·机器学习·数据挖掘
黑客思维者9 小时前
LLM底层原理学习笔记:Adam优化器为何能征服巨型模型成为深度学习的“速度与稳定之王”
笔记·深度学习·学习·llm·adam优化器
kk哥88999 小时前
Swift底层原理学习笔记
笔记·学习·swift
AA陈超11 小时前
Lyra学习004:GameFeatureData分析
c++·笔记·学习·ue5·虚幻引擎
zkl_zkl_12 小时前
地理信息系统学习笔记——第六章 空间数据采集与处理
笔记·学习·数据处理·数据质量·空间数据
光头程序员12 小时前
学习笔记——主攻 vite
笔记·学习
零匠学堂202512 小时前
移动学习系统,如何提升企业培训效果?
java·开发语言·spring boot·学习·音视频
TL滕13 小时前
从0开始学算法——第四天(题目参考答案)
数据结构·笔记·python·学习·算法
Hoshino.4113 小时前
从0开始学习Linux——第七部分:DNS(1)
linux·网络·学习
TL滕14 小时前
从0开始学算法——第四天(练点题吧)
数据结构·笔记·学习·算法