Skip to content

Commit e9056d1

Browse files
committed
Update README.md
1 parent 7a9ad09 commit e9056d1

File tree

4 files changed

+44
-21
lines changed

4 files changed

+44
-21
lines changed

img/simu.gif

-920 KB
Loading

modbus_simulator/ui/datamodel.py

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -286,16 +286,17 @@ def update_view(self):
286286
self.add_widget(self.list_view)
287287
self.dirty_model = False
288288

289-
def get_address(self, offset):
289+
def get_address(self, offset, as_string=False):
290290
offset = int(offset)
291291
if self.blockname == "coils":
292-
return offset
292+
offset = offset
293293
elif self.blockname == "discrete_inputs":
294-
return 10001 + offset if offset < 10001 else offset
294+
offset = 10001 + offset if offset < 10001 else offset
295295
elif self.blockname == "input_registers":
296-
return 30001 + offset if offset < 30001 else offset
296+
offset = 30001 + offset if offset < 30001 else offset
297297
else:
298-
return 40001 + offset if offset < 40001 else offset
298+
offset = 40001 + offset if offset < 40001 else offset
299+
return str(offset) if as_string else offset
299300

300301
def arg_converter(self, index, data):
301302
"""
@@ -369,14 +370,17 @@ def add_data(self, data):
369370
self.update_view()
370371
current_keys = self.list_view.adapter.sorted_keys
371372
next_index = 0
373+
key_as_string = False
372374
if current_keys:
373375
next_index = int(max(current_keys)) + 1
374-
data = {self.get_address(int(offset) + next_index): v
376+
if not isinstance(current_keys[0], int):
377+
key_as_string = True
378+
data = {self.get_address(int(offset) + next_index, key_as_string): v
375379
for offset, v in data.items()}
376380
for offset, d in data.items():
377381
# offset = self.get_address(offset)
378382
item_strings.append(offset)
379-
if offset >= 30001:
383+
if int(offset) >= 30001:
380384
if not d.get('formatter'):
381385
d['formatter'] = 'uint16'
382386

@@ -473,7 +477,10 @@ def refresh(self, data={}, to_remove=None):
473477
:return:
474478
"""
475479
self.update_view()
476-
self.list_view.adapter.data.update(data)
480+
if not data or len(data) != len(self.list_view.adapter.data):
481+
self.list_view.adapter.data = data
482+
else:
483+
self.list_view.adapter.data.update(data)
477484
if to_remove:
478485
for entry in to_remove:
479486
removed = self.list_view.adapter.data.pop(entry, None)

modbus_simulator/ui/gui.py

Lines changed: 28 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -448,7 +448,9 @@ def _add_slaves(self, selected, data, ret):
448448
self.modbus_device.add_slave(slave_to_add)
449449
for block_name, block_type in BLOCK_TYPES.items():
450450
self.modbus_device.add_block(slave_to_add,
451-
block_name, block_type, self.block_start, self.block_size)
451+
block_name, block_type,
452+
self.block_start,
453+
self.block_size)
452454

453455
data.append(str(slave_to_add))
454456
self.slave_list.adapter.data = data
@@ -540,9 +542,13 @@ def _update_data_models(self, active, tab, value):
540542
current_tab = MAP[ct.text]
541543

542544
ct.content.update_view()
543-
# self.data_map[self.active_slave][current_tab]['dirty'] = False
544545
_data = self.data_map[active][current_tab]
545-
item_strings = _data['item_strings']
546+
registers = sum(
547+
map(
548+
lambda val: int(
549+
filter(
550+
str.isdigit, str(val.get('formatter', '16')))
551+
), _data['data'].values()))/16
546552

547553
# Old schema
548554
if isinstance(value, list):
@@ -553,14 +559,15 @@ def _update_data_models(self, active, tab, value):
553559
value[index] = {'value': v}
554560
if current_tab in ['input_registers', 'holding_registers']:
555561
value[index]['formatter'] = 'uint16'
556-
if len(value) < self.block_size:
562+
if registers+len(value) <= self.block_size:
557563
list_data, item_strings = ct.content.add_data(value)
558-
_data['item_strings'] = item_strings
564+
_data['item_strings'].extend(item_strings)
565+
_data['item_strings'] = list(set(_data['item_strings']))
559566
_data['data'].update(list_data)
560-
self.update_backend(int(active), current_tab, value)
567+
self.update_backend(int(active), current_tab, list_data)
561568
else:
562569
msg = ("OutOfModbusBlockError: address %s"
563-
" is out of block size %s" % (len(item_strings),
570+
" is out of block size %s" % (len(value),
564571
self.block_size))
565572
self.show_error(msg)
566573

@@ -610,9 +617,14 @@ def sync_formatter_callback(self, blockname, data, old_formatter):
610617
_updated['count'] = count
611618
if old_wc > new_wc:
612619
missing = self.modbus_device.get_values(
613-
int(self.active_slave), current_tab, k, old_wc-new_val)
620+
int(self.active_slave),
621+
current_tab, int(k) + new_wc,
622+
old_wc-new_wc
623+
)
614624
for i, val in enumerate(missing):
615-
o = int(k) + i
625+
o = int(k) + new_wc + i
626+
if not isinstance(k, int):
627+
o = str(o)
616628
data[o] = {'value': val, 'formatter': 'uint16'}
617629
_data['data'].update(data)
618630
_data['data'] = dict(ct.content.update_registers(_data['data'],
@@ -873,9 +885,13 @@ def load_state(self):
873885
slaves_memory = data['slaves_memory']
874886
for slave_memory in slaves_memory:
875887
active_slave, memory_type, memory_data = slave_memory
876-
self._update_data_models(active_slave,
877-
memory_map[memory_type],
878-
memory_data)
888+
_data = self.data_map[active_slave][memory_type]
889+
_data['data'].update(memory_data)
890+
_data['item_strings'] = list(sorted(memory_data.keys()))
891+
self.update_backend(int(active_slave), memory_type, memory_data)
892+
# self._update_data_models(active_slave,
893+
# memory_map[memory_type],
894+
# memory_data)
879895

880896

881897
setting_panel = """

modbus_simulator/utils/pymodbus_server.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@ def _add_device_info(self):
177177
self.identity.VendorUrl = 'http://github.com/riptideio/'
178178
self.identity.ProductName = 'Modbus Server'
179179
self.identity.ModelName = 'Modbus Server'
180-
self.identity.MajorMinorRevision = '1.0.0'
180+
self.identity.MajorMinorRevision = '2.0.0'
181181

182182
@property
183183
def server_type(self):

0 commit comments

Comments
 (0)