Frequenzberechnung in SCL

Zuviel Werbung?
-> Hier kostenlos registrieren
Die Mathematik stimmt, 1/50 sind 0,02 daß ist 2*10^-2, soviel erstmal zum reinen Rechnen.

Zu Umrechnung an sich:

der OB35 wird alle 10ms aufgerufen, du hast einen Zählwert von 50. Das bedeutet, daß du zwischen den Imulsen 500 ms liegen. Daß heißt du hast umgerechnet 2 Impulse in einer Sekunde, also 2 Hz. Die Formel muß also lauten: f = 1000/(Zählwert*10), oder einfach f = 100/Zählwert. Noch ne Frage, wie hoch ist die Zykluszeit deiner SPS?

Zaehlwert : DINT; //Zählwert *100 = T in ms
wie kommst du darauf bei 10ms OB35?
 
Zuletzt bearbeitet:
Einspruch ;)

Die Frequenz gibt doch an, wie oft ein Ereignis bzw. Impuls pro Sekunde eintritt. Also muss da irgendwas mit...
f := ... * Zaehlwert stehen,
(siehe auch mein voriger Beitrag)
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Also meine Berechnung läuft jetzt Richtig :p
Aber der AufRuf der IF Bedingung kommt nicht jeden Impuls sondern mal nach 2, dann erst wieder nach 5. Also so wie er will :(:confused:

Meine Zykluszeit ist im Moment weil ich am Testen bin und fast nichts drin ist bei 1ms.
Hier jetzt das aktuelle Programm mit dem die berechnung jetzt läuft.

Code:
// Bausteinparameter
VAR_INPUT
  // Eingangsparameter
  Impuls    : BOOL;
  Zaehlwert : DINT;     
END_VAR

VAR_IN_OUT
  // Durchgangsparameter
  Reset     : BOOL;    
END_VAR

VAR_OUTPUT
 // Ausgangsparameter
 Frequenz  : DINT;       
END_VAR


VAR
  // statische Variablen
  Impuls_Fl : BOOL;
END_VAR


  IF Impuls AND NOT Impuls_Fl THEN
    Frequenz := 1000/(Zaehlwert) ;
    Reset := true;
  ELSE
    Reset := false;
  END_IF;
    Impuls_Fl := Impuls;
    
END_FUNCTION_BLOCK
 
Das sollte aber so gehen, mit der Flanke, hab mit das Compilerergebnis mir mal in AWL angeschaut, paßt so. Wieso 1000 ??? in der Division?

@Kiestumpe

der Zählwert zählt doch, wie oft der OB35 zwischen zwei Flanken aufgerufen wurde. Der Zählwert * 10 (OB35 wird alle 10ms aufgerufen) ergibt die Zeit zwischen zwei Flanken also T in ms. Frequenz = 1/T. (T in Sek.) Ergo ertmal umrechnen in Sekunden, f= 1000/(Zählwert*10). :rolleyes:
 
Das sollte aber so gehen, mit der Flanke, hab mit das Compilerergebnis mir mal in AWL angeschaut, paßt so. Wieso 1000 ??? in der Division?

@Kiestumpe

der Zählwert zählt doch, wie oft der OB35 zwischen zwei Flanken aufgerufen wurde. Der Zählwert * 10 (OB35 wird alle 10ms aufgerufen) ergibt die Zeit zwischen zwei Flanken also T in ms. Frequenz = 1/T. (T in Sek.) Ergo ertmal umrechnen in Sekunden, f= 1000/(Zählwert*10). :rolleyes:

Stimmt, hast recht - der Zählwert misst die Zeit, war etwas verwirrt-sorry.
Vorrausetzung bei FB-s laufen im OB35.
 
Macht das was aus wenn die Bedingung erst einen Zyklus Später erfüllt wird?
Mein Vorschlag für die Flanke:
Code:
          IF Not Impuls THEN
          Impuls_Fl:=False;
          END_IF; 
 
          IF Impuls = true AND NOT Impuls_Fl THEN
            Impuls_Fl:=True;
            T := Zaehlwert/10 ;
            T_REAL := DINT_TO_REAL ( T );
            F_REAL := 1/T_REAL ;
            Frequenz := ROUND(F_REAL) ;
            Reset := true;
    
         ELSE
          // Anweisungsteil_ELSE
          Reset := false;

         END_IF;

Gruss Andy
 
So ich habe es jetzt mit diesem Code zum laufen gebracht:
Code:
IF Not Impuls THEN
    Impuls_Fl:=False;
  END_IF; 

  IF Impuls = true AND NOT Impuls_Fl THEN
    Impuls_Fl:=True;
    Frequenz := 100/(Zaehlwert) ;
    Reset := true;

  ELSE
    // Anweisungsteil_ELSE
    Reset := false;

  END_IF;

Vielen Dank an alle die mir hier geholfen haben.
 
Zuletzt bearbeitet:
Zurück
Oben