FUNCTION "Frequenz" : Bool
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
VAR_INPUT
Period : Real; // Periodendauer in Hz
END_VAR
VAR_TEMP
Periodendauer : Real;
Halbwelle : Real;
wechselProMin : UDInt;
Systime {InstructionName := 'DTL'; LibVersion := '1.0'} : DTL;
status : Int;
MilisecOfMin : UDInt;
Per : UDInt;
Takt_2 : UDInt;
END_VAR
VAR CONSTANT
MaxMsPerMin : UDInt := 60000;
END_VAR
BEGIN
#Periodendauer := 1000.0 * (1.0 / #Period); // Periodendauer in Milisekunden errechnen
#Halbwelle := #Periodendauer / 2.0; // halbe Periode errechnen in Milisekunden
#status := RD_SYS_T(#Systime); // aktuelle Systemzeit auslesen
#MilisecOfMin := (#Systime.NANOSECOND / 1000000) + (USINT_TO_UDINT(#Systime.SECOND) * 1000); // die aktuelle Milisekunde der aktuellen Minute errechnen
#wechselProMin := #MaxMsPerMin / REAL_TO_UDINT(#Halbwelle); // Wieviele Nulldurchgänge pro minute?
#Per := #MilisecOfMin / REAL_TO_UDINT(#Halbwelle);
(* wenn eine ungerade anzahl durchgänge pro minute passieren muss bei
jedem Minutenwechsel die Taktrichtung invertiert werden
um keine doppelte Zeit anstehend zu haben beim Minutenwechsel *)
IF #wechselProMin.%X0 = True THEN
IF #Systime.MINUTE.%X0 = true THEN
#Frequenz := #Per.%X0;
ELSE
#Frequenz := NOT #Per.%X0;
END_IF;
ELSE
#Frequenz := #Per.%X0;
END_IF;
END_FUNCTION