Mir ist aufgefallen seitdem ich diesen LBS nutze, dass die LBS RUN im Minimum der Anzahl der Betriebsstundenzähler entspricht.
Deshalb habe ich den Code mal genauer betrachtet und *räusper* einen Bug gefunden.
Das Spannende ist das Ende (else if ($E[1]['value']==0) - habe ich dazu gedichtet.
Das Problem war, die gestartete Schleife hat sich nie beendet/beenden können, wenn $E1=0 wird. Der Stopp der Schleife war nämlich in if ($E[1]['value']>0) und da war kein drankommen mehr.
In der Folge ist der LBS munter in seiner Schleife weitergelaufen. War auch ersichtlich in der Live-Ansicht im Logikeditor.
Vielleicht kannst Du (weiss grad nicht wer den LBS geschrieben hat) das prüfen und nach Deinem Gusto ändern.
Deshalb habe ich den Code mal genauer betrachtet und *räusper* einen Bug gefunden.
Code:
###[DEF]### [name =Betriebsstundenzähler modifiziert ] [e#1 =Eingangssignal ] [e#2 =Frequenz Ausgabe Zähler in Sekunden #init=60 ] [e#3 =Maximumwert der als AUS interpretiert wird #init=0] [e#4 =akuteller Stand (remanent) ] [a#1 =aktueller Zählerstand in Stunden ] [v#1 =letze Signalauswertung high ] ###[/DEF]### ###[HELP]### Dieser Baustein ermöglich es die Betriebsstunden eines Geräte mitzuloggen Eingang 1: Wert der anzeigt ob Gerät in Betrieb ist Eingang 2: Frequenz der überprüfung und remanenten Ablage des Zählers Eingang 3: Maximumwert, der für Gerät im Aus-Zustand steht Eingang 4: aktueller Stand remanent (da keine Remanenten Bausteine in EDOMI) Ausgang 1: Ausgabe aktueller Zählerstand bei Veränderungen Der Baustein wird durch die Zeitschleife immer neu getriggert, Zählt aber auch anhand der eintreffenden Signale an Eingang 1 weiter. Unbedingt Ausgang 1 über ein remanentes KO mit Eingang 4 verbinden ! ###[/HELP]### ###[LBS]### <? function LB_LBSID($id) { if (($E=logic_getInputs($id)) && ($V=logic_getVars($id))) { if ($E[1]['value']>0) { if (logic_getState($id)==0) { // Baustein ist nicht gelaufen, Start der Schleife logic_setState($id,1,$E[2]['value']*1000,true); //Baustein automatisch nach e#2 Sekunden erneut aufrufen // if ($debug) writeToCustomLog('LBS19000337 Betriebsstundenzähler',1,'Start Zähler'); } // wenn refresh von e#2 bis e#4 ausgeht, raus aus dem LBS if ($E[2]['refresh'] || $E[3]['refresh'] || $E[4]['refresh']) return; $betriebsstunden = $E[4]['value']; // folgendes machen wir immer, egal ob Trigger e#1 oder Loop if ($V[1] > 0) { //Nachdem der Startwert gesetzt ist, muss die verstrichene Zeit als aktiv bewertet werden $betriebsstunden = $betriebsstunden + ((time()-$V[1]) / 3600 ); } if ($E[1]['value'] > $E[3]['value']) { // Verbraucher aktiv logic_setVar($id,1,time()); } // else { //Verbraucher inaktiv // logic_setVar($id,1,0); // logic_setState($id,0); // } if ($betriebsstunden != $E[4]['value']) {logic_setOutput($id,1,$betriebsstunden);} }else if ($E[1]['value']==0) { if (logic_getState($id)==1) { logic_setVar($id,1,0); logic_setState($id,0); } } } } ?> ###[/LBS]### ###[EXEC]### <? ?> ###[/EXEC]###
Das Problem war, die gestartete Schleife hat sich nie beendet/beenden können, wenn $E1=0 wird. Der Stopp der Schleife war nämlich in if ($E[1]['value']>0) und da war kein drankommen mehr.
In der Folge ist der LBS munter in seiner Schleife weitergelaufen. War auch ersichtlich in der Live-Ansicht im Logikeditor.
Vielleicht kannst Du (weiss grad nicht wer den LBS geschrieben hat) das prüfen und nach Deinem Gusto ändern.
Kommentar