Gleitendes Mittel AWL

Aus Software Entwicklung Projekte
Wechseln zu: Navigation, Suche

Grundlage

Kopiert aus dem SPS-Forum.

Speichern von 10 Messwerten in einem FIFO

FUNCTION FC 100 : VOID
TITLE =FIFO
AUTHOR : KAI
FAMILY : SPSFORUM
NAME : FIFO
VERSION : 1.0

 VAR_INPUT
   DB_Werte : BLOCK_DB ; 
   Anzahl_Werte : INT ; 
   Wert : REAL ; 
 END_VAR
 VAR_TEMP
   DB_Register : WORD ; 
   AR1_Register : DWORD ; 
   Zwischenwert : REAL ; 
   Schleife : INT ; 
 END_VAR
 BEGIN
 NETWORK
 TITLE =Register sichern

     L     DBNO; // DB-Register
     T     #DB_Register; 

     TAR1  ; // AR1-Register
     T     #AR1_Register; 

NETWORK
TITLE =FIFO

     AUF   #DB_Werte; // DB-Werte

     L     #Wert; // Wert
     T     #Zwischenwert; // Zwischenwert

     L     P#0.0; 
     LAR1  ; 

     L     #Anzahl_Werte; // Anzahl Werte
M01:  T     #Schleife; 

     L     DBD [AR1,P#0.0]; // Wert
     L     #Zwischenwert; // Zwischenwert
     T     DBD [AR1,P#0.0]; // Zwischenwert -> Wert   
     TAK   ; 
     T     #Zwischenwert; // Wert -> Zwischenwert

     L     P#4.0; 
     +AR1  ; 

     L     #Schleife; 
     LOOP  M01; 

NETWORK
TITLE =Register wiederherstellen

     AUF   DB [#DB_Register]; // DB-Register

     L     #AR1_Register; // AR1-Register
     LAR1  ; 

END_FUNCTION

Und die Berechnung des Mittelwertes

FUNCTION FC 110 : VOID
TITLE =Mittelwert
AUTHOR : KAI
FAMILY : SPSFORUM
NAME : FIFO
VERSION : 1.0

VAR_INPUT
  DB_Werte : BLOCK_DB ; 
  Anzahl_Werte : INT ; 
END_VAR
VAR_OUTPUT
  Mittelwert : REAL ; 
END_VAR
VAR_TEMP
  DB_Register : WORD ; 
  AR1_Register : DWORD ; 
  Zwischenwert : REAL ; 
  Zaehler : REAL ; 
  Schleife : INT ; 
END_VAR
BEGIN
NETWORK
TITLE =Register sichern

     L     DBNO; // DB-Register
     T     #DB_Register; 

     TAR1  ; // AR1-Register
     T     #AR1_Register; 

NETWORK
TITLE =Mittelwert
//Mittelwert
//
//M = LM + ((Z - LM) / N) = LM + Z / N - LM / N
//
//M  = Mittelwert
//LM = Letzter Mittelwert
//Z  = Wert
//N  = Anzahl Werte
//   

     AUF   #DB_Werte; // DB-Werte

     L     0.000000e+000; 
     T     #Zwischenwert; // M Mittelwert

     L     1.000000e+000; 
     T     #Zaehler; // N Anzahl Werte

     L     P#0.0; 
     LAR1  ; 

     L     #Anzahl_Werte; // Anzahl Werte
M01:  T     #Schleife; 

     L     DBD [AR1,P#0.0]; // Z Wert
     L     #Zwischenwert; // LM Letzter Mittelwert
     -R    ; 
     L     #Zaehler; // N Anzahl Werte
     /R    ; 
     L     #Zwischenwert; // LM Letzter Mittelwert
     +R    ; 
     T     #Zwischenwert; // M Mittelwert

     L     #Zaehler; // N Anzahl Werte
     L     1.000000e+000; 
     +R    ; 
     T     #Zaehler; // N Anzahl Werte

     L     P#4.0; 
     +AR1  ; 

     L     #Schleife; 
     LOOP  M01; 

     L     #Zwischenwert; // M Mittelwert
     T     #Mittelwert; // Mittelwert

NETWORK
TITLE =Register wiederherstellen

     AUF   DB [#DB_Register]; // DB-Register

     L     #AR1_Register; // AR1-Register
     LAR1  ; 

END_FUNCTION