# Glättung eines Analogwertes



## hank12 (12 Juli 2008)

Hallo zusammen wie funktioniert denn eigentlich die Glättung eines Analogwertes z.Bsp des MD10.. dieser ist eine Temperatur, die aber immer schwankungen drauf hat... möchte hier einfach ein "PT1" nachschalten der ir den Wert glättet!! Wie??


grüsse


----------



## AUDSUPERUSER (12 Juli 2008)

Hä?

Könntest Du mal genauer sagen, was du eigentlich vorhast.

Wenn es dir darum geht, Temperaturausreiser zu glätten, warum sampelst Du den Wert dann nicht? Einfach einen DB aufmachen und den Wert z.B. im Sekundentakt einlesen und immer an die nächste Freie Stelle schreiben. Die Werte kannst du dann addieren und durch die anzahl der Werte teilen. Wenn der DB voll ist wieder von vorne anfangen.

Gruss
Audsuperuser


----------



## Gerhard K (12 Juli 2008)

also ich würde eine mittelwertbildung machen.aber den zyklus beachten dabei.
mfg gerhard k


----------



## hank12 (12 Juli 2008)

Also:

Also Temperatur wird über pt100 gemessen und ist über messumformer an AI der sps angeschlossen. Dieses Signal wird sakliert und landet anschlissend im MD10. Da aber auf dem Messignal ein Rauschen drauf ist, möchte ich die hochfrequenten Anteile rausfiltern .. also: Tiefpass oder Glättung oder PT1.. ist ja alles das selbe.

Ergebnis sollte sein, dass der Wert einfach geglättet ist und n icht mehr so hin und her zappelt...

das signal geht dann über einen Vergleicher an einen DO, wo ein schütz dran hängt... der zappelt aber ungemein.

Hatt zu diesem Thema schon mal mit der Hysterese einen Vorschlag... wollte aber noch nach einer anderen Variante schauen

wisst Ihr was ich mein


----------



## vierlagig (12 Juli 2008)

mein vorschlag zu ausreißern:

wir nehmen dem AUDsu seine mittelwertbildung, prüfen aber vorher ob der wert plausibel also nicht größer als ein einstellbares delta vom letzten bzw. dem mittelwert des fifos entspricht.

zusätzlich würde ich einen start-eingang vorsehen, um den fifo das erste mal füllen zu können


----------



## Woldo (12 Juli 2008)

Zum Glätten von REAL-Messwerten verwende ich zwei Hilfswörter

```
L     #Eingang                //ungeglätteter Eingang REAL
      L     #HW_Mittelwert       //Hilfswort REAL
      +R    
      T     #HW_Mittelwert
      L     #Ausgang               //geglätteter Ausgang REAL
      -R    
      T     #HW_Mittelwert
      L     #HW_Mittelwert
      L     #Faktor                 //Faktor REAL für Glättung z.B. 500.0
      /R    
      T     #Ausgang
```


----------



## hank12 (12 Juli 2008)

Hallo,

