Package: canopen
A Python implementation of theCANopenstandard.
The aim of the project is to support the most common parts of the CiA 301
standard in a simple Pythonic interface. It is mainly targeted for testing and
automation tasks rather than a standard compliant master implementation.The library supports Python 3.6+.FeaturesThe library is mainly meant to be used as a master.NMT masterSDO clientPDO producer/consumerSYNC producerEMCY consumerTIME producerLSS masterObject Dictionary from EDS402 profile supportIncomplete support for creating slave nodes also exists.SDO serverPDO producer/consumerNMT slaveEMCY producerObject Dictionary from EDSInstallationInstall fromPyPIusing pip:$ pip install canopenInstall from latest master on GitHub:$ pip install https://github.com/christiansandberg/canopen/archive/master.zipIf you want to be able to change the code while using it, clone it then install
it indevelop mode:$ git clone https://github.com/christiansandberg/canopen.git
$ cd canopen
$ pip install -e .Unit tests can be run using thepytestframework:$ pip install pytest
$ pytest -vDocumentationDocumentation can be found on Read the Docs:http://canopen.readthedocs.io/en/latest/It can also be generated from a local clone usingSphinx:$ python setup.py build_sphinxHardware supportThis library supports multiple hardware and drivers through thepython-canpackage.
Seethe list of supported devices.It is also possible to integrate this library with a custom backend.Quick startHere are some quick examples of what you can do:The PDOs can be access by three forms:1st:node.tpdo[n]ornode.rpdo[n]2nd:node.pdo.tx[n]ornode.pdo.rx[n]3rd:node.pdo[0x1A00]ornode.pdo[0x1600]Thenis the PDO index (normally 1 to 4). The second form of access is for backward compatibility.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.Bus() constructor# (see https://python-can.readthedocs.io/en/latest/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()DebuggingIf you need to see what’s going on in better detail, you can increase thelogginglevel:importlogginglogging.basicConfig(level=logging.DEBUG)