- Beiträge
- 6.698
- Reaktionspunkte
- 1.690
-> Hier kostenlos registrieren
Der weißnix_-Code aus #19 und das Thema ErrorBit haben mich angeregt, mich noch weiter mit der Angelegenheit zu beschäftigen.
Die Überlegungen, dass
- die grösste Abweichung vom Mittelwert durchaus nur minimal grösser sein kann, als eine der beiden anderen Abweichungen und
- aus diesem minimalen Unterschied abgeleitet werden soll, welcher Sensor der "böse" sein soll und
- es u.U. keine grösste Abweichung geben muss, obwohl alle drei Abweichungen riesig sind (weil zufällig identisch),
führten dazu, dass ich
- in meiner Variante als Ergebnis ggfs auch den Mittelwert aus allen drei SensorWerten ausgebe und, dass ich
- für die Bildung der ErrorBits (und der WarnungsBits) einen ToleranzWert eingeführt habe, mit dem die Abweichungen verglichen werden und ich
- WarnungsBits noch zusätzlich vorgesehen habe.
Gruss, Heinileini
Die Überlegungen, dass
- die grösste Abweichung vom Mittelwert durchaus nur minimal grösser sein kann, als eine der beiden anderen Abweichungen und
- aus diesem minimalen Unterschied abgeleitet werden soll, welcher Sensor der "böse" sein soll und
- es u.U. keine grösste Abweichung geben muss, obwohl alle drei Abweichungen riesig sind (weil zufällig identisch),
führten dazu, dass ich
- in meiner Variante als Ergebnis ggfs auch den Mittelwert aus allen drei SensorWerten ausgebe und, dass ich
- für die Bildung der ErrorBits (und der WarnungsBits) einen ToleranzWert eingeführt habe, mit dem die Abweichungen verglichen werden und ich
- WarnungsBits noch zusätzlich vorgesehen habe.
Code:
var
i_tempa:int;
i_tempb:int;
i_tempb:int;
i_mw1:int;
i_diffabsa:int;
i_diffabsb:int;
i_diffabsc:int;
i_maxtolerable:int; (* mit ToleranzWert für Fehler versorgen!!! *)
i_result:int;
x_tmp_bad_a:bool;
x_tmp_bad_b:bool;
x_tmp_bad_c:bool;
x_tmp_worst_a:bool;
x_tmp_worst_b:bool;
x_tmp_worst_c:bool;
x_warng_a:bool;
x_warng_b:bool;
x_warng_c:bool;
x_error_a:bool;
x_error_b:bool;
x_error_c:bool;
end_var
i_mw1:=(i_tempa+i_tempb+i_tempc)/3;
i_diffabsa:=abs(i_mw1-i_tempa);
i_diffabsb:=abs(i_mw1-i_tempb);
i_diffabsc:=abs(i_mw1-i_tempc);
x_tmp_worst_a:=diffabsa > i_diffabsb and diffabsa > i_diffabsc; (* grösste Abweichung vom MittelWert *)
x_tmp_worst_b:=diffabsb > i_diffabsc and diffabsb > i_diffabsa;
x_tmp_worst_c:=diffabsc > i_diffabsa and diffabsc > i_diffabsb;
if x_tmp_worst_a then
i_result:=(i_tempb+i_tempc)/2; (* Fühler a scheidet aus *)
elseif x_tmp_worst_b then
i_result:=(i_tempc+i_tempa)/2; (* Fühler b scheidet aus *)
elseif x_tmp_worst_c then
i_result:=(i_tempa+i_tempb)/2; (* Fühler c scheidet aus *)
else
i_result:=i_mw1;
end_if;
x_tmp_bad_a:=diffabsa > i_maxtolerable; (* Abweichung überschreitet ToleranzWert *)
x_tmp_bad_b:=diffabsb > i_maxtolerable;
x_tmp_bad_c:=diffabsc > i_maxtolerable;
x_error_a:=x_tmp_bad_a and x_tmp_worst_a; (* Fehler, weil grösste Abweichung UND ToleranzÜberschreitung *)
x_error_b:=x_tmp_bad_b and x_tmp_worst_b;
x_error_c:=x_tmp_bad_c and x_tmp_worst_c;
x_warng_a:=x_tmp_bad_a and not(x_tmp_worst_a); (* Warnung, weil ToleranzÜberschreitung, aber nicht grösste Abweichung *)
x_warng_b:=x_tmp_bad_b and not(x_tmp_worst_b);
x_warng_c:=x_tmp_bad_c and not(x_tmp_worst_c);
Zuletzt bearbeitet: