Zeiten in der Visu anzeigen

Zuviel Werbung?
-> Hier kostenlos registrieren
Habe jetzt glaube ich die richtige Formel gefunden!
Anbei der Code:

Flanke(CLK:= Takt, Q=> ); //Erkennung Taktflanke
IF (IN AND Flanke.Q) THEN //Sekunden hochzählen
BetrsecAbsolut := BetrsecAbsolut + 1;
END_IF
IF ResetFb THEN
BetrsecAbsolut :=0;
END_IF
//aus BetrsecAbsolut Tage Stunden Minuten Sekunden bilden
BetrTag := ( BetrsecAbsolut / 86400 );
Betrstd := (( BetrsecAbsolut /3600 ) - (BetrTag *24));
Betrmin := ((( BetrsecAbsolut /60) - (Betrstd *60))-(BetrTag*1440));
Betrsec := ( BetrsecAbsolut -(Betrstd*3600 )) -( Betrmin*60);
// Umwandeln nach formatierten String
BetrString := RIGHT(UDINT_TO_STRING(BetrTag + 1000),3);
BetrString := CONCAT (BetrString, 'd_');
BetrString := CONCAT (BetrString,RIGHT(UDINT_TO_STRING(Betrstd +100),2));
BetrString := CONCAT (BetrString, 'h_');
BetrString := CONCAT (BetrString,RIGHT(UDINT_TO_STRING(Betrmin+100),2));
BetrString := CONCAT (BetrString, 'm_');
BetrString := CONCAT (BetrString,RIGHT(UDINT_TO_STRING(Betrsec+100),2));
BetrString := CONCAT (BetrString, 's');
 
BetrTag := ( BetrsecAbsolut / 86400 );
Betrstd := (( BetrsecAbsolut /3600 ) - (BetrTag *24));
Betrmin := ((( BetrsecAbsolut /60) - (Betrstd *60))-(BetrTag*1440));
Betrsec := ( BetrsecAbsolut -(Betrstd*3600 )) -( Betrmin*60);
Die Modulo-Funktion berechnet den DivisionsRest.
Genau dasselbe tust Du, wenn Du z.B. Betrstd := (( BetrsecAbsolut / 3600 ) - (BetrTag * 24)); rechnest und dabei das Ergebnis der vorausgehenden Division mit dem Disvisor multiplizierst und von dem vorherigen Wert subtrahierst.
 
Danke für die Hinweise zum besseren Code, also hier nun mit Tagen und modulo ...

FUNCTION_BLOCK OperationDayHour VAR_INPUT IN : BOOL; //Betrieb Takt : BOOL; //1Hz Systemtakt END_VAR VAR_OUTPUT BetrTag : UDINT; //Ausgabe Betriebstage Betrstd : UDINT; //Ausgabe Betriebsstunden Betrmin : UDINT; //Ausgabe Betriebsminuten Betrsec : UDINT; //Ausgabe Betriebsekunden BetrString : STRING; //Ausgabe als String END_VAR VAR ///Erkennung Taktflanke Flanke: R_TRIG; END_VAR VAR_IN_OUT BetrsecAbsolut: UDINT; //Ein/Ausgangsvariable Betriebssekunden RETAIN !!! END_VAR Flanke(CLK:= Takt, Q=> ); (*Erkennung Taktflanke*) IF (IN AND Flanke.Q) THEN (*Sekunden hochzählen*) BetrsecAbsolut := BetrsecAbsolut + 1; END_IF Betrsec := BetrsecAbsolut MOD 60; Betrmin := ( BetrsecAbsolut / 60) MOD 60; Betrstd := ( BetrsecAbsolut / 60 / 60 ) MOD 24; BetrTag := ( BetrsecAbsolut / 60 / 60 /24 ); BetrString := RIGHT ( UDINT_TO_STRING( BetrTag + 100000),5); BetrString := CONCAT (BetrString, 'd_'); BetrString := CONCAT (BetrString,RIGHT ( UDINT_TO_STRING( Betrstd + 100000),5)); BetrString := CONCAT (BetrString, 'h_'); BetrString := CONCAT (BetrString, RIGHT ( UDINT_TO_STRING( Betrmin + 100),2)); BetrString := CONCAT (BetrString, 'm_'); BetrString := CONCAT (BetrString, RIGHT ( UDINT_TO_STRING( Betrsec + 100),2)); BetrString := CONCAT (BetrString, 's');

Gruß, Wollvieh.
 
Zurück
Oben