NEU! UPGRADE IP 10 verfügbar!
Optimierte Darstellung von VISU Editor und VISU Client - sowie viele weitere Verbesserungen
Infos im Wiki: https://elabnet.atlassian.net/l/cp/8HzePCm3

Insider & Leistungsmerkmale FÜR ALLE freigeschaltet
Ab sofort kann jeder die neue VISU & IFTTT testen. Info: viewtopic.php?f=8&t=5074

Release V 4 am 15. Juni 2024
Es gibt nun einen fixen Termin. Info: viewtopic.php?f=8&t=5117

NEU! Ausführliches Video Tutorial zur IP 10
Jetzt werden alle Fragen beantwortet. Das Video: https://youtu.be/_El-zaC2Rrs

[DISKUSSION] Fragen zur State Machine

Informationen und Diskussionen über Logik-Engine und Logik-Editor
Forumsregeln
  • Denke bitte an aussagekräftige Titel und gebe dort auch die [Firmware] an. Wenn ETS oder CometVisu beteiligt sind, dann auch deren Version
  • Bitte mache vollständige Angaben zu Deinem Server, dessen ID und dem Online-Status in Deiner Signatur. Hilfreich ist oft auch die Beschreibung der angeschlossener Hardware sowie die verwendeten Protokolle
  • Beschreibe Dein Projekt und Dein Problem bitte vollständig. Achte bitte darauf, dass auf Screenshots die Statusleiste sichtbar ist
  • Bitte sei stets freundlich und wohlwollend, bleibe beim Thema und unterschreibe mit deinem Vornamen. Bitte lese alle Regeln, die Du hier findest: https://wiki.timberwolf.io/Forenregeln

MiniMaxV2
Reactions:
Beiträge: 274
Registriert: Sa Jan 12, 2019 8:41 pm
Wohnort: Bremen
Hat sich bedankt: 342 Mal
Danksagung erhalten: 151 Mal

#21

Beitrag von MiniMaxV2 »

Hi Robert,
jetzt verwirrst du mich. :angry-banghead:
Die folgende Zeile:

Code: Alles auswählen

["$SystemRequestInternal", 0, 1, "$SystemForerun"], // new request
Ist bei mir z.B. der Übergang in den Startzustand. Z1 ist der "Vorlauf". Z1 bleibt genau die Zeit bestehen, wie "SystemForerun" definiert. Nach der Zeit Triggert die Logik und arbeitet alles von oben ab, wodurch die folgende Zeile als nächstes greift:

Code: Alles auswählen

[0, 1, 2, "$PumpForerun"], // system forerun done
Hier Verbleiben wir in Z2 so lange wie "PumpForerun" definiert. Danach gehts mit

Code: Alles auswählen

[0, 2, 3, 0], // pump forerun done, system fully operating
in Z3 und da bleiben wir, bis ein Eingang die Logik wieder triggert.

Das tut ja auch alles. Es wird nach den Zeiten die Logik komplett getriggert und von oben abgearbeitet.
Heißt für mich, ist das "Timeout" nur eine Angabe, wann die Logik wieder triggern soll. Was dann passiert, definiert wieder die Logik durch die Auswertung aller Module.
Daher hatte ich bei deiner Logik gesehen, dass der nicht abgebrochene "Timeout" zu einem fehlerhaften Zustandsübergang führen kann (ich hoffe die Erklärung im vorherigen Post war verständlich).

Vielleicht kann @S. Kolbinger etwas Licht ins Dunkle bringen, was genau nun der Timeout in der StateMachine macht ("nur" die Logik triggern oder die Übergänge beeinflussen)?
LG
Hans Martin
timberwolf413 (950Q) - VPN offen - reboot erlaubt / timberwolf610 (950Q) - VPN offen - reboot erlaubt

Ersteller
Robert_Mini
Reactions:
Beiträge: 3744
Registriert: So Aug 12, 2018 8:44 am
Hat sich bedankt: 1167 Mal
Danksagung erhalten: 2076 Mal

