Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Ergebnis 1 bis 3 von 3

Thema: Prüfung von Messwerten auf Plausibilität

  1. #1
    Registriert seit
    22.11.2006
    Ort
    CH
    Beiträge
    3.618
    Danke
    775
    Erhielt 646 Danke für 492 Beiträge

    Standard


    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.
    ((X1-X2) < DM) AND ((X1-X3) < DM) AND ((X2-X3) > DM) 
    nur X1 ist plausibel weil nur die abweichung X2 zu X3 zu gross ist.
    
    
    ((X1-X2) < DM) AND ((X2-X3) < DM) AND ((X1-X3) > DM) 
    nur X2 ist plausibel weil nur die abweichung X1 zu X3 zu gross ist.
    
    
    ((X1-X3) < DM) AND ((X2-X3) < DM) AND ((X2-X1) > DM) 
    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é
    Zitieren Zitieren Prüfung von Messwerten auf Plausibilität  

  2. #2
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.716
    Danke
    398
    Erhielt 2.398 Danke für 1.998 Beiträge

    Standard

    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

  3. Folgender Benutzer sagt Danke zu Larry Laffer für den nützlichen Beitrag:

    vollmi (24.10.2014)

  4. #3
    Avatar von vollmi
    vollmi ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    22.11.2006
    Ort
    CH
    Beiträge
    3.618
    Danke
    775
    Erhielt 646 Danke für 492 Beiträge

    Standard


    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é

Ähnliche Themen

  1. Ausgabe von analogen Messwerten
    Von DavidS im Forum HMI
    Antworten: 7
    Letzter Beitrag: 15.03.2013, 17:27
  2. Antworten: 7
    Letzter Beitrag: 04.10.2009, 10:09
  3. Kontinuierliche Speicherung von Messwerten
    Von ronin2503 im Forum CODESYS und IEC61131
    Antworten: 4
    Letzter Beitrag: 24.09.2008, 22:02
  4. Plausibilität
    Von ottopaul im Forum Simatic
    Antworten: 9
    Letzter Beitrag: 01.06.2007, 15:36
  5. Selektion von Messwerten
    Von dimo_77 im Forum Programmierstrategien
    Antworten: 3
    Letzter Beitrag: 15.11.2006, 07:33

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •