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

Seite 3 von 5 ErsteErste 12345 LetzteLetzte
Ergebnis 21 bis 30 von 46

Thema: Mittelwertbildung

  1. #21
    Registriert seit
    28.01.2009
    Ort
    Hamburg
    Beiträge
    199
    Danke
    52
    Erhielt 54 Danke für 34 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo an alle,
    mein Ansatz ist folgender.Ich baue einen Datenbaustein der nur eine Variable hat,ein Array[1..X] of real.Die Größe des Array ist beliebig(nur durch S7 geschränkt) und realisiert das Messarchiv .
    Der gebaute Fb(Linear_Mittelwert_real) macht dann folgendes, er füllt das Array vollständig und bildet über alle Elemente den linearen Mittelwert unabhängig von der Größe des Array.Ist das Archiv voll fängt der FB wieder bei der ersten Zelle an.
    Die Archivierung erfolgt getaktet(bei O3X nicht nötig da selbst ein Takt),aus der Taktfrequenz und der Größe des Archives ergibt sich die Geschwindigkeitsänderung des Mittelwertes.Beispiel Takt:=100ms,DB:=100 Elemente, somit währe das Archiv nach 10Sekunden vollständig neu gefüllt worden.

    Awl-Quelle liegt bei.
    Beispielprogramm liedt bei.
    Aufrufgrafik liegt bei.

    AWL Textcode:
    Code:
    FUNCTION_BLOCK "Linear_Mittelwert_real"
    TITLE =
    VERSION : 0.1
    
    
    VAR_INPUT
      Takt : BOOL ;    //Externer Impuls
      Real_Messwert : REAL ;    //Messwert normiert auf real
      DB_NR : INT ;    //Nr des DB ,der DB ist Array[1..X] of real Ausschließlich
    END_VAR
    VAR_OUTPUT
      Linearer_Mittelwert : REAL ;    
    END_VAR
    VAR
      Pointer_Speicher_Stat : DWORD ;    
    END_VAR
    VAR_TEMP
      DB_NR_intern : INT ;    
      Pointer_Speicher_temp : DWORD ;    
      Pointer_schleife : DWORD ;    
      schleife : INT ;    
      SummeMesswert : REAL ;    
      Anzahl_Messelemente : DINT ;    
    END_VAR
    BEGIN
    NETWORK
    TITLE =Messwertspeicherung in einem beliebig großem Array of real(DB)
    //Datensammlung des Messwertes.Bei jeder messung wird der Wert hochlaufend in 
    //eine Zelle geschrieben.Ist der DB voll wird mit der ersten zelle 
    //wieder angefangen.
          UN    #Takt; //wenn Takt=false keine Bearbeitung
          SPB   Ende; 
    //***************************************************
          L     #DB_NR; //Indirektes öffnen des Messpeicher DB
          T     #DB_NR_intern; 
          AUF   DB [#DB_NR_intern]; 
    //***************************************************
          L     #Pointer_Speicher_Stat; //Übergabe statischen an Temp zwecks Indirekte
          T     #Pointer_Speicher_temp; 
    //++++++++++++++++++++++++++++++
          L     #Real_Messwert; //Wertablage in Mess_speicher db
          T     DBD [#Pointer_Speicher_temp]; 
    //++++++++++++++++++++++++++++++
          L     P#4.0; //Pointererhöhung für nächste Messspeicherung
          L     #Pointer_Speicher_Stat; 
          +D    ; 
          T     #Pointer_Speicher_Stat; 
    //***************************************************
    //Berechnen der Grenzen des Messspeicher DB und Neubelegung des Pointers mit null
          L     #Pointer_Speicher_Stat; //Adresse des Pointers ermitteln
          SRD   3; //umwandeln nach dint,int
          L     DBLG; //laden der DB Länge in byte
          >=D   ; //wenn der Pointer >= ist als die Anzahl der Byte`des DB
          SPBN  neu; 
          L     P#0.0; //Neubelegung des Pointer
          T     #Pointer_Speicher_Stat; 
    neu:  NOP   0; 
    
    
    NETWORK
    TITLE =Lineare Mittelwertbildung über alle Elemente des Array`s (DB)
    
          L     P#0.0; //Pointer auf erstes Messelement legen
          T     #Pointer_schleife; 
          L     0.000000e+000; 
          T     #SummeMesswert; //vorbelegung Summe Messwert mit null
          L     DBLG; //Datenbausteinlänge in Byte
          L     4; 
          /D    ; 
          T     #Anzahl_Messelemente; 
    next: T     #schleife; 
          L     DBD [#Pointer_schleife]; //lade Messelement
          L     #SummeMesswert; 
          +R    ; 
          T     #SummeMesswert; 
          L     P#4.0; 
          L     #Pointer_schleife; 
          +D    ; 
          T     #Pointer_schleife; 
    
          L     #schleife; 
          LOOP  next; 
    //*************************************************
          L     #SummeMesswert; 
          L     #Anzahl_Messelemente; 
          DTR   ; //Umwandlung in real
          /R    ; //Die summe der Messungen durch Anzahl ist Mittelwert
          T     #Linearer_Mittelwert; 
    Ende: NOP   0; 
          SET   ; 
          SAVE  ; 
    END_FUNCTION_BLOCK
    Angehängte Grafiken Angehängte Grafiken
    Angehängte Dateien Angehängte Dateien
    Zitieren Zitieren Lineare Mittelwertbildung und Archiv über X Array Elemente  

  2. Folgender Benutzer sagt Danke zu Bernard für den nützlichen Beitrag:

    Andy79 (12.12.2010)

  3. #22
    pinolino ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    19.10.2007
    Beiträge
    261
    Danke
    1
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Zitat Zitat von vierlagig Beitrag anzeigen
    jetz hab ich mir dann auch mal die bilder angeguckt

    deine anfangsadresse ist NICHT 8
    Hm, ja stimmt - die Adresse im DB1 für das RealArray[0] geht mit 0.0 los!

    1) Vermutlich muss ich das immer händisch nachholen, wenn die Startadresse nicht bei 0 losgeht, oder?

    2) Jetzt müsste ich ja eigentlich die Adressen von RealArray[0] bis RealArray[7] per Hand abändern - aber ich kann im DB keine Eingaben machen.

    Danke!
    Geändert von pinolino (26.01.2010 um 12:08 Uhr)

  4. #23
    Registriert seit
    08.08.2007
    Ort
    Dresden
    Beiträge
    9.648
    Danke
    1.059
    Erhielt 2.046 Danke für 1.627 Beiträge

    Standard

    pinolino, verwende bitte, dass in der ersten PN und hier angesprochene:

    Code:
    *
          LAR1     P##aRealArray
    !

    und: DON'T TOUCH THE IDB!
    [SIGNATUR]
    Ironie setzt Intelligenz beim Empfänger voraus.
    [/SIGNATUR]

  5. #24
    pinolino ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    19.10.2007
    Beiträge
    261
    Danke
    1
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Ok vierlagig,

    ich versuche es mit "LAR1 P##aRealArray".


    Nur zum Verständnis:

    Was müsste ich wo abändern, damit es auch so bei mir läuft?

    Offensichtlich liegt es ja an der Startadresse..

  6. #25
    Registriert seit
    08.08.2007
    Ort
    Dresden
    Beiträge
    9.648
    Danke
    1.059
    Erhielt 2.046 Danke für 1.627 Beiträge

    Standard

    Zitat Zitat von pinolino Beitrag anzeigen
    Ok vierlagig,

    ich versuche es mit "LAR1 P##aRealArray".


    Nur zum Verständnis:

    Was müsste ich wo abändern, damit es auch so bei mir läuft?

    Offensichtlich liegt es ja an der Startadresse..
    laut screenshot fängt dein array bei 0.0 an also die angebliche startadresse 8 ist 0
    [SIGNATUR]
    Ironie setzt Intelligenz beim Empfänger voraus.
    [/SIGNATUR]

  7. #26
    pinolino ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    19.10.2007
    Beiträge
    261
    Danke
    1
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Ja, genau - und damit das Ganze wieder zusammenpasst, müsste ich doch jetzt per Hand die Adressen im IDB1 anpassen, so dass die Startadresse eben die 8.0 ist.

    Aber genau das geht nicht - es werden keine Änderungen zugelassen, vermutlich weil es ein Instanz-DB ist! Ich hatte aber doch auch keine Möglichkeit, beim Generieren des DBs die Adresse bei 8 beginnen zu lassen...

    Frage:

    Was macht man in diesem Fall in der Praxis - wie kann die oben genannte Änderung dennoch vorgenommen werden?

    Danke!

  8. #27
    Registriert seit
    08.08.2007
    Ort
    Dresden
    Beiträge
    9.648
    Danke
    1.059
    Erhielt 2.046 Danke für 1.627 Beiträge

    Standard

    Zitat Zitat von pinolino Beitrag anzeigen
    Ja, genau - und damit das Ganze wieder zusammenpasst, müsste ich doch jetzt per Hand die Adressen im IDB1 anpassen, so dass die Startadresse eben die 8.0 ist.

    Aber genau das geht nicht - es werden keine Änderungen zugelassen, vermutlich weil es ein Instanz-DB ist! Ich hatte aber doch auch keine Möglichkeit, beim Generieren des DBs die Adresse bei 8 beginnen zu lassen...

    Frage:

    Was macht man in diesem Fall in der Praxis - wie kann die oben genannte Änderung dennoch vorgenommen werden?

    Danke!
    alter, willste mich verarschen???
    das ist nicht lustig!

    1. LAR1
    2. vielleicht statt der acht in zeile 85.879372 eine 0 hinschreiben
    [SIGNATUR]
    Ironie setzt Intelligenz beim Empfänger voraus.
    [/SIGNATUR]

  9. #28
    Registriert seit
    15.09.2008
    Beiträge
    165
    Danke
    10
    Erhielt 6 Danke für 6 Beiträge

    Standard

    Ich glaube der Kollege versucht den Instanz DB so zu ändern, daß sein Array bei adresse 8 anfängt.
    Step7 5.5
    TIA 11 / 13
    WinCC flexible 2008
    WinCC 7.0 / 7.3

  10. #29
    Registriert seit
    08.08.2007
    Ort
    Dresden
    Beiträge
    9.648
    Danke
    1.059
    Erhielt 2.046 Danke für 1.627 Beiträge

    Standard

    Zitat Zitat von PBO-WE Beitrag anzeigen
    Ich glaube der Kollege versucht den Instanz DB so zu ändern, daß sein Array bei adresse 8 anfängt.
    dummyArray davor anlegen ... aber was ist der sinn?
    [SIGNATUR]
    Ironie setzt Intelligenz beim Empfänger voraus.
    [/SIGNATUR]

  11. #30
    Registriert seit
    18.10.2007
    Beiträge
    127
    Danke
    1
    Erhielt 15 Danke für 13 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo Leute,

    mal ein ganz anderer Ansatz ganz ohne Arrays.

    Ich verwende meistens die gleitende Mittelwertbildung. Vorteil, kommt ganz ohne speicherfressendes Array aus. Nachteil es ergibt sich immer ein kleiner Fehler, der aber meist vernachlässigbar ist.

    Hier die AWL Quelle:

    Code:
     
    FUNCTION "VM" : VOID
    TITLE =Gleitende Mittelwertbildung
    AUTHOR : VIS_Blum
    FAMILY : CALC
    NAME : FC_169
    VERSION : 1.0
     
    VAR_INPUT
      AKT : REAL ; //Aktueller Wert
      Tiefe : INT ; //Filtertiefe
    END_VAR
    VAR_IN_OUT
      Mittel : REAL ; //Mittelwert
    END_VAR
    VAR_TEMP
      Faktor : REAL ; //Bewertung, Stärke des Mittelwertes
      Divisor : REAL ; //Filtertiefe für Mittelwert
    END_VAR
    BEGIN
    NETWORK
    TITLE =
          L     2; 
          L     #Tiefe; 
          >I    ; 
          SPB   AUS; 
          L     #Tiefe; 
          DTR   ; 
          T     #Divisor; 
          L     #Tiefe; 
          +     -1; 
          DTR   ; 
          T     #Faktor; 
          L     #Mittel; 
          L     #Faktor; 
          *R    ; 
          L     #AKT; 
          +R    ; 
          L     #Divisor; 
          /R    ; 
          T     #Mittel; 
          BEA   ; 
    AUS:  L     #AKT; 
          T     #Mittel; 
    END_FUNCTION
    Vielleicht hilft es ja,

    Gruß Rolf

Ähnliche Themen

  1. Erweiterte Mittelwertbildung
    Von Full Flavor im Forum Simatic
    Antworten: 7
    Letzter Beitrag: 18.10.2011, 22:30
  2. Mittelwertbildung aus integer
    Von daudel im Forum Simatic
    Antworten: 10
    Letzter Beitrag: 14.11.2010, 14:56
  3. Mittelwertbildung SIWAREX U
    Von petzi im Forum Simatic
    Antworten: 35
    Letzter Beitrag: 20.06.2010, 10:42
  4. Mittelwertbildung S5-95U
    Von demo im Forum Simatic
    Antworten: 13
    Letzter Beitrag: 28.08.2007, 21:10
  5. Mittelwertbildung
    Von Servomaster im Forum Simatic
    Antworten: 3
    Letzter Beitrag: 18.10.2005, 06:42

Lesezeichen

Berechtigungen

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