Step 7 Temperaturmessung mit 3 Sensoren

Zuviel Werbung?
-> 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.
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);
Gruss, Heinileini
 
Zuletzt bearbeitet:
Durch diese Tread hab ich unsere 2v3 Bearbeitung mal gegen es Licht gehalten.
Wir machen keinen Unterschied beim Abweichung eine der Kanälen. Wir generieren ein Sammelalarm und alle 3 Sensoren bleiben in die Verarbeitung.
Nur wenn richtig ein, zwei der 3 , oder sogar 3 gestört ist/sind dann wird ausgekuppelt.

Mittelwert, Abweichung hab ich mal überarbeitet

Dies seht dann so aus

Code:
     // Middle Value
    IF NOT #MAX_OUT AND NOT #MIN_OUT AND NOT #AVERAGE_OUT THEN
        #Cache_ACT_VAL_2oo3_OUT := MIN(IN1 := MAX(IN1:=#AV_intern_Channel_A, IN2:=#AV_intern_Channel_B),
                                             IN2 := MAX(IN1:=#AV_intern_Channel_A, IN2:=#AV_intern_Channel_C),
                                             IN3 := MAX(IN1:=#AV_intern_Channel_B, IN2:=#AV_intern_Channel_C));
        IF #MF_AL_Intern_Channel_A THEN
            #Cache_ACT_VAL_2oo3_OUT := #AV_intern_Channel_B;
        END_IF;
        IF #MF_AL_Intern_Channel_B THEN
            #Cache_ACT_VAL_2oo3_OUT := #AV_intern_Channel_C;
        END_IF;
        IF #MF_AL_Intern_Channel_C THEN
            #Cache_ACT_VAL_2oo3_OUT := #AV_intern_Channel_A;
        END_IF;
    END_IF;


Code:
   // Analog OUT in case of 2oo3 disturbed     
    IF #MF_AL_Intern_Channel_A AND #MF_AL_Intern_Channel_B THEN
        #Cache_ACT_VAL_2oo3_OUT := #AV_intern_Channel_C;
    END_IF;
    IF #MF_AL_Intern_Channel_A AND #MF_AL_Intern_Channel_C THEN
        #Cache_ACT_VAL_2oo3_OUT := #AV_intern_Channel_B;
    END_IF;
    IF #MF_AL_Intern_Channel_B AND #MF_AL_Intern_Channel_C THEN
        #Cache_ACT_VAL_2oo3_OUT := #AV_intern_Channel_A;
    END_IF;
    IF #MF_AL_Intern_Channel_A AND #MF_AL_Intern_Channel_B AND #MF_AL_Intern_Channel_C THEN
        #Cache_ACT_VAL_2oo3_OUT := #Replace_Value;
    END_IF;

Code:
 REGION Alarm Deviation
    #TIMER_Deviation(IN := ABS(#AV_intern_Channel_A - #AV_intern_Channel_B)  >= #Deviation
                                    OR ABS(#AV_intern_Channel_B - #AV_intern_Channel_C)  >= #Deviation
                                    OR ABS(#AV_intern_Channel_C - #AV_intern_Channel_A)  >= #Deviation,
                     PT := #Delay_Deviation);
    #Deviation_AL_OUT :=
    #STATE_HMI_2oo3.Deviation_ALARM_1oo3_OUT :=
    #Comm_ZLT.STATE_2oo3.Deviation_ALARM_1oo3_OUT :=
    #Signal_Bytes_HMI."CHANNEL_2oo3".Deviation :=
    #Comm_ZLT.Failure_2oo3.Deviation :=
    #TIMER_Deviation.Q;
    #"Deviation - Program_Alarm"(SIG := #TIMER_Deviation.Q);
END_REGION

Bram
 
Zurück
Oben