Prüfung von Messwerten auf Plausibilität

vollmi

Level-3
Beiträge
5.442
Reaktionspunkte
1.412
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich mache immerwieder Prüfungen von gemessenen Werte auf Plausibilität. Dazu nehme ich drei vorhandene Messwerte und schaue ob die Differend zwischen ihnen zu gross ist um einen Messgerätefehler frühzeitig zu erkennen. im normalfall müssen sich alle Messgeräte in einem bestimmten Band befinden.

Das mach ich im Programm so:
X1-3 sind die messwerte und DM ist die plausible Tolleranz zueinander.

Code:
((X1-X2) < DM) AND ((X1-X3) < DM) AND ((X2-X3) < DM) alle werte plausibel


Ein Wert nicht plausibel
((X1-X2) < DM) AND ((X1-X3) > DM) AND ((X2-X3) > DM) 
nur X3 nicht plausibel weil die abweichung zu X1 und X2 zu gross ist.


((X1-X3) < DM) AND ((X1-X2) > DM) AND ((X2-X3) > DM) 
nur X2 nicht plausibel weil die abweichung zu X1 und X3 zu gross ist.


((X2-X3) < DM) AND ((X1-X3) > DM) AND ((X2-X1) > DM) 
nur X1 nicht plausibel weil die abweichung zu X2 und X3 zu gross ist.


