Funktion Kompressor

Kompressor Funktion …

------------------------------------------------------------------
🔧 Parameterstruktur pro Kompressor:
------------------------------------------------------------------
typedef struct {
    uint8_t aktiv;                       // 0 = deaktiviert, 1 = aktiviert
    uint8_t digital_output;             // GPIO oder Mapping für Start/Stopp

    // Starttemperaturen (Differenz zum Sollwert) [°C]
    float start_temp_sommer;
    float start_temp_winter;

    // Hysterese [°C]
    float hyst_sommer;
    float hyst_winter;

    // Kompressorpause [s]
    uint16_t pause_zeit_s;

    // Alarmparameter Niederdruck
    uint8_t nd_digital_input;           // GPIO-Eingang
    uint8_t nd_alarm_relais;           // Alarmrelais (Priorität)
    uint8_t nd_alarm_prio;
    uint16_t nd_startverzoegerung_s;
    uint8_t max_neustarts_nd;
    uint16_t nd_reset_intervall_s;
    float nd_min_druck;                 // wenn Drucksensor vorhanden

    // Alarmparameter Hochdruck
    uint8_t max_neustarts_hd;
    uint16_t hd_reset_intervall_s;
    float hd_max_druck;
    uint8_t hd_modus;                   // 0 = Stopp, 1 = Betrieb fortsetzen

    // Laufzeit [h]
    uint32_t laufzeit_kompressor_h;

} KompressorParam;
------------------------------------------------------------------
🧠 Globale Systemstruktur:
------------------------------------------------------------------
typedef struct {
    KompressorParam k1;
    KompressorParam k2;

    bool winterbetrieb_aktiv;

    bool saugdrossel_1_aktiv;
    bool saugdrossel_2_aktiv;
    bool hgbp_ventil_aktiv;

} KompressorSystem;
------------------------------------------------------------------
🔄 Sequencing-Logik (Laufzeitausgleich):
------------------------------------------------------------------
void pruefe_laufzeitausgleich(KompressorSystem *sys) {
    if (!(sys->saugdrossel_1_aktiv && sys->saugdrossel_2_aktiv)) return;
    if (!sys->hgbp_ventil_aktiv) return;

    int32_t diff = (int32_t)sys->k1.laufzeit_kompressor_h - (int32_t)sys->k2.laufzeit_kompressor_h;
    if (abs(diff) < 20) return;

    KompressorParam *mehr = diff > 0 ? &sys->k1 : &sys->k2;
    KompressorParam *weniger = diff > 0 ? &sys->k2 : &sys->k1;

    bool is_winter = sys->winterbetrieb_aktiv;
    float start_mehr = is_winter ? mehr->start_temp_winter : mehr->start_temp_sommer;
    float start_weniger = is_winter ? weniger->start_temp_winter : weniger->start_temp_sommer;

    if (start_mehr < start_weniger) {
        // Werte tauschen
        float tmp_start = mehr->start_temp_sommer;
        mehr->start_temp_sommer = weniger->start_temp_sommer;
        weniger->start_temp_sommer = tmp_start;

        tmp_start = mehr->start_temp_winter;
        mehr->start_temp_winter = weniger->start_temp_winter;
        weniger->start_temp_winter = tmp_start;

        float tmp_hyst = mehr->hyst_sommer;
        mehr->hyst_sommer = weniger->hyst_sommer;
        weniger->hyst_sommer = tmp_hyst;

        tmp_hyst = mehr->hyst_winter;
        mehr->hyst_winter = weniger->hyst_winter;
        weniger->hyst_winter = tmp_hyst;
    }
}
------------------------------------------------------------------

Tags:

Comments

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Search


Categories


Recent Posts


Tags