Check timeouts
This commit is contained in:
parent
a91f9d70db
commit
f558f44907
@ -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)
|
||||||
|
@ -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)
|
||||||
|
@ -47,7 +47,6 @@ ApplicationWindow {
|
|||||||
}
|
}
|
||||||
|
|
||||||
onBmsErrorChanged: {
|
onBmsErrorChanged: {
|
||||||
console.log(bmsError);
|
|
||||||
bmsErrorVisible = bmsError != "";
|
bmsErrorVisible = bmsError != "";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user