tecna wip

This commit is contained in:
ST-TEN-1 2022-07-04 12:36:51 +02:00
parent 514964d7c6
commit c36f953012
7 changed files with 144 additions and 90 deletions

View File

@ -6,7 +6,7 @@ cd "$here"
echo "---------- initialize venv ----------"
lsof "./venv/bin/python" | awk 'NR > 1 {print $2}' | xargs kill || :
lsof "./venv/Scripts/activate" | awk 'NR > 1 {print $2}' | xargs kill || :
python="python3.9"
python="python"
"${python}" -m pip install --upgrade pip
"${python}" -m venv venv
source "./venv/bin/activate" || source "./venv/Scripts/activate" || :

View File

@ -64,7 +64,7 @@ class ModbusComponent(Component):
def _write(self, register, value):
self.lock.lock()
wrote = self.client.write_register(register, value)
wrote = self.client.write_registers(register, value, skip_encode=True)
self.lock.unlock()
if wrote.isError():
self.log.exception(traceback.format_exception(wrote))

View File

@ -16,6 +16,7 @@ class TecnaMarpossProvasetT3(ModbusComponent):
super().config_changed()
# self.set_measure_units()
self.units = self.get_measure_units()
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, }
@ -32,11 +33,11 @@ class TecnaMarpossProvasetT3(ModbusComponent):
def set_measure_units(self):
return [
self.write("MEASURE UNITS: pressure measure units", self._pressure_units["mbar"]),
self.write("MEASURE UNITS: Leak measure units", self._leak_units["mbar"]),
self.write("MEASURE UNITS: leak flow rate measure units", self._leak_flow_units["cm3/min"]),
self.write("MEASURE UNITS: Volume", self._volume_units["litri"]),
self.write("MEASURE UNITS: Flow rate measure units", self._flow_units["liters/min"]),
self.write("MEASURE UNITS: pressure measure units", self._pressure_units["mbar"]), # red, ?purple?
self.write("MEASURE UNITS: Leak measure units", self._leak_units["mbar"]), # yellow
self.write("MEASURE UNITS: leak flow rate measure units", self._leak_flow_units["cm3/min"]), # blue
self.write("MEASURE UNITS: Volume", self._volume_units["litri"]), # green
self.write("MEASURE UNITS: Flow rate measure units", self._flow_units["liters/min"]), # orange
]
def get_measure_units(self):
@ -56,38 +57,43 @@ class TecnaMarpossProvasetT3(ModbusComponent):
units[unit_name] = unit
return units
def _convert_from_format(self, data, format=None):
if format is None:
return data
# units = self.units[format]
# return [data * units[0], units[1]]
return data * self.units[format][0]
def _convert_from_format(self, data, formatting=None, decoding_map=None):
if decoding_map is not None:
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, format=None):
if format is None:
return data
return int(data / self.units[format][0])
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:
data = encoding_map[data]
return data
def read(self, register, *args, format=None, **kwargs):
def read(self, register, *args, formatting=None, decoding_map=None, **kwargs):
if type(register) is str:
_, s = self.registers[register]
if format is None:
format = s.get("f")
return self._convert_from_format(super().read(register, *args, **kwargs), format=format)
if formatting is None:
formatting = s.get("f", None)
if decoding_map is None:
decoding_map = s.get("decoding", None)
return self._convert_from_format(super().read(register, *args, **kwargs), formatting=formatting, decoding_map=decoding_map)
def write(self, register, data, *args, format=None, **kwargs):
def write(self, register, data, *args, formatting=None, encoding_map=None, **kwargs):
if type(register) is str:
_, s = self.registers[register]
if format is None:
format = s.get("f")
return super().write(register, self._convert_to_format(data, format=format), *args, **kwargs)
if formatting is None:
formatting = s.get("f", None)
if encoding_map is None:
encoding_map = s.get("encoding", None)
return super().write(register, self._convert_to_format(data, formatting=formatting, encoding_map=encoding_map), *args, **kwargs)
def _get(self):
# print("TECNA", str(int(QThread.currentThreadId())), flush=True)
# READ INFO
if self.units is None:
self.set_measure_units()
self.units = self.get_measure_units()
info = {r: self.read(r) for r in [
"Instrument status: active phase",
"Test circuit pressure, in real time",
@ -97,8 +103,20 @@ class TecnaMarpossProvasetT3(ModbusComponent):
"Running test: type of test",
"Testing in progress: progressive sequence index",
]}
if info["Running test: type of test"] is None:
info.update(self.get_test_results())
self.start_test()
print(info, flush=True)
super()._get([info])
def start_test(self):
self.log.info("starting test")
self.write("Start testing", 1)
def stop_test(self):
self.log.warining("stopping test")
self.write("Stop the test in progress", 0)
def get_test_results(self):
return {r: self.read(r) for r in [
"Running test: measured leak",

View File

@ -16,30 +16,31 @@ registers = {
"Format of time variables": [26, {"dt": "16bit_uint", }],
"Format of variables related to flow measurements": [27, {"dt": "16bit_uint", }],
"Instrument status: table of parameters in use": [31, {"dt": "16bit_uint", }],
"Instrument status: active phase": [32, {"dt": "16bit_uint", }],
# 0 = NO TEST EXECUTED: WAITING START NEW TEST
# 10 = TEST IN PROGRESS: CHECK BARCODE CODE (if enabled)
# 20 = TEST IN PROGRESS: WAITING READING BARCODE CODE (if enabled)
# 30 = TEST IN PROGRESS: TEST INITIALIZATION
# 40 = TEST IN PROGRESS: AUTOMATIC CLOSING 1 (CAGE)
# 50 = TEST IN PROGRESS: AUTOMATIC CLOSING 2 (PLUG)
# 60 = TEST IN PROGRESS: ACTIVE TEST PROGRAM INITIALIZATION
# 70 = TEST IN PROGRESS: WAITING ACKNOWLEDGE WITH BI-START COMMAND (if used)
# 80 = TEST IN PROGRESS: WAITING DELAY (PSDEL parameter)
# 90 = TEST IN PROGRESS: WAITING CONSENT SIGNAL (PSIN parameter)
# 100 = TEST IN PROGRESS: PHASE T0 - PRE-FILLING
# 110 = TEST IN PROGRESS: PHASE T1 - FILLING
# 120 = TEST IN PROGRESS: PHASE T2 - ASSESTMENT
# 130 = TEST IN PROGRESS: PHASE T3- SIZE
# 140 = TEST IN PROGRESS: WAITING CONFIRMATION EXAMINED BY OPERATOR (if used)
# 150 = TEST IN PROGRESS: TEST RESULT PRESENT
# 160 = TEST IN PROGRESS: MARKING (only if last table of a sequence or not in sequence mode)
# 170 = TEST IN PROGRESS: PRESSURE DISCHARGE
# 180 = TEST IN PROGRESS: END OF TESTING TABLE - IF IN SEQUENCE MODE THE CYCLE STARTS FROM
# PHASE 60 WITH THE NEXT TABLE OF THE SEQUENCE
# 190 = TEST IN PROGRESS: AUTOMATIC OPENING 2 (BUFFER)
# 200 = TEST IN PROGRESS: AUTOMATIC OPENING 1 (CAGE)
# 210 = TEST TERMINATED: WAITING THE START OF A NEW TEST
"Instrument status: active phase": [32, {"dt": "16bit_uint", "decoding": {
0: "NO TEST EXECUTED: WAITING START NEW TEST",
10: "TEST IN PROGRESS: CHECK BARCODE CODE (if enabled)",
20: "TEST IN PROGRESS: WAITING READING BARCODE CODE (if enabled)",
30: "TEST IN PROGRESS: TEST INITIALIZATION",
40: "TEST IN PROGRESS: AUTOMATIC CLOSING 1 (CAGE)",
50: "TEST IN PROGRESS: AUTOMATIC CLOSING 2 (PLUG)",
60: "TEST IN PROGRESS: ACTIVE TEST PROGRAM INITIALIZATION",
70: "TEST IN PROGRESS: WAITING ACKNOWLEDGE WITH BI-START COMMAND (if used)",
80: "TEST IN PROGRESS: WAITING DELAY (PSDEL parameter)",
90: "TEST IN PROGRESS: WAITING CONSENT SIGNAL (PSIN parameter)",
100: "TEST IN PROGRESS: PHASE T0 - PRE-FILLING",
110: "TEST IN PROGRESS: PHASE T1 - FILLING",
120: "TEST IN PROGRESS: PHASE T2 - ASSESTMENT",
130: "TEST IN PROGRESS: PHASE T3- SIZE",
140: "TEST IN PROGRESS: WAITING CONFIRMATION EXAMINED BY OPERATOR (if used)",
150: "TEST IN PROGRESS: TEST RESULT PRESENT",
160: "TEST IN PROGRESS: MARKING (only if last table of a sequence or not in sequence mode)",
170: "TEST IN PROGRESS: PRESSURE DISCHARGE",
180: "TEST IN PROGRESS: END OF TESTING TABLE - IF IN SEQUENCE MODE THE CYCLE STARTS FROM",
# PHASE 60 WITH THE NEXT TABLE OF THE SEQUENCE
190: "TEST IN PROGRESS: AUTOMATIC OPENING 2 (BUFFER)",
200: "TEST IN PROGRESS: AUTOMATIC OPENING 1 (CAGE)",
210: "TEST TERMINATED: WAITING THE START OF A NEW TEST",
}, }],
"Running test: active phase backwards time": [33, {"dt": "16bit_uint", "f": 26, }],
"Running test: T1 phase end pressure": [34, {"dt": "32bit_int", "f": 21, }],
"Running test: T2 phase end pressure": [36, {"dt": "32bit_int", "f": 21, }],
@ -47,39 +48,58 @@ registers = {
"Running test: measured leak": [40, {"dt": "32bit_int", "f": 22, }],
"Running test: calculated leak flow rate": [42, {"dt": "32bit_int", "f": 24, }],
"Running test: calculate RVP%": [44, {"dt": "32bit_int", }],
"Running test: result": [46, {"dt": "16bit_uint", }],
# 1 = LEAK TEST PASSED
# 2 = BURST TEST PASSED WITH BURST
# 3 = BURST TEST PASSED WITHOUT BURST
# 4 = not used
# 5 = BLOCKAGE TEST PASSED
# 100 = LEAK TEST FAILED - UPPER LIMIT
# 101 = LEAK TEST FAILED ANOMALY
# 102 = LEAK TEST - MAXIMUM LEAK FAILED
# 103 = BURST - BREAKAGE PRESSURE DEFLECTION
# 104 = VOLUMETRIC CONTROL - RVP% FAILED
# 105 = not used
# 106 = not used
# 107 = BLOCKAGE - MAX PRESSURE FAILED
# 108 = BLOCKAGE - MIN PRESSURE FAILED
# 109 = BURST - MINIMUM PRESSURE FAILED
# 200 = LEAK TEST FAILED PR% PRESSURE MINUM
# 201 = LEAK TEST FAILED - PR% PRESSURE MAX
# 202 = LEAK TEST FAILED P0% PRESSURE MINUM
# 203 = LEAK TEST FAILED - P0% PRESSURE MAX
# 204 = ERROR - INTERNAL ALARMS
# 205 = ERROR - RELATIVE PRESSURE OUT OF RANGE
# 206 = ERROR - DIFFERENTIAL PRESSURE OUT OF RANGE
# 207 = ERROR PRE-FILLING VALVE NOT OPENED
# 250 = TEST ABORTED
"Running test: type of test": [47, {"dt": "16bit_uint", }],
# 1 = LEAK TEST
# 2 = BLOCKAGE TEST
# 3 = LEAK TEST WITH VOLUME CHECK
# 4 = BURST TEST
"Running test: result": [46, {"dt": "16bit_uint", "decoding": {
0: None,
1: "LEAK TEST PASSED",
2: "BURST TEST PASSED WITH BURST",
3: "BURST TEST PASSED WITHOUT BURST",
4: "not used",
5: "BLOCKAGE TEST PASSED",
100: "LEAK TEST FAILED - UPPER LIMIT",
101: "LEAK TEST FAILED ANOMALY",
102: "LEAK TEST - MAXIMUM LEAK FAILED",
103: "BURST - BREAKAGE PRESSURE DEFLECTION",
104: "VOLUMETRIC CONTROL - RVP% FAILED",
105: "not used",
106: "not used",
107: "BLOCKAGE - MAX PRESSURE FAILED",
108: "BLOCKAGE - MIN PRESSURE FAILED",
109: "BURST - MINIMUM PRESSURE FAILED",
200: "LEAK TEST FAILED PR% PRESSURE MINUM",
201: "LEAK TEST FAILED - PR% PRESSURE MAX",
202: "LEAK TEST FAILED P0% PRESSURE MINUM",
203: "LEAK TEST FAILED - P0% PRESSURE MAX",
204: "ERROR - INTERNAL ALARMS",
205: "ERROR - RELATIVE PRESSURE OUT OF RANGE",
206: "ERROR - DIFFERENTIAL PRESSURE OUT OF RANGE",
207: "ERROR PRE-FILLING VALVE NOT OPENED",
250: "TEST ABORTED",
}, }],
"Running test: type of test": [47, {"dt": "16bit_uint", "decoding": {
0: None,
1: "LEAK TEST",
2: "BLOCKAGE TEST",
3: "LEAK TEST WITH VOLUME CHECK",
4: "BURST TEST",
},}],
"Testing in progress: progressive sequence index": [48, {"dt": "16bit_uint", }],
"Testing in progress: graphical sampling rate": [49, {"dt": "16bit_uint", }],
"Testing in progress: number of samples of the graph": [50, {"dt": "16bit_uint", }],
# ------------------------- COMMANDS -------------------------
"Start testing": [101, {"dt": "16bit_uint", }],
# Write a value of 0 to use the selected test table.
# Write a value from 1 to 100 to start testing with the desired table.
"Stop the test in progress": [102, {"dt": "16bit_uint", }],
"Activate digital output": [103, {"dt": "16bit_uint", }],
# Write a number from 1 to 16 to activate the corresponding digital output (the output must be set as "Free")
"Reset specific digital output": [104, {"dt": "16bit_uint", }],
# Write a number from 1 to 16 to disable the relative digital output (the output must be set as "Free")
"Activate digital output (mask)": [105, {"dt": "16bit_uint", }],
# Write 1 in the bit corresponding to the output to be activated
"Reset digital output (mask)": [106, {"dt": "16bit_uint", }],
# Write 1 in the bit corresponding to the output to be deactivated
"Reset test counter": [107, {"dt": "16bit_uint", }],
# ------------------------------------------------------------
"DISLPAY and SOUND: Language": [601, {"dt": "16bit_uint", }],
# 0=ITALIANO
# 1=ENGLISH
@ -166,4 +186,11 @@ registers = {
# VOLUME+LEAK: Format x.xx (from 0.00 to 649.99)
"RVP%: max tolerance": [751, {"dt": "16bit_uint", }],
# VOLUME+LEAK: Format: x.xx
# 1001-1060 Table of the last test performed X The order of the parameters is always the same, as indicated for register from 701 to 759.
# 10001-10060 Direct access to test program table number 1 X X The order of the parameters is always the same, as indicated for register from 701 to 759.
# 10101-10160 Direct access to test program table number 2 X X The order of the parameters is always the same, as indicated for register from 701 to 759.
# 10201-19960 Direct access to test program table number 2 thru 100 X X The order of the parameters is always the same, as indicated for register from 701 to 759.
# 501-510 U16 Model name X 20 ASCII characters divided into 10 registers
# 511-520 U16 Serial number X 10 ASCII characters divided into 5 registers
# 2001-8000 S32 Pressure values with sign X Register 49 indicates the sampling rate in tenths of a second Register 50 indicates the number of valid values In the leak tests, the values referred to the phases T0, T1 and T2 are under absolute pressure, while the values referred to phase T3 represent the detected loss.
}

View File

@ -18,15 +18,22 @@ from .component import Component
from .consumer import Consumer
if "--no-edgetpu" not in sys.argv:
if "--no-tflite" not in sys.argv:
try:
from pycoral.utils.edgetpu import make_interpreter
except (ImportError, ModuleNotFoundError) as e:
def make_interpreter(*args, **kwargs):
raise ValueError(f"{e!r}")
else:
def make_interpreter(*args, **kwargs):
raise ValueError("\"--no-edgetpu\" in sys.argv")
if "--no-tflite" not in sys.argv:
from pycoral.adapters import detect
from tflite_runtime.interpreter import Interpreter
try:
from pycoral.adapters import detect
from tflite_runtime.interpreter import Interpreter
except (ImportError, ModuleNotFoundError) as e:
def Interpreter(*args, **kwargs):
raise ValueError(f"{e!r}")
else:
def Interpreter(*args, **kwargs):
raise ValueError("\"--no-tflite\" in sys.argv")

View File

@ -9,11 +9,13 @@ import traceback
from datetime import datetime
from pathlib import Path
app = None
def quit_app(signalnum=None, handler=None):
logging.info(f"quitting app. signal: {signalnum!r}, handler: {handler!r}")
global app
app.quit()
if app is not None:
app.quit()
quit()
@ -34,7 +36,7 @@ logging.basicConfig(
handlers=[
logging.StreamHandler(stream=sys.stderr),
logging.FileHandler(
logs_dir / f"{datetime.now().isoformat()}.log",
logs_dir / f"{datetime.now().isoformat().replace(':', ';')}.log",
mode="a",
encoding="utf-8",
delay=False,
@ -48,7 +50,7 @@ logging.basicConfig(
try:
# IMPORT PROJECT ONLY AFTER SETTING UP SIGNAL, FAULTHANDLER AND LOGGHING
from components import (ArchiveSynchronizer, GalaxyCamera, NeoPixels,
from components import (ArchiveSynchronizer, NeoPixels,
Os_Label_Printer, RemoteAPI,
TecnaMarpossProvasetT3, TestComponent, Vision,
VisionSaver)

View File

@ -6,8 +6,8 @@ client = ModbusClient(method="rtu", port="COM3", stopbits=serial.STOPBITS_ONE, b
status = client.connect()
read_data = client.read_holding_registers(1, count=1)
if type(read_data) is not pymodbus.exceptions.ModbusIOException:
for i, v in enumerate(read_data):
print(f"READ DATA at {i}:{v}")
for i, v in enumerate(read_data.registers):
print(f"READ DATA at {i}: {v}")
pass
else:
print("READ ERROR")