tecna wip
This commit is contained in:
parent
514964d7c6
commit
c36f953012
2
init.sh
2
init.sh
|
|
@ -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" || :
|
||||
|
|
|
|||
|
|
@ -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))
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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")
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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")
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user