Skip to content

Commit c23c737

Browse files
authored
Update more v2.5.3 examples. (#1446)
1 parent 6002c8e commit c23c737

12 files changed

+148
-1360
lines changed

doc/source/examples.rst

Lines changed: 38 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -10,52 +10,60 @@ These examples are considered essential usage examples, and are guaranteed to wo
1010
because they are tested automatilly with each dev branch commit using CI.
1111

1212

13-
Asynchronous client Example
14-
^^^^^^^^^^^^^^^^^^^^^^^^^^^
13+
Asynchronous client
14+
^^^^^^^^^^^^^^^^^^^
1515
.. literalinclude:: ../../examples/client_async.py
1616

17-
Asynchronous client basic calls example
18-
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
17+
Asynchronous client basic calls
18+
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
1919
.. literalinclude:: ../../examples/client_calls.py
2020

21-
Asynchronous server example
22-
^^^^^^^^^^^^^^^^^^^^^^^^^^^
21+
Asynchronous server
22+
^^^^^^^^^^^^^^^^^^^
2323
.. literalinclude:: ../../examples/server_async.py
2424

25-
Build bcd Payload example
26-
^^^^^^^^^^^^^^^^^^^^^^^^^
25+
Build bcd Payload
26+
^^^^^^^^^^^^^^^^^
2727
.. literalinclude:: ../../examples/build_bcd_payload.py
2828

29-
Message generator example
30-
^^^^^^^^^^^^^^^^^^^^^^^^^
29+
Callback Server example
30+
^^^^^^^^^^^^^^^^^^^^^^^
31+
.. literalinclude:: ../../examples/server_callback.py
32+
33+
Custom Message client
34+
^^^^^^^^^^^^^^^^^^^^^
35+
.. literalinclude:: ../../examples/client_custom_msg.py
36+
37+
Message generator
38+
^^^^^^^^^^^^^^^^^
3139
.. literalinclude:: ../../examples/message_generator.py
3240

33-
Message Parser example
34-
^^^^^^^^^^^^^^^^^^^^^^
41+
Message Parser
42+
^^^^^^^^^^^^^^
3543
.. literalinclude:: ../../examples/message_parser.py
3644

37-
Modbus forwarder Example
38-
^^^^^^^^^^^^^^^^^^^^^^^^
45+
Modbus forwarder
46+
^^^^^^^^^^^^^^^^
3947
.. literalinclude:: ../../examples/modbus_forwarder.py
4048

41-
Modbus payload client Example
42-
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
49+
Modbus payload client
50+
^^^^^^^^^^^^^^^^^^^^^
4351
.. literalinclude:: ../../examples/client_payload.py
4452

45-
Modbus payload Server example
46-
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
53+
Modbus payload Server
54+
^^^^^^^^^^^^^^^^^^^^^
4755
.. literalinclude:: ../../examples/server_payload.py
4856

49-
Synchronous client Example
50-
^^^^^^^^^^^^^^^^^^^^^^^^^^
57+
Synchronous client
58+
^^^^^^^^^^^^^^^^^^
5159
.. literalinclude:: ../../examples/client_sync.py
5260

53-
Synchronous server example
54-
^^^^^^^^^^^^^^^^^^^^^^^^^^
61+
Synchronous server
62+
^^^^^^^^^^^^^^^^^^
5563
.. literalinclude:: ../../examples/server_sync.py
5664

57-
Updating server example
58-
^^^^^^^^^^^^^^^^^^^^^^^^^^
65+
Updating server
66+
^^^^^^^^^^^^^^^
5967
.. literalinclude:: ../../examples/server_updating.py
6068

6169

@@ -65,47 +73,14 @@ Examples contributions
6573
These examples are supplied by users of pymodbus.
6674
The pymodbus team thanks for sharing the examples.
6775

68-
Redis datastore example
69-
^^^^^^^^^^^^^^^^^^^^^^^^
76+
Redis datastore
77+
^^^^^^^^^^^^^^^
7078
.. literalinclude:: ../../examples/contrib/redis_datastore.py
7179

72-
Serial Forwarder example
73-
^^^^^^^^^^^^^^^^^^^^^^^^
80+
Serial Forwarder
81+
^^^^^^^^^^^^^^^^
7482
.. literalinclude:: ../../examples/contrib/serial_forwarder.py
7583

76-
Sqlalchemy datastore example
77-
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
78-
.. literalinclude:: ../../examples/contrib/sql_datastore.py
79-
80-
81-
Examples version 2.5.3
82-
----------------------
83-
84-
These examples have not been upgraded to v3.0.0 but are still relevant.
85-
86-
Help is wanted to upgrade the examples.
87-
88-
89-
Callback Server example
90-
^^^^^^^^^^^^^^^^^^^^^^^
91-
.. literalinclude:: ../../examples/v2.5.3/callback_server.py
92-
93-
Custom Message example
94-
^^^^^^^^^^^^^^^^^^^^^^
95-
.. literalinclude:: ../../examples/v2.5.3/custom_message.py
96-
97-
Deviceinfo showcase client example
98-
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
99-
.. literalinclude:: ../../examples/v2.5.3/deviceinfo_showcase_client.py
100-
101-
Deviceinfo showcase server example
102-
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
103-
.. literalinclude:: ../../examples/v2.5.3/deviceinfo_showcase_server.py
104-
105-
Modbus Saver example
84+
Sqlalchemy datastore
10685
^^^^^^^^^^^^^^^^^^^^
107-
.. literalinclude:: ../../examples/v2.5.3/modbus_saver.py
108-
109-
performance module
110-
^^^^^^^^^^^^^^^^^^
111-
.. literalinclude:: ../../examples/v2.5.3/performance.py
86+
.. literalinclude:: ../../examples/contrib/sql_datastore.py

examples/v2.5.3/custom_message.py renamed to examples/client_custom_msg.py

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -124,9 +124,25 @@ def __init__(self, address, **kwargs):
124124
# --------------------------------------------------------------------------- #
125125

126126

127-
if __name__ == "__main__":
127+
def run_custom_client():
128+
"""Run versions of read coil."""
128129
with ModbusClient(host="localhost", port=5020) as client:
130+
# Standard call
131+
request = ReadCoilsRequest(32, 1, slave=1)
132+
result = client.execute(request)
133+
print(result)
134+
135+
# inherited request
136+
request = Read16CoilsRequest(32, slave=1)
137+
result = client.execute(request)
138+
print(result)
139+
140+
# new modbus function code.
129141
client.register(CustomModbusResponse)
130-
request = CustomModbusRequest(1, slave=1)
142+
request = CustomModbusRequest(32, slave=1)
131143
result = client.execute(request)
132-
print(result.values)
144+
print(result)
145+
146+
147+
if __name__ == "__main__":
148+
run_custom_client()

examples/server_callback.py

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
#!/usr/bin/env python3
2+
"""Pymodbus Server With Callbacks.
3+
4+
This is an example of adding callbacks to a running modbus server
5+
when a value is written to it.
6+
"""
7+
import asyncio
8+
import logging
9+
10+
from examples.server_async import run_async_server, setup_server
11+
from pymodbus.datastore import (
12+
ModbusSequentialDataBlock,
13+
ModbusServerContext,
14+
ModbusSlaveContext,
15+
)
16+
17+
18+
_logger = logging.getLogger()
19+
_logger.setLevel(logging.DEBUG)
20+
21+
22+
class CallbackDataBlock(ModbusSequentialDataBlock):
23+
"""A datablock that stores the new value in memory,
24+
25+
and passes the operation to a message queue for further processing.
26+
"""
27+
28+
def __init__(self, queue, addr, values):
29+
"""Initialize."""
30+
self.queue = queue
31+
super().__init__(addr, values)
32+
33+
def setValues(self, address, value):
34+
"""Set the requested values of the datastore."""
35+
super().setValues(address, value)
36+
txt = f"Callback from setValues with address {address}, value {value}"
37+
_logger.debug(txt)
38+
39+
def getValues(self, address, count=1):
40+
"""Return the requested values from the datastore."""
41+
result = super().getValues(address, count=count)
42+
txt = f"Callback from getValues with address {address}, count {count}, data {result}"
43+
_logger.debug(txt)
44+
return result
45+
46+
def validate(self, address, count=1):
47+
"""Check to see if the request is in range."""
48+
result = super().validate(address, count=count)
49+
txt = f"Callback from validate with address {address}, count {count}, data {result}"
50+
_logger.debug(txt)
51+
return result
52+
53+
54+
async def run_callback_server(cmdline=None):
55+
"""Define datastore callback for server and do setup."""
56+
queue = asyncio.Queue()
57+
block = CallbackDataBlock(queue, 0x00, [17] * 100)
58+
store = ModbusSlaveContext(di=block, co=block, hr=block, ir=block)
59+
context = ModbusServerContext(slaves=store, single=True)
60+
run_args = setup_server(
61+
description="Run callback server.", cmdline=cmdline, context=context
62+
)
63+
await run_async_server(run_args)
64+
65+
66+
if __name__ == "__main__":
67+
asyncio.run(run_callback_server())

examples/v2.5.3/README.rst

Lines changed: 0 additions & 81 deletions
This file was deleted.

0 commit comments

Comments
 (0)