@vierlagig: ...bitte in deutsch.. was ist "AUD"  fifo (first in first out.. was meinst du mit fifo... was für ein Baustein?

@waldo:
ist das folgende Übetragungsfunktion?

Eingang/Ausgang = 1/1+sFaktor        (s = Laplace Operator; Faktor ist die Dämpfung)

? Bin mir jetzt nicht ganz sicher, aber das was du dort machst ist doch ein Tiefpass oder?


----------



## vierlagig (12 Juli 2008)

hank12 schrieb:


> @vierlagig: ...bitte in deutsch.. was ist "AUD"  fifo (first in first out.. was meinst du mit fifo... was für ein Baustein?



AUDsu = AUDSUPERUSER ... er hatte einen FIFO-puffer (First in First Out) ins gespräch gebracht, aus dem er einen mittelwert bilden würde - würde ich auch so machen. würde halt beim triggern des signals nur noch prüfen, ob der wert den ich nachschiebe plausibel ist, also den einstellbaren grenzen einer abweichung entspricht... deutsch genug?


----------



## Larry Laffer (12 Juli 2008)

by the Way :
die Suche im Forum zum Thema Mittelwert brachte dies zum Vorschein : http://www.sps-forum.de/showthread.php?t=18014&highlight=mittelwert

Ist vielleicht ganz interessant ...

Gruß
LL


----------



## hank12 (12 Juli 2008)

thanks vierlagig!

hi larry, interessanter link, danke


----------



## vierlagig (14 Juli 2008)

würde dann in etwa so aussehen:


```
*
FUNCTION_BLOCK "AVERAGING_BLOCK_LIM_SYNC"
TITLE =AVERAGING BLOCK WITH LIMIT AND SYNCHRO
//if the rInput inside the range and xSynchro on then calculate the average from 
//an 8 value shift register every xTrigger-time else the rOutput are the old 
//output
//without synchro the accu will be filled
//reset will zeroing the FIFO
//
//DATE:     19.02.2008
//AUTHOR:   4lagig
//VERSION:  V0.1 BasicVer
AUTHOR : '4lagig'
FAMILY : RealGF
VERSION : 0.1


VAR_INPUT
  xTrigger : BOOL ;    
  xSynchro : BOOL ;    
  xReset : BOOL ;    
  rInput : REAL ;    
  rLowCut : REAL ;    
  rDelta : REAL ;    
END_VAR
VAR_OUTPUT
  rOutput : REAL ;    
END_VAR
VAR
  xHelpFlag : BOOL ;    
  rAccu1 : REAL ;    
  rAccu2 : REAL ;    
  rAccu3 : REAL ;    
  rAccu4 : REAL ;    
  rAccu5 : REAL ;    
  rAccu6 : REAL ;    
  rAccu7 : REAL ;    
  rAccu8 : REAL ;    
  rOutpuAux : REAL ;    
  rHighX : REAL ;    
  rLowX : REAL ;    
END_VAR
BEGIN
NETWORK
TITLE = 
// 
//_______INITIALIZATOR_______//
      U     #xReset; 
      SPB   _004; 
      L     #rInput; 
      L     #rLowCut; 
      <R    ; 
      ON    #xSynchro; 
      SPB   _005; 

//_______RANGE LIMITS_______//
      L     #rOutpuAux; 
      L     #rDelta; 
      +R    ; 
      T     #rHighX; // High limit
      L     #rOutpuAux; 
      L     #rDelta; 
      -R    ; 
      T     #rLowX; // Low limit

//_______TRIGGER_______//
      U     #xTrigger; 
      FP    #xHelpFlag; // One shot pulse
      SPBN  _006; // Do NOT jump if there is a pulse

//_______HIGH FILTER_______//
      L     #rInput; 
      L     #rHighX; 
      >R    ; 
      SPB   _006; // Jump if input is too HIGH

//_______LOW FILTER_______//
      L     #rInput; 
      L     #rLowX; 
      <R    ; 
      SPB   _006; // Jump if input is too LOW

//_______SHIFTER_______//
_005: L     #rAccu7; 
      T     #rAccu8; 
      L     #rAccu6; 
      T     #rAccu7; 
      L     #rAccu5; 
      T     #rAccu6; 
      L     #rAccu4; 
      T     #rAccu5; 
      L     #rAccu3; 
      T     #rAccu4; 
      L     #rAccu2; 
      T     #rAccu1; 
      L     #rAccu1; 
      T     #rAccu2; 
      L     #rInput; 
      T     #rAccu8; 

      SPA   _006; 

//_______ZEROING_______//
_004: L     0.000000e+000; 
      T     #rAccu1; 
      T     #rAccu2; 
      T     #rAccu3; 
      T     #rAccu4; 
      T     #rAccu5; 
      T     #rAccu6; 
      T     #rAccu7; 
      T     #rAccu8; 

//_______AVERAGE VALUE CALCULATION_______//
_006: L     #rAccu1; 
      L     #rAccu2; 
      +R    ; 
      L     #rAccu3; 
      +R    ; 
      L     #rAccu4; 
      +R    ; 
      L     #rAccu5; 
      +R    ; 
      L     #rAccu6; 
      +R    ; 
      L     #rAccu7; 
      +R    ; 
      L     #rAccu8; 
      +R    ; 
      L     8.000000e+000; 
      /R    ; 
      T     #rOutpuAux; 
      T     #rOutput; 

//_______EN-EN0 MECHANISM_______//
      SET   ; 
      SAVE  ; 
END_FUNCTION_BLOCK
```


----------



## Feng (14 Juli 2008)

Hi hank12 - wenn ich Dich recht verstehe, möchtest Du im Digitalen das machen, was im Analogen sonst ein PT1-Tiefpass-Filter mit der Verstärkung 1 macht.

Da kann ich Dir aus der Abtasttheorie helfen - geht sehr einfach und sehr effektiv - Du musst die Theorie gar nicht verstehen - nur anwenden.

Das Rezept: *x = a * x(n-1) + b * y(n-1).*

a und b sind konstante Koeffizienten *), 
x ist der Ausgangswert des Filters zum momentanen Zeitpunkt t=n*H, *H ist die Zeit zwischen zwei Berechnungen (Abtastschrittweite)* kann mit OB35 elegant festgelegt werden, n ist eine mit der Zeit ganze fortlaufende Zahl.
y ist der Eingangswert, y(n-1) ist demnach der Eingangswert einen Takt vor y.

So, und der Clou sind die Koeffizienten a, b: *a=exp(-H/T)* und *b= 1-a*, wobei *T die von Dir gewählte Zeitkonstante* Deines PT1-Filters ist.

Du bestimmst also *einmal(!)* (z.B. im OB100) die Koeffizienten a und b.
Spendierst 2 REAL-Speicherstellen für die alten Werte x(n-1) und y(n-1)
und berechnest mit a*x(n-1) + b*y(n-1) den neuen Ausgangswert x, der dann im nächsten Rechenschritt wieder bei x(n-1) eingefüllt wird. usw.

Also mit gerade mal 2 Speicherstellen, 2 Koeffizienten, 2 Multiplikationen und 1 Addition hast Du ein Digitales PT1-Filter!

Nebenbei bemerkt - mit Hilfe der Abtasttheorie lässt sich jedes analoge Filter sehr effektiv in ein Digitales Filter abbilden - man muss nur wissen, wie die Koeffizienten bestimmt werden (das ist das "know-how", das wir momentan zum Nulltarif nach China liefern ...)

Gruß
Feng

*) Da gibt es Programmierer, die im Programm diese Koeffizienten *bei jedem Rechenschritt* ausrechnen lassen! Ist ja nicht falsch - und kein Schwein merkt von außen diese Sünde - man sollte denen 20 Stockschläge verpassen (in Arabien würden die Fingerkuppen abgeschnitten werden ...)


