Skip to content

Commit ee9e8e0

Browse files
author
bobfox
authored
Merge pull request #54 from sunspec/development
Development
2 parents e946f86 + bc6d185 commit ee9e8e0

File tree

5 files changed

+195
-33
lines changed

5 files changed

+195
-33
lines changed

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99

1010
setup(
1111
name='pysunspec2',
12-
version='1.0.5',
12+
version='1.0.6',
1313
description='Python SunSpec Tools',
1414
author='SunSpec Alliance',
1515
author_email='support@sunspec.org',

sunspec2/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
# pySunSpec version
2-
VERSION = '1.0.0'
2+
VERSION = '1.0.6'

sunspec2/device.py

Lines changed: 32 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,7 @@ def __init__(self, pdef=None, model=None, group=None, model_offset=0, data=None,
139139
self.read_func_arg = None # the argument passed to the read_func
140140
self.write_func = None # function to be called on write
141141
self.write_func_arg = None # the argument passed to the write_func
142+
self.static = None
142143

143144
if pdef:
144145
self.sf_required = (pdef.get(mdef.SF) is not None)
@@ -158,6 +159,10 @@ def __init__(self, pdef=None, model=None, group=None, model_offset=0, data=None,
158159
if data is not None:
159160
self._set_data(data=data, offset=data_offset)
160161

162+
static = pdef.get('static', None)
163+
if static and static == 'S':
164+
self.static = True
165+
161166
def __str__(self):
162167
return self.disp()
163168

@@ -203,7 +208,7 @@ def get_value(self, computed=False):
203208
v = self._value
204209
if computed and v is not None:
205210
if self.sf_required:
206-
if self.sf_value is None:
211+
if self.sf_value is None or not self.static:
207212
if self.sf:
208213
sf = self.group.points.get(self.sf)
209214
if sf is None:
@@ -224,7 +229,7 @@ def set_value(self, data=None, computed=False, dirty=None):
224229
self.dirty = dirty
225230
if computed:
226231
if self.sf_required:
227-
if self.sf_value is None:
232+
if self.sf_value is None or not self.static:
228233
if self.sf:
229234
sf = self.group.points.get(self.sf)
230235
if sf is None:
@@ -263,7 +268,7 @@ def get_mb(self, computed=False):
263268
data = err = None
264269
if computed and v is not None:
265270
if self.sf_required:
266-
if self.sf_value is None:
271+
if self.sf_value is None or not self.static:
267272
if self.sf:
268273
sf = self.group.points.get(self.sf)
269274
if sf is None:
@@ -409,32 +414,10 @@ def __init__(self, gdef=None, model=None, model_offset=0, group_len=0, data=None
409414

410415
# check if group fits in access region
411416
if self.len > ACCESS_REGION_REGS:
412-
if self.points_len > ACCESS_REGION_REGS:
413-
index = 0
414-
count = 0
415-
for p, point in self.points.items():
416-
if count + point.len > ACCESS_REGION_REGS:
417-
self.access_regions.append((index, count))
418-
index = count
419-
count = 0
420-
count += point.len
421-
if count > 0:
422-
self.access_regions.append((index, count))
423-
else:
424-
self.access_regions.append((0, self.points_len))
425-
groups_len = self.len - self.points_len
426-
if groups_len > ACCESS_REGION_REGS:
427-
for g, group in self.groups.items():
428-
if isinstance(group, list) and len(group) > 0:
429-
glen = group[0].len
430-
if glen > ACCESS_REGION_REGS:
431-
raise ModelError('Nested groups too big')
432-
index = self.points_len
433-
for i in range(len(group)):
434-
self.access_regions.append((index, glen))
435-
index += glen
436-
elif group.len > ACCESS_REGION_REGS:
437-
raise ModelError('Nested single group too big')
417+
index, count = self._init_access(self.access_regions, index=0, count=0)
418+
# add last region if pending
419+
if count > 0:
420+
self.access_regions.append((index, count))
438421

439422
len_point = self.points.get('L')
440423
if len_point:
@@ -446,6 +429,26 @@ def __init__(self, gdef=None, model=None, model_offset=0, group_len=0, data=None
446429
if id_val:
447430
id_point.set_value(id_point.pdef['value'])
448431

432+
def _init_access(self, access_regions, index, count):
433+
# add points
434+
if self.points:
435+
for p, point in self.points.items():
436+
if count + point.len > ACCESS_REGION_REGS:
437+
access_regions.append((index, count))
438+
index += count
439+
count = 0
440+
count += point.len
441+
# add groups
442+
if self.groups:
443+
for g, groups in self.groups.items():
444+
if isinstance(groups, list) and len(groups) > 0:
445+
for group in groups:
446+
index, count = group._init_access(access_regions, index, count)
447+
elif groups.len > ACCESS_REGION_REGS:
448+
index, count = groups._init_access(access_regions, index, count)
449+
450+
return index, count
451+
449452
def __getattr__(self, attr):
450453
v = self.points.get(attr)
451454
if v is None:

sunspec2/modbus/client.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -266,7 +266,7 @@ def scan(self, progress=None, delay=None, connect=True, full_model_read=True):
266266
model_data = model_id_data + model_len_data
267267
model = self.model_class(model_id=model_id, model_addr=addr, model_len=model_len, data=model_data,
268268
mb_device=self)
269-
if full_model_read:
269+
if full_model_read and model.model_def:
270270
model.read()
271271
model.mid = '%s_%s' % (self.did, mid)
272272
mid += 1

0 commit comments

Comments
 (0)