zwei Werte nicht plausibel.
[COLOR=#008000]((X1-X2) < DM) AND ((X1-X3) < DM) AND ((X2-X3) > DM) [/COLOR]
nur X1 ist plausibel weil nur die abweichung X2 zu X3 zu gross ist.


[COLOR=#008000]((X1-X2) < DM) AND ((X2-X3) < DM) AND ((X1-X3) > DM) [/COLOR]
nur X2 ist plausibel weil nur die abweichung X1 zu X3 zu gross ist.


[COLOR=#008000]((X1-X3) < DM) AND ((X2-X3) < DM) AND ((X2-X1) > DM) [/COLOR]
nur X3 ist plausibel weil nur die abweichung X2 zu X1 zu gross ist.

Das ist ja noch recht einfach durch ein IF Konstrukt abgearbeitet. und von den Plausiblen Messwerten wird der Durchschnitt genommen.
Wenn zwei werte nicht plausibel sind bekomme ich als Ausgabe den Median von den drei Messwerten (die letzten Drei grünen zeilen)

Allerdings wenn ich jetzt einen 4. Messwert dazunehme wird das Konstrukt ja riesig. Darum überlege ich mir ob ich das nicht besser zusammenstellen könnte. Klar könnte ich jetzt einfach den Median von allen Messwerten nehmen. Dann habe ich ja aber noch keine Auswertung der Plausibilität und die brauch ich.

Jetzt wäre ich froh um einen Denkanstoss.

Hier noch mein Code wie ich das üblicherweise mache ich weiss, nicht schön aber selten und funktioniert:
Code:
FUNCTION Divpruef : BOOL // Plausibel


TITLE = 'Prüfung ob werte mehr als x voneinander abweichen'
// Funktion subtrahiert den kleineren Wert vom grösseren
// prüft ob differenz grösser als DivSoll ist.
//
VERSION : '1.0'
AUTHOR  : VoR
NAME    : Divpru
FAMILY  : TUV


VAR_INPUT
X1 : INT; // Wert 1
X2 : INT; // Wert 2
DivSoll : INT; // maximale abweichung
END_VAR


IF x1 > x2 THEN  // grösseren Wert abfragen.
    Divpruef := DivSoll > (x1 - x2);
ELSE
    Divpruef := DivSoll > (x2 - x1);
END_IF;
END_FUNCTION


FUNCTION Plausibel : INT


TITLE = 'Plausibilitätsauswertung dreier Messwerte'
// prüft ob differenz grösser als DivSoll ist.
VERSION : '1.0'
AUTHOR  : VoR
NAME    : Divpru
FAMILY  : TUV


VAR_INPUT
X1 : INT; // Wert 1
X2 : INT; // Wert 2
X3 : INT; // Wert 3
DivSoll : INT; // maximale abweichung
END_VAR


VAR_OUTPUT
 X1p : BOOL; // X nicht plausibel
 X2p : BOOL; // X nicht plausibel
 X3p : BOOL; // X nicht plausibel
END_VAR


X1p := FALSE; // rücksetzen der nicht plausibel Bools
X2p := FALSE;
X3p := FALSE;


IF     Divpruef(X1 := X1 ,X2 := X2 ,DivSoll :=  DivSoll) AND 
      (Divpruef(X1 := X1 ,X2 := X3 ,DivSoll :=  DivSoll) AND 
       Divpruef(X1 := X2 ,X2 := X3 ,DivSoll :=  DivSoll)) THEN  // Alle Köpfe plausibel.
    Plausibel := (X1 + X2 + X3) / 3;
END_IF;


// Ab hier 1 Kopf nicht plausibel
IF      Divpruef(X1 := X1 ,X2 := X2 ,DivSoll :=  DivSoll) AND
   (NOT Divpruef(X1 := X1 ,X2 := X3 ,DivSoll :=  DivSoll) AND     // nicht plausibel
    NOT Divpruef(X1 := X2 ,X2 := X3 ,DivSoll :=  DivSoll)) THEN  // nicht plausibel.
    Plausibel := (X1 + X2) / 2; // X3 nicht plausibel
        X3p := TRUE;
END_IF;


IF      Divpruef(X1 := X1 ,X2 := X3 ,DivSoll :=  DivSoll) AND
   (NOT Divpruef(X1 := X1 ,X2 := X2 ,DivSoll :=  DivSoll) AND     // nicht plausibel
    NOT Divpruef(X1 := X2 ,X2 := X3 ,DivSoll :=  DivSoll)) THEN  // nicht plausibel.
    Plausibel := (X1 + X3) / 2; // X2 nicht plausibel
        X2p := TRUE;
END_IF;


IF      Divpruef(X1 := X2 ,X2 := X3 ,DivSoll :=  DivSoll) AND
   (NOT Divpruef(X1 := X1 ,X2 := X3 ,DivSoll :=  DivSoll) AND     // nicht plausibel
    NOT Divpruef(X1 := X1 ,X2 := X2 ,DivSoll :=  DivSoll)) THEN  // nicht plausibel.
    Plausibel := (X2 + X3) / 2; // X1 nicht plausibel
        X1p := TRUE;
END_IF;


// Ab hier 2 Köpfe nicht plausibel aber Median möglich. Median gilt!
IF      Divpruef(X1 := X1 ,X2 := X2 ,DivSoll :=  DivSoll) AND
       (Divpruef(X1 := X1 ,X2 := X3 ,DivSoll :=  DivSoll) AND
    NOT Divpruef(X1 := X1 ,X2 := X2 ,DivSoll :=  DivSoll)) THEN  // nicht plausibel.
    Plausibel := X1; // X2 und X3 nicht plausibel
        X2p := TRUE;
        X3p := TRUE;
END_IF;


IF      Divpruef(X1 := X1 ,X2 := X2 ,DivSoll :=  DivSoll) AND
       (Divpruef(X1 := X2 ,X2 := X3 ,DivSoll :=  DivSoll) AND
    NOT Divpruef(X1 := X1 ,X2 := X3 ,DivSoll :=  DivSoll)) THEN  // nicht plausibel.
    Plausibel := X2; // X1 und X3 nicht plausibel
        X1p := TRUE;
        X3p := TRUE;
END_IF;


IF      Divpruef(X1 := X1 ,X2 := X3 ,DivSoll :=  DivSoll) AND
       (Divpruef(X1 := X2 ,X2 := X3 ,DivSoll :=  DivSoll) AND
    NOT Divpruef(X1 := X1 ,X2 := X2 ,DivSoll :=  DivSoll)) THEN  // nicht plausibel.
    Plausibel := X3; // X1 und X2 nicht plausibel
        X1p := TRUE;
        X2p := TRUE;
END_IF;


// Alle Werte nicht plausibel/ Keine Plausibilisierung möglich
IF  NOT Divpruef(X1 := X1 ,X2 := X2 ,DivSoll :=  DivSoll) AND
   (NOT Divpruef(X1 := X1 ,X2 := X3 ,DivSoll :=  DivSoll) AND
    NOT Divpruef(X1 := X2 ,X2 := X3 ,DivSoll :=  DivSoll)) THEN  // nicht plausibel.
    Plausibel := 0;
        X1p := TRUE;
        X2p := TRUE;
        X3p := TRUE;
END_IF;




END_FUNCTION

mfG René
 
Hallo René,
du könntest z.B. so vorgehen :
Code:
Status := 0 ;

if (abs(X1-X2) > DM) then Status := 1 ; end_if ;
if (abs(X1-X3) > DM) then Status := 2 ; end_if ;
if (abs(X2-X3) > DM) then Status := 4 ; end_if ;
Jetzt könntest du über die Hilfs-Variable Status herausbekommen, wie es um die Plausibilität ausschaut.
Möchtest du das Ganze jetzt für n-Variablen haben so würde ich die Geschichte über ein Array, in das du deine Vergleichswerte hineinschreibst, und das du dann mit einer Schleife durchsuchst, lösen.

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke dir

Ich hab mir das mit dem Array überlegt. Ich könnte ja jede Messstelle einer Arraystelle zuweisen. und bei überschreiten der Abweichung gebe ich beiden Teilnehmer der Arraygruppe eine addition des Status mit.

Damit habe ich zwar dann eine Bewertung welche Messwerte am wenigsten plausibel sind. Dann könnte ich entweder den Messwert mit der geringsten Fehlerwertung nehmen oder den Mittelwert der Messwerte mit dem geringsten Fehlerwert.

Das Problem könnte dann aber sein dass ich im Arraydurchlauf z.B. X[1]-X[3] prüfe und beim Durchlauf X[3] ja nochmal X[3]-X[1] prüfe.
Sollte aber kein Problem darstellen.

Muss ich jetzt mal im Simulator ausprobieren.

mfG René
 
Zurück
Oben