CANopen堆栈实现
canopen的Python项目详细描述
CANopen标准的python实现。 该项目的目的是支持CIA301最常见的部分 pythonic接口中的标准。
库支持Python2.7和3.4+。
功能
- EDS的对象字典
- NMT主/从
- SDO客户机/服务器
- PDO生产者/消费者
- 同步生产者/消费者
- emcy消费者/生产者
- 时间生产者
- LSS主机
安装
使用pip从PyPI安装:
$ pip install canopen==0.9.0
从github上的最新主机安装:
$ pip install https://github.com/christiansandberg/canopen/archive/master.zip
如果要在使用时更改代码,请将其克隆,然后安装 在develop mode:
$ git clone https://github.com/christiansandberg/canopen.git $ cd canopen $ pip install -e .
快速启动
下面是一些您可以做的快速示例:
PDO可以通过三种形式访问:
1:node.tpdo[n]
或node.rpdo[n]
2nd:node.pdo.tx[n]
或node.pdo.rx[n]
3:node.pdo[0x1A00]
或node.pdo[0x1600]
n
是pdo索引(通常为1到4)。第二种访问方式是向后兼容。
importcanopen# Start with creating a network representing one CAN busnetwork=canopen.Network()# Add some nodes with corresponding Object Dictionariesnode=canopen.RemoteNode(6,'/path/to/object_dictionary.eds')network.add_node(node)# Connect to the CAN bus# Arguments are passed to python-can's can.interface.Bus() constructor# (see https://python-can.readthedocs.io/en/stable/bus.html).network.connect()# network.connect(bustype='socketcan', channel='can0')# network.connect(bustype='kvaser', channel=0, bitrate=250000)# network.connect(bustype='pcan', channel='PCAN_USBBUS1', bitrate=250000)# network.connect(bustype='ixxat', channel=0, bitrate=250000)# network.connect(bustype='vector', app_name='CANalyzer', channel=0, bitrate=250000)# network.connect(bustype='nican', channel='CAN0', bitrate=250000)# Read a variable using SDOdevice_name=node.sdo['Manufacturer device name'].rawvendor_id=node.sdo[0x1018][1].raw# Write a variable using SDOnode.sdo['Producer heartbeat time'].raw=1000# Read PDO configuration from nodenode.tpdo.read()node.rpdo.read()# Re-map TPDO[1]node.tpdo[1].clear()node.tpdo[1].add_variable('Statusword')node.tpdo[1].add_variable('Velocity actual value')node.tpdo[1].add_variable('Some group','Some subindex')node.tpdo[1].trans_type=254node.tpdo[1].event_timer=10node.tpdo[1].enabled=True# Save new PDO configuration to nodenode.tpdo[1].save()# Transmit SYNC every 100 msnetwork.sync.start(0.1)# Change state to operational (NMT start)node.nmt.state='OPERATIONAL'# Read a value from TPDO[1]node.tpdo[1].wait_for_reception()speed=node.tpdo[1]['Velocity actual value'].physval=node.tpdo['Some group.Some subindex'].raw# Disconnect from CAN busnetwork.sync.stop()network.disconnect()