From f854eff7749c72440f96ddf5048c0927e6089bb8 Mon Sep 17 00:00:00 2001 From: neo-dl Date: Sat, 7 Oct 2023 18:14:30 +0200 Subject: [PATCH] dev --- config/csv_import/st-ten-9.csv | 2 + config/machine_settings/st-ten-9.ini | 1 + make_desktop_file_noautotest.bat | 9 + .../furness_controls_fco730_registers.py | 3 + .../furness_controls_fco780_registers.py | 3 + .../furness_controls_leak_tester.py | 311 ++++++++++++++++++ src/ui/imgs/neo_red.ico | Bin 0 -> 153750 bytes 7 files changed, 329 insertions(+) create mode 100644 config/csv_import/st-ten-9.csv create mode 100644 make_desktop_file_noautotest.bat create mode 100644 src/components/furness_controls_fco730_registers.py create mode 100644 src/components/furness_controls_fco780_registers.py create mode 100644 src/components/furness_controls_leak_tester.py create mode 100644 src/ui/imgs/neo_red.ico diff --git a/config/csv_import/st-ten-9.csv b/config/csv_import/st-ten-9.csv new file mode 100644 index 0000000..b29b8b6 --- /dev/null +++ b/config/csv_import/st-ten-9.csv @@ -0,0 +1,2 @@ +codice_ricetta,cliente,codice_prodotto,descrizione +R54967,Errecinque,R54967, Tubo in metallo \ No newline at end of file diff --git a/config/machine_settings/st-ten-9.ini b/config/machine_settings/st-ten-9.ini index c15f052..a19c0f2 100644 --- a/config/machine_settings/st-ten-9.ini +++ b/config/machine_settings/st-ten-9.ini @@ -5,6 +5,7 @@ description = ST-TEN-9 SATIL SRL - BANCO COLLAUDO TUBI R5 archive_synchronizer: present label_printer: present remote_api: absent +tecna_t3: absent furness_controls: present [archive_synchronizer] diff --git a/make_desktop_file_noautotest.bat b/make_desktop_file_noautotest.bat new file mode 100644 index 0000000..64137d9 --- /dev/null +++ b/make_desktop_file_noautotest.bat @@ -0,0 +1,9 @@ +set SCRIPT="%TEMP%\%RANDOM%-%RANDOM%-%RANDOM%-%RANDOM%.vbs" +echo Set oWS = WScript.CreateObject("WScript.Shell") >> %SCRIPT% +echo sLinkFile = "%USERPROFILE%\Desktop\NO AUTOTEST.lnk" >> %SCRIPT% +echo Set oLink = oWS.CreateShortcut(sLinkFile) >> %SCRIPT% +echo oLink.TargetPath = "%userprofile%\PycharmProjects\st-ten-1\runme_noautotest.bat" >> %SCRIPT% +echo oLink.IconLocation = "%userprofile%\PycharmProjects\st-ten-1\src\ui\imgs\neo_red.ico" +echo oLink.Save >> %SCRIPT% +cscript /nologo %SCRIPT% +del %SCRIPT% diff --git a/src/components/furness_controls_fco730_registers.py b/src/components/furness_controls_fco730_registers.py new file mode 100644 index 0000000..e804068 --- /dev/null +++ b/src/components/furness_controls_fco730_registers.py @@ -0,0 +1,3 @@ +registers = { + +} diff --git a/src/components/furness_controls_fco780_registers.py b/src/components/furness_controls_fco780_registers.py new file mode 100644 index 0000000..e804068 --- /dev/null +++ b/src/components/furness_controls_fco780_registers.py @@ -0,0 +1,3 @@ +registers = { + +} diff --git a/src/components/furness_controls_leak_tester.py b/src/components/furness_controls_leak_tester.py new file mode 100644 index 0000000..96ef1d9 --- /dev/null +++ b/src/components/furness_controls_leak_tester.py @@ -0,0 +1,311 @@ +from lib.db import Recipes, Steps, db +from PyQt5.QtCore import QSemaphore, pyqtSignal +from PyQt5.QtWidgets import QMessageBox + +from .component import Component +from .modbus_component import ModbusComponent +from .furness_controls_fco730_registers import registers as fco730_registers +from .furness_controls_fco780_registers import registers as fco780_registers + + +class FurnessControlsLeakTester(Component): + + def __init__(self, config=None, name=None, period=1, lazy=True, paused=False, threaded=True): + super().__init__(config=config, name=name, period=period, lazy=lazy, paused=paused, threaded=threaded, registers=None) + + def config_changed(self): + super().config_changed() + self.model = self.config[self.name]["model"].lower() + if self.model == "fco730": + self.registers = fco730_registers + elif self.model == "fco730": + self.registers = fco780_registers + else: + raise NotImplementedError(f"Furness Controls model {self.model!r} not implemented.") + self.set_measure_units() + self.units = self.get_measure_units() + self.max_program_number = self.read("Max number of programs") + self.model = self.config[self.name]["model"].lower() + self.log.info(f"units: {self.units}") + + _pressure_units = {"mH2O": 0, "mbar": 1, "kPa": 2, "mmHg": 3, "inH2O": 4, "psi": 5, "mmH2O": 6, } # (se fondoscala <=6 bar) + _leak_units = {"mmH2O": 0, "mbar": 1, "Pa": 2, "mmHg": 3, "inH2O": 4, "psi": 5, } + _leak_flow_units = {"cm3/min": 0, "cm3/h": 1, } + _volume_units = {"litri": 0, "cm3": 1, } + _time_units = {"seconds": 0, } + _flow_units = {"liters/min": 0, "liters/h": 1, "m3/h": 2, "cfm": 3} + _pressure_units_map = {v: k for k, v in _pressure_units.items()} + _leak_units_map = {v: k for k, v in _leak_units.items()} + _leak_flow_units_map = {v: k for k, v in _leak_flow_units.items()} + _volume_units_map = {v: k for k, v in _volume_units.items()} + _time_units_map = {v: k for k, v in _time_units.items()} + _flow_units_map = {v: k for k, v in _flow_units.items()} + + def set_measure_units(self): + if self.model == "t3p": + for register, [unit, decimals] in { + "MEASURE UNITS: Relative pressure": [self._pressure_units["mbar"], 0], # red, purple + "MEASURE UNITS: Differential (leak) pressure": [self._leak_units["mbar"], 0], # yellow + "MEASURE UNITS: Calculated leak flow rate": [self._leak_flow_units["cm3/min"], 0], # blue + "MEASURE UNITS: Volume": [self._volume_units["litri"], 0], # green + "MEASURE UNITS: Flow rate": [self._flow_units["liters/min"], 0], # orange + }.items(): + self.write(register, (decimals << 8) + unit) + elif self.model == "t3l": + for register, [unit, decimals] in { + "MEASURE UNITS: Relative pressure": [self._pressure_units["mbar"], 0], # red, purple + "MEASURE UNITS: Differential (leak) pressure": [self._leak_units["mbar"], 0], # yellow + "MEASURE UNITS: Calculated leak flow rate": [self._leak_flow_units["cm3/min"], 0], # blue + "MEASURE UNITS: Volume": [self._volume_units["litri"], 0], # green + "MEASURE UNITS: Flow rate": [self._flow_units["liters/min"], 0], # orange + }.items(): + self.write(register, unit) # (decimals << 8) + unit) + else: + raise NotImplementedError(f"tecna t3 model {self.model!r} not implemented.") + + def get_measure_units(self): + units = {} + if self.model == "t3p": + for [register, unit_map, unit_names] in [ + ["Running test: relative pressure format", self._pressure_units_map, ["relative_pressure", "red", "r", 21, ]], # also by documentation color and register number + ["Running test: differential pressure format", self._pressure_units_map, ["differential_pressure", "purple", "p", 22, ]], # also by documentation color and register number + ["Running test: relative pressure format (low resolution)", self._leak_units_map, ["relative_pressure_lr", "yellow", "y", 23, ]], # also by documentation color and register number + ["Running test: calculated leak flow rate format", self._leak_flow_units_map, ["leak_flow", "blue", "b", 24, ]], # also by documentation color and register number + ["Running test: volume format", self._volume_units_map, ["volume", "green", "g", 25, ]], # also by documentation color and register number + ["Running test: time format", self._time_units_map, ["time", "orange", "t", 26, ]], # also by documentation color and register number + ["Running test: flow rate format", self._flow_units_map, ["flow", "white", "o", 27, ]], # also by documentation color and register number + ]: + v = self.read(register) + unit_spec = [10**(-((v >> 8) & 0xff)), unit_map[v & 0xff]] + for unit_name in unit_names: + units[unit_name] = unit_spec + elif self.model == "t3l": + for [register, unit_map, unit_names] in [ + [["Running test: relative pressure scale", "Running test: relative pressure decimals"], self._pressure_units_map, ["relative_pressure", "red", "r", 1501, ]], # also by documentation color and register number + [["Running test: differential pressure scale", "Running test: differential pressure decimals"], self._pressure_units_map, ["differential_pressure", "purple", "p", 1503, ]], # also by documentation color and register number + [["Running test: relative pressure scale (low resolution)", "Running test: relative pressure decimals (low resolution)"], self._leak_units_map, ["relative_pressure_lr", "yellow", "y", 1505, ]], # also by documentation color and register number + ["Running test: calculated leak flow rate format", self._leak_flow_units_map, ["leak_flow", "blue", "b", 1507, ]], # also by documentation color and register number + ["Running test: volume format", self._volume_units_map, ["volume", "green", "g", 1508, ]], # also by documentation color and register number + ["Running test: time format", self._time_units_map, ["time", "orange", "t", 1509, ]], # also by documentation color and register number + ["Running test: flow rate format", self._flow_units_map, ["flow", "white", "o", 1510, ]], # also by documentation color and register number + ["Running test: line pressure format", self._pressure_units_map, ["line_pressure", "lp", "l", 1511, ]], # also by documentation color and register number + ]: + if type(register) is list: + v = [self.read(r) for r in register] + unit_spec = [10**(-(v[1] & 0xff)), v[0]] + else: + v = self.read(register) + unit_spec = [10**(-((v >> 8) & 0xff)), unit_map[v & 0xff]] + for unit_name in unit_names: + units[unit_name] = unit_spec + else: + raise NotImplementedError(f"tecna t3 model {self.model!r} not implemented.") + return units + + def _convert_from_format(self, data, formatting=None, decoding_map=None): + if decoding_map is not None and data in decoding_map: + data = decoding_map[data] + if formatting is not None: + # units = self.units[formatting] + # data = [data * units[0], units[1]] + data = data * self.units[formatting][0] + return data + + def _convert_to_format(self, data, formatting=None, encoding_map=None): + if formatting is not None: + data = int(data / self.units[formatting][0]) + if encoding_map is not None and data in encoding_map: + data = encoding_map[data] + return data + + @Component.reconfig_on_error + def read(self, register, *args, data_type=None, gain=None, offset=None, formatting=None, decoding_map=None, **kwargs): + if type(register) is str: + register, s = self.registers[register] + if data_type is None: + data_type = s.get("dt", None) + if gain is None: + gain = s.get("g", None) + if offset is None: + offset = s.get("o", None) + if formatting is None: + formatting = s.get("f", None) + if decoding_map is None: + decoding_map = s.get("decoding", None) + if not len(args): + args = s.get("a", []) + if not len(kwargs): + kwargs = s.get("k", {}) + if data_type is None: + data_type = "16bit_uint" + if gain is None: + gain = 1 + if offset is None: + offset = 0 + return self._convert_from_format( + super().read( + register, + *args, + data_type=data_type, + gain=gain, + offset=offset, + **kwargs, + ), + formatting=formatting, + decoding_map=decoding_map, + ) + + @Component.reconfig_on_error + def write(self, register, data, *args, data_type=None, gain=None, offset=None, formatting=None, encoding_map=None, **kwargs): + if type(register) is str: + register, s = self.registers[register] + if data_type is None: + data_type = s.get("dt", None) + if gain is None: + gain = s.get("g", None) + if offset is None: + offset = s.get("o", None) + if formatting is None: + formatting = s.get("f", None) + if encoding_map is None: + encoding_map = s.get("encoding", None) + if not len(args): + args = s.get("a", []) + if not len(kwargs): + kwargs = s.get("k", {}) + if data_type is None: + data_type = "16bit_uint" + if gain is None: + gain = 1 + if offset is None: + offset = 0 + return super().write( + register, + self._convert_to_format( + data, + formatting=formatting, + encoding_map=encoding_map, + ), + *args, + data_type=data_type, + gain=gain, + offset=offset, + **kwargs, + ) + + @Component.reconfig_on_error + def _get(self): + # READ INFO + info = {r: self.read(r) for r in [ + "Real time test pressure output", + "Real time differential pressure output", + "Real time pressure line regulator", + "Active alarm flags", + "Active test program number", + "Running test: active phase", + "Running test: test type", + "Running test: sequence index", + "Digital inputs status (mask)", + # "Digital outputs status (mask)", + ]} + if self.model == "t3p": + pass + elif self.model == "t3l": + info.update({r: self.read(r) for r in [ + "Active not severe alarm flags", + ]}) + else: + raise NotImplementedError(f"Tecna t3 model {self.model!r} not implemented.") + if info["Running test: active phase"] == "FINE TEST": # "END TEST, WAITING THE START OF A NEW TEST": + info.update(self.get_test_results()) + for round_me in ["measured leak"]: + if round_me in info.keys(): + info.update({round_me:float(f"{info[round_me]:.2f}")}) + self.log.debug(str(info)) + super()._get([info]) + + @Component.reconfig_on_error + def _set(self, val=None): + if val is not None: # handle request: + for register, value in val.items(): + print(register, value) + self.write(register, value) + super()._set(val) + + def start_test(self, table=None): + if table is None: + table = self.max_program_number + self.log.info(f"starting test table {table!r}") + self.write("Source of test program number selection", "FROM PARAMETER (SET BY LCD OR SERIAL LINE)") + self.write("Selected program", table) + self.write("Start test", table) + + def stop_test(self): + self.log.warning("stopping test") + self.write("Reset running test", 0) + + def get_test_results(self): + self.log.info("getting test results") + return {r: self.read(r) for r in [ + #"Running test: phase backwards time", + "Running test: filling pressure", + "Running test: pressure at the end of settling", + #"Running test: burst pressure", + "Running test: measured leak", + #"Running test: calculated leak flow rate", + #"Running test: calculate RVP%", + "Running test: result", + ]} + + def write_recipe(self, recipe, step, table=None): + if table is None: + table = self.max_program_number + recipe_name = recipe.part_number[:16].encode("ascii") + recipe_name += b"\x00" * (16 - len(recipe_name)) + recipe_barcode = f"j{recipe.part_number}"[:16].encode("ascii") + recipe_barcode += b"\x00" * (24 - len(recipe_barcode)) + test_flags = 0b0110100001010100 if (step.spec.get("autotest", False) in ["ko_check"]) else 0b0110000001010100 + pid_mode = int(self.config["recipes_defaults"]["pid_mode"])<<4 + test_flags = test_flags | pid_mode + pid_ramps=0b0000000000000000 | int(self.config["recipes_defaults"]["pid_level"])<<8 | int(self.config["recipes_defaults"]["pid_speed"])<<12 + spec = { + "Flag: Instrument settings": 0b0000000000000000, + "Test program for read/write operation": table, + **{719 - 1 + i: (recipe_name[i * 2 + 1] << 8) + recipe_name[i * 2] for i in range(8)}, # program name + **{727 - 1 + i: (recipe_barcode[i * 2 + 1] << 8) + recipe_barcode[i * 2] for i in range(12)}, # program associated bar-code + **{761 - 1 + i: (recipe_name[i * 2 + 1] << 8) + recipe_name[i * 2] for i in range(8)}, # print field 1 + # **{769 - 1 + i: (recipe_name[i * 2 + 1] << 8) + recipe_name[i * 2] for i in range(8)}, # print field 2 + "Print options": 0b0000000000000000 | self.saver_label_count << 12 | self.saver_print_on_fail << 8 | self.saver_label_template, + "Test type": "Leak Test", + "Test flags": test_flags, + "T0 - Pre-filling time": step.spec["pre_filling_time"], + "P0 - Pre-filling pressure": step.spec["pre_filling_pressure"], + "T1 - Filling time": step.spec["filling_time"], + "T2 - Settling time": step.spec["settling_time"], + "PR- - Min pressure tolerance %": step.spec["settling_pressure_min_percent"], + "PR+ - Max pressure tolerance % (P+)": step.spec["settling_pressure_max_percent"], + "T3 - Measure time": step.spec["test_time"], + "Q- Lower test leak limit": step.spec["test_pressure_qneg"], + "PREL - Nominal test pressure": step.spec["test_pressure"], + "Q+ Upper test leak limit": step.spec["test_pressure_qpos"], + "FST - Discharge time": step.spec["flush_time"], + "FSL - Discharge limit": step.spec["flush_pressure"], + "PSQ - Next sequence program PSOUT mode": 0, + "RAMPS: T1 configuration": pid_ramps, + "PID: pressure correction": 100, + "Various flags": 0b0000000000010000 if self.config["recipes_defaults"]["tecna_discharge_enable"]=="yes" else 0b0000000000000000 + + } + if self.model == "t3p": + pass + elif self.model == "t3l": + spec.update({ + "Use programs or use products": 0, + "Nominal peak pressure": step.spec["test_pressure"], + "Pn - Nominal test pressure": step.spec["test_pressure"], + }) + else: + raise NotImplementedError(f"tecna t3 model {self.model!r} not implemented.") + self.log.debug(str(spec)) + for register, value in spec.items(): + self.write(register, value) diff --git a/src/ui/imgs/neo_red.ico b/src/ui/imgs/neo_red.ico new file mode 100644 index 0000000000000000000000000000000000000000..82aa4f68f8a33f96cc7fa4d6b0fb4bb01c2cef17 GIT binary patch literal 153750 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 literal 0 HcmV?d00001