----------



## Feng (14 Juli 2008)

Hi hank12 -


----------



## Onkel Dagobert (14 Juli 2008)

Hallo Feng,

schön erklärt, aber zusätzliche Realwerte muss man dabei nicht speichern.

*x = a * x(n-1) + b * y(n-1)*

*x(n-1)* ist der berechnete Ausgangswert des letzen Zyklus der hier rekursiv neu berchnet wird
*y(n-1)* ist der aktuelle Eingangswert der Funktion.


Gruß, Onkel


----------



## Ralle (14 Juli 2008)

Feng schrieb:


> (das ist das "know-how", das wir momentan zum Nulltarif nach China liefern ...)
> 
> Gruß
> Feng



Meinst du das im Ernst? Das haben wir schon vor 20 Jahren an der Uni beigebracht bekommen (ok, das meißte ist schon wieder weg ) und das steht in jedem Lehrbuch über digitale Regelungstechnik. Immerhin, lesen können die Chinesen auch.

PS: Aber im Prinzip verstehe ich schon was du meinst, mir ist auch nicht wohl bei diesen gedankenlosen Firmenverlegungen etc.


----------



## Feng (14 Juli 2008)

Ja ja - ralle - Du hast das schon richtig verstanden - vor 40 Jahren konnten die Chinesen allenfalls Fahrräder herstellen - heute bauen sie Festplatten etc - und demnächst werden wir bei denen abschauen ... falls sie uns lassen ...


