TCS heater upper burn limit #732
@ -22,6 +22,8 @@ will consitute of a breaking change warranting a new major release:
|
|||||||
equal or above v4. However, this software version is compatible to both v3 and v4 of the firmware.
|
equal or above v4. However, this software version is compatible to both v3 and v4 of the firmware.
|
||||||
- The firmware version variables are global statics inititalized early during the program
|
- The firmware version variables are global statics inititalized early during the program
|
||||||
runtime now. This makes it possible to check the firmware version earlier.
|
runtime now. This makes it possible to check the firmware version earlier.
|
||||||
|
- The TCS controller will now always command heaters OFF when being blind for thermal
|
||||||
|
components (no sensors available), irrespective of current switch state.
|
||||||
|
|
||||||
## Fixed
|
## Fixed
|
||||||
|
|
||||||
@ -29,6 +31,10 @@ will consitute of a breaking change warranting a new major release:
|
|||||||
- Small fixes for TMP1075 FDIR: Use strange and missed reply counters.
|
- Small fixes for TMP1075 FDIR: Use strange and missed reply counters.
|
||||||
- TCS controller: Last heater (S-band heater) was skipped for transition completion
|
- TCS controller: Last heater (S-band heater) was skipped for transition completion
|
||||||
checks.
|
checks.
|
||||||
|
- TCS controller: A helper member to track the elapsed heater control cycles was not reset
|
||||||
|
properly, which could lead to switch transitions being completed immediately. This can
|
||||||
|
lead to weird bugs like heaters being commanded ON twice and can potentially lead to
|
||||||
|
other bugs.
|
||||||
- TMP1075: Devices did not go to OFF mode when being set faulty.
|
- TMP1075: Devices did not go to OFF mode when being set faulty.
|
||||||
- Update PL PCDU 1 in TCS mode tree on the EM.
|
- Update PL PCDU 1 in TCS mode tree on the EM.
|
||||||
- TMP1075: Possibly ignored health commands.
|
- TMP1075: Possibly ignored health commands.
|
||||||
|
@ -1602,8 +1602,7 @@ void ThermalController::ctrlComponentTemperature(HeaterContext& htrCtx) {
|
|||||||
// No sensors available, so switch the heater off. We can not perform control tasks if we
|
// No sensors available, so switch the heater off. We can not perform control tasks if we
|
||||||
// are blind..
|
// are blind..
|
||||||
if (chooseHeater(htrCtx.switchNr, htrCtx.redSwitchNr)) {
|
if (chooseHeater(htrCtx.switchNr, htrCtx.redSwitchNr)) {
|
||||||
if (heaterCtrlAllowed() and
|
if (heaterCtrlAllowed()) {
|
||||||
(heaterHandler.getSwitchState(htrCtx.switchNr) == HeaterHandler::SwitchState::ON)) {
|
|
||||||
heaterSwitchHelper(htrCtx.switchNr, HeaterHandler::SwitchState::OFF, currThermalComponent);
|
heaterSwitchHelper(htrCtx.switchNr, HeaterHandler::SwitchState::OFF, currThermalComponent);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1687,11 +1686,13 @@ void ThermalController::checkLimitsAndCtrlHeater(HeaterContext& htrCtx) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
htrCtx.switchState = heaterHandler.getSwitchState(htrCtx.switchNr);
|
htrCtx.switchState =
|
||||||
|
static_cast<HeaterHandler::SwitchState>(heaterInfo.heaterSwitchState[htrCtx.switchNr]);
|
||||||
// Heater off
|
// Heater off
|
||||||
if (htrCtx.switchState == HeaterHandler::SwitchState::OFF) {
|
if (htrCtx.switchState == HeaterHandler::SwitchState::OFF) {
|
||||||
if (sensorTemp < htrCtx.tempLimit.opLowerLimit and heaterCtrlAllowed()) {
|
if (sensorTemp < htrCtx.tempLimit.opLowerLimit and heaterCtrlAllowed()) {
|
||||||
sif::info << "TCS: Heater " << static_cast<int>(currThermalComponent) << " ON" << std::endl;
|
sif::info << "TCS: Heater " << static_cast<int>(htrCtx.switchNr) << " for component "
|
||||||
|
<< static_cast<int>(currThermalComponent) << " ON" << std::endl;
|
||||||
heaterSwitchHelper(htrCtx.switchNr, HeaterHandler::SwitchState::ON, thermalComponent);
|
heaterSwitchHelper(htrCtx.switchNr, HeaterHandler::SwitchState::ON, thermalComponent);
|
||||||
} else {
|
} else {
|
||||||
// Even if heater control is now allowed, we can update the state.
|
// Even if heater control is now allowed, we can update the state.
|
||||||
@ -1706,8 +1707,8 @@ void ThermalController::checkLimitsAndCtrlHeater(HeaterContext& htrCtx) {
|
|||||||
if (thermalStates[currThermalComponent].heating) {
|
if (thermalStates[currThermalComponent].heating) {
|
||||||
// We are already in a heating cycle, so need to check whether heating task is complete.
|
// We are already in a heating cycle, so need to check whether heating task is complete.
|
||||||
if (sensorTemp >= htrCtx.tempLimit.opLowerLimit + TEMP_OFFSET and heaterCtrlAllowed()) {
|
if (sensorTemp >= htrCtx.tempLimit.opLowerLimit + TEMP_OFFSET and heaterCtrlAllowed()) {
|
||||||
sif::info << "TCS: Heater " << static_cast<int>(currThermalComponent) << " OFF"
|
sif::info << "TCS: Heater " << static_cast<int>(htrCtx.switchNr) << " for component "
|
||||||
<< std::endl;
|
<< static_cast<int>(currThermalComponent) << " OFF" << std::endl;
|
||||||
heaterSwitchHelper(htrCtx.switchNr, HeaterHandler::SwitchState::OFF, currThermalComponent);
|
heaterSwitchHelper(htrCtx.switchNr, HeaterHandler::SwitchState::OFF, currThermalComponent);
|
||||||
heaterStates[htrCtx.switchNr].switchTransition = true;
|
heaterStates[htrCtx.switchNr].switchTransition = true;
|
||||||
heaterStates[htrCtx.switchNr].target = HeaterHandler::SwitchState::OFF;
|
heaterStates[htrCtx.switchNr].target = HeaterHandler::SwitchState::OFF;
|
||||||
@ -1767,9 +1768,10 @@ void ThermalController::heaterTransitionControl(const HeaterSwitchStates& curren
|
|||||||
crossCheckHeaterStateOfComponentsWhenHeaterGoesOff(static_cast<heater::Switch>(i));
|
crossCheckHeaterStateOfComponentsWhenHeaterGoesOff(static_cast<heater::Switch>(i));
|
||||||
}
|
}
|
||||||
heaterStates[i].switchTransition = false;
|
heaterStates[i].switchTransition = false;
|
||||||
|
heaterStates[i].heaterSwitchControlCycles = 0;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (heaterStates[i].heaterSwitchControlCycles > 3) {
|
if (heaterStates[i].heaterSwitchControlCycles > 5) {
|
||||||
heaterStates[i].switchTransition = false;
|
heaterStates[i].switchTransition = false;
|
||||||
heaterStates[i].heaterSwitchControlCycles = 0;
|
heaterStates[i].heaterSwitchControlCycles = 0;
|
||||||
}
|
}
|
||||||
|
@ -419,13 +419,13 @@ ReturnValue_t HeaterHandler::getAllSwitchStates(std::array<SwitchState, 8>& stat
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool HeaterHandler::allSwitchesOff() {
|
bool HeaterHandler::allSwitchesOff() {
|
||||||
bool allSwitchesOrd = false;
|
|
||||||
MutexGuard mg(handlerLock, LOCK_TYPE, LOCK_TIMEOUT, LOCK_CTX);
|
MutexGuard mg(handlerLock, LOCK_TYPE, LOCK_TIMEOUT, LOCK_CTX);
|
||||||
/* Or all switches. As soon one switch is on, allSwitchesOrd will be true */
|
|
||||||
for (power::Switch_t switchNr = 0; switchNr < heater::NUMBER_OF_SWITCHES; switchNr++) {
|
for (power::Switch_t switchNr = 0; switchNr < heater::NUMBER_OF_SWITCHES; switchNr++) {
|
||||||
allSwitchesOrd = allSwitchesOrd || heaterVec.at(switchNr).switchState;
|
if (heaterVec.at(switchNr).switchState == SwitchState::ON) {
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
return !allSwitchesOrd;
|
}
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
MessageQueueId_t HeaterHandler::getCommandQueue() const { return commandQueue->getId(); }
|
MessageQueueId_t HeaterHandler::getCommandQueue() const { return commandQueue->getId(); }
|
||||||
|
Loading…
Reference in New Issue
Block a user