Skip to content

Commit 84b08a6

Browse files
committed
update samples
1 parent c680bd7 commit 84b08a6

3 files changed

Lines changed: 99 additions & 0 deletions

File tree

docs/samples/sample_modbus/sample_modbus/bat.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
#!/usr/bin/env python3
2+
from enum import IntEnum
23
from typing import Optional, TypedDict, Any
34
from modules.common.abstract_device import AbstractBat
45
from modules.common.component_state import BatState
@@ -15,7 +16,23 @@ class KwargsDict(TypedDict):
1516
client: ModbusTcpClient_
1617

1718

19+
class Register(IntEnum):
20+
CURRENT_L1 = 0x06
21+
POWER = 0x0C
22+
SOC = 0x46
23+
IMPORTED = 0x48
24+
EXPORTED = 0x4A
25+
26+
1827
class SampleBat(AbstractBat):
28+
REG_MAPPING = (
29+
(Register.CURRENT_L1, [ModbusDataType.FLOAT_32]*3),
30+
(Register.POWER, [ModbusDataType.FLOAT_32]*3),
31+
(Register.SOC, ModbusDataType.FLOAT_32),
32+
(Register.IMPORTED, ModbusDataType.FLOAT_32),
33+
(Register.EXPORTED, ModbusDataType.FLOAT_32),
34+
)
35+
1936
def __init__(self, component_config: SampleBatSetup, **kwargs: Any) -> None:
2037
self.component_config = component_config
2138
self.kwargs: KwargsDict = kwargs
@@ -29,6 +46,20 @@ def initialize(self) -> None:
2946

3047
def update(self) -> None:
3148
unit = self.component_config.configuration.modbus_id
49+
# Modbus-Bulk reader, liest einen Block von Registern und gibt ein Dictionary mit den Werten zurück
50+
# read_input_registers_bulk benötigit als Parameter das Startregister, die Anzahl der Register,
51+
# Register-Mapping und die Modbus-ID
52+
resp = self.client.read_input_registers_bulk(
53+
Register.CURRENT_L1, 70, mapping=self.REG_MAPPING, unit=self.id)
54+
bat_state = BatState(
55+
power=resp[Register.POWER],
56+
soc=resp[Register.SOC],
57+
imported=resp[Register.IMPORTED],
58+
exported=resp[Register.EXPORTED],
59+
)
60+
self.store.set(bat_state)
61+
62+
# Einzelregister lesen (dauert länger, bei sehr weit >100 auseinanderliegenden Registern sinnvoll)
3263
power = self.client.read_holding_registers(reg, ModbusDataType.INT_32, unit=unit)
3364
soc = self.client.read_holding_registers(reg, ModbusDataType.INT_32, unit=unit)
3465
imported, exported = self.sim_counter.sim_count(power)

docs/samples/sample_modbus/sample_modbus/counter.py

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
#!/usr/bin/env python3
2+
from enum import IntEnum
23
from typing import TypedDict, Any
34
from modules.common.abstract_device import AbstractCounter
45
from modules.common.component_state import CounterState
@@ -15,7 +16,27 @@ class KwargsDict(TypedDict):
1516
client: ModbusTcpClient_
1617

1718

19+
class Register(IntEnum):
20+
VOLTAGE_L1 = 0x00
21+
CURRENT_L1 = 0x06
22+
POWER_L1 = 0x0C
23+
POWER_FACTOR_L1 = 0x1E
24+
FREQUENCY = 0x46
25+
IMPORTED = 0x48
26+
EXPORTED = 0x4A
27+
28+
1829
class SampleCounter(AbstractCounter):
30+
REG_MAPPING = (
31+
(Register.VOLTAGE_L1, [ModbusDataType.FLOAT_32]*3),
32+
(Register.CURRENT_L1, [ModbusDataType.FLOAT_32]*3),
33+
(Register.POWER_L1, [ModbusDataType.FLOAT_32]*3),
34+
(Register.POWER_FACTOR_L1, [ModbusDataType.FLOAT_32]*3),
35+
(Register.FREQUENCY, ModbusDataType.FLOAT_32),
36+
(Register.IMPORTED, ModbusDataType.FLOAT_32),
37+
(Register.EXPORTED, ModbusDataType.FLOAT_32),
38+
)
39+
1940
def __init__(self, component_config: SampleCounterSetup, **kwargs: Any) -> None:
2041
self.component_config = component_config
2142
self.kwargs: KwargsDict = kwargs
@@ -29,6 +50,24 @@ def initialize(self) -> None:
2950

