Skip to content

Commit bafee10

Browse files
committed
datastore: change code to call async_getValues/setValues
messages and serverside defaults to async-calls now and async default is to call the sync version of itself, allowing to build async datastorage functionality
1 parent bf85de9 commit bafee10

File tree

7 files changed

+68
-48
lines changed

7 files changed

+68
-48
lines changed

examples/server_callback.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -31,15 +31,15 @@ def __init__(self, queue, addr, values):
3131
self.queue = queue
3232
super().__init__(addr, values)
3333

34-
def setValues(self, address, value):
34+
async def async_setValues(self, address, value):
3535
"""Set the requested values of the datastore."""
36-
super().setValues(address, value)
36+
await super().async_setValues(address, value)
3737
txt = f"Callback from setValues with address {address}, value {value}"
3838
_logger.debug(txt)
3939

40-
def getValues(self, address, count=1):
40+
async def async_getValues(self, address, count=1):
4141
"""Return the requested values from the datastore."""
42-
result = super().getValues(address, count=count)
42+
result = await super().async_getValues(address, count=count)
4343
txt = f"Callback from getValues with address {address}, count {count}, data {result}"
4444
_logger.debug(txt)
4545
return result
@@ -56,7 +56,7 @@ async def run_callback_server(cmdline=None):
5656
"""Define datastore callback for server and do setup."""
5757
queue = asyncio.Queue()
5858
block = CallbackDataBlock(queue, 0x00, [17] * 100)
59-
block.setValues(1, 15)
59+
await block.async_setValues(1, 15)
6060
store = ModbusSlaveContext(di=block, co=block, hr=block, ir=block)
6161
context = ModbusServerContext(slaves=store, single=True)
6262
run_args = server_async.setup_server(

examples/server_updating.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -61,9 +61,9 @@ async def updating_task(context):
6161
count = 6
6262

6363
# set values to zero
64-
values = context[slave_id].getValues(fc_as_hex, address, count=count)
64+
values = await context[slave_id].async_getValues(fc_as_hex, address, count=count)
6565
values = [0 for v in values]
66-
context[slave_id].setValues(fc_as_hex, address, values)
66+
await context[slave_id].async_setValues(fc_as_hex, address, values)
6767

6868
txt = (
6969
f"updating_task: started: initialised values: {values!s} at address {address!s}"
@@ -75,9 +75,11 @@ async def updating_task(context):
7575
while True:
7676
await asyncio.sleep(2)
7777

78-
values = context[slave_id].getValues(fc_as_hex, address, count=count)
78+
values = await context[slave_id].async_getValues(
79+
fc_as_hex, address, count=count
80+
)
7981
values = [v + 1 for v in values]
80-
context[slave_id].setValues(fc_as_hex, address, values)
82+
await context[slave_id].async_setValues(fc_as_hex, address, values)
8183

8284
txt = f"updating_task: incremented values: {values!s} at address {address!s}"
8385
print(txt)

pymodbus/bit_read_message.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,9 @@ async def execute(self, context):
169169
return self.doException(merror.IllegalValue)
170170
if not context.validate(self.function_code, self.address, self.count):
171171
return self.doException(merror.IllegalAddress)
172-
values = context.getValues(self.function_code, self.address, self.count)
172+
values = await context.async_getValues(
173+
self.function_code, self.address, self.count
174+
)
173175
if isinstance(values, ExceptionResponse):
174176
return values
175177
return ReadCoilsResponse(values)
@@ -237,7 +239,9 @@ async def execute(self, context):
237239
return self.doException(merror.IllegalValue)
238240
if not context.validate(self.function_code, self.address, self.count):
239241
return self.doException(merror.IllegalAddress)
240-
values = context.getValues(self.function_code, self.address, self.count)
242+
values = await context.async_getValues(
243+
self.function_code, self.address, self.count
244+
)
241245
if isinstance(values, ExceptionResponse):
242246
return values
243247
return ReadDiscreteInputsResponse(values)

pymodbus/bit_write_message.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -90,10 +90,12 @@ async def execute(self, context):
9090
if not context.validate(self.function_code, self.address, 1):
9191
return self.doException(merror.IllegalAddress)
9292

93-
result = context.setValues(self.function_code, self.address, [self.value])
93+
result = await context.async_setValues(
94+
self.function_code, self.address, [self.value]
95+
)
9496
if isinstance(result, ExceptionResponse):
9597
return result
96-
values = context.getValues(self.function_code, self.address, 1)
98+
values = await context.async_getValues(self.function_code, self.address, 1)
9799
if isinstance(values, ExceptionResponse):
98100
return values
99101
return WriteSingleCoilResponse(self.address, values[0])
@@ -226,7 +228,9 @@ async def execute(self, context):
226228
if not context.validate(self.function_code, self.address, count):
227229
return self.doException(merror.IllegalAddress)
228230

229-
result = context.setValues(self.function_code, self.address, self.values)
231+
result = await context.async_setValues(
232+
self.function_code, self.address, self.values
233+
)
230234
if isinstance(result, ExceptionResponse):
231235
return result
232236
return WriteMultipleCoilsResponse(self.address, count)

pymodbus/register_read_message.py

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,9 @@ async def execute(self, context):
149149
return self.doException(merror.IllegalValue)
150150
if not context.validate(self.function_code, self.address, self.count):
151151
return self.doException(merror.IllegalAddress)
152-
values = context.getValues(self.function_code, self.address, self.count)
152+
values = await context.async_getValues(
153+
self.function_code, self.address, self.count
154+
)
153155
if isinstance(values, ExceptionResponse):
154156
return values
155157

@@ -210,7 +212,9 @@ async def execute(self, context):
210212
return self.doException(merror.IllegalValue)
211213
if not context.validate(self.function_code, self.address, self.count):
212214
return self.doException(merror.IllegalAddress)
213-
values = context.getValues(self.function_code, self.address, self.count)
215+
values = await context.async_getValues(
216+
self.function_code, self.address, self.count
217+
)
214218
if isinstance(values, ExceptionResponse):
215219
return values
216220
return ReadInputRegistersResponse(values)
@@ -328,12 +332,12 @@ async def execute(self, context):
328332
return self.doException(merror.IllegalAddress)
329333
if not context.validate(self.function_code, self.read_address, self.read_count):
330334
return self.doException(merror.IllegalAddress)
331-
result = context.setValues(
335+
result = await context.async_setValues(
332336
self.function_code, self.write_address, self.write_registers
333337
)
334338
if isinstance(result, ExceptionResponse):
335339
return result
336-
registers = context.getValues(
340+
registers = await context.async_getValues(
337341
self.function_code, self.read_address, self.read_count
338342
)
339343
return ReadWriteMultipleRegistersResponse(registers)

pymodbus/register_write_message.py

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -68,10 +68,12 @@ async def execute(self, context):
6868
if not context.validate(self.function_code, self.address, 1):
6969
return self.doException(merror.IllegalAddress)
7070

71-
result = context.setValues(self.function_code, self.address, [self.value])
71+
result = await context.async_setValues(
72+
self.function_code, self.address, [self.value]
73+
)
7274
if isinstance(result, ExceptionResponse):
7375
return result
74-
values = context.getValues(self.function_code, self.address, 1)
76+
values = await context.async_getValues(self.function_code, self.address, 1)
7577
return WriteSingleRegisterResponse(self.address, values[0])
7678

7779
def get_response_pdu_size(self):
@@ -213,7 +215,9 @@ async def execute(self, context):
213215
if not context.validate(self.function_code, self.address, self.count):
214216
return self.doException(merror.IllegalAddress)
215217

216-
result = context.setValues(self.function_code, self.address, self.values)
218+
result = await context.async_setValues(
219+
self.function_code, self.address, self.values
220+
)
217221
if isinstance(result, ExceptionResponse):
218222
return result
219223
return WriteMultipleRegistersResponse(self.address, self.count)
@@ -333,11 +337,13 @@ async def execute(self, context):
333337
return self.doException(merror.IllegalValue)
334338
if not context.validate(self.function_code, self.address, 1):
335339
return self.doException(merror.IllegalAddress)
336-
values = context.getValues(self.function_code, self.address, 1)[0]
340+
values = (await context.async_getValues(self.function_code, self.address, 1))[0]
337341
if isinstance(values, ExceptionResponse):
338342
return values
339343
values = (values & self.and_mask) | (self.or_mask & ~self.and_mask)
340-
result = context.setValues(self.function_code, self.address, [values])
344+
result = await context.async_setValues(
345+
self.function_code, self.address, [values]
346+
)
341347
if isinstance(result, ExceptionResponse):
342348
return result
343349
return MaskWriteRegisterResponse(self.address, self.and_mask, self.or_mask)

test/sub_server/test_simulator.py

Lines changed: 25 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -372,7 +372,7 @@ def test_simulator_validate_type(self):
372372
validated = exc_simulator.validate(entry[0], entry[1], entry[2])
373373
assert entry[3] == validated, f"at entry {entry}"
374374

375-
def test_simulator_get_values(self):
375+
async def test_simulator_get_values(self):
376376
"""Test simulator get values."""
377377
for entry in (
378378
(FX_READ_BIT, 194, 1, [False]),
@@ -382,33 +382,33 @@ def test_simulator_get_values(self):
382382
(FX_READ_REG, 19, 1, [14662]),
383383
(FX_READ_REG, 16, 2, [3124, 5678]),
384384
):
385-
values = self.simulator.getValues(entry[0], entry[1], entry[2])
385+
values = await self.simulator.async_getValues(entry[0], entry[1], entry[2])
386386
assert entry[3] == values, f"at entry {entry}"
387387

388-
def test_simulator_set_values(self):
388+
async def test_simulator_set_values(self):
389389
"""Test simulator set values."""
390390
exc_setup = copy.deepcopy(self.default_config)
391391
exc_simulator = ModbusSimulatorContext(exc_setup, None)
392392
value = [31234]
393-
exc_simulator.setValues(FX_WRITE_REG, 16, value)
394-
result = exc_simulator.getValues(FX_READ_REG, 16, 1)
393+
await exc_simulator.async_setValues(FX_WRITE_REG, 16, value)
394+
result = await exc_simulator.async_getValues(FX_READ_REG, 16, 1)
395395
assert value == result
396396
value = [31234, 189]
397-
exc_simulator.setValues(FX_WRITE_REG, 16, value)
398-
result = exc_simulator.getValues(FX_READ_REG, 16, 2)
397+
await exc_simulator.async_setValues(FX_WRITE_REG, 16, value)
398+
result = await exc_simulator.async_getValues(FX_READ_REG, 16, 2)
399399
assert value == result
400400

401401
exc_simulator.registers[5].value = 0
402-
exc_simulator.setValues(FX_WRITE_BIT, 80, [True])
403-
exc_simulator.setValues(FX_WRITE_BIT, 82, [True])
404-
exc_simulator.setValues(FX_WRITE_BIT, 84, [True])
405-
exc_simulator.setValues(FX_WRITE_BIT, 86, [True, False, True])
406-
result = exc_simulator.getValues(FX_READ_BIT, 80, 8)
402+
await exc_simulator.async_setValues(FX_WRITE_BIT, 80, [True])
403+
await exc_simulator.async_setValues(FX_WRITE_BIT, 82, [True])
404+
await exc_simulator.async_setValues(FX_WRITE_BIT, 84, [True])
405+
await exc_simulator.async_setValues(FX_WRITE_BIT, 86, [True, False, True])
406+
result = await exc_simulator.async_getValues(FX_READ_BIT, 80, 8)
407407
assert [True, False] * 4 == result
408-
exc_simulator.setValues(FX_WRITE_BIT, 88, [False])
409-
result = exc_simulator.getValues(FX_READ_BIT, 86, 3)
408+
await exc_simulator.async_setValues(FX_WRITE_BIT, 88, [False])
409+
result = await exc_simulator.async_getValues(FX_READ_BIT, 86, 3)
410410
assert [True, False, False] == result
411-
exc_simulator.setValues(FX_WRITE_BIT, 80, [True] * 17)
411+
await exc_simulator.async_setValues(FX_WRITE_BIT, 80, [True] * 17)
412412

413413
def test_simulator_get_text(self):
414414
"""Test get_text_register()."""
@@ -454,7 +454,7 @@ def test_simulator_get_text(self):
454454
Label.uptime,
455455
],
456456
)
457-
def test_simulator_actions(self, func, addr, action):
457+
async def test_simulator_actions(self, func, addr, action):
458458
"""Test actions."""
459459
exc_setup = copy.deepcopy(self.default_config)
460460
exc_simulator = ModbusSimulatorContext(exc_setup, None)
@@ -465,20 +465,20 @@ def test_simulator_actions(self, func, addr, action):
465465
reg2.value = 0
466466
if func == FX_READ_BIT:
467467
addr = addr * 16 - 16 + 14
468-
values = exc_simulator.getValues(func, addr, 2)
468+
values = await exc_simulator.async_getValues(func, addr, 2)
469469
assert values[0] or values[1]
470470

471-
def test_simulator_action_timestamp(self):
471+
async def test_simulator_action_timestamp(self):
472472
"""Test action timestamp."""
473473
exc_setup = copy.deepcopy(self.default_config)
474474
exc_simulator = ModbusSimulatorContext(exc_setup, None)
475475
addr = 12
476476
exc_simulator.registers[addr].action = exc_simulator.action_name_to_id[
477477
Label.timestamp
478478
]
479-
exc_simulator.getValues(FX_READ_REG, addr, 1)
479+
await exc_simulator.async_getValues(FX_READ_REG, addr, 1)
480480

481-
def test_simulator_action_reset(self):
481+
async def test_simulator_action_reset(self):
482482
"""Test action reset."""
483483
exc_setup = copy.deepcopy(self.default_config)
484484
exc_simulator = ModbusSimulatorContext(exc_setup, None)
@@ -487,7 +487,7 @@ def test_simulator_action_reset(self):
487487
Label.reset
488488
]
489489
with pytest.raises(RuntimeError):
490-
exc_simulator.getValues(FX_READ_REG, addr, 1)
490+
await exc_simulator.async_getValues(FX_READ_REG, addr, 1)
491491

492492
@pytest.mark.parametrize(
493493
("celltype", "minval", "maxval", "value", "expected"),
@@ -502,7 +502,7 @@ def test_simulator_action_reset(self):
502502
(CellType.FLOAT32, 27.0, 75.5, 24.0, (27.0, 28.0, 29.0)),
503503
],
504504
)
505-
def test_simulator_action_increment(
505+
async def test_simulator_action_increment(
506506
self, celltype, minval, maxval, value, expected
507507
):
508508
"""Test action increment."""
@@ -528,7 +528,7 @@ def test_simulator_action_increment(
528528
exc_simulator.registers[30].value = regs[0]
529529
exc_simulator.registers[31].value = regs[1]
530530
for expect_value in expected:
531-
regs = exc_simulator.getValues(FX_READ_REG, 30, reg_count)
531+
regs = await exc_simulator.async_getValues(FX_READ_REG, 30, reg_count)
532532
if reg_count == 1:
533533
assert expect_value == regs[0], f"type({celltype})"
534534
else:
@@ -547,7 +547,7 @@ def test_simulator_action_increment(
547547
(CellType.FLOAT32, 65.0, 78.0),
548548
],
549549
)
550-
def test_simulator_action_random(self, celltype, minval, maxval):
550+
async def test_simulator_action_random(self, celltype, minval, maxval):
551551
"""Test action random."""
552552
exc_setup = copy.deepcopy(self.default_config)
553553
exc_simulator = ModbusSimulatorContext(exc_setup, None)
@@ -563,7 +563,7 @@ def test_simulator_action_random(self, celltype, minval, maxval):
563563
is_int = celltype != CellType.FLOAT32
564564
reg_count = 1 if celltype in (CellType.BITS, CellType.UINT16) else 2
565565
for _i in range(100):
566-
regs = exc_simulator.getValues(FX_READ_REG, 30, reg_count)
566+
regs = await exc_simulator.async_getValues(FX_READ_REG, 30, reg_count)
567567
if reg_count == 1:
568568
new_value = regs[0]
569569
else:

0 commit comments

Comments
 (0)