5
5
import logging
6
6
import re
7
7
import time
8
- import struct
8
+ import importlib
9
+
9
10
from pymodbus .exceptions import ModbusIOException
10
11
11
12
from typing import TYPE_CHECKING
12
13
if TYPE_CHECKING :
13
14
from pymodbus .client .sync import ModbusSerialClient as ModbusClient
14
15
16
+ from readers .reader_base import reader_base
15
17
from protocol_settings import Data_Type , registry_map_entry , protocol_settings , Registry_Type
16
18
17
19
class Inverter :
@@ -20,15 +22,18 @@ class Inverter:
20
22
max_precision : int
21
23
modbus_delay : float = 0.85
22
24
modbus_version = ""
25
+ reader : reader_base
26
+ settings : dict [str , str ]
23
27
24
28
'''time inbetween requests'''
25
29
26
- def __init__ (self , client , name , unit , protocol_version , max_precision : int = - 1 , log = None ):
27
- self .client : ModbusClient = client
30
+ def __init__ (self , name , unit , protocol_version , settings : dict [str ,str ], max_precision : int = - 1 , log = None ):
28
31
self .name = name
29
32
self .unit = unit
30
33
self .protocol_version = protocol_version
31
34
self .max_precision = max_precision
35
+ self .settings = settings
36
+
32
37
print ("max_precision: " + str (self .max_precision ))
33
38
if (log is None ):
34
39
self .__log = log
@@ -39,6 +44,16 @@ def __init__(self, client, name, unit, protocol_version, max_precision : int = -
39
44
#load protocol settings
40
45
self .protocolSettings = protocol_settings (self .protocol_version )
41
46
47
+ #load reader
48
+ # Import the module
49
+ module = importlib .import_module ('readers.' + self .protocolSettings .reader )
50
+
51
+ # Get the class from the module
52
+ cls = getattr (module , self .protocolSettings .reader )
53
+
54
+ self .reader : reader_base = cls (self .settings )
55
+ self .reader .connect ()
56
+
42
57
self .read_info ()
43
58
44
59
def read_serial_number (self ) -> str :
@@ -57,7 +72,7 @@ def read_serial_number(self) -> str:
57
72
registry_entry = self .protocolSettings .get_holding_registry_entry (field )
58
73
if registry_entry is not None :
59
74
self .__log .info ("Reading " + field + "(" + str (registry_entry .register )+ ")" )
60
- data = self .client . read_holding_registers (registry_entry .register )
75
+ data = self .reader . read_registers (registry_entry .register , registry_type = Registry_Type . HOLDING )
61
76
if not hasattr (data , 'registers' ) or data .registers is None :
62
77
self .__log .critical ("Failed to get serial number register (" + field + ") ; exiting" )
63
78
exit ()
@@ -128,9 +143,12 @@ def read_registers(self, ranges : list[tuple] = None, start : int = 0, end : int
128
143
129
144
if not ranges : #ranges is empty, use min max
130
145
ranges = []
131
- start = - batch_size
146
+ start = start - batch_size
132
147
while ( start := start + batch_size ) < end :
133
- ranges .append ((start , batch_size )) ##APPEND TUPLE
148
+ count = batch_size
149
+ if start + batch_size > end :
150
+ count = end - start + 1
151
+ ranges .append ((start , count )) ##APPEND TUPLE
134
152
135
153
registry : dict [int ,] = {}
136
154
retries = 7
@@ -146,12 +164,7 @@ def read_registers(self, ranges : list[tuple] = None, start : int = 0, end : int
146
164
147
165
isError = False
148
166
try :
149
- if registry_type == Registry_Type .INPUT :
150
- register = self .client .read_input_registers (range [0 ], range [1 ], unit = self .unit )
151
- else :
152
- print ("get holding" )
153
- register = self .client .read_holding_registers (range [0 ], range [1 ], unit = self .unit )
154
- #register.addCallback
167
+ register = self .reader .read_registers (range [0 ], range [1 ], registry_type = registry_type , unit = self .unit )
155
168
156
169
except ModbusIOException as e :
157
170
print ("ModbusIOException : " , e .error_code )
@@ -181,14 +194,13 @@ def read_registers(self, ranges : list[tuple] = None, start : int = 0, end : int
181
194
retry -= 1
182
195
if retry < 0 :
183
196
retry = 0
197
+
184
198
#combine registers into "registry"
185
- print ("combine results, " + str (len (register .registers )))
186
199
i = - 1
187
200
while (i := i + 1 ) < range [1 ]:
188
201
#print(str(i) + " => " + str(i+range[0]))
189
202
registry [i + range [0 ]] = register .registers [i ]
190
203
191
- print ("registry len: " + str (len (registry )))
192
204
return registry
193
205
194
206
def process_registery (self , registry : dict , map : list [registry_map_entry ]) -> dict [str ,str ]:
@@ -316,51 +328,4 @@ def read_holding_registry(self) -> dict[str,str]:
316
328
317
329
registry = self .read_registers (self .protocolSettings .holding_registry_ranges , registry_type = Registry_Type .HOLDING )
318
330
info = self .process_registery (registry , self .protocolSettings .holding_registry_map )
319
- return info
320
-
321
-
322
- # def read_fault_table(self, name, base_index, count):
323
- # fault_table = {}
324
- # for i in range(0, count):
325
- # fault_table[name + '_' + str(i)] = self.read_fault_record(base_index + i * 5)
326
- # return fault_table
327
- #
328
- # def read_fault_record(self, index):
329
- # row = self.client.read_input_registers(index, 5, unit=self.unit)
330
- # # TODO: Figure out how to read the date for these records?
331
- # print(row.registers[0],
332
- # ErrorCodes[row.registers[0]],
333
- # '\n',
334
- # row.registers[1],
335
- # row.registers[2],
336
- # row.registers[3],
337
- # '\n',
338
- # 2000 + (row.registers[1] >> 8),
339
- # row.registers[1] & 0xFF,
340
- # row.registers[2] >> 8,
341
- # row.registers[2] & 0xFF,
342
- # row.registers[3] >> 8,
343
- # row.registers[3] & 0xFF,
344
- # row.registers[4],
345
- # '\n',
346
- # 2000 + (row.registers[1] >> 4),
347
- # row.registers[1] & 0xF,
348
- # row.registers[2] >> 4,
349
- # row.registers[2] & 0xF,
350
- # row.registers[3] >> 4,
351
- # row.registers[3] & 0xF,
352
- # row.registers[4]
353
- # )
354
- # return {
355
- # 'FaultCode': row.registers[0],
356
- # 'Fault': ErrorCodes[row.registers[0]],
357
- # #'Time': int(datetime.datetime(
358
- # # 2000 + (row.registers[1] >> 8),
359
- # # row.registers[1] & 0xFF,
360
- # # row.registers[2] >> 8,
361
- # # row.registers[2] & 0xFF,
362
- # # row.registers[3] >> 8,
363
- # # row.registers[3] & 0xFF
364
- # #).timestamp()),
365
- # 'Value': row.registers[4]
366
- # }
331
+ return info
0 commit comments