CANopen stack implementation
A Python implementation of the CANopen standard. The aim of the project is to support the most common parts of the DS-301 standard for a master node wrapped in a Pythonic interface.
Install from PyPI using pip:
$ pip install canopen
If you want to be able to change the code while using it, clone it then install it in develop mode:
$ git clone https://github.com/christiansandberg/canopen.git $ cd canopen $ pip install -e .
Documentation can be found on Read the Docs:
It can also be generated from a local clone using Sphinx:
$ python setup.py build_sphinx
This library supports multiple hardware and drivers through the python-can package. At the time of writing this includes:
It is also possible to integrate this library with a custom backend.
Here are some quick examples of what you can do:
import canopen # Start with creating a network representing one CAN bus network = canopen.Network() # Add some nodes with corresponding Object Dictionaries node = network.add_node(6, '/path/to/object_dictionary.eds') network.add_node(7, '/path/to/object_dictionary.eds') # Connect to the CAN bus # Arguments are passed to a python-can bus # (see https://python-can.readthedocs.io/en/latest/bus.html). network.connect(channel=0, bustype='kvaser', bitrate=250000) # Read a variable using SDO device_name = node.sdo['Manufacturer device name'].raw vendor_id = node.sdo[0x1018].raw # Write a variable using SDO node.sdo['Producer heartbeat time'].raw = 1000 # Read PDO configuration from node node.pdo.read() # Transmit SYNC every 100 ms network.sync.start(0.1) # Change state to operational (NMT start) network.nmt.state = 'OPERATIONAL' network.nmt.state = 'OPERATIONAL' # Read a value from Tx PDO 1 node.pdo.tx.wait_for_reception() speed = node.pdo.tx['ApplicationStatus.ActualSpeed'].phys # Disconnect from CAN bus network.sync.stop() network.disconnect()
There are a lot of things that still needs implementing and fixing. Pull requests are most welcome!