- Beiträge
- 5.442
- Reaktionspunkte
- 1.412
-> 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.
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:
mfG René
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é