Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Seite 2 von 3 ErsteErste 123 LetzteLetzte
Ergebnis 11 bis 20 von 28

Thema: Frequenzberechnung in SCL

  1. #11
    Registriert seit
    22.11.2005
    Ort
    kl.Odenwald
    Beiträge
    716
    Danke
    111
    Erhielt 85 Danke für 71 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Probiers mal so. Impuls_Fl als Boolsche Variable (statisch oder IN_OUT) definieren

    Code:
    IF Impuls = true  and not Impuls_Fl THEN
        T := Zaehlwert/10 ;
    ...
         END_IF;
    Impuls_Fl := Implus
    hth

  2. #12
    M-Arens ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    02.09.2004
    Beiträge
    108
    Danke
    12
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Zitat Zitat von kiestumpe Beitrag anzeigen
    Probiers mal so. Impuls_Fl als Boolsche Variable (statisch oder IN_OUT) definieren

    Code:
    IF Impuls = true  and not Impuls_Fl THEN
        T := Zaehlwert/10 ;
    ...
         END_IF;
    Impuls_Fl := Implus
    hth
    So klappt es gar nicht, da wird die If Bedingung nie erfüllt.
    Code:
    VAR_INPUT
      // Eingangsparameter
      Impuls    : BOOL;
      Zaehlwert  : DINT;     //Zählwert *100 = T in ms
    END_VAR
    
    VAR_IN_OUT
      // Durchgangsparameter
      Freigabe  : BOOL;
      Impuls_Fl : BOOL;
    END_VAR
    
    VAR_OUTPUT
     // Ausgangsparameter
      Reset     : BOOL;     //Rücksetzen des Zählers im OB35
      Frequenz  : DINT;     //Frequenz im REAL Format  
    END_VAR
    
    VAR_TEMP
      // temporäre Variablen
      T         : DINT;     //Zeitwert T als DINT
      T_REAL    : REAL;     //Zeitwert T als Real
      F_REAL    : REAL;     //Frequenz F als Real
    END_VAR
    
      // Anweisungsteil
      // Zeitwert T auslesen und angleichen
      IF Impuls = true AND NOT Impuls_Fl THEN
        T := Zaehlwert/10 ;
        T_REAL := DINT_TO_REAL ( T );
        F_REAL := 1/T_REAL ;
        Frequenz := ROUND(F_REAL) ;
        
        IF Freigabe = true THEN
          Frequenz := ROUND(F_REAL) ;
          Freigabe := false ;
        END_IF;
        
        Impuls_Fl := Impuls;
        Reset := true;
        
      ELSE
        // Anweisungsteil_ELSE
        Reset := false;
        Freigabe := true ;
      END_IF;
    Gruß M-Arens

  3. #13
    Registriert seit
    22.11.2005
    Ort
    kl.Odenwald
    Beiträge
    716
    Danke
    111
    Erhielt 85 Danke für 71 Beiträge

    Standard

    Du musst:


    Impuls_Fl := Impuls

    natürlich ausserhalb deiner IF-Schleife setzen.


    Mit was hast du die neue IN-OUT variable beschaltet ?

    hth

  4. #14
    M-Arens ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    02.09.2004
    Beiträge
    108
    Danke
    12
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Da ist nen Merker dran!
    91.1 oder so, halt nen freier Merker
    Gruß M-Arens

  5. #15
    Registriert seit
    22.11.2005
    Ort
    kl.Odenwald
    Beiträge
    716
    Danke
    111
    Erhielt 85 Danke für 71 Beiträge

    Standard

    Also Irgendwie versteh ich deine Aufgabenstellung nicht so ganz, was soll der Baustein ausgeben, wenn kein Impuls da ist? Dir fehlt die Zuweisung dafür.

    Wenn ich's richtig verstehe steht Imuls einige Zeit an und dabe soll einmal die Freigabeschleife durchgeführt werden?

    Wenn ja, mach die Flankenabfrag halt in die innere IF-Schleife.

    hth

  6. #16
    M-Arens ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    02.09.2004
    Beiträge
    108
    Danke
    12
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Also wenn der Impuls ansteht soll der einmal die If schleife durchlaufen werden und dann das ergebnis in dem Ausgang Frequenz gespeichert werden. bis zum nächsten Impuls.
    Gruß M-Arens

  7. #17
    Registriert seit
    22.11.2005
    Ort
    kl.Odenwald
    Beiträge
    716
    Danke
    111
    Erhielt 85 Danke für 71 Beiträge

    Standard

    Und wann wird das Freigabesignal gesetzt, bzw. wo kommt es her?

    Du solltest hierfür auf jeden Fall einen FB verwenden, falls noch nicht geschehen.

  8. #18
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.218
    Danke
    533
    Erhielt 2.696 Danke für 1.948 Beiträge

    Standard

    Zitat Zitat von kiestumpe Beitrag anzeigen
    Du musst:


    Impuls_Fl := Impuls

    natürlich ausserhalb deiner IF-Schleife setzen.


    hth
    Das muß du ganz sicher so machen, Impuls_FI soll immer den Wert von Imuls zugewiesen bekommen und zwar nach Ausführung deines SCL-Bausteines, also am Ende. Wenn dann der Eingang (Impuls ist ein Eingang, wenn ich das richtig in Erinnerung habe) von False auf True wechselt ist Impuls_Fl noch False und zwar genau ein Mal.
    Die Bedingeung If Impuls and not Impulse_Fl ist jetzt erfüllt.
    Am Ende des Bausteins Imuls_Fl := Impuls.
    Beim nächsten Durchgang dann ist deine Bedingung nicht erfüllt, da Impuls True und Impuls_Fl True. Wenn dann Impuls wieder False wird, ist deine Bedingung nicht erfüllt, da Impuls False und Impuls_Fl True.
    Hier kommts jetzt, in deinem Code wird Impuls_Fl nie mehr False!!! Deshalb ans Ende mit der Zeile.
    Ich würde RESET als INOUT-Variable anlegen und im OB35 zurücksetzen. Wenn der OB35 das Reset ausgeführt hat, soll er RESET False setze, sonst ist das nicht sicher, je nachdem ob der OB35 öfter aufgerufen wird als das restliche Programm, oder umgekehrt (Die SPS könnte auch mal 40ms Zykluszeit haben)
    Gruß
    Ralle

    ... there\'re 10 kinds of people ... those who understand binaries and those who don\'t …
    and the third kinds of people … those who love TIA-Portal

  9. #19
    M-Arens ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    02.09.2004
    Beiträge
    108
    Danke
    12
    Erhielt 0 Danke für 0 Beiträge

    Frage

    Also ich habe das alles jetzt mal in einen FB gemacht, aber der Aufruf kommt trotzdem nicht bei jedem Impuls.
    Zum Testen habe ich an den Impuls Eingang einen Taktmerker mit 2Hz geschltet, mein OB 35 wird alle 10ms aufgerufen und zählt bei jedem auf 1 bei meinem Zählwert hinzu. Zurückgesetzt auf 0 wird der Zählwert wenn der Reset ausgang aus meinem Baustein kommt (habe Ihn jetzt mal als In-Out gemacht).
    So, das ist jetzt mal der ganze FB:
    Code:
    FUNCTION_BLOCK FB102
    TITLE = 'Frequenzberechnung'
    //
    // In diesem Baustein wird die Frequenz berechnet mit der, der
    // Druck auf und abgebaut wird.
    //
    VERSION : '1.0'
    AUTHOR  : MA
    NAME    : F_Ber
    FAMILY  : Tools
    
    
    // Bausteinparameter
    VAR_INPUT
      // Eingangsparameter
      Impuls    : BOOL;
      Zaehlwert  : DINT;     //Zählwert *100 = T in ms
    END_VAR
    
    VAR_IN_OUT
      // Durchgangsparameter
      Reset     : BOOL;     //Rücksetzen des Zählers im OB35
    END_VAR
    
    VAR_OUTPUT
     // Ausgangsparameter
     Frequenz  : DINT;     //Frequenz im REAL Format  
    END_VAR
    
    VAR_TEMP
      // temporäre Variablen
    
    END_VAR
    VAR
      // statische Variablen
      T         : DINT;     //Zeitwert T als DINT
      T_REAL    : REAL;     //Zeitwert T als Real
      F_REAL    : REAL;     //Frequenz F als Real
      Freigabe  : BOOL;
      Impuls_Fl : BOOL;
    END_VAR
    
      // Anweisungsteil
      // Zeitwert T auslesen und angleichen
      IF Impuls = true AND NOT Impuls_Fl THEN
        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;
      
      Impuls_Fl := Impuls;
    END_FUNCTION_BLOCK
    Aber ich habe da noch ein Problem, wenn die Schleife ausgeführt wird, bekomme ich bei dieser Zeile F_REAL := 1/T_REAL ; ein falsches ergebnis.
    T_REAL = 5.00 und er berechnet mir für F_REAL einen negativen Wert. Schaut es euch selber im Bild an.
    Angehängte Grafiken Angehängte Grafiken
    Gruß M-Arens

  10. #20
    Registriert seit
    22.11.2005
    Ort
    kl.Odenwald
    Beiträge
    716
    Danke
    111
    Erhielt 85 Danke für 71 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    sorry, ich kann da keine negativen Wert erkennen !?

    Wo soll der sein?

    Ausserdem müßte der Zählwert doch eher f sein, dein FB funktioniert irgendwie grad reziprok (falschrum/Kehrwert)
    Geändert von kiestumpe (09.02.2007 um 09:05 Uhr)

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •