Check timeouts

This commit is contained in:
Jasper Blanckenburg 2023-01-26 16:52:58 +01:00
parent a91f9d70db
commit f558f44907
3 changed files with 32 additions and 6 deletions

View File

@ -21,6 +21,8 @@ THRESH_UV = 2.5
THRESH_OV = 4.2 THRESH_OV = 4.2
THRESH_UT = 1 THRESH_UT = 1
THRESH_OT = 60 THRESH_OT = 60
THRESH_VOLTAGE_TIMEOUT = 1
THRESH_TEMP_TIMEOUT = 1
class BMSError(Enum): class BMSError(Enum):
@ -29,6 +31,8 @@ class BMSError(Enum):
OV = 2 OV = 2
UT = 3 UT = 3
OT = 4 OT = 4
TIMEOUT_V = 5
TIMEOUT_T = 6
def __str__(self): def __str__(self):
if self == self.NONE: if self == self.NONE:
@ -41,6 +45,10 @@ class BMSError(Enum):
return "Undertemperature" return "Undertemperature"
elif self == self.OT: elif self == self.OT:
return "Overtemperature" return "Overtemperature"
elif self == self.TIMEOUT_V:
return "Timeout (voltages)"
elif self == self.TIMEOUT_T:
return "Timeout (temps)"
else: else:
return "Unknown error" return "Unknown error"
@ -59,6 +67,8 @@ class BMS(QObject):
_load: Load _load: Load
_num_cells: int _num_cells: int
_num_sensors: int _num_sensors: int
_last_voltage_time: float
_last_temp_time: float
def __init__(self, load: Load, num_cells: int, num_sensors: int): def __init__(self, load: Load, num_cells: int, num_sensors: int):
super().__init__(None) super().__init__(None)
@ -83,6 +93,11 @@ class BMS(QObject):
if t < THRESH_UT: if t < THRESH_UT:
error = BMSError.UT error = BMSError.UT
break break
now = time.time()
if now - self._last_voltage_time > THRESH_VOLTAGE_TIMEOUT:
error = BMSError.TIMEOUT_V
if now - self._last_temp_time > THRESH_TEMP_TIMEOUT:
error = BMSError.TIMEOUT_T
if error != self._data.error: if error != self._data.error:
print(f"Error changed: {error}") print(f"Error changed: {error}")
@ -103,6 +118,8 @@ class BMSEvalBoard(BMS):
self._dev = ModbusSerialClient( self._dev = ModbusSerialClient(
method="rtu", port=uart_path, baudrate=MODBUS_BAUDRATE method="rtu", port=uart_path, baudrate=MODBUS_BAUDRATE
) )
self._last_voltage_time = time.time()
self._last_temp_time = time.time()
temperaturesUpdated.connect( temperaturesUpdated.connect(
self._updateTemperatures, Qt.ConnectionType.DirectConnection self._updateTemperatures, Qt.ConnectionType.DirectConnection
) )
@ -113,15 +130,20 @@ class BMSEvalBoard(BMS):
result = self._dev.read_holding_registers( result = self._dev.read_holding_registers(
VOLTAGE_ADDRESS, NUM_CELLS, SLAVE_UNIT_ID VOLTAGE_ADDRESS, NUM_CELLS, SLAVE_UNIT_ID
) )
if result.isError():
print(f"ERROR READING VOLTAGES: {result}")
else:
self._data.voltages = list( self._data.voltages = list(
map(lambda v: v * VOLTAGE_QUANT, result.registers) map(lambda v: v * VOLTAGE_QUANT, result.registers)
) )
self._check_for_errors() self._last_voltage_time = time.time()
self.dataUpdated.emit(self._data) self.dataUpdated.emit(self._data)
self._check_for_errors()
@Slot(list) @Slot(list)
def _updateTemperatures(self, temps: list[float]): def _updateTemperatures(self, temps: list[float]):
assert len(temps) == N_SENSORS assert len(temps) == N_SENSORS
self._data.temperatures = temps self._data.temperatures = temps
self._last_temp_time = time.time()
self._check_for_errors() self._check_for_errors()
self.dataUpdated.emit(self._data) self.dataUpdated.emit(self._data)

View File

@ -26,12 +26,17 @@ class Temperatures(QObject):
self.dev.read_until(START_OF_TEMPS) self.dev.read_until(START_OF_TEMPS)
data = self.dev.read(N_SENSORS * 2) data = self.dev.read(N_SENSORS * 2)
temps = struct.unpack(f">{N_SENSORS}h", data) temps = struct.unpack(f">{N_SENSORS}h", data)
err = False
for i, t in enumerate(temps): for i, t in enumerate(temps):
if (t & 0x0F) != 0: if (t & 0x0F) != 0:
print( print(
f"WARN: temperature had a non-zero least-significant nibble: {t:04x}", f"WARN: temperature had a non-zero least-significant nibble: {t:04x}",
file=sys.stderr, file=sys.stderr,
) )
err = True
else: else:
self._temps[i] = (t >> 4) * TEMP_QUANT self._temps[i] = (t >> 4) * TEMP_QUANT
# Only emit the signal if there's no error, so we cause a timeout if
# there were errors.
if not err:
self.temperaturesUpdated.emit(self._temps) self.temperaturesUpdated.emit(self._temps)

View File

@ -47,7 +47,6 @@ ApplicationWindow {
} }
onBmsErrorChanged: { onBmsErrorChanged: {
console.log(bmsError);
bmsErrorVisible = bmsError != ""; bmsErrorVisible = bmsError != "";
} }