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

Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 16 von 16

Thema: Bitte um Hilfe bei einem Problem (zyklische Abfrage)

  1. #11
    Bosga ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    09.04.2008
    Beiträge
    21
    Danke
    5
    Erhielt 3 Danke für 1 Beitrag

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hi Leute,

    erstmal vielen vielen Dank für eure Antworten und somit Hilfe!!!

    Ich werde die vorgeschlagenen Methoden heut oder morgen im Büro gleich mal ausprobieren.
    Hoffe kann mit weiteren Antworten von euch rechnen

    Gruß

    Bosga

  2. #12
    Registriert seit
    01.11.2007
    Beiträge
    1.235
    Danke
    91
    Erhielt 406 Danke für 367 Beiträge

    Standard

    @Larry:
    Du hast natürlich vollkommen recht. Mein Vorschlag taugt nur, wenn
    1. ein gewöhnlicher, arithmetischer Mittelwert berechnet werden soll und
    2. weder der Mittelwert noch die Einzelwerte anderweitig gebraucht werden.
    Ansonsten wäre mein Ansatz mit deinem aus Beitrag #6 vergleichbar.

    Grüße von HaDi

  3. #13
    Bosga ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    09.04.2008
    Beiträge
    21
    Danke
    5
    Erhielt 3 Danke für 1 Beitrag

    Standard

    Hi ihr,

    also ich hab mal eine Lösung für mein Problem geschrieben.
    Wollte fragen ob ihr mal drüberfliegen könnt.
    Die Array-Variante wäre wahrscheinlicher "schöner" gewesen.
    Aber mir geht es mom. nur um die Funktionalität.
    (Werde es dann noch ändern)
    Bin ja noch blutjunger Anfänger bezügl. dem Umgang mit SPS...

    LG
    Bosga
    Angehängte Dateien Angehängte Dateien

  4. #14
    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

    Hm könnte gehen, ich habs mal korrigiert, damit der Compiler das übersetzen kann:

    Code:
    FUNCTION_BLOCK FB100
    //Baustein für die Gradientenregelung des Drehmoments 
    
    
    
    VAR_INPUT
    DB_NR                       :WORD   ;                               //    DB Nummer 
    BYTEADDR_DB                 :INT    ;                               //    Anfangsadresse   
    SAMPLE_T                    {S7_sampletime:= 'true'}  :REAL:=0.1;   //  = 100ms  * 10(Durchläufe) --> 1s (OB35 - Zyklus 100ms)  
    //DM_max                       {S7_m_c:='true'} :    REAL;            //    Variable DM_Max 
    END_VAR
    
      
    VAR_IN_OUT
    DM_max                       {S7_m_c:='true'} :    REAL     ;       //    Gradient Drehmoment(je Antrieb)    
    END_VAR
    
    
    VAR_OUTPUT    
    Ergebniss : BOOL;                                                   // "True" wenn Puffer2 < Puffer1
    END_VAR
    
    
    VAR
    Cnt_DM_max  : REAL;                                                 //Innerer Counter
    CNT         : INT;                                                  //Äußerer Counter
    
    Puffer1     : REAL;
    Puffer2     : REAL;
    
    Wert1       : REAL;
    Wert2       : REAL;
    Wert3       : REAL;
    Wert4       : REAL;
    Wert5       : REAL;
    Wert6       : REAL;
    Wert7       : REAL;
    Wert8       : REAL;
    Wert9       : REAL;
    Wert10      : REAL;
    Wert11      : REAL;
    Wert12      : REAL;
    Wert13      : REAL;
    Wert14      : REAL;
    Wert15      : REAL;
    Wert16      : REAL;
    Wert17      : REAL;
    Wert18      : REAL;
    Wert19      : REAL;
    Wert20      : REAL;
    
    //Ergebniss : BOOL;
    
    END_VAR     
     
    
    
    BEGIN
    //-------------------------------------------------Werte aus DB(DB_NR) lesen----------------------------------------------------------------------------
    
    DM_max              :=WORD_TO_INT( WORD_TO_BLOCK_DB(DB_NR).DW[BYTEADDR_DB+50]);       //    Gradient Drehmoment(je Antrieb)    
           
    //----------------------------------------------------------Counter-------------------------------------------------------------------------------------
    
    IF Cnt <= 20 THEN
    Cnt := Cnt + 1;                                                                      //Äußere Counter  1-20(0,1s - 2.0s)    
    Cnt_DM_max :=  Cnt_DM_max  +  SAMPLE_T;                 //Der Counter beginnt bei 0,1s (100ms) und zählt jeden weiteren Bausteinaufruf(OB35) 0,1s weiter
     
           IF Cnt_DM_max = 0.1 THEN Wert1   := DM_max; END_IF;
           IF Cnt_DM_max = 0.2 THEN wert2   := DM_max; END_IF;
           IF Cnt_DM_max = 0.3 THEN wert3   := DM_max; END_IF;
           IF Cnt_DM_max = 0.4 THEN wert4   := DM_max; END_IF;
           IF Cnt_DM_max = 0.5 THEN wert5   := DM_max; END_IF;
           IF Cnt_DM_max = 0.6 THEN wert6   := DM_max; END_IF;
           IF Cnt_DM_max = 0.7 THEN wert7   := DM_max; END_IF;
           IF Cnt_DM_max = 0.8 THEN wert8   := DM_max; END_IF;
           IF Cnt_DM_max = 0.9 THEN wert9   := DM_max; END_IF;
           IF Cnt_DM_max = 1.0 THEN wert10  := DM_max; END_IF;
       IF Cnt_DM_max = 1.1 THEN wert11  := DM_max; END_IF;
       IF Cnt_DM_max = 1.2 THEN wert12  := DM_max; END_IF;
       IF Cnt_DM_max = 1.3 THEN wert13  := DM_max; END_IF;
       IF Cnt_DM_max = 1.4 THEN wert14  := DM_max; END_IF;
       IF Cnt_DM_max = 1.5 THEN wert15  := DM_max; END_IF;
       IF Cnt_DM_max = 1.6 THEN wert16  := DM_max; END_IF;
       IF Cnt_DM_max = 1.7 THEN wert17  := DM_max; END_IF;
       IF Cnt_DM_max = 1.8 THEN wert18  := DM_max; END_IF;
       IF Cnt_DM_max = 1.9 THEN wert19  := DM_max; END_IF;
       IF Cnt_DM_max = 2.0 THEN wert20  := DM_max; END_IF;
    
    ELSE
    Cnt :=0; 
    Cnt_DM_max :=0;                      //Nach 2Sekunden wird der Counter wieder auf 0 gesetzt und die Zählung beginnt von vorne
    END_IF;
        
    //--------------------------------------------------------Mittelwertbildung----------------------------------------------------------------------------
    
    Puffer1 := (Wert1  + Wert2  + Wert3  + Wert4  + Wert5  + Wert6  + Wert7  + Wert8  + Wert9  + Wert10) / 10 ;
    Puffer2 := (Wert11 + Wert12 + Wert13 + Wert14 + Wert15 + Wert16 + Wert17 + Wert18 + Wert19 + Wert20) / 10 ;
    
    //-----------------------------------------------------------Vergleich---------------------------------------------------------------------------------
    
    
    IF Puffer2 > Puffer1 THEN
        Ergebniss := true;
    ELSE
        Ergebniss := false;
    END_IF;
      
         
    //-------------------------------------------------------Schreiben in den DB--------------------------------------------------------------------------
                     
    //WORD_TO_BLOCK_DB(DB_NR).DW[BYTEADDR_DB+50] := INT_TO_WORD(DM_max);             //  Gradient Drehmoment(je Antrieb)    
            
    END_FUNCTION_BLOCK
    Und hier mal mit Array:

    Code:
    FUNCTION_BLOCK FB100
    //Baustein für die Gradientenregelung des Drehmoments 
    
    
    
    VAR_INPUT
      DB_NR                       :WORD   ;                               //    DB Nummer 
      BYTEADDR_DB                 :INT    ;                               //    Anfangsadresse   
      SAMPLE_T                    {S7_sampletime:= 'true'}  :REAL:=0.1;   //  = 100ms  * 10(Durchläufe) --> 1s (OB35 - Zyklus 100ms)  
    END_VAR
    
      
    VAR_IN_OUT
      DM_max                       {S7_m_c:='true'} :    REAL     ;       //    Gradient Drehmoment(je Antrieb)    
    END_VAR
    
    
    VAR_OUTPUT    
      Ergebniss : BOOL;                                                   // "True" wenn Puffer2 < Puffer1
    END_VAR
    
    
    VAR
      CNT         : INT;                                                  //Äußerer Counter
      I           : INT; 
      Puffer1     : REAL;
      Puffer2     : REAL;
    
      Wert        : ARRAY[1..20] OF REAL;
    
    END_VAR     
     
    
    
    BEGIN
    //-------------------------------------------------Werte aus DB(DB_NR) lesen----------------------------------------------------------------------------
    
    DM_max              :=WORD_TO_INT( WORD_TO_BLOCK_DB(DB_NR).DW[BYTEADDR_DB+50]);       //    Gradient Drehmoment(je Antrieb)    
           
    //----------------------------------------------------------Counter-------------------------------------------------------------------------------------
    
    IF Cnt <= 20 THEN
      Cnt := Cnt + 1;                                                                      //Äußere Counter  1-20(0,1s - 2.0s)    
      Wert[Cnt] := DM_max;
    ELSE
      Cnt :=0; 
    END_IF;
        
    //--------------------------------------------------------Mittelwertbildung----------------------------------------------------------------------------
    
    Puffer1 := 0.0;
    Puffer2 := 0.0;
    
    FOR I := 1 TO 10 do 
      Puffer1 := Puffer1 + Wert[i];
      Puffer2 := Puffer2 + Wert[I+10];
    END_FOR;
      Puffer1 := Puffer1 / 10;
      Puffer2 := Puffer2 / 10;
    
    //-----------------------------------------------------------Vergleich---------------------------------------------------------------------------------
    
    
    IF Puffer2 > Puffer1 THEN
        Ergebniss := true;
    ELSE
        Ergebniss := false;
    END_IF;
      
         
    //-------------------------------------------------------Schreiben in den DB--------------------------------------------------------------------------
                     
    //WORD_TO_BLOCK_DB(DB_NR).DW[BYTEADDR_DB+50] := INT_TO_WORD(DM_max);             //  Gradient Drehmoment(je Antrieb)    
            
    END_FUNCTION_BLOCK
    Allerdings mußt du das Ergebnis mal prüfen, hab wenig Zeit, übersetzen läßt es sich. Auf jeden Fall ist da noch einiges an Optimierungsmöglichkeiten vorhanden, die Mittelwertbildung ist mir hier zu Rechenintensiv, das geht noch einfacher, denke ich, evtl. in jedem Schritt innerhalb der IF-Abfrage als gleitender Mittelwert. Suche mal im Forum, da hatten wir schon eine Diskussion zur optimalen Mittelwertberechnung.

    PS: Hab noch eimal einen Fehler korrigiert, die Puffer müssen gelöscht werden, vor der Berechnung.
    Geändert von Ralle (20.05.2008 um 15:12 Uhr) Grund: Fehler im Code korrigiert
    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

  5. Folgender Benutzer sagt Danke zu Ralle für den nützlichen Beitrag:

    Bosga (20.05.2008)

  6. #15
    Bosga ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    09.04.2008
    Beiträge
    21
    Danke
    5
    Erhielt 3 Danke für 1 Beitrag

    Standard

    Hey Ralle,

    danke für deine Bemühungen!!!

  7. #16
    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


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Übrigens, das hier:

    Code:
    Puffer1 := Puffer1 / 10;
    Puffer2 := Puffer2 / 10;
    kann man getrost weglassen, weil weiter unten ja beide auf größer verglichen werden. Am Ergebns des Vergleichs ändert sich durch die Division ja nichts, also ist die "für die Katz". Aber für diese Tier arbeitet der Mensch ja die meiste Zeit im Leben .
    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

Ähnliche Themen

  1. Bitte um Hilfe
    Von Ngouagnia im Forum Simatic
    Antworten: 6
    Letzter Beitrag: 29.11.2010, 10:30
  2. Suche Hilfe bei einem Problem
    Von würgi im Forum Simatic
    Antworten: 12
    Letzter Beitrag: 25.10.2010, 23:06
  3. Bitte um Hilfe
    Von SirDaniel86 im Forum Elektronik
    Antworten: 3
    Letzter Beitrag: 06.01.2009, 12:00
  4. Hilfe, bitte 315-2DP
    Von Mike Anderson im Forum Simatic
    Antworten: 9
    Letzter Beitrag: 19.11.2004, 15:37

Lesezeichen

Berechtigungen

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