Skip to content

Commit b9c2341

Browse files
authored
Simulator support for FLOAT64 type. (#3002)
1 parent 3551129 commit b9c2341

9 files changed

Lines changed: 368 additions & 187 deletions

File tree

examples/datastore_simulator_share.py

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -54,13 +54,15 @@
5454
"uint16": 1,
5555
"uint32": 45000,
5656
"float32": 127.4,
57+
"float64": 505.14,
5758
"string": "X",
5859
},
5960
"action": {
6061
"bits": None,
6162
"uint16": None,
6263
"uint32": None,
6364
"float32": None,
65+
"float64": None,
6466
"string": None,
6567
},
6668
},
@@ -102,11 +104,14 @@
102104
{"addr": [33, 36], "value": 5678.19},
103105
{"addr": [37, 40], "value": 345000.18, "action": "increment"},
104106
],
107+
"float64": [
108+
{"addr": [41, 44], "value": -42478.53, "action": "random"},
109+
],
105110
"string": [
106-
{"addr": [41, 42], "value": "Str"},
107-
{"addr": [43, 44], "value": "Strx"},
111+
{"addr": [45, 46], "value": "Str"},
112+
{"addr": [47, 48], "value": "Strx"},
108113
],
109-
"repeat": [{"addr": [0, 45], "to": [46, 138]}],
114+
"repeat": [{"addr": [0, 48], "to": [49, 147]}],
110115
}
111116

112117

examples/simulator.py

Lines changed: 27 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -13,25 +13,27 @@
1313

1414
from pymodbus import FramerType
1515
from pymodbus.client import AsyncModbusTcpClient
16-
from pymodbus.datastore import ModbusSimulatorContext
16+
from pymodbus.datastore import CellType, ModbusSimulatorContext
1717
from pymodbus.server import ModbusSimulatorServer, get_simulator_commandline
1818

1919

2020
_logger = logging.getLogger(__file__)
2121

2222

2323
async def read_registers(
24-
client, addr, count, is_int, curval=None, minval=None, maxval=None
24+
client, addr, count, celltype: CellType, curval=None, minval=None, maxval=None
2525
):
2626
"""Run modbus call."""
2727
rr = await client.read_holding_registers(addr, count=count, device_id=1)
2828
assert not rr.isError()
2929
if count == 1:
3030
value = rr.registers[0]
3131
else:
32-
value = ModbusSimulatorContext.build_value_from_registers(rr.registers, is_int)
33-
if not is_int:
34-
value = round(value, 1)
32+
value = ModbusSimulatorContext.build_value_from_registers(
33+
rr.registers, celltype
34+
)
35+
if not CellType.is_int(celltype):
36+
value = round(value, 2)
3537
if curval:
3638
assert value == curval, f"{value} == {curval}"
3739
else:
@@ -43,19 +45,30 @@ async def run_calls(client, count):
4345
_logger.info("### Read fixed/increment/random value of different types.")
4446
_logger.info("--> UINT16")
4547
for count in range(1, 5):
46-
await read_registers(client, 1148, 1, True, curval=32117)
47-
await read_registers(client, 2305, 1, True, curval=50 + count)
48-
await read_registers(client, 2306, 1, True, minval=45, maxval=55)
48+
await read_registers(client, 1148, 1, CellType.UINT16, curval=32117)
49+
await read_registers(client, 2305, 1, CellType.UINT16, curval=50 + count)
50+
await read_registers(client, 2306, 1, CellType.UINT16, minval=45, maxval=55)
4951

5052
_logger.info("--> UINT32")
51-
await read_registers(client, 3188, 2, True, curval=32514)
52-
await read_registers(client, 3876, 2, True, curval=50000 + count)
53-
await read_registers(client, 3878, 2, True, minval=45000, maxval=55000)
53+
await read_registers(client, 3188, 2, CellType.UINT32, curval=32514)
54+
await read_registers(client, 3876, 2, CellType.UINT32, curval=50000 + count)
55+
await read_registers(
56+
client, 3878, 2, CellType.UINT32, minval=45000, maxval=55000
57+
)
5458

5559
_logger.info("--> FLOAT32")
56-
await read_registers(client, 4188, 2, False, curval=32514.2)
57-
await read_registers(client, 4876, 2, False, curval=50000.0 + count)
58-
await read_registers(client, 4878, 2, False, minval=45000.0, maxval=55000.0)
60+
await read_registers(client, 4188, 2, CellType.FLOAT32, curval=32514.2)
61+
await read_registers(client, 4876, 2, CellType.FLOAT32, curval=50000.0 + count)
62+
await read_registers(
63+
client, 4878, 2, CellType.FLOAT32, minval=45000.0, maxval=55000.0
64+
)
65+
66+
_logger.info("--> FLOAT64")
67+
await read_registers(client, 5092, 4, CellType.FLOAT64, curval=-32514.2)
68+
await read_registers(client, 5164, 4, CellType.FLOAT64, curval=-42.15 + count)
69+
await read_registers(
70+
client, 5244, 4, CellType.FLOAT64, minval=-4242, maxval=314.92
71+
)
5972

6073

6174
async def run_simulator():

pymodbus/datastore/__init__.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
"""Datastore."""
22

33
__all__ = [
4+
"CellType",
45
"ModbusDeviceContext",
56
"ModbusSequentialDataBlock",
67
"ModbusServerContext",
@@ -13,5 +14,5 @@
1314
ModbusServerContext,
1415
)
1516
from .sequential import ModbusSequentialDataBlock
16-
from .simulator import ModbusSimulatorContext
17+
from .simulator import CellType, ModbusSimulatorContext
1718
from .sparse import ModbusSparseDataBlock

0 commit comments

Comments
 (0)