#22

Beitrag von Robert_Mini »

Hallo Hans-Martin!

Probier das mal aus. Funktioniert mit Timeouts ohne zusätzlichen Timern o.ä.

lg
Robert

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"]
    ]
}

Timberwolf Server 2500 / #117 (VPN offen + reboot nach Rückfrage) / zusätzlich: 3500M/#935, 3500L/#1297

MiniMaxV2
Reactions:
Beiträge: 274
Registriert: Sa Jan 12, 2019 8:41 pm
Wohnort: Bremen
Hat sich bedankt: 342 Mal
Danksagung erhalten: 151 Mal

#23

Beitrag von MiniMaxV2 »

Hi Robert,
Jetzt hab ichs verstanden und ein Detail gelernt. Es gibt also im Hintergrund einen Timer, der mit der 0 abgefragt wird ob er getriggert hat. Der kann aber durch einen anderen Übergang überschrieben werden. Sprich wird vorher ein Übergang genommen, wird der vorherige Timer gelöscht.
LG
Hans Martin
timberwolf413 (950Q) - VPN offen - reboot erlaubt / timberwolf610 (950Q) - VPN offen - reboot erlaubt

Ersteller
Robert_Mini
Reactions:
Beiträge: 3744
Registriert: So Aug 12, 2018 8:44 am
Hat sich bedankt: 1167 Mal
Danksagung erhalten: 2076 Mal

#24

Beitrag von Robert_Mini »

Hallo Hans-Martin!

Richtig. Find ich eine extrem coole Lösung insbesondere auch die Tatsache, dass der Timer beim Übergang zugeordnet wird und nicht fest zum Zustand gehört. So kann man je nach Absprung-State einen anderen Timeout setzen!

Danke @S. Kolbinger!

lg
Robert
Timberwolf Server 2500 / #117 (VPN offen + reboot nach Rückfrage) / zusätzlich: 3500M/#935, 3500L/#1297

S. Kolbinger
Elaborated Networks
Reactions:
Beiträge: 588
Registriert: Mi Aug 15, 2018 11:34 am
Hat sich bedankt: 82 Mal
Danksagung erhalten: 559 Mal

#25

Beitrag von S. Kolbinger »

Hallo Hans-Martin(@MiniMaxV2) ,

herzlichen Dank, dass du hier die Fragen so detailliert beantwortest.
Ich habe aktuell wenig Zeit und kann nicht immer gleich reagieren.
Umso mehr bin ich begeistert, wenn du mit deinem Fachwissen so kompetent weiter hilfst. :bow-yellow:

Hallo Robert,
Robert_Mini hat geschrieben: So Mai 10, 2020 8:40 pm Richtig. Find ich eine extrem coole Lösung insbesondere auch die Tatsache, dass der Timer beim Übergang zugeordnet wird und nicht fest zum Zustand gehört. So kann man je nach Absprung-State einen anderen Timeout setzen!
das freut mich sehr, dass dir diese Lösung gefällt.
Vor allem da mir der Zustandsautomat ziemliche Kopfschmerzen bereitet hat, insbesondere die Integration zeitlicher Bedingungen (aka Timeouts).
Ich bin erleichtert, dass du es als Bereicherung ansieht, die Timeouts für jeden Übergang individuell und nicht nur per Zustand setzen zu können.
War mir nicht sicher, ob es nicht als zu flexibel (kompliziert) eingestuft wird.

Umso mehr freue ich mich, dass das Modul "Statemachine" so gut angenommen wird. :dance:
Es lohnt sich wirklich, sich damit genauer auseinander zu setzen.
Aktuell ist es das Modul mit den meisten Einsatzmöglichkeiten und erlaubt auch komplexere Aufgaben kompakt und übersichtlich umzusetzen.

Weiter so :clap: :clap: :clap:
Gruß,
Stefan K.
Antworten

Zurück zu „Logikengine & Logik-Editor“