- Senden von Fehler (Maxlaufzeit erreicht, unbekannter Zustand für die statemachine)
- Wiedereinstieg in die reguläre (unbegrenzt laufende) Lüftersteuerung, wenn während der Nachlaufzeit die Ausschaltgrenze wieder überschritten wird.
Code: Alles auswählen
{
"Level": [
// Konstanten
["$ConstTrue", "bool", true],
["$ConstFalse", "bool", false],
// Konstanten für Statustexte (erforderlich für Multiplexer)
["$Const_StateText_0_AUS", "string", "AUS"],
["$Const_StateText_1_FEUCHTE", "string", "FEUCHTE"],
["$Const_StateText_2_NACHLAUF", "string", "NACHLAUF"],
["$Const_StateText_3_MANUELL", "string", "MANUELL"],
["$Const_StateText_4_GESPERRT", "string", "GESPERRT"],
["$Const_StateText_5_MAX_ZEIT", "string", "MAX_ZEIT Erreicht"],
["$Const_StateText_OK", "string", "OK"], // Default für ungenutzte Zustände 6-98
["$Const_StateText_99_FEHLER", "string", "FEHLER: Unbehandelter Zustand"],
// Inputs (Initialwerte werden durch Input-Array überschrieben)
["$in_Feuchte", "float", 60.0],
["$in_Taster_manuellesLueften", "bool", false],
["$in_BusReset", "bool", false],
["$in_LuefterSperre", "bool", false],
// Parameter (Initialwerte werden durch Input-Array überschrieben)
["$in_param_Feuchte_EinschaltOffset", "float", 5.0],
["$in_param_Feuchte_AusschaltOffset", "float", -2.0],
["$in_param_Feuchte_Nachlaufzeit", "float", 900.0],
["$in_param_TasterLueftung_Laufzeit", "float", 900.0],
["$in_param_Luefter_max_Laufzeit", "float", 10800.0],
["$in_param_Feuchte_GlaettungDauer", "float", 1800.0],
// Berechnungen & Zustand (Vorverarbeitung)
["$calc_Feuchte_geglaettet", "float", 60.0],
["$calc_EinschaltFeuchte", "float", 65.0],
["$calc_AusschaltFeuchte", "float", 58.0],
["$calc_isFeuchteUeberEinschalt", "bool", false],
["$calc_isFeuchteUnterAusschalt", "bool", false],
["$calc_isFeuchteUeberAusschalt", "bool", false], // Für Nachlaufabbruch
["$calc_isFeuchteAnforderungAktiv", "bool", false], // Initialwert FALSE ist wichtig
["$calc_isTasterLueftungCurrentTrigger", "bool", false],
["$calc_isTasterBetaetigt", "bool", false], // Impuls
["$calc_isSperreAktiv", "bool", false],
// Hilfsvariablen für MaxZeit-Trigger (und Nachlauf)
["$calc_isState1_fuerMaxZeit", "bool", false], // Wiederverwendet für Nachlauf-Trigger
["$calc_isState2_fuerMaxZeit", "bool", false],
["$calc_isState3_fuerMaxZeit", "bool", false],
["$calc_isLuefterAnFuerMaxZeit", "bool", false],
// MaxZeit Timer
["$calc_isMaxZeitTimerLaeuft", "bool", false],
["$calc_isMaxZeitTimerAbgelaufen", "bool", false], // Impuls
// Reset Bedingungen
["$calc_isResetManuellTimer", "bool", false],
["$calc_isResetNachlaufTimer", "bool", false],
// Manuell Timer
["$calc_isManuellTimerLaeuft", "bool", false],
["$calc_isManuellTimerGeradeAbgelaufen", "bool", false], // Impuls
["$calc_isManuellTimerEndeUndFeuchteHoch", "bool", false],
["$calc_isManuellTimerEndeUndTrocken", "bool", false],
// Nachlauf Timer
["$calc_triggerNachlaufStart", "bool", false], // Trigger-Impuls für Nachlauf-Monoflop
["$calc_isNachlaufTimerLaeuft", "bool", false],
["$calc_isNachlaufTimerGeradeAbgelaufen", "bool", false], // Impuls
// Statemachine & Ausgänge
["$calc_State", "integer", 0], // Initialzustand 0
["$out_LuefterEA_logic_result", "bool", false], // Logischer Zustand des Lüfters
["$out_LuefterEA_for_BusReset", "bool", false], // Hilfsvariable für separaten BusReset-Ausgang
["$calc_FehlerText", "string", "Initialisierung"], // Startwert für Fehlertext/Status
// Bus Reset
["$calc_isBusResetCurrentTrigger", "bool", false]
],
"Module": [
// --- START: Vorverarbeitung & Grundbedingungen (Pkt 1) ---
// Feuchtigkeitsglättung
["Lowpass", "$in_Feuchte", "$calc_Feuchte_geglaettet", "$in_param_Feuchte_GlaettungDauer"],
// Schwellen berechnen (Basis: geglättete Feuchte + Offsets)
["Polynomial", "$ConstTrue", "$calc_EinschaltFeuchte", ["$calc_Feuchte_geglaettet", "$in_param_Feuchte_EinschaltOffset"]],
["Polynomial", "$ConstTrue", "$calc_AusschaltFeuchte", ["$calc_Feuchte_geglaettet", "$in_param_Feuchte_AusschaltOffset"]],
// Feuchtigkeitsvergleiche
["Comparator", "$in_Feuchte", "$calc_isFeuchteUeberEinschalt", "$calc_EinschaltFeuchte"], // Ist aktuelle Feuchte > Einschalt-Schwelle?
["Comparator", "$calc_AusschaltFeuchte", "$calc_isFeuchteUnterAusschalt", "$in_Feuchte"], // Ist aktuelle Feuchte < Ausschalt-Schwelle?
["Comparator", "$in_Feuchte", "$calc_isFeuchteUeberAusschalt", "$calc_AusschaltFeuchte"], // Ist aktuelle Feuchte > Ausschalt-Schwelle? (Für Nachlaufabbruch)
// Feuchteanforderung (Hysterese)
["Latch", "$ConstTrue", "$calc_isFeuchteAnforderungAktiv", "$calc_isFeuchteUeberEinschalt", 0], // Setzen bei > Einschalt
["Latch", "$ConstFalse", "$calc_isFeuchteAnforderungAktiv", "$calc_isFeuchteUnterAusschalt", 0], // Rücksetzen bei < Ausschalt
// Tastererkennung (Impuls)
["Triggered", "$in_Taster_manuellesLueften", "$calc_isTasterLueftungCurrentTrigger"],
["And", ["$calc_isTasterLueftungCurrentTrigger", "$in_Taster_manuellesLueften"], "$calc_isTasterBetaetigt"], // Wird TRUE für einen Zyklus bei steigender Flanke
// Sperre übernehmen
["Latch", "$in_LuefterSperre", "$calc_isSperreAktiv", "$ConstTrue", 0],
// Ermitteln, ob Lüfter VOR SM logisch AN war (für MaxZeit & Nachlauf)
["Limiter", "$calc_State", 0, "$calc_isState1_fuerMaxZeit", [1,1]], // War State == 1?
["Limiter", "$calc_State", 0, "$calc_isState2_fuerMaxZeit", [2,2]], // War State == 2?
["Limiter", "$calc_State", 0, "$calc_isState3_fuerMaxZeit", [3,3]], // War State == 3?
["Or", ["$calc_isState1_fuerMaxZeit", "$calc_isState2_fuerMaxZeit", "$calc_isState3_fuerMaxZeit"], "$calc_isLuefterAnFuerMaxZeit"], // War Lüfter an?
// --- END: Vorverarbeitung & Grundbedingungen (Pkt 1) ---
// --- START: Maximale Laufzeitüberwachung (Pkt 2) ---
// Monoflop für MaxZeit (nicht retriggerbar)
["Monoflop", "$calc_isLuefterAnFuerMaxZeit", "-$calc_isLuefterAnFuerMaxZeit", "$calc_isMaxZeitTimerLaeuft", "$in_param_Luefter_max_Laufzeit", 2],
// Ablauf-Erkennung MaxZeit-Timer (Ein-Zyklus-Impuls bei fallender Flanke)
["Latch", "$ConstFalse", "$calc_isMaxZeitTimerAbgelaufen", "$ConstTrue", 0], // Impuls Var: Immer zuerst FALSE setzen
["Latch", "$ConstTrue", "$calc_isMaxZeitTimerAbgelaufen", "$calc_isMaxZeitTimerLaeuft", 2], // Impuls Var: Nur bei fallender Flanke von Timer-Status auf TRUE setzen
// --- END: Maximale Laufzeitüberwachung (Pkt 2) ---
// --- START: Berechnung Timer Reset-Bedingungen (Pkt 3) ---
// Reset-Bedingung für Manuell-Timer
["Or", ["$calc_isSperreAktiv", "$calc_isMaxZeitTimerAbgelaufen"], "$calc_isResetManuellTimer"], // (Sperre ODER MaxZeit Ablauf-Impuls)
// Reset-Bedingung für Nachlauf-Timer
["Or", ["$calc_isSperreAktiv", "$calc_isMaxZeitTimerAbgelaufen", "$calc_isFeuchteUeberAusschalt", "$calc_isTasterBetaetigt"], "$calc_isResetNachlaufTimer"], // (Sperre ODER MaxZeit-Ablauf ODER Feuchte>Ausschalt ODER Taster-Impuls)
// --- END: Berechnung Timer Reset-Bedingungen (Pkt 3) ---
// --- START: Externer Timer Manuell & Ablauf-Erkennung (Pkt 4) ---
// Monoflop für Manuell-Betrieb (retriggerbar)
["Monoflop", "$calc_isTasterBetaetigt", "$calc_isResetManuellTimer", "$calc_isManuellTimerLaeuft", "$in_param_TasterLueftung_Laufzeit", 3],
// Ablauf-Erkennung Manuell-Timer (Ein-Zyklus-Impuls bei fallender Flanke)
["Latch", "$ConstFalse", "$calc_isManuellTimerGeradeAbgelaufen", "$ConstTrue", 0], // Impuls Var: Immer zuerst FALSE setzen
["Latch", "$ConstTrue", "$calc_isManuellTimerGeradeAbgelaufen", "$calc_isManuellTimerLaeuft", 2], // Impuls Var: Nur bei fallender Flanke auf TRUE setzen
// --- END: Externer Timer Manuell & Ablauf-Erkennung (Pkt 4) ---
// --- START: Externer Timer Nachlauf & Ablauf-Erkennung (Pkt 5) ---
// Trigger für Nachlauf-Start (Impuls)
["And", ["$calc_isState1_fuerMaxZeit", "-$calc_isFeuchteAnforderungAktiv"], "$calc_triggerNachlaufStart"], // (War State 1 UND Feuchteanforderung endet jetzt)
// Monoflop für Nachlauf (nicht retriggerbar)
["Monoflop", "$calc_triggerNachlaufStart", "$calc_isResetNachlaufTimer", "$calc_isNachlaufTimerLaeuft", "$in_param_Feuchte_Nachlaufzeit", 2],
// Ablauf-Erkennung Nachlauf-Timer (Ein-Zyklus-Impuls bei fallender Flanke)
["Latch", "$ConstFalse", "$calc_isNachlaufTimerGeradeAbgelaufen", "$ConstTrue", 0], // Impuls Var: Immer zuerst FALSE setzen
["Latch", "$ConstTrue", "$calc_isNachlaufTimerGeradeAbgelaufen", "$calc_isNachlaufTimerLaeuft", 2], // Impuls Var: Nur bei fallender Flanke auf TRUE setzen
// --- END: Externer Timer Nachlauf & Ablauf-Erkennung (Pkt 5) ---
// --- START: Bedingungen für SM nach Timer-Ende (Pkt 6) ---
// Kombinierte Bedingungen für Übergänge nach Ablauf Manuell-Timer (nutzen Ablauf-Impuls)
["And", ["$calc_isManuellTimerGeradeAbgelaufen", "$calc_isFeuchteAnforderungAktiv"], "$calc_isManuellTimerEndeUndFeuchteHoch"],
["And", ["$calc_isManuellTimerGeradeAbgelaufen", "-$calc_isFeuchteAnforderungAktiv"], "$calc_isManuellTimerEndeUndTrocken"],
// --- END: Bedingungen für SM nach Timer-Ende (Pkt 6) ---
// --- START: Statemachine (Pkt 7) ---
["Statemachine",
[
// --- Priorität 1: SPERRE (Ziel: State 4=GESPERRT) ---
["$calc_isSperreAktiv", 0, 4, 0], // AUS -> GESPERRT (wenn Sperre aktiv)
["$calc_isSperreAktiv", 1, 4, 0], // FEUCHTE -> GESPERRT (wenn Sperre aktiv)
["$calc_isSperreAktiv", 2, 4, 0], // NACHLAUF -> GESPERRT (wenn Sperre aktiv)
["$calc_isSperreAktiv", 3, 4, 0], // MANUELL -> GESPERRT (wenn Sperre aktiv)
["$calc_isSperreAktiv", 5, 4, 0], // MAX_ZEIT -> GESPERRT (wenn Sperre aktiv)
["$calc_isSperreAktiv", 99, 4, 0], // FEHLER -> GESPERRT (wenn Sperre aktiv)
["-$calc_isSperreAktiv", 4, 0, 0], // GESPERRT -> AUS (wenn Sperre nicht aktiv)
// --- Priorität 2: MAX_ZEIT (Ziel: State 5=MAX_ZEIT) ---
["$calc_isMaxZeitTimerAbgelaufen", 1, 5, 0], // FEUCHTE -> MAX_ZEIT (bei MaxZeit Timer Ablauf - Impuls!)
["$calc_isMaxZeitTimerAbgelaufen", 2, 5, 0], // NACHLAUF -> MAX_ZEIT (bei MaxZeit Timer Ablauf - Impuls!)
["$calc_isMaxZeitTimerAbgelaufen", 3, 5, 0], // MANUELL -> MAX_ZEIT (bei MaxZeit Timer Ablauf - Impuls!)
// Verlassen von MAX_ZEIT (wenn keine Sperre aktiv)
["$calc_isTasterBetaetigt", 5, 3, 0], // MAX_ZEIT -> MANUELL (bei Taster - Übersteuerung - Impuls!)
["-$calc_isFeuchteAnforderungAktiv", 5, 0, 0], // MAX_ZEIT -> AUS (wenn Feuchteanforderung endet)
// --- Priorität 3: MANUELLER BETRIEB (Ziel: State 3=MANUELL) ---
["$calc_isTasterBetaetigt", 0, 3, 0], // AUS -> MANUELL (bei Taster - Impuls!)
["$calc_isTasterBetaetigt", 1, 3, 0], // FEUCHTE -> MANUELL (bei Taster - Impuls!)
["$calc_isTasterBetaetigt", 2, 3, 0], // NACHLAUF -> MANUELL (bei Taster - Impuls!)
// Ende von MANUELL (wenn keine Sperre/MaxZeit aktiv)
["$calc_isManuellTimerEndeUndFeuchteHoch", 3, 1, 0], // MANUELL -> FEUCHTE (nach Timer-Ablauf + Feuchte hoch - Impuls!)
["$calc_isManuellTimerEndeUndTrocken", 3, 0, 0], // MANUELL -> AUS (nach Timer-Ablauf + trocken - Impuls!)
// --- Priorität 4: AUTOMATIK (FEUCHTE State 1, NACHLAUF State 2) ---
["$calc_isFeuchteAnforderungAktiv", 0, 1, 0], // AUS -> FEUCHTE (wenn Feuchteanforderung aktiv)
["-$calc_isFeuchteAnforderungAktiv", 1, 2, 0], // FEUCHTE -> NACHLAUF (wenn Feuchteanforderung endet -> startet Nachlauf)
// Während NACHLAUF (wenn keine Sperre/MaxZeit/Taster aktiv)
["$calc_isFeuchteUeberAusschalt", 2, 1, 0], // NACHLAUF -> FEUCHTE (wenn Feuchte wieder steigt -> resettet Nachlauf)
["$calc_isNachlaufTimerGeradeAbgelaufen", 2, 0, 0], // NACHLAUF -> AUS (nach Timer-Ablauf - Impuls!)
// --- Catch-All für unbehandelte Fälle -> FEHLER (State 99) ---
["$ConstTrue", 0, 99, 0], // AUS -> FEHLER (Unerwartet!)
["$ConstTrue", 1, 99, 0], // FEUCHTE -> FEHLER (Unerwartet!)
["$ConstTrue", 2, 99, 0], // NACHLAUF -> FEHLER (Unerwartet!)
["$ConstTrue", 3, 99, 0], // MANUELL -> FEHLER (Unerwartet!)
["$ConstTrue", 5, 99, 0], // MAX_ZEIT -> FEHLER (Unerwartet!)
// Zustand 4 (GESPERRT) braucht keinen Catch-All, da -$calc_isSperreAktiv der einzige Weg hinaus ist.
// --- Verhalten im FEHLER Zustand (State 99) ---
// ["$calc_isSperreAktiv", 99, 4, 0] ist bereits oben bei Priorität 1 abgedeckt.
["$ConstTrue", 99, 0, 0] // FEHLER -> AUS (Default-Rückfall, wenn nicht gesperrt)
],
"$calc_State" // Variable, die den Zustand speichert und aktualisiert
],
// --- END: Statemachine (Pkt 7) ---
// --- START: Ausgangsvariablen ableiten (Pkt 8) ---
// Finalen Lüfterzustand ableiten
["Multiplexer",
[ // Index: 0 1 2 3 4 5 6...98 99
"$ConstFalse", "$ConstTrue", "$ConstTrue", "$ConstTrue", "$ConstFalse", "$ConstFalse", "$ConstFalse", "$ConstFalse", "$ConstFalse", "$ConstFalse", "$ConstFalse", "$ConstFalse", "$ConstFalse", "$ConstFalse", "$ConstFalse", "$ConstFalse", "$ConstFalse", "$ConstFalse", "$ConstFalse", "$ConstFalse", "$ConstFalse", "$ConstFalse", "$ConstFalse", "$ConstFalse", "$ConstFalse", "$ConstFalse", "$ConstFalse", "$ConstFalse", "$ConstFalse", "$ConstFalse", "$ConstFalse", "$ConstFalse", "$ConstFalse", "$ConstFalse", "$ConstFalse", "$ConstFalse", "$ConstFalse", "$ConstFalse", "$ConstFalse", "$ConstFalse", "$ConstFalse", "$ConstFalse", "$ConstFalse", "$ConstFalse", "$ConstFalse", "$ConstFalse", "$ConstFalse", "$ConstFalse", "$ConstFalse", "$ConstFalse", "$ConstFalse", "$ConstFalse", "$ConstFalse", "$ConstFalse", "$ConstFalse", "$ConstFalse", "$ConstFalse", "$ConstFalse", "$ConstFalse", "$ConstFalse", "$ConstFalse", "$ConstFalse", "$ConstFalse", "$ConstFalse", "$ConstFalse", "$ConstFalse", "$ConstFalse", "$ConstFalse", "$ConstFalse", "$ConstFalse", "$ConstFalse", "$ConstFalse", "$ConstFalse", "$ConstFalse", "$ConstFalse", "$ConstFalse", "$ConstFalse", "$ConstFalse", "$ConstFalse", "$ConstFalse", "$ConstFalse", "$ConstFalse", "$ConstFalse", "$ConstFalse", "$ConstFalse", "$ConstFalse", "$ConstFalse", "$ConstFalse", "$ConstFalse", "$ConstFalse", "$ConstFalse", "$ConstFalse", "$ConstFalse", "$ConstFalse", "$ConstFalse", "$ConstFalse", "$ConstFalse", "$ConstFalse", "$ConstFalse"
],
"$out_LuefterEA_logic_result", // Zielvariable
"$calc_State" // Selektor
],
// Fehlertext/Status ableiten
["Multiplexer",
[ // Index: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
"$Const_StateText_0_AUS", "$Const_StateText_1_FEUCHTE", "$Const_StateText_2_NACHLAUF", "$Const_StateText_3_MANUELL", "$Const_StateText_4_GESPERRT", "$Const_StateText_5_MAX_ZEIT", "$Const_StateText_OK", "$Const_StateText_OK", "$Const_StateText_OK", "$Const_StateText_OK", "$Const_StateText_OK", "$Const_StateText_OK", "$Const_StateText_OK", "$Const_StateText_OK", "$Const_StateText_OK", "$Const_StateText_OK", "$Const_StateText_OK", "$Const_StateText_OK", "$Const_StateText_OK", "$Const_StateText_OK", "$Const_StateText_OK", "$Const_StateText_OK", "$Const_StateText_OK", "$Const_StateText_OK", "$Const_StateText_OK", "$Const_StateText_OK", "$Const_StateText_OK", "$Const_StateText_OK", "$Const_StateText_OK", "$Const_StateText_OK", "$Const_StateText_OK", "$Const_StateText_OK", "$Const_StateText_OK", "$Const_StateText_OK", "$Const_StateText_OK", "$Const_StateText_OK", "$Const_StateText_OK", "$Const_StateText_OK", "$Const_StateText_OK", "$Const_StateText_OK", "$Const_StateText_OK", "$Const_StateText_OK", "$Const_StateText_OK", "$Const_StateText_OK", "$Const_StateText_OK", "$Const_StateText_OK", "$Const_StateText_OK", "$Const_StateText_OK", "$Const_StateText_OK", "$Const_StateText_OK", "$Const_StateText_OK", "$Const_StateText_OK", "$Const_StateText_OK", "$Const_StateText_OK", "$Const_StateText_OK", "$Const_StateText_OK", "$Const_StateText_OK", "$Const_StateText_OK", "$Const_StateText_OK", "$Const_StateText_OK", "$Const_StateText_OK", "$Const_StateText_OK", "$Const_StateText_OK", "$Const_StateText_OK", "$Const_StateText_OK", "$Const_StateText_OK", "$Const_StateText_OK", "$Const_StateText_OK", "$Const_StateText_OK", "$Const_StateText_OK", "$Const_StateText_OK", "$Const_StateText_OK", "$Const_StateText_OK", "$Const_StateText_OK", "$Const_StateText_OK", "$Const_StateText_OK", "$Const_StateText_OK", "$Const_StateText_OK", "$Const_StateText_OK", "$Const_StateText_OK", "$Const_StateText_OK", "$Const_StateText_OK", "$Const_StateText_OK", "$Const_StateText_OK", "$Const_StateText_OK", "$Const_StateText_OK", "$Const_StateText_OK", "$Const_StateText_OK", "$Const_StateText_OK", "$Const_StateText_OK", "$Const_StateText_OK", "$Const_StateText_OK", "$Const_StateText_OK", "$Const_StateText_OK", "$Const_StateText_OK", "$Const_StateText_99_FEHLER"
],
"$calc_FehlerText", // Zielvariable
"$calc_State" // Selektor
],
// Wert für BusReset-Ausgang kopieren (erforderlich, da Variable nur einem Output zugewiesen werden darf)
["Latch", "$out_LuefterEA_logic_result", "$out_LuefterEA_for_BusReset", "$ConstTrue", 0],
// --- END: Ausgangsvariablen ableiten (Pkt 8) ---
// --- START: BusReset Logik (Pkt 9) ---
// Erkennung Bus-Reset (wenn Eingang die Logik triggert)
["Triggered", "$in_BusReset", "$calc_isBusResetCurrentTrigger"],
// Explizites Senden des kopierten Lüfterstatus bei Bus-Reset
["SendExplicit", "$calc_isBusResetCurrentTrigger", "$out_LuefterEA_for_BusReset", 0] // Option 0 = Sende bei TRUE
// --- END: BusReset Logik (Pkt 9) ---
],
"Input": [
["Feuchte", "Aktuelle Feuchte vom Sensor (%)", "$in_Feuchte", "c"],
["Taster Manuell", "Manueller Taster zum Ein-/Ausschalten (steigende Flanke)", "$in_Taster_manuellesLueften", "c"],
["Bus Reset", "Signal zum erneuten Senden des Lüfterstatus (z.B. bei Busspannungswiederkehr)", "$in_BusReset", "a"],
["Sperre", "Übergeordnete Sperre für den Lüfter (true = gesperrt)", "$in_LuefterSperre", "c"],
["P: EinschaltOffset", "Offset zur geglätteten Feuchte zum Einschalten (%)", "$in_param_Feuchte_EinschaltOffset", "u"],
["P: AusschaltOffset", "Offset zur geglätteten Feuchte zum Ausschalten (%)", "$in_param_Feuchte_AusschaltOffset", "u"],
["P: Nachlaufzeit", "Nachlaufzeit in Sekunden", "$in_param_Feuchte_Nachlaufzeit", "u"],
["P: Manuelle Laufzeit", "Laufzeit bei Tasterbetätigung in Sekunden", "$in_param_TasterLueftung_Laufzeit", "u"],
["P: Max Laufzeit", "Maximale ununterbrochene Laufzeit in Sekunden", "$in_param_Luefter_max_Laufzeit", "u"],
["P: Glättungsdauer", "Zeitkonstante für Feuchte-Glättung in Sekunden (Lowpass)", "$in_param_Feuchte_GlaettungDauer", "u"]
],
"Output": [
["Luefter EA (Logik)", "Lüfter Ein-/Ausschaltbefehl (bei Änderung oder Timer)", "$out_LuefterEA_logic_result", "ct"],
["Luefter EA (BusReset)", "Lüfter Ein-/Ausschaltbefehl (nur bei Bus-Reset explizit senden)", "$out_LuefterEA_for_BusReset?", "x"],
["dbg State", "Aktueller Zustand der Statemachine (0=AUS,1=FEUCHTE,2=NACHLAUF,3=MAN,4=SPERRE,5=MAX,99=ERR)", "$calc_State?", "c"],
["dbg Fehlertext", "Textuelle Beschreibung des Zustands/Fehlers", "$calc_FehlerText?", "c"],
["dbg Feuchte geglättet", "Geglättete Feuchte (absolut in %)", "$calc_Feuchte_geglaettet?", "c"]
]
}
"Der Schöpfer dieses Modbus Geräte Profiles überträgt die Nutzungsrechte gemäß der TOLL ("Timberwolf Open Logikblock License") die unter