From 1d43c7b3b3a9540bdab7826cde11145f966e8bdd Mon Sep 17 00:00:00 2001 From: sanjay Date: Tue, 18 Dec 2018 09:30:57 +0530 Subject: [PATCH 1/2] #7 Python 3 compatibility, Initial version --- modbus_simulator/ui/datamodel.py | 5 +++-- modbus_simulator/ui/gui.py | 19 +++++++++++++------ modbus_simulator/utils/pymodbus_server.py | 4 +++- requirements | 12 +++++------- 4 files changed, 24 insertions(+), 16 deletions(-) diff --git a/modbus_simulator/ui/datamodel.py b/modbus_simulator/ui/datamodel.py index 24ec0a3..f633d43 100644 --- a/modbus_simulator/ui/datamodel.py +++ b/modbus_simulator/ui/datamodel.py @@ -60,7 +60,8 @@ class ErrorPopup(Popup): """ def __init__(self, **kwargs): # print kwargs - super(ErrorPopup, self).__init__(**kwargs) + super(ErrorPopup, self).__init__() + # super(ErrorPopup, self).__init__(**kwargs) content = BoxLayout(orientation="vertical") content.add_widget(Label(text=kwargs['text'], font_size=20)) mybutton = Button(text="Dismiss", size_hint=(1,.20), font_size=20) @@ -462,7 +463,7 @@ def update_registers(self, new_values, update_info): to_remove = None if count > 1: offset = int(offset) - to_remove = [str(o) for o in list(xrange(offset+1, offset+count))] + to_remove = [str(o) for o in list(range(offset+1, offset+count))] self.list_view.adapter.update_for_new_data() self.refresh(new_values, to_remove) diff --git a/modbus_simulator/ui/gui.py b/modbus_simulator/ui/gui.py index d18a77e..558dfc5 100644 --- a/modbus_simulator/ui/gui.py +++ b/modbus_simulator/ui/gui.py @@ -544,8 +544,8 @@ def _update_data_models(self, active, tab, value): registers = sum( map( lambda val: int( - filter( - str.isdigit, str(val.get('formatter', '16'))) + ''.join(list(filter( + str.isdigit, str(val.get('formatter', '16'))))) ), _data['data'].values()))/16 # Old schema @@ -604,11 +604,17 @@ def sync_formatter_callback(self, blockname, data, old_formatter): try: _data = self.data_map[self.active_slave][current_tab] _updated = {} - for k, v in data.items(): - old_wc = int(filter(str.isdigit, str(old_formatter)))/16 - new_wc = int(filter(str.isdigit, v.get('formatter')))/16 + current = list(data.keys()) + for k in current: + old_wc = int(''.join(list( + filter(str.isdigit, str(old_formatter)) + )))/16 + new_wc = int(''.join(list( + filter(str.isdigit, data[k].get('formatter')) + )))/16 new_val, count = self.modbus_device.decode( - int(self.active_slave), current_tab, k, v['formatter'] + int(self.active_slave), + current_tab, k, data[k]['formatter'] ) data[k]['value'] = new_val _updated['offset'] = k @@ -621,6 +627,7 @@ def sync_formatter_callback(self, blockname, data, old_formatter): ) for i, val in enumerate(missing): o = int(k) + new_wc + i + o = int(o) if not isinstance(k, int): o = str(o) data[o] = {'value': val, 'formatter': 'uint16'} diff --git a/modbus_simulator/utils/pymodbus_server.py b/modbus_simulator/utils/pymodbus_server.py index 9dc1643..f979d01 100644 --- a/modbus_simulator/utils/pymodbus_server.py +++ b/modbus_simulator/utils/pymodbus_server.py @@ -243,7 +243,7 @@ def get_values(self, slave_id, block_name, address, size=1): slave = self.get_slave(slave_id) address = self._calc_offset(block_name, address) if slave.validate(_FX_MAPPER[block_name], address, count=size): - return slave.getValues(_FX_MAPPER[block_name], address, size) + return slave.getValues(_FX_MAPPER[block_name], address, int(size)) def get_slave(self, slave_id): return self.context[slave_id] @@ -265,6 +265,8 @@ def encode(self, slave_id, block_name, offset, value, formatter): builder = BinaryPayloadBuilder(byteorder=self.byte_order, wordorder=self.word_order) add_method = ENCODERS.get(formatter) + if 'int' in add_method: # Temp fix + value = int(value) getattr(builder, add_method)(value) payload = builder.to_registers() return self.set_values(slave_id, block_name, offset, payload) diff --git a/requirements b/requirements index cd4d310..5130fdb 100644 --- a/requirements +++ b/requirements @@ -1,13 +1,11 @@ -click>=6.7 -Cython==0.25.2 +Click==7.0 +Cython==0.29.2 docutils==0.13.1 -Kivy>=1.9.1 +Kivy==1.10.1 Kivy-Garden==0.1.4 -# modbus-tk==0.5.6 -pygame==1.9.2 +pygame==1.9.4 pyglet==1.2.4 Pygments==2.1.3 -# pymodbus==1.5.2 pyserial==3.2.1 requests==2.12.4 -six==1.10.0 +six==1.10.0 \ No newline at end of file From a46c601d69675dd628fd6b058e19d628527ceb9f Mon Sep 17 00:00:00 2001 From: sanjay Date: Thu, 10 Jan 2019 09:22:52 +0530 Subject: [PATCH 2/2] Fix crash while overriding coils and discrete inputs from the UI --- modbus_simulator/ui/datamodel.py | 2 +- modbus_simulator/ui/gui.py | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/modbus_simulator/ui/datamodel.py b/modbus_simulator/ui/datamodel.py index f633d43..b79e681 100644 --- a/modbus_simulator/ui/datamodel.py +++ b/modbus_simulator/ui/datamodel.py @@ -423,7 +423,7 @@ def on_data_update(self, index, data): if self.blockname in ['input_registers', 'holding_registers']: self.list_view.adapter.data[index]['value'] = float(data) else: - self.list_view.adapter.data.update({index: float(data)}) + self.list_view.adapter.data[index]['value'] = int(data) self.list_view._trigger_reset_populate() data = {'event': 'sync_data', 'data': {index: self.list_view.adapter.data[index]}} diff --git a/modbus_simulator/ui/gui.py b/modbus_simulator/ui/gui.py index 558dfc5..92d105a 100644 --- a/modbus_simulator/ui/gui.py +++ b/modbus_simulator/ui/gui.py @@ -588,9 +588,12 @@ def sync_data_callback(self, blockname, data): v['formatter'] ) else: + # v = dict(value=int(v)) + if not isinstance(v, dict): + v = dict(value=v) self.modbus_device.set_values(int(self.active_slave), current_tab, - k, int(v['value'])) + k, v.get('value')) except KeyError: pass except struct.error: