由于工作原因,需要使用python语言将CANopen DCF文件写到下位机中,平时操作的都是EDS文件,DCF文件不知道怎么操作,在网上搜了很多资料,很多说是两种文件格式相似,但详细介绍怎么像EDS那样操作DCF的文章很少,我连个demo都没找到。经过阅读很多资料和摸索代码,成功的将DCF操作起来。本文主要介绍通过修改EDS,来实现对DCF文件操作的方法。
1 前提
阅读本文的读者需要有python基础知识,CANopen协议基本知识。
2 EDS和DCF
DCF文件格式与EDS基本一样,只是DCF可以保存设备的NodeID和bitrate信息,并且可以只保存部分OD,意义在哪呢?有时我们想更新设备中的OD,但是只更新一部分,这样就可以使用DCF了。
3 EDS例子
在python canopen官网找了一个使用EDS的例子,方便讲解,我只摘录了我需要的代码,比较全的代码大家可以看下面的链接。
下面代码是我要修改的代码,主要修改canopen.RemoteNode和network.connect这两句代码。
import canopen
# Start with creating a network representing one CAN bus
network = canopen.Network()
# Add some nodes with corresponding Object Dictionaries
node = canopen.RemoteNode(6, '/path/to/object_dictionary.eds')
network.add_node(node)
network.connect(bustype='pcan', channel='PCAN_USBBUS1', bitrate=250000)
4 修改成DCF例子
为了方便大家看懂,我做了下对比,如下图所示,左边为修改前的代码,加载的是EDS文件,右边为修改后的代码,加载的是DCF文件。
修改的地方主要有
4.1 将EDS换成要加载的DCF文件;
4.2 将EDS例子中的NodeID由‘6’改为'None';
4.3 将EDS中的波特率设置去掉;
执行完以上修改后,DCF例子修改就成功了,是不是很简单啊!下面介绍下原理,毕竟知其然最好还能知其所以然。
5 原理
5.1 ‘6’改为'None'
在RemoteNode的定义中,说了Node ID (set to None or 0 if specified by object dictionary).在DCF文件中是有NodeID的,所以设置为'None'.
5.2 去掉波特率
在connect函数定义中,说了如果没有直接定义波特率,就去字典中找。
6 总结
经过以上修改,DCF定义了NodeID和波特率后,就能正常加载DCF文件了。其他的操作就和EDS文件的一样了。
参考文献
1 学习CANopen --- [4] 对象字典_canopen对象字典配置教程-CSDN博客
2 Object Dictionary — canopen 2.2.1.dev2+g36900b1 documentation