在前面几篇文章中,我们运行例子时都需要一个eds文件,比较麻烦,本文讲述如何在代码中自定义对象字典,只添加自己需要的OD项。如果是作为master来使用,还是比较方便的。
自定义对象字典
主要是参考https://canopen.readthedocs.io/en/latest/od.html
需要注意的是,编写自定义的对象字典还是需要参考slave的eds文件,否则不知道添加哪些需要的项,特别是对于vendor专有的功能项。添加后,如果功能不需要改变,那么就不再需要查看eds文件了。
下面是代码例子,
import canopen
def createOD():
od = canopen.ObjectDictionary()
var = canopen.objectdictionary.Variable('Manufacturer hardware version', 0x1009)
var.data_type = canopen.objectdictionary.VISIBLE_STRING
od.add_object(var)
var = canopen.objectdictionary.Variable('Producer heartbeat time', 0x1017)
var.data_type = canopen.objectdictionary.UNSIGNED16
od.add_object(var)
RPDOCommParaRecord = canopen.objectdictionary.Record('RPDO1 communication parameter', 0x1400)
var = canopen.objectdictionary.Variable('COB-ID used by RPDO', 0x1400, 1)
var.data_type = canopen.objectdictionary.UNSIGNED32
RPDOCommParaRecord.add_member(var)
var = canopen.objectdictionary.Variable('Transmission type', 0x1400, 2)
var.data_type = canopen.objectdictionary.UNSIGNED8
RPDOCommParaRecord.add_member(var)
var = canopen.objectdictionary.Variable('Inhibit time', 0x1400, 3)
var.data_type = canopen.objectdictionary.UNSIGNED16
RPDOCommParaRecord.add_member(var)
od.add_object(RPDOCommParaRecord)
RPDOMappingRecord = canopen.objectdictionary.Record('RPDO1 mapping', 0x1600)
od.add_object(RPDOMappingRecord)
consumerHBTimeArray = canopen.objectdictionary.Array('Consumer heartbeat time', 0x1016)
var = canopen.objectdictionary.Variable('Consumer heartbeat time 1', 0x1016, 1)
var.data_type = canopen.objectdictionary.UNSIGNED32
consumerHBTimeArray.add_member(var)
var = canopen.objectdictionary.Variable('Consumer heartbeat time 2', 0x1016, 2)
var.data_type = canopen.objectdictionary.UNSIGNED32
consumerHBTimeArray.add_member(var)
var = canopen.objectdictionary.Variable('Consumer heartbeat time 3', 0x1016, 3)
var.data_type = canopen.objectdictionary.UNSIGNED32
consumerHBTimeArray.add_member(var)
od.add_object(consumerHBTimeArray)
return od
network = canopen.Network()
node = canopen.RemoteNode(6, createOD())
network.add_node(node)
network.connect(bustype='socketcan', channel='vcan0')
retval = node.sdo[0x1009].raw
print('1009h: {}'.format(retval))
retval = node.sdo[0x1009].raw
print('1017h: {}'.format(retval))
retval = node.sdo[0x1400][1].raw
print('1400h_01: {}'.format(retval))
retval = node.sdo[0x1016][2].raw
print('1016h_02: {}'.format(retval))
最后运行结果,注意:需要先把client运行起来
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)