Skip to content

Commit 125bad3

Browse files
Merge pull request #18 from SCHUNK-SE-Co-KG/modbus-server
Improve modbus server
2 parents 39de3f1 + 4ee006b commit 125bad3

File tree

4 files changed

+48
-16
lines changed

4 files changed

+48
-16
lines changed

schunk_gripper_library/tests/conftest.py

+24-6
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
from schunk_gripper_library.tests.etc.pseudo_terminals import Connection
33
from schunk_gripper_library.tests.etc.modbus_server import ModbusServer
44
import asyncio
5+
import threading
56
from pathlib import Path
67

78

@@ -20,15 +21,32 @@ def pseudo_terminals():
2021
@pytest.fixture(scope="module")
2122
def modbus_server(pseudo_terminals):
2223
pt1, pt2 = pseudo_terminals
23-
server = ModbusServer()
24-
print("Opening Modbus server")
25-
asyncio.run(server.setup(port=pt1))
26-
asyncio.run(server.start())
2724

25+
async def periodic_modbus_task(pt1, stop_event):
26+
server = ModbusServer()
27+
await server.setup(port=pt1)
28+
await server.start()
29+
30+
try:
31+
while not stop_event.is_set():
32+
await asyncio.sleep(1)
33+
finally:
34+
server.stop()
35+
36+
loop = asyncio.new_event_loop()
37+
thread = threading.Thread(target=lambda: loop.run_forever())
38+
thread.start()
39+
40+
stop_event = asyncio.Event()
41+
task = asyncio.run_coroutine_threadsafe(periodic_modbus_task(pt1, stop_event), loop)
2842
yield pt2
2943

30-
print("Closing Modbus server")
31-
server.stop()
44+
stop_event.set()
45+
task.result()
46+
47+
loop.call_soon_threadsafe(loop.stop)
48+
thread.join()
49+
loop.close()
3250

3351

3452
def modbus_gripper_available():

schunk_gripper_library/tests/etc/modbus_server.py

+1-2
Original file line numberDiff line numberDiff line change
@@ -41,12 +41,11 @@ def trace_connect(self, connect: bool) -> None:
4141

4242
async def setup(self, port: str):
4343
datablock = ModbusSequentialDataBlock(0x00, [0] * 1000)
44-
slave_id = 12 # SCHUNK default
4544
slave_context = ModbusSlaveContext(
4645
di=datablock, co=datablock, hr=datablock, ir=datablock
4746
)
4847
context = ModbusServerContext(
49-
slaves={slave_id: slave_context},
48+
slaves=slave_context,
5049
single=True,
5150
)
5251
self.server = ModbusSerialServer(

schunk_gripper_library/tmp/client.py

+5-2
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
#!/usr/bin/env python3
2-
from src.driver import Driver
2+
import sys
3+
4+
sys.path.append("..")
5+
from src.driver import Driver # noqa: E402
36

47

58
def main():
69
driver = Driver()
7-
driver.connect("modbus", "/dev/pts/14", 12)
10+
driver.connect("modbus", "/dev/pts/17", 12)
811
driver.send_plc_output()
912

1013

schunk_gripper_library/tmp/server.py

+18-6
Original file line numberDiff line numberDiff line change
@@ -7,21 +7,33 @@
77
import asyncio # noqa: E402
88

99

10-
def main():
10+
async def main():
1111
connection = Connection()
1212
pt1, pt2 = connection.open()
1313
server = ModbusServer()
1414
print(f"Opening Modbus server on {pt2}")
15-
asyncio.run(server.setup(port=pt1))
16-
print(f"Using these parameters: {server.get_params()}")
17-
asyncio.run(server.start())
1815

19-
_ = input("Press enter to close")
16+
async def start_server():
17+
print("Before start")
18+
await server.setup(port=pt1)
19+
await server.start()
20+
print("After start")
21+
22+
loop = asyncio.get_event_loop()
23+
server_task = loop.create_task(start_server())
24+
25+
try:
26+
while True:
27+
28+
await asyncio.sleep(5)
29+
except asyncio.CancelledError:
30+
pass
2031

2132
print("Closing Modbus server")
2233
server.stop()
2334
connection.close()
35+
loop.run_until_complete(server_task)
2436

2537

2638
if __name__ == "__main__":
27-
main()
39+
asyncio.run(main())

0 commit comments

Comments
 (0)