学习CANopen

编程入门 行业动态 更新时间:2024-10-21 13:13:17

学习<a href=https://www.elefans.com/category/jswz/34/1717487.html style=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

本文发布于:2024-03-06 04:20:46,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1714342.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:CANopen

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!