Ich suche einen Frequenzbaustein

Tmbiz

Level-2
Beiträge
642
Reaktionspunkte
21
Hallo, ich meine es gibt in der Bibliothek einen Frequenzbaustein. Diesen möchte ich in SCL SPS 1500 nutzen. Kann mir jemand sagen was es da gibt und wie der hiesst?

Nachtrag:
Sorry, er soll am Ausgang eine bestimmte Frequenz ausgeben. Ich meine es gibt einen Baustein, welcher mehrere Frequenzen ausgeben kann
 
Zuletzt bearbeitet:
Was soll denn der "FrequenzBaustein" können? Ein AusgangsSignal mit einer bestimmten Frequenz erzeugen? Die Frequenz eines EingangsSignals "messen" bzw. Frequenzen erkennen, die in einem bestimmten Bereich liegen? Oder geht es um digitale Filter?
 
Meinst du sowas?
Code:
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

Das hab ich mir mal gebastelt um auf mehreren CPUs einen Synchronen Takt zu haben.
 
Zurück
Oben