CANopen"/>
学习CANopen
在前面几篇文章中,我们运行例子时都需要一个eds文件,比较麻烦,本文讲述如何在代码中自定义对象字典,只添加自己需要的OD项。如果是作为master来使用,还是比较方便的。
自定义对象字典
主要是参考.html
需要注意的是,编写自定义的对象字典还是需要参考slave的eds文件,否则不知道添加哪些需要的项,特别是对于vendor专有的功能项。添加后,如果功能不需要改变,那么就不再需要查看eds文件了。
下面是代码例子,
import canopen## 创建自定义的对象字典
def createOD():od = canopen.ObjectDictionary()# 添加单个项 --- 0x1009,类型是字符串var = canopen.objectdictionary.Variable('Manufacturer hardware version', 0x1009)var.data_type = canopen.objectdictionary.VISIBLE_STRINGod.add_object(var)# 添加单个项 --- 0x1017,类型是unsigned int16var = canopen.objectdictionary.Variable('Producer heartbeat time', 0x1017)var.data_type = canopen.objectdictionary.UNSIGNED16od.add_object(var)# 添加Record (其包含的子元素类型可以互不相同)RPDOCommParaRecord = canopen.objectdictionary.Record('RPDO1 communication parameter', 0x1400)var = canopen.objectdictionary.Variable('COB-ID used by RPDO', 0x1400, 1)var.data_type = canopen.objectdictionary.UNSIGNED32RPDOCommParaRecord.add_member(var)var = canopen.objectdictionary.Variable('Transmission type', 0x1400, 2)var.data_type = canopen.objectdictionary.UNSIGNED8RPDOCommParaRecord.add_member(var)var = canopen.objectdictionary.Variable('Inhibit time', 0x1400, 3)var.data_type = canopen.objectdictionary.UNSIGNED16RPDOCommParaRecord.add_member(var)od.add_object(RPDOCommParaRecord) # 添加record# 由于1400h和1600h是相对应的,这里把1600h也添加下,否则会报错RPDOMappingRecord = canopen.objectdictionary.Record('RPDO1 mapping', 0x1600)od.add_object(RPDOMappingRecord) # 添加record# 添加Array (其包含的子元素类型必须是相同的)consumerHBTimeArray = canopen.objectdictionary.Array('Consumer heartbeat time', 0x1016)var = canopen.objectdictionary.Variable('Consumer heartbeat time 1', 0x1016, 1)var.data_type = canopen.objectdictionary.UNSIGNED32consumerHBTimeArray.add_member(var)var = canopen.objectdictionary.Variable('Consumer heartbeat time 2', 0x1016, 2)var.data_type = canopen.objectdictionary.UNSIGNED32consumerHBTimeArray.add_member(var)var = canopen.objectdictionary.Variable('Consumer heartbeat time 3', 0x1016, 3)var.data_type = canopen.objectdictionary.UNSIGNED32consumerHBTimeArray.add_member(var)od.add_object(consumerHBTimeArray) # 添加arrayreturn odnetwork = 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运行起来
更多推荐
学习CANopen
发布评论