Autor Thema: Zykluszeitberechnung im Programm  (Gelesen 8617 mal)

Offline radar17892

  • Full Member
  • ***
  • Beiträge: 420
  • Think easy!
Zykluszeitberechnung im Programm
« 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.
« Letzte Änderung: Januar 12, 2013, 13:36:12 Nachmittag von radar17892 »
Weil Einfach einfach Einfach ist!

Offline radar17892

  • Full Member
  • ***
  • Beiträge: 420
  • Think easy!
Re:Zykluszeitberechnung im Programm
« Antwort #1 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=> );


« Letzte Änderung: September 01, 2015, 18:51:28 Nachmittag von radar17892 »
Weil Einfach einfach Einfach ist!