Skip to content

Commit e05aff0

Browse files
committed
improve serial gateway example
1 parent d69b238 commit e05aff0

File tree

4 files changed

+27
-27
lines changed

4 files changed

+27
-27
lines changed

docs/examples/index.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,6 @@ pyModbusTCP examples
1515
server
1616
server_allow
1717
server_change_log
18-
server_gateway
18+
server_serial_gw
1919
server_schedule
2020
server_virtual_data

docs/examples/server_gateway.rst

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

docs/examples/server_serial_gw.rst

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
=================================
2+
Server: Modbus/TCP serial gateway
3+
=================================
4+
5+
6+
.. literalinclude:: ../../examples/server_serial_gw.py

examples/server_gateway.py renamed to examples/server_serial_gw.py

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
import logging
1717
import queue
1818
import struct
19-
from threading import Thread, Event
19+
from threading import Event
2020
from queue import Queue
2121
from pyModbusTCP.server import ModbusServer
2222
from pyModbusTCP.utils import crc16
@@ -72,21 +72,19 @@ def build(self, raw_pdu, slave_ad):
7272
self.raw = tmp_raw
7373

7474

75-
class ModbusSerialWorker(Thread):
76-
""" Main serial thread to manage I/O with RTU devices. """
75+
class RtuQuery:
76+
""" Request container to deal with modbus serial worker. """
7777

78-
class _RtuQuery:
79-
""" Internal request container to deal with serial worker thread. """
78+
def __init__(self):
79+
self.completed = Event()
80+
self.request = ModbusRTUFrame()
81+
self.response = ModbusRTUFrame()
8082

81-
def __init__(self):
82-
self.completed = Event()
83-
self.request = ModbusRTUFrame()
84-
self.response = ModbusRTUFrame()
83+
84+
class ModbusSerialWorker:
85+
""" A serial worker to manage I/O with RTU devices. """
8586

8687
def __init__(self, port, timeout=1.0, end_of_frame=0.05):
87-
super().__init__()
88-
# this thread is a daemon
89-
self.daemon = True
9088
# public
9189
self.serial_port = port
9290
self.timeout = timeout
@@ -95,8 +93,8 @@ def __init__(self, port, timeout=1.0, end_of_frame=0.05):
9593
# accept 5 simultaneous requests before overloaded exception is return
9694
self.rtu_queries_q = Queue(maxsize=5)
9795

98-
def run(self):
99-
"""Serial worker thread."""
96+
def loop(self):
97+
"""Serial worker main loop."""
10098
while True:
10199
# get next exchange from queue
102100
rtu_query = self.rtu_queries_q.get()
@@ -123,13 +121,13 @@ def run(self):
123121
self.rtu_queries_q.task_done()
124122

125123
def srv_engine_entry(self, session_data):
126-
"""Server engine entry point (pass request to serial worker thread).
124+
"""Server engine entry point (pass request to serial worker queries queue).
127125
128126
:param session_data: server session data
129127
:type session_data: ModbusServer.SessionData
130128
"""
131129
# init a serial exchange from session data
132-
rtu_query = ModbusSerialWorker._RtuQuery()
130+
rtu_query = RtuQuery()
133131
rtu_query.request.build(raw_pdu=session_data.request.pdu.raw,
134132
slave_ad=session_data.request.mbap.unit_id)
135133
try:
@@ -169,14 +167,16 @@ def srv_engine_entry(self, session_data):
169167
# init serial port
170168
logger.debug('Open serial port %s at %d bauds', args.device, args.baudrate)
171169
serial_port = Serial(port=args.device, baudrate=args.baudrate)
172-
# start serial worker thread
173-
logger.debug('Start serial worker thread')
170+
# init serial worker
174171
serial_worker = ModbusSerialWorker(serial_port, args.timeout, args.eof)
175-
serial_worker.start()
176172
# start modbus server with custom engine
177173
logger.debug('Start modbus server (%s, %d)', args.host, args.port)
178-
srv = ModbusServer(host=args.host, port=args.port, ext_engine=serial_worker.srv_engine_entry)
174+
srv = ModbusServer(host=args.host, port=args.port,
175+
no_block=True, ext_engine=serial_worker.srv_engine_entry)
179176
srv.start()
177+
# start serial worker loop
178+
logger.debug('Start serial worker')
179+
serial_worker.loop()
180180
except serialutil.SerialException as e:
181181
logger.critical('Serial device error: %r', e)
182182
exit(1)

0 commit comments

Comments
 (0)