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

Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 29

Thema: Ringpuffer mit Mittelwert

  1. #1
    Registriert seit
    14.02.2006
    Beiträge
    61
    Danke
    21
    Erhielt 4 Danke für 3 Beiträge

    Böse


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Habe diverse Programmteile vom Forum zu einem Ringpuffer zusammengefügt. Soweit funktioniert es ja aber es gibt ein Problem.
    den Datenanfang beim Abspeichern: dieser wird im NW4 erst aktualisiert wenn das Datenende erreicht wurde.
    Habe es schon mit einer Schleife versucht, aber irgendwie .....

    Es gibt sicher eine Lösung dafür, aber leider gelingt es mir nicht.
    habe das Programm hinzugefügt, danke.

    Schön langsam wird es mit den Pointern
    Geändert von taucherd (13.03.2008 um 15:24 Uhr)
    Zitieren Zitieren Ringpuffer mit Mittelwert  

  2. #2
    Registriert seit
    03.01.2006
    Ort
    Im sonnigen Süden von Österreich!
    Beiträge
    1.377
    Danke
    227
    Erhielt 183 Danke für 168 Beiträge

    Standard

    Habe kurz mal dein Programm überflogen...
    Warum Bildest du dir immer einen Pointer mit SLD 3 und dann Speicherst das ab damit du Speicherindirekt adressieren kannst?

    zb:
    Code:
          T     #Index               
          SLD   3                       
          T     #Ind_pointer                // Pointer-Adresse
          L     #Real_IN
          T     DBD [#Ind_pointer]         //Das ist eine speicherindirekte adressierung! Du greifst auf das Byte zu das in deiner Variable Ind_pointer steht!
    das sollte so sein:

    Code:
          T     #Index               
          SLD   3 
          LAR 1               
          L     #Real_IN
          T     DBD [AR1,P#0.0] //Das ist eine Adressregister indirekte adressierung! Du greifst auf die Adresse zu die im AR 1 steht mit dem Offset 0.0!

  3. #3
    Registriert seit
    14.02.2006
    Beiträge
    61
    Danke
    21
    Erhielt 4 Danke für 3 Beiträge

    Standard

    Zitat Zitat von godi Beitrag anzeigen
    Habe kurz mal dein Programm überflogen...
    Warum Bildest du dir immer einen Pointer mit SLD 3 und dann Speicherst das ab damit du Speicherindirekt adressieren kannst?

    zb:
    Code:
          T     #Index               
          SLD   3                       
          T     #Ind_pointer                // Pointer-Adresse
          L     #Real_IN
          T     DBD [#Ind_pointer]         //Das ist eine speicherindirekte adressierung! Du greifst auf das Byte zu das in deiner Variable Ind_pointer steht!
    das sollte so sein:

    Code:
          T     #Index               
          SLD   3 
          LAR 1               
          L     #Real_IN
          T     DBD [AR1,P#0.0] //Das ist eine Adressregister indirekte adressierung! Du greifst auf die Adresse zu die im AR 1 steht mit dem Offset 0.0!
    ________________________________________
    Wenn der Pointer für den Speicherort nicht indirekt generiert wird, dann wird immer bei der Adresse 0 begonnen und ich möchte aber sagen von wo der Speicherbereich beginnt wo die Daten abgespeichert werden. möchte mit einem DB mehrere Mittelwertbildungen abdecken.

    Der Index arbeitet schon noch richtig aber der Pointer beginnt trotzdem bei Adresse 0!

  4. #4
    Registriert seit
    03.01.2006
    Ort
    Im sonnigen Süden von Österreich!
    Beiträge
    1.377
    Danke
    227
    Erhielt 183 Danke für 168 Beiträge

    Standard

    Zitat Zitat von taucherd Beitrag anzeigen
    ________________________________________
    Wenn der Pointer für den Speicherort nicht indirekt generiert wird, dann wird immer bei der Adresse 0 begonnen und ich möchte aber sagen von wo der Speicherbereich beginnt wo die Daten abgespeichert werden. möchte mit einem DB mehrere Mittelwertbildungen abdecken.

    Der Index arbeitet schon noch richtig aber der Pointer beginnt trotzdem bei Adresse 0!
    Hast du die Kommentare gelesen und verstanden die ich bei den Beispielen dazugeschrieben habe?

  5. #5
    Registriert seit
    14.02.2006
    Beiträge
    61
    Danke
    21
    Erhielt 4 Danke für 3 Beiträge

    Standard

    Zitat Zitat von godi Beitrag anzeigen
    Hast du die Kommentare gelesen und verstanden die ich bei den Beispielen dazugeschrieben habe?

    OK, das stimmt - aber ich brauche den offset mit null nicht! oder ich habe es nicht verstanden?
    das behebt das problem auch nicht - leider!
    den bei einem neustart, wenn im Index_Ringspeicher 0 drinnen steht und ich sage die daten beginnen bei adresse 100 dann wird der db von adresse 0 - 100 genauso mit dem real_in wert überschrieben.
    und ganu das möchte ich verhindern, da ich mit einem zweiten fc auf diesen bereich schreibe und zugreife.

    Offset: P#100.0 beginnt der Pointer natürlich bei 100.0.
    jetzt gebe ich bei datenanfang die adresse 200 an und der speicherort ist bei 300 und der mittelwert wird ab 200 gebildet?
    Geändert von taucherd (08.02.2008 um 22:01 Uhr) Grund: erkenntnis:

  6. #6
    Registriert seit
    16.06.2003
    Ort
    88356 Ostrach
    Beiträge
    4.811
    Danke
    1.231
    Erhielt 1.101 Danke für 527 Beiträge

    Standard

    habe dein programm jetz nicht angesehen, muss hier grad erst alles neu installieren auf der neuen mühle....

    aber nur zum thema mittelwerbildung eine kleine anregung:

    Zitat Zitat von harrylask Beitrag anzeigen
    M=LM+((Z-LM)/N)

    M=Mittelwert
    LM=Letzter Mittelwert
    Z=Messwert
    N=Anzahl der Messungen

    man spart dadurch rechenzeit und mem da ich nur den letzten mittelwert (LM) und die anzahl der messungen (N) speichern muss (aus dem buch "c für die automatisierungstechnik")

    mfg, harry
    vielleicht machst du die sache zu kompliziert?

    habe mit einen schönen fc gemacht der mir mittel, min und max wert ausgibt und eingänge für trigger und reset hat - aber leider komme ich da gerade nicht dran...
    "Es ist weit besser, große Dinge zu wagen, ruhmreiche Triumphe zu erringen, auch wenn es manchmal bedeutet, Niederlagen einzustecken, als sich zu den Krämerseelen zu gesellen, die weder große Freude noch großen Schmerz empfinden, weil sie im grauen Zwielicht leben, das weder Sieg noch Niederlage kennt." Theodore Roosevelt - President of the United States (1901-1909)

  7. #7
    Registriert seit
    14.02.2006
    Beiträge
    61
    Danke
    21
    Erhielt 4 Danke für 3 Beiträge

    Standard

    Zitat Zitat von Markus Beitrag anzeigen
    habe dein programm jetz nicht angesehen, muss hier grad erst alles neu installieren auf der neuen mühle....

    aber nur zum thema mittelwerbildung eine kleine anregung:



    vielleicht machst du die sache zu kompliziert?

    habe mit einen schönen fc gemacht der mir mittel, min und max wert ausgibt und eingänge für trigger und reset hat - aber leider komme ich da gerade nicht dran...
    Ist das nicht eine "Signalglättung" ,ein schöner Einzweiler.
    beim anfahren der anlage braucht es ewig bis der wirkliche mittelwert erreicht ist, wenn die anzahl zu hoch ist, oder?
    aber ich werde es nochmals ansehen - danke

  8. #8
    Registriert seit
    03.01.2006
    Ort
    Im sonnigen Süden von Österreich!
    Beiträge
    1.377
    Danke
    227
    Erhielt 183 Danke für 168 Beiträge

    Standard

    Dein Index_Ringspeicher sollte eine IN_OUT Variable sein.
    Den Offset von deinem Pointer könntest du auch von Außen über eine IN Variable angeben.

    zb:
    L #Index
    L #Offset_Index
    +D
    SLD 3
    LAR 1
    L #Real_IN
    T DBD [AR1,P#0.0]

  9. #9
    Registriert seit
    20.06.2003
    Ort
    Sauerland.NRW.Deutschland
    Beiträge
    4.850
    Danke
    78
    Erhielt 800 Danke für 543 Beiträge

    Standard

    ein paar bausteine die dir weiterhelfen findest du auf meiner hp im download unter sps/s7
    guckst du mal filo_lifo.zip und db_auswerten.zip


    .
    mfg Volker .......... .. alles wird gut ..

    =>Meine Homepage .. direkt zum Download

    Meine Definition von TIA: Total Inakzeptable Applikation

  10. #10
    Registriert seit
    30.03.2005
    Beiträge
    2.096
    Danke
    0
    Erhielt 673 Danke für 541 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von taucherd Beitrag anzeigen
    Habe diverse Programmteile vom Forum zu einem Ringpuffer zusammengefügt. Soweit funktioniert es ja aber es gibt ein Problem.
    Wenn Du nicht unbedingt mit einem Ringpuffer arbeiten musst, dann helfen Dir vielleicht die beiden folgenden Bausteine weiter.

    Der FC100 FILO liest Werte im Datenformat REAL ein und speichert die Werte in einem DB:

    Code:
    FUNCTION FC 100 : INT
    TITLE =FILO-Speicher
    AUTHOR : KAI
    FAMILY : SPSFORUM
    NAME : FILO
    VERSION : 1.0
     
    VAR_INPUT
      SPEICHER : POINTER ;  
      LAENGE : INT ;    
      WERT : REAL ; 
    END_VAR
    VAR_TEMP
      DB_REGISTER : WORD ;  
      AR1_REGISTER : DWORD ;    
      DB_NUMMER : WORD ;    
      BEREICHSZEIGER : DWORD ;  
      ZWISCHENWERT : REAL ; 
      SCHLEIFE : INT ;  
      ZAEHLER : REAL ;  
    END_VAR
    BEGIN
    NETWORK
    TITLE =DB-Register und Adressregister AR1 sichern
     
          L     DBNO; // DB-Register
          T     #DB_REGISTER; 
     
          TAR1  #AR1_REGISTER; // AR1-Register
     
    NETWORK
    TITLE =FILO-Speicher
     
          L     P##SPEICHER; // POINTER
          LAR1  ; 
     
          L     W [AR1,P#0.0]; // DB-Nummer
          T     #DB_NUMMER; 
     
          AUF   DB [#DB_NUMMER]; 
     
          L     D [AR1,P#2.0]; // Bereichszeiger
          LAR1  ; 
     
          L     #WERT; // Wert
          T     #ZWISCHENWERT; // Wert => Zwischenwert
     
          L     #LAENGE; // Länge
    M01:  T     #SCHLEIFE; // Schleife
     
          L     D [AR1,P#0.0]; // Wert
          L     #ZWISCHENWERT; // Zwischenwert
          T     D [AR1,P#0.0]; // Zwischenwert => Wert
          TAK   ; 
          T     #ZWISCHENWERT; // Wert => Zwischenwert 
     
          L     P#4.0; 
          +AR1  ; 
     
          L     #SCHLEIFE; // Schleife
          LOOP  M01; 
     
    NETWORK
    TITLE =DB-Register und Adressregister AR1 wiederherstellen
     
          AUF   DB [#DB_REGISTER]; // DB-Register
     
          LAR1  #AR1_REGISTER; // AR1-Register
     
    END_FUNCTION
    Der FC110 MITTELWERT bildet aus den im DB gespeicherten Werten einen Mittelwert im Datenformat REAL nach folgender Formel:

    M = LM + ( (Z - LM ) / N)

    M = Mittelwert
    LM = Letzter Mittelwert
    Z = Messwert
    N = Anzahl der Messungen
    Code:
    FUNCTION FC 110 : INT
    TITLE =Mittelwert
    //Mittelwert
    //
    //M = LM + ((Z - LM) / N)
    //
    //M  = Mittelwert
    //LM = Letzter Mittelwert
    //Z  = Wert
    //N  = Anzahl Werte
    //   
    //Beispiel:
    // 
    //Man hat einen Mittelwert, der aus 10 Werten gebildet wird. Wenn jetzt ein 
    //neue Wert dazu addiert wird, hat man 11 Werte. Also muss 1/10 des
    //Mittelwertes subtrahiert werden, damit man insgesamt wieder 10 Werte hat.
    //   
    AUTHOR : KAI
    FAMILY : SPSFORUM
    NAME : FILO
    VERSION : 1.0
     
    VAR_INPUT
      SPEICHER : POINTER ;    
      LAENGE : INT ;    
    END_VAR
    VAR_OUTPUT
      MITTELWERT : REAL ;   
    END_VAR
    VAR_TEMP
      DB_REGISTER : WORD ;  
      AR1_REGISTER : DWORD ;    
      DB_NUMMER : WORD ;    
      BEREICHSZEIGER : DWORD ;  
      ZWISCHENWERT : REAL ; 
      SCHLEIFE : INT ;  
      ZAEHLER : REAL ;  
    END_VAR
    BEGIN
    NETWORK
    TITLE =DB-Register und Adressregister AR1 sichern
     
          L     DBNO; // DB-Register
          T     #DB_REGISTER; 
     
          TAR1  #AR1_REGISTER; // AR1-Register
     
    NETWORK
    TITLE =Mittelwert
     
          L     P##SPEICHER; // POINTER
          LAR1  ; 
     
          L     W [AR1,P#0.0]; // DB-Nummer
          T     #DB_NUMMER; 
     
          AUF   DB [#DB_NUMMER]; 
     
          L     D [AR1,P#2.0]; // Bereichszeiger
          LAR1  ; 
     
          L     0.000000e+000; 
          T     #ZWISCHENWERT; // Letzter Mittelwert
     
          L     1.000000e+000; 
          T     #ZAEHLER; // Anzahl Werte
     
          L     #LAENGE; // Länge
    M01:  T     #SCHLEIFE; // Schleife
     
          L     D [AR1,P#0.0]; // Wert
          L     #ZWISCHENWERT; // Letzter Mittelwert
          -R    ; 
          L     #ZAEHLER; // Anzahl Werte
          /R    ; 
          L     #ZWISCHENWERT; // Letzter Mittelwert
          +R    ; 
          T     #ZWISCHENWERT; // Mittelwert
     
          L     #ZAEHLER; // Anzahl Messungen
          L     1.000000e+000; 
          +R    ; 
          T     #ZAEHLER; // Anzahl Messungen
     
          L     P#4.0; 
          +AR1  ; 
     
          L     #SCHLEIFE; // Schleife
          LOOP  M01; 
     
          L     #ZWISCHENWERT; // Mittelwert
          T     #MITTELWERT; // Mittelwert
     
    NETWORK
    TITLE =DB-Register und Adressregister AR1 wiederherstellen
     
          AUF   DB [#DB_REGISTER]; // DB-Register
     
          LAR1  #AR1_REGISTER; // AR1-Register
     
    END_FUNCTION
    Gruß Kai
    Angehängte Dateien Angehängte Dateien

  11. Folgende 8 Benutzer sagen Danke zu Kai für den nützlichen Beitrag:

    corny456 (20.03.2015),D-Four-E (22.11.2014),eYe (01.02.2011),foe (04.05.2015),paula23 (14.07.2010),roadrunner (20.04.2009),robin.rood (04.02.2010),taucherd (25.02.2008)

Ähnliche Themen

  1. Problem mit Ringpuffer
    Von nutellahase im Forum Simatic
    Antworten: 1
    Letzter Beitrag: 12.09.2011, 19:09
  2. mittelwert berechnung
    Von candemirkorkmaz im Forum Sonstige Steuerungen
    Antworten: 1
    Letzter Beitrag: 27.07.2011, 13:11
  3. S7-FIFO-Baustein (als Ringpuffer) [GELÖST]
    Von openminded23 im Forum Simatic
    Antworten: 52
    Letzter Beitrag: 11.04.2011, 21:09
  4. UDT // Ringpuffer
    Von zloyduh im Forum Simatic
    Antworten: 16
    Letzter Beitrag: 06.03.2011, 08:18
  5. Array bei Datenwechsel speichern in Ringpuffer
    Von Wiedenn? im Forum Simatic
    Antworten: 13
    Letzter Beitrag: 21.03.2010, 04:55

Lesezeichen

Berechtigungen

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