3051
def update(self):
3152
unit = self.component_config.configuration.modbus_id
53+
# Modbus-Bulk reader, liest einen Block von Registern und gibt ein Dictionary mit den Werten zurück
54+
# read_input_registers_bulk benötigit als Parameter das Startregister, die Anzahl der Register,
55+
# Register-Mapping und die Modbus-ID
56+
resp = self.client.read_input_registers_bulk(
57+
Register.VOLTAGE_L1, 76, mapping=self.REG_MAPPING, unit=self.id)
58+
counter_state = CounterState(
59+
imported=resp[Register.IMPORTED],
60+
exported=resp[Register.EXPORTED],
61+
power=sum(resp[Register.POWER_L1]),
62+
voltages=resp[Register.VOLTAGE_L1],
63+
currents=resp[Register.CURRENT_L1],
64+
powers=resp[Register.POWER_L1],
65+
power_factors=resp[Register.POWER_FACTOR_L1],
66+
frequency=resp[Register.FREQUENCY],
67+
)
68+
self.store.set(counter_state)
69+
70+
# Einzelregister lesen (dauert länger, bei sehr weit >100 auseinanderliegenden Registern sinnvoll)
3271
power = self.client.read_holding_registers(reg, ModbusDataType.INT_32, unit=unit)
3372
imported, exported = self.sim_counter.sim_count(power)
3473

docs/samples/sample_modbus/sample_modbus/inverter.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
#!/usr/bin/env python3
2+
from enum import IntEnum
23
from typing import TypedDict, Any
34
from modules.common.abstract_device import AbstractInverter
45
from modules.common.component_state import InverterState
@@ -15,7 +16,21 @@ class KwargsDict(TypedDict):
1516
client: ModbusTcpClient_
1617

1718

19+
class Register(IntEnum):
20+
CURRENT_L1 = 0x06
21+
POWER = 0x0C
22+
DC_POWER = 0x48
23+
EXPORTED = 0x4A
24+
25+
1826
class SampleInverter(AbstractInverter):
27+
REG_MAPPING = (
28+
(Register.CURRENT_L1, [ModbusDataType.FLOAT_32]*3),
29+
(Register.POWER, [ModbusDataType.FLOAT_32]*3),
30+
(Register.DC_POWER, ModbusDataType.FLOAT_32),
31+
(Register.EXPORTED, ModbusDataType.FLOAT_32),
32+
)
33+
1934
def __init__(self, component_config: SampleInverterSetup, **kwargs: Any) -> None:
2035
self.component_config = component_config
2136
self.kwargs: KwargsDict = kwargs
@@ -29,6 +44,20 @@ def initialize(self) -> None:
2944

3045
def update(self) -> None:
3146
unit = self.component_config.configuration.modbus_id
47+
# Modbus-Bulk reader, liest einen Block von Registern und gibt ein Dictionary mit den Werten zurück
48+
# read_input_registers_bulk benötigit als Parameter das Startregister, die Anzahl der Register,
49+
# Register-Mapping und die Modbus-ID
50+
resp = self.client.read_input_registers_bulk(
51+
Register.CURRENT_L1, 70, mapping=self.REG_MAPPING, unit=self.id)
52+
inverter_state = InverterState(
53+
power=resp[Register.POWER],
54+
currents=resp[Register.CURRENT_L1],
55+
dc_power=resp[Register.DC_POWER],
56+
exported=resp[Register.EXPORTED],
57+
)
58+
self.store.set(inverter_state)
59+
60+
# Einzelregister lesen (dauert länger, bei sehr weit >100 auseinanderliegenden Registern sinnvoll)
3261
power = self.client.read_holding_registers(reg, ModbusDataType.INT_32, unit=unit)
3362
exported = self.sim_counter.sim_count(power)[1]
3463

0 commit comments

Comments
 (0)