CANopen library providing functionality to implement responder nodes
Project description
CANopen library to implement responder nodes.
Backends:
CAN interfaces via python-can
Synopsis
Pure python implementation
Under MIT license (2021 Günther Jena)
Source is hosted on GitHub.com
Tested on Python 3.7, 3.8, 3.9 and 3.10
Unit tested with pytest, coding style done with Black, static type checked with mypy, static code checked with Pylint, documented with Sphinx
Supporting CiA301 (EN 50325-4)
Feature List
Object dictionary
provides callbacks for validation, update, download and read
supports records, arrays and variables
EDS support
dynamically generation of EDS file
automatically provided via object 0x1021 (“Store EDS”)
up to 128 SDO servers
expetited, segmented and block transfer for up- and download
COB-IDs dynamically configurable
custom up- and download handlers supported
up to 512 TPDOs and 512 RPDOs
dynamically configurable
transmission types: synchronous (acyclic and every nth sync) and event driven
inhibit time supported
EMCY producer service
COB-ID dynamically configurable
inhibit time supported
Heartbeat producer service
dynamically configurable
NMT slave service
boot-up service
callback for state change provided
SYNC consumer service
COB-ID dynamically configurable
callback for received sync provided
CiA305 Layer Setting Service
fast scan supported
bitrate and node id configuring supported
identify remote responder supported
CAN interface abstraction
python-can fully supported
automatic CAN id filtering by subscripted services
Scheduling supporting threaded and async operation
- TODO
build object dictionary via reading an EDS file
supporting MPDOs
TIME consumer service
Up- and download handler as io streams
Examples
Creating a node
import can
from durand import CANBusNetwork, Node, Variable, Record, DatatypeEnum
bus = can.Bus(bustype='socketcan', channel='vcan0')
network = CANBusNetwork(bus)
node = Node(network, node_id=0x01)
Congratulations! You have a CiA-301 compliant node running. Layer Setting Service is also supported out of the box.
Adding objects
od = node.object_dictionary
# add variable at index 0x2000
od[0x2000] = Variable(DatatypeEnum.UNSIGNED16, access='rw', value=10, name='Parameter 1')
# add record at index 0x2001
record = Record(name='Parameter Record')
record[1] = Variable(DatatypeEnum.UNSIGNED8, access='ro', value=0, name='Parameter 2a')
record[2] = Variable(DatatypeEnum.REAL32, access='rw', value=0, name='Parameter 2b')
od[0x2001] = record
Access values
The objects can be read and written directly by accessing the object dictionary:
print(f'Value of Parameter 1: {od.read(0x2000, 0)}')
od.write(0x2001, 1, value=0xAA)
Add callbacks
A more event driven approach is using of callbacks. Following callbacks are available:
validate_callbacks - called before a value in the object dictionary is going to be updated
update_callbacks - called when the value has been changed (via od.write or via CAN bus)
download_callbacks - called when the value has been changed via CAN bus
read_callback - called when a object is read (return value is used )
od.validate_callbacks[(0x2000, 0)].add(lambda v: v % 2 == 0)
od.update_callbacks[(0x2001, 2)].add(lambda v: print(f'Update for Parameter 2b: {v}'))
od.download_callbacks[(0x2000, 0)].add(lambda v: print(f'Download for Parmeter 1: {v}'))
od.set_read_callback(0x2001, 1, lambda: 17)
PDO mapping
PDOs can dynamically mapped via the SDO server or programmatically. The PDO indices start at 0.
node.tpdo[0].mapping = [(0x2001, 1), (0x2001, 2)]
node.tpdo[0].transmission_type = 1 # transmit on every SYNC
node.rpdo[0].mapping = [(0x2000, 0)]
node.tpdo[0].transmission_type = 255 # event driven (processed when received)
Install
pip install durand
Credits
This library would not be possible without:
python-canopen: CANopen library (by Christian Sandberg)
python-can: CAN interface library (by Brian Thorne)
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
File details
Details for the file durand-0.4.13.tar.gz
.
File metadata
- Download URL: durand-0.4.13.tar.gz
- Upload date:
- Size: 36.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/5.1.1 CPython/3.9.20
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | a2d4b63664a790ab05424e105730ebfb9cf80c5afcecf32d26696201ed7d57ba |
|
MD5 | 628fb49d3fdb12fa472b8278fa2c07c2 |
|
BLAKE2b-256 | 1bcb9dea282920e5a8814c48e428d0ebf7570a624e9016ed23aa5d5a807fe0d6 |
File details
Details for the file durand-0.4.13-py3-none-any.whl
.
File metadata
- Download URL: durand-0.4.13-py3-none-any.whl
- Upload date:
- Size: 31.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/5.1.1 CPython/3.9.20
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | bc9180d920333f90c0265df99eac68287f31505321157d0d966a5e8194ea81d3 |
|
MD5 | c808636d8c0a888dda1ad1cc1f937955 |
|
BLAKE2b-256 | 9f71aed2b1e696b94e8c7d16b878f2d4b0a125c0626c86014c60ea9c2658c95a |