Probier das mal aus. Funktioniert mit Timeouts ohne zusätzlichen Timern o.ä.
Code: Alles auswählen
/**===========================================================
Sperrt den Zulauf, wenn ein max. Füllstand erreicht ist und
der Zulauf aktiv ist. Danach sperrt sich die Logik selbst, bis
die Sperre aufgehoben wird.
============================================================*/
{
"Level":[
["$I_Status_IN","bool",false],
["$I_Status_SV","bool",false],
["$I_Timeout_Laden","float",0.0],
["$I_Timeout_Maehen","float",0.0],
["$I_Timeout_Warten","float",0.0],
["$I_Timeout_Suchen","float",0.0],
["$I_Timeout_SV_Maehen","float",0.0],
["$Timeout_Laden","float",0.0],
["$Timeout_Maehen","float",0.0],
["$Timeout_Warten","float",0.0],
["$Timeout_Suchen","float",0.0],
["$Status_EinAus","bool",false],
["$State","integer",0],
["$Konst1","float",1.0],
["$Konst0","float",0.0],
["$Konst60","float",60.0],
["$KonstTrue","bool",true],
// state transition inputs
["$SV_on_and_IN","bool",false],
["$SV_on_and_OUT","bool",false],
["$SV_off_and_IN","bool",false],
["$SV_off_and_OUT","bool",false],
//
["$StatusMaehen","bool",false],
["$StatusFehler","bool",false],
["$StatusLaden","bool",false],
["$StatusWarten","bool",false],
["$ResetMaehen","bool",false],
["$ResetLaden","bool",false],
["$DauerMaehen","float",0.0],
["$DauerMaehen_Minuten","float",0.0],
["$DauerMaehen_Minuten_vorher","float",0.0],
["$DauerLaden","float",0.0],
["$DauerLaden_Minuten","float",0.0]
],
"Module":[
["And" , ["$I_Status_SV","$I_Status_IN"], "$SV_on_and_IN"],
["And" , ["-$I_Status_SV","$I_Status_IN"], "$SV_off_and_IN"],
["And" , ["$I_Status_SV","-$I_Status_IN"], "$SV_on_and_OUT"],
["And" , ["-$I_Status_SV","-$I_Status_IN"], "$SV_off_and_OUT"],
// build state
["Statemachine",
// 0: Fehler SV
// 1: Suchen
// 2: Laden
// 3: Maehen
// 4: Warten mit SV
// 5: Warten ohne SV
// 6: Fehler Maehzeit
[
// [condition , current state, next state, timeout]
// Zustand 0 Fehler SV
["$SV_on_and_OUT",0,1,"$I_Timeout_Suchen"], //Suchen bei SV ein wenn draußen
["$SV_on_and_IN",0,2,"$I_Timeout_Laden"], //Wenn in Ladestation, direkt in Zustand Laden wechseln
// Zustand 1 Suchen
["$SV_on_and_IN",1,2,"$I_Timeout_Laden"], //Von Suchen in Zustand Laden wechseln, Timer starten
["$SV_off_and_OUT",1,0,0], //Zurück in Fehler SV
[0,1,0,0], //Zurück in Fehler SV
// Zustand 2 Laden
["$SV_off_and_IN",2,0,0], //Fehler SV (SV aus während Laden)
["$SV_on_and_OUT",2,3,"$I_Timeout_Maehen"], //Beginn Mähen nach Laden, Timer starten
[0,2,4,"$I_Timeout_Warten"], //TimeOut => Ende Laden => Warten, Timer Warten starten
// Zustand 3 Maehen
["$SV_off_and_OUT",3,7,"$I_Timeout_SV_Maehen"], //Fehler SV (SV aus während Mähen)
["$SV_on_and_IN",3,2,"$I_Timeout_Laden"], //Mäher kehrt zurück => Laden, Timer starten
[0,3,6,"$I_Timeout_SV_Maehen"], //TimeOut => Fehler Mähen
// Zustand 4 Warten mit SV
["$SV_on_and_OUT",4,3,"$I_Timeout_Maehen"], //Beginn Mähen nach Warten, Timer starten
["$SV_off_and_IN",4,5,0], //Warten in Ladestation ohne SV
[0,4,5,0], //Timeout Warten nach Laden => Logik schaltet SV aus
// Zustand 4 Warten ohne SV
["$SV_off_and_OUT",5,0,0], //Fehler SV (manuell oder Mäher startet ohne SV)
["$SV_on_and_IN",5,4,0], //Wechsel zurück in Warten mit SV
// Zustand 6 Fehler Maehen
["$SV_off_and_OUT",6,0,0], //Fehler SV (SV manuell aus während Fehler Mähen)
[0,6,0,0], //Fehler SV (SV manuell aus während Fehler Mähen)
["$SV_on_and_IN",6,2,"$I_Timeout_Laden"], //Mäher zurück nach Fehler => Beginn Laden
// Zustand 7 Fehler SV während Mähen
["$SV_on_and_OUT",7,3,"$I_Timeout_Maehen"], //Maehen fortsetzen, Timeout müsste reduziert werden
["$SV_off_and_IN",7,0,0], //Fehler SV, Maeher zurueckgebracht
[0,7,0,0] //Timeout_SV_Naehen => Fehler SV
],"$State"],
["Latch","$DauerMaehen_Minuten","$DauerMaehen_Minuten_vorher","$KonstTrue",0],
["Multiplexer",["$Konst0","$Konst0","$Konst0","$Konst1","$Konst0","$Konst0","$Konst0","$Konst0"],"$StatusMaehen","$State"],
["HobbsMeter","$StatusMaehen","$DauerMaehen","$ResetMaehen"],
["Multiplexer",["$Konst0","$Konst0","$Konst1","$Konst0","$Konst0","$Konst0","$Konst0","$Konst0"],"$StatusLaden","$State"],
["HobbsMeter","$StatusLaden","$DauerLaden","$ResetLaden"],
//In Minuten umrechnen
["Polynomial", "$Konst60", "$DauerMaehen_Minuten",["$Konst0", "$DauerMaehen"]],
["Polynomial", "$Konst60", "$DauerLaden_Minuten",["$Konst0", "$DauerLaden"]]
//["Polynomial", "$Konst1", "$Temp_Soll",["$I_Temp_Soll", "$I_Offset"]],
//["Ratio","$Konst100","$Steigung","$I_Delta_T_Max"],
//["Limiter","$Hoehe_Soll","$Hoehe_Soll_Lim","$Val_ok",["$I_Hoehe_Min", "$I_Hoehe_Max"]],
//["Comparator", "$I_Hoehe_Min", "$SelectHoehe", "$Hoehe_Soll"],
//["Multiplexer",["$Konst0","$Hoehe_Soll_Lim"],"$Hoehe_Soll_Lim","-$SelectHoehe"],
//["Or" , ["$Val_Large1" , "$Val_Large2"], "$Val_Large"],
//["And" , ["-$Val_Large" , "-$Val_Null"], "$Val_Small"],
//["Monoflop","$Val_Large",0,"$Timer_Large","$I_Delay",1],
//["Latch","$Hoehe_Soll_Step","$Hoehe_Soll_StepB","$Val_Large",0],
//["Clocksignal","$ConstTRUE","$Clk","$Period"],
//["HobbsMeter","$State","$Time","$Reset"],
],
"Input":[
["Status Ladestation","Ladestation belegt=true","$I_Status_IN","c"],
["Status SV","Ladestation belegt=true","$I_Status_SV","c"],
["Timeout Laden","Dauer bevor von Mähen auf Warten weitergeschaltet wird","$I_Timeout_Laden","c"],
["Timeout Mähen","Dauer bis Fehler Mähen","$I_Timeout_Maehen","c"],
["Timeout Warten","Dauer bis SV off nach Ende Laden","$I_Timeout_Warten","c"],
["Timeout Suchen","Dauer bis SV off bei Suche","$I_Timeout_Suchen","c"],
["Timeout SV Mähen","Dauer","$I_Timeout_SV_Maehen","c"]
],
"Output":[
["State","","$State","c"],
["Dauer Mähen","","$DauerMaehen_Minuten","c"],
["Dauer Laden","","$DauerLaden_Minuten","c"],
["Dauer Maehen_Alt","","$DauerMaehen_Minuten_vorher","c"]
//["Debug Val_Small","","$Val_Small","a"]
]
}