easy-forum

Downloadbereich => Xsoft-CoDeSys => Thema gestartet von: radar17892 am Mai 18, 2012, 20:27:09 Nachmittag

Titel: Zykluszeitberechnung im Programm
Beitrag von: radar17892 am Mai 18, 2012, 20:27:09 Nachmittag
Hallo CoDeSys Freunde

hier mal ein Beispiel zur Ermittlung der Zykluszeit im Programm,
wenn keine feste Zykluszeit eingestellt ist.
Diese kann weiterverarbeitet werden als delta_t in Differenzialberechnungen
zB. Signalglättung, Reglern usw.
Es wird alle zwei Minuten, für 1s die Zyklen gezählt und daraus die Zykluszeit berechnet.


Gruß Thomas

Im Bild eine weitere Variante mit kontinuierlicher Berechnung und Min/Max Statistik über 24h.
Achtung !! Eine automatische Sommer/Winterzeit Umstellung der RTC wurde nicht getestet bzw berücksichtigt.
Titel: Re:Zykluszeitberechnung im Programm
Beitrag von: radar17892 am März 18, 2015, 22:11:01 Nachmittag
Der Baustein mit kontinuierlicher Berechnung in ST

Hinweis: Der FB wurde am 01.09.2015 geändert, da nach einem Kaltstart eines Gerätes, Cy_Timer: TON nicht lief.

FUNCTION_BLOCK Zykluszeit
(*
##################################################################################
Programmbeschreibung:
Berechnung der Zykluszeit in ms und Ausgabe min/max Statistik
kann in Verbindung mit FB Systemzeitgeber verwendet werden
benötigte LIB: util 
getestet auf XV100
##################################################################################
Änderungsindex
Name:TL Version:0.1 Datum: 30.12.14 Grund:   neu
Name:TL Version:0.2 Datum: 01.09.15 Grund:   Änderung Anlaufverhalten
##################################################################################
*)
VAR_INPUT
Tagesbeginn: BOOL; (*Triggersignal Tag beginnt*)
Systemanlauf: BOOL; (*Anlaufmerker (nur im 1.Zykl =1)*)
END_VAR
VAR_OUTPUT
Cyc_min: REAL;
Cyc_max: REAL; (*max Zykluszeit in ms letzte 24h*)
CyZeit: REAL; (*Zykluszeit in ms*)
END_VAR
VAR
MIN_MAX: STATISTICS_REAL; (*Statistik Zykluszeiten*)
Cy_Timer: TON; (*"interne TOD" aus einem Timer erzeugen*)
Cy_Zeit_alt: TIME;
reset: BOOL; (*nur für Testbetrieb*)
END_VAR
##########################################################

(*"interne TOD" aus einem Timer erzeugen*)
Cy_Timer(IN:= NOT (Tagesbeginn OR Systemanlauf OR reset), PT:= t#25h, Q=> , ET=> );
(*Zeitdifferenz berechnen*)
IF(t#0s <> Cy_Timer.ET) AND (t#0s <> Cy_Zeit_alt)
THEN CyZeit:=TIME_TO_REAL(Cy_Timer.ET - Cy_Zeit_alt);
ELSE CyZeit:=15; (*für den 1.Zykl mit 15ms vorbelegen*)
END_IF
Cy_Zeit_alt:=Cy_Timer.ET; (*aktuelle Zeit speichern*)
(*Statistik*)
MIN_MAX(
IN:= CyZeit,
RESET:= Tagesbeginn,
MN=> Cyc_min,
MX=> Cyc_max,
AVG=> );