1- '' '
1+ """ '
22Modbus Simu App
33===============
4- '''
4+ """
55import kivy
6- kivy .require ('1.4.2' )
6+ import re
7+ import os
8+ import platform
9+ import six
10+ import struct
11+ from copy import deepcopy
712from kivy .app import App
813from kivy .properties import ObjectProperty
914from kivy .uix .boxlayout import BoxLayout
1217from kivy .uix .settings import SettingsWithSidebar
1318from kivy .uix .listview import ListView , ListItemButton
1419from kivy .adapters .listadapter import ListAdapter
20+ from kivy .config import Config
21+ from kivy .lang import Builder
22+
1523from modbus_simulator .utils .constants import BLOCK_TYPES
1624from modbus_simulator .utils .common import configure_modbus_logger
1725from modbus_simulator .ui .settings import SettingIntegerWithRange
1826from modbus_simulator .utils .backgroundJob import BackgroundJob
19- import re
20- import os
21- import platform
22- import six
2327from json import load , dump
24- from kivy .config import Config
25- from kivy .lang import Builder
28+
2629import modbus_simulator .ui .datamodel #noqa
2730from pkg_resources import resource_filename
2831from serial .serialutil import SerialException
2932
3033from distutils .version import LooseVersion
3134
35+ kivy .require ('1.4.2' )
36+
3237if six .PY3 :
3338 xrange = range
3439
@@ -574,16 +579,19 @@ def sync_data_callback(self, blockname, data):
574579 int (self .active_slave ),
575580 current_tab ,
576581 k ,
577- int (v ['value' ]),
582+ float (v ['value' ]),
578583 v ['formatter' ]
579584 )
580585 else :
581586 self .modbus_device .set_values (int (self .active_slave ),
582- current_tab , k , int (v ['value' ]))
587+ current_tab ,
588+ k , int (v ['value' ]))
583589 except KeyError :
584590 pass
591+ except struct .error :
592+ self .show_error ("Invalid value supplied , Check the formatter!" )
585593
586- def sync_formatter_callback (self , blockname , data ):
594+ def sync_formatter_callback (self , blockname , data , old_formatter ):
587595 ct = self .data_models .current_tab
588596 current_tab = MAP [ct .text ]
589597 if blockname != current_tab :
@@ -592,20 +600,24 @@ def sync_formatter_callback(self, blockname, data):
592600 _data = self .data_map [self .active_slave ][current_tab ]
593601 _updated = {}
594602 for k , v in data .items ():
603+ old_wc = int (filter (str .isdigit , str (old_formatter )))/ 16
604+ new_wc = int (filter (str .isdigit , v .get ('formatter' )))/ 16
595605 new_val , count = self .modbus_device .decode (
596606 int (self .active_slave ), current_tab , k , v ['formatter' ]
597607 )
598608 data [k ]['value' ] = new_val
599609 _updated ['offset' ] = k
600610 _updated ['count' ] = count
601- if count == 1 :
611+ if old_wc > new_wc :
602612 missing = self .modbus_device .get_values (
603- int (self .active_slave ), current_tab , k , 4 )
613+ int (self .active_slave ), current_tab , k , old_wc - new_val )
604614 for i , val in enumerate (missing ):
605615 o = int (k ) + i
606616 data [o ] = {'value' : val , 'formatter' : 'uint16' }
607617 _data ['data' ].update (data )
608- ct .content .update_registers (_data ['data' ], _updated )
618+ _data ['data' ] = dict (ct .content .update_registers (_data ['data' ],
619+ _updated )
620+ )
609621
610622 except KeyError :
611623 pass
@@ -664,7 +676,7 @@ def update_backend(self, slave_id, blockname, new_data):
664676 slave_id ,
665677 blockname ,
666678 k ,
667- int (v ['value' ]),
679+ float (v ['value' ]),
668680 v ['formatter' ]
669681 )
670682 else :
@@ -679,9 +691,9 @@ def change_simulation_settings(self, **kwargs):
679691
680692 def change_datamodel_settings (self , key , value ):
681693 if "max" in key :
682- data = {"maxval" : int (value )}
694+ data = {"maxval" : float (value )}
683695 else :
684- data = {"minval" : int (value )}
696+ data = {"minval" : float (value )}
685697
686698 if "bin" in key :
687699 self .data_model_coil .reinit (** data )
@@ -727,15 +739,24 @@ def _sync_modbus_block_values(self):
727739 for block_name , value in _data_map .items ():
728740 updated = {}
729741 for k , v in value ['data' ].items ():
730- actual_data = self .modbus_device .get_values (
731- int (self .active_slave ),
732- block_name ,
733- int (k ),
734-
735- )
742+ if block_name in ['input_registers' ,
743+ 'holding_registers' ]:
744+ actual_data , count = self .modbus_device .decode (
745+ int (self .active_slave ), block_name , k ,
746+ v ['formatter' ]
747+ )
748+ else :
749+ actual_data = self .modbus_device .get_values (
750+ int (self .active_slave ),
751+ block_name ,
752+ int (k ),
753+
754+ )
755+ actual_data = actual_data [0 ]
736756 try :
737- if actual_data [0 ] != int (v ):
738- updated [k ] = actual_data [0 ]
757+ if actual_data != float (v ['value' ]):
758+ v ['value' ] = actual_data
759+ updated [k ] = v
739760 except TypeError :
740761 pass
741762 if updated :
0 commit comments