----------



## Feng (14 Juli 2008)

Onkel Dagobert Du hast (fast) Recht - aber zumindest 1 REAL-Wert muss man doch bereitstellen für den alten x(n-1) - oder man trickst mit den Akkus ...


----------



## Onkel Dagobert (14 Juli 2008)

Hallo Feng,

naja, dass man den berechneten Wert irgendwo abspeichern muss ist klar. Es ist ja der gedämpfte Messwert, den man woanders im Programm benötigt. Wenn man diesen als IN_OUT an die FC übergibt, kann man ihn sowohl als X als auch als x(n-1) in der Berechnung verwenden. Vor der Berechnung ist es der "Altwert", nach der Berechnung der "Neuwert". Aber es ist dieselbe Variable.


Gruß, Onkel


----------



## Siggi56 (15 Juli 2008)

Hallo Hank12,

ich habe mal einen Baustein FB150 geschrieben, der ein VZ1 Glied realisiert. War ursprünglich zur Sollwertglättung gedacht, deshalb die entsprechenden Bezeichnungen. Aufruf sollte im zeitgesteuerten OB erfolgen, Zeitwert bei Parameter Tsample in Sekunden eingeben.
Im Anhang die Quelle.

Gruß Siggi


----------



## Chefmech (20 Juli 2008)

Hab soeben den Algorithmus eines einpoligen digitalen Tiefpass in einem anderen Forum gepostet, allerdings in Hochsprachencode...

http://www.progforum.com/showthread.php?t=8468


----------



## Hartmut Lux (25 Juli 2008)

Tja ich dachte das Thema PT1-Glied wäre längst abgehakt, hatten wir hier im Forum schon öfter. Habe vor langer Zeit mal einen Baustein geschrieben welcher im Zyklus aufgerufen eine höhere Genauigkeit mit sich bringt als eine Funktion im Zeit-OB. 
Setze ich schon seit Jahren mit Erfolg zur Meßwertglättung ein.


----------



## Chefmech (27 August 2009)

PS:
Wenn du ein digitales Tiefpass reinhängst solltest du auf eine gleichmässige Abtastung schauen, also im Zeitgesteuerten OB 35 aufrufen...


----------



## Gerri (27 November 2014)

Feng schrieb:


> Hi hank12 - wenn ich Dich recht verstehe, möchtest Du im Digitalen das machen, was im Analogen sonst ein PT1-Tiefpass-Filter mit der Verstärkung 1 macht.
> 
> Da kann ich Dir aus der Abtasttheorie helfen - geht sehr einfach und sehr effektiv - Du musst die Theorie gar nicht verstehen - nur anwenden.
> 
> ...



verstehe das T nicht. Wie wird die Konstante gewählt ?


----------



## Feng (27 November 2014)

Hi Gerri - T[sec] ist die Zeitkonstante deines Tiefpassfilters. Je  größer das T - umso träger wird dein Filter. Hängt also von deinem  Anwendungsfall ab. Am besten mal ausprobieren mit einer  y="Flatterfunktion" (z.B. Rechteckfolge) und dann das Ausgangssignal x  des Tiefpassfilters ansehen... 
Jede gute elektronische Waage hat so  ein Tiefpassfilter, sonst würde die letzte Stelle immer hin und her  zappeln und nicht mehr ablesbar sein - wäre aber die Zeitkonstante T zu  groß gewählt, dann hast du dein Gewicht erst nach Minuten...
Gruß Feng


----------

