Skip to content

Commit 6c6367c

Browse files
committed
Updated README.rst
1 parent 5631a03 commit 6c6367c

File tree

1 file changed

+72
-2
lines changed

1 file changed

+72
-2
lines changed

README.rst

Lines changed: 72 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
CANopen for Python
2-
==================
1+
CANopen for Python, asyncio port
2+
================================
33

44
A Python implementation of the CANopen_ standard.
55
The aim of the project is to support the most common parts of the CiA 301
@@ -8,6 +8,8 @@ automation tasks rather than a standard compliant master implementation.
88

99
The library supports Python 3.6+.
1010

11+
This library is the asyncio port of CANopen. See below for code example.
12+
1113

1214
Features
1315
--------
@@ -147,6 +149,74 @@ The :code:`n` is the PDO index (normally 1 to 4). The second form of access is f
147149
network.disconnect()
148150
149151
152+
Asyncio
153+
-------
154+
155+
This library can be used with asyncio.
156+
157+
.. code-block:: python
158+
159+
import asyncio
160+
import canopen
161+
import can
162+
163+
async def my_node(network, nodeid, od):
164+
165+
# Create the node object and load the OD
166+
node = network.add_node(nodeid, od)
167+
168+
# Read the PDOs from the remote
169+
await node.tpdo.aread()
170+
await node.rpdo.aread()
171+
172+
# Set the module state
173+
node.nmt.set_state('OPERATIONAL')
174+
175+
# Set motor speed via SDO
176+
await node.sdo['MotorSpeed'].aset_raw(2)
177+
178+
while True:
179+
180+
# Wait for RPDO 1
181+
t = await tpdo.await_for_reception(1)
182+
if not t:
183+
continue
184+
185+
# Get the PDO value
186+
rpm = node.tpdo[1]['MotorSpeed Actual'].get_raw()
187+
print(f'SPEED on motor {nodeid}:', rpm)
188+
189+
# Sleep a little
190+
await asyncio.sleep(0.2)
191+
192+
# Send PDO with
193+
node.rpdo[1]['Some variable'].set_phys(42)
194+
node.rpdo[1].transmit()
195+
196+
async def main():
197+
198+
# Open CAN bus
199+
# Arguments are passed to python-can's can.Bus() constructor
200+
# (see https://python-can.readthedocs.io/en/latest/bus.html).
201+
bus = can.BUS(interface='pcan', bitrate=1000000)
202+
203+
# Create a network representing one CAN bus
204+
network = canopen.Network(bus)
205+
206+
# Start the notifier to enable canopen to respond to incoming CAN message
207+
loop = asyncio.get_event_loop()
208+
network.notifier = can.Notifier(bus, network.listeners, 1, loop=loop)
209+
210+
# Create two independent tasks for two nodes 51 and 52 which will run concurrently
211+
task1 = asyncio.create_task(my_node(network, 51, '/path/to/object_dictionary.eds'))
212+
task2 = asyncio.create_task(my_node(network, 52, '/path/to/object_dictionary.eds'))
213+
214+
# Wait for both to complete (which will never happen)
215+
await asyncio.gather((task1, task2))
216+
217+
asyncio.run(main())
218+
219+
150220
Debugging
151221
---------
152222

0 commit comments

Comments
 (0)