Skip to content

Commit

Permalink
fix quick switches in integrety check -> V2.1.8
Browse files Browse the repository at this point in the history
fix quick switches in integrety check
  • Loading branch information
DieWaldfee authored Oct 14, 2024
1 parent ca34140 commit 980a26d
Showing 1 changed file with 69 additions and 46 deletions.
115 changes: 69 additions & 46 deletions ESP32DevKitV4/Heizstabsteuerung.ino
Original file line number Diff line number Diff line change
Expand Up @@ -203,6 +203,7 @@ static QueueHandle_t free3Queue; //Queue-Handler - wenn leer, dann Integri
//erforderliche Funtions-Prototypen
void panicStop(void);
float getAmp_SCT013(int);
void thermalStop (void);

//-------------------------------------
//Wirft den gewünschten Phasencheck in die passende Queue
Expand Down Expand Up @@ -1586,66 +1587,85 @@ static void integrityCheck (void *args){
vTaskDelay(1); // 1ms Pause, und dann neuer Versuch, bis die Queues frei sind
}
if (debug > 1) Serial.println("Integrety - Freigabe durch Schaltvorgang erfolgt");
rc = xSemaphoreTake(mutexAmp, portMAX_DELAY);
assert(rc == pdPASS);
a1 = amp1;
a2 = amp2;
a3 = amp3;
p1on = phase1on;
p2on = phase2on;
p3on = phase3on;
errLast = checkError;
rc = xSemaphoreGive(mutexAmp);
assert(rc == pdPASS);
//prüfe erneut, ob die Zeit nach der letzten Phasenschaltung schon abgelaufen ist. Falls nicht wird die Integritätsprüfung ausgesetzt
//das kann bei schnellen Schaltungen passieren
if (lastPhaseSwitch + INTEGRETY_DELAY < xTaskGetTickCount()) {
//aktueller Stromwerte aus Sensor auslesen und aktueller Schaltzustand auslesen
rc = xSemaphoreTake(mutexAmp, portMAX_DELAY);
assert(rc == pdPASS);
rc = xSemaphoreTake(mutexAmpSensor, portMAX_DELAY);
assert(rc == pdPASS);
a1 = getAmp_SCT013(1);
a2 = getAmp_SCT013(2);
a3 = getAmp_SCT013(3);
p1on = phase1on;
p2on = phase2on;
p3on = phase3on;
errLast = checkError;
rc = xSemaphoreGive(mutexAmpSensor);
assert(rc == pdPASS);
rc = xSemaphoreGive(mutexAmp);
assert(rc == pdPASS);

if (p1on == 1) {
//Schaltzustand ein
if (a1 <= ZEROHYST) err = 1;
} else {
//Schaltzustand aus
if (a1 > ZEROHYST) err = 1;
}
if (p2on == 1) {
//Schaltzustand ein
if (a2 <= ZEROHYST) err = 1;
} else {
//Schaltzustand aus
if (a2 > ZEROHYST) err = 1;
}
if (p3on == 1) {
//Schaltzustand ein
if (a3 <= ZEROHYST) err = 1;
} else {
//Schaltzustand aus
if (a3 > ZEROHYST) err = 1;
}
if (a1 < (float)-ZEROHYST) err = 1;
if (a2 < (float)-ZEROHYST) err = 1;
if (a3 < (float)-ZEROHYST) err = 1;
if (errLast == 1) {
//letzter Durchflauf lag noch ein Fehler vor
if (err == 1) {
//Konsistenzfehler -> Notabschaltung
lastError = "Integritätsfehler - Schaltzustand und Phasenströme passen nicht zueinander. A1: " + String(a1);
lastError = lastError + "A; P1on: " + String(p1on) + "; A2: " + String(a2) + "A; P2on: " + String(p2on) + "; A3: " + String(a3) + "A; P3on: " + String(p3on) + ".";
panicStop();
if (p1on == 1) {
//Schaltzustand ein
if (a1 <= ZEROHYST) err = 1;
} else {
//Schaltzustand aus
if (a1 > ZEROHYST) err = 1;
}
if (p2on == 1) {
//Schaltzustand ein
if (a2 <= ZEROHYST) err = 1;
} else {
//Schaltzustand aus
if (a2 > ZEROHYST) err = 1;
}
if (p3on == 1) {
//Schaltzustand ein
if (a3 <= ZEROHYST) err = 1;
} else {
//Schaltzustand aus
if (a3 > ZEROHYST) err = 1;
}
if (a1 < (float)-ZEROHYST) err = 1;
if (a2 < (float)-ZEROHYST) err = 1;
if (a3 < (float)-ZEROHYST) err = 1;
if (errLast == 1) {
//letzter Durchflauf lag noch ein Fehler vor
if (err == 1) {
//Konsistenzfehler -> Notabschaltung
lastError = "Integritätsfehler - Schaltzustand und Phasenströme passen nicht zueinander. A1: " + String(a1);
lastError = lastError + "A; P1on: " + String(p1on) + "; A2: " + String(a2) + "A; P2on: " + String(p2on) + "; A3: " + String(a3) + "A; P3on: " + String(p3on) + ".";
panicStop();
} else {
rc = xSemaphoreTake(mutexAmp, portMAX_DELAY);
assert(rc == pdPASS);
checkError = err;
rc = xSemaphoreGive(mutexAmp);
assert(rc == pdPASS);
}
} else {
//keine akute Disonanz festgestellt
rc = xSemaphoreTake(mutexAmp, portMAX_DELAY);
assert(rc == pdPASS);
checkError = err;
rc = xSemaphoreGive(mutexAmp);
assert(rc == pdPASS);
}
} else {
//keine akute Disonanz festgestellt
if (debug) Serial.println("Integrety-Prüfung ausgesetzt - Queues zu kurz hinter einer Phasenschaltung entleert");
}
} else {
if (debug) Serial.println("Integrety-Prüfung ausgesetzt - zu kurz hinter einer Phasenschaltung");
if (lastPhaseSwitch > xTaskGetTickCount()) {
//tritt nur bei einem Überlauf ein. Dann Reset von lastSwitch. akzeptierte Integritätsaussetzer zur Behandlung des Überlaufs
rc = xSemaphoreTake(mutexAmp, portMAX_DELAY);
assert(rc == pdPASS);
checkError = err;
lastSwitch = xTaskGetTickCount();
rc = xSemaphoreGive(mutexAmp);
assert(rc == pdPASS);
}
} else {
if (debug) Serial.println("Integrety-Prüfung ausgesetzt - zu kurz hinter einer Phasenschaltung");
}
if (debug > 1) Serial.println("Integrety - fertig druchlaufen");
// Task schlafen legen - restart alle INTEGRETY_INTERVAL [ticks]
Expand Down Expand Up @@ -1815,6 +1835,9 @@ void readDS18B20() {
}
if (tempTSensorFail > maxTSensorFail) {
Serial.println("zu viele Fehler (out of range) beim Auslesen der DS18B20! Reboot!!");
digitalWrite(PHASE1, HIGH);
digitalWrite(PHASE2, HIGH);
digitalWrite(PHASE3, HIGH);
ESP.restart();
}
}
Expand Down

0 comments on commit 980a26d

Please sign in to comment.