Glättung eines Analogwertes

hank12

Level-1
Beiträge
132
Reaktionspunkte
2
Zuviel Werbung?
-> Hier kostenlos registrieren
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
 
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
 
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
 
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
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Zum Glätten von REAL-Messwerten verwende ich zwei Hilfswörter
Code:
      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
 
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: ...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?
 
würde dann in etwa so aussehen:

Code:
*
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
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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(n) = a * x(n-1) + b * y(n-1).

a und b sind konstante Koeffizienten *),
x(n) 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(n).

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(n), 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 ...)
 
Zuletzt bearbeitet:
Hallo Feng,

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

x(n) = 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
 
Zuviel Werbung?
-> Hier kostenlos registrieren
(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 :ROFLMAO:) 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.
 
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 ...
 
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 ...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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(n) 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
 
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
 

Anhänge

  • VZ1.zip
    690 Bytes · Aufrufe: 132
Zurück
Oben