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