学习CANopen --- [6] 自定义对象字典

在前面几篇文章中,我们运行例子时都需要一个eds文件,比较麻烦,本文讲述如何在代码中自定义对象字典,只添加自己需要的OD项。如果是作为master来使用,还是比较方便的。


自定义对象字典

主要是参考https://canopen.readthedocs.io/en/latest/od.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_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)


    # 添加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.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) # 添加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.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) # 添加array

    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运行起来
在这里插入图片描述


版权声明:本文为whahu1989原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。