s7-SCL-scripts/dew-point-calulator.md

1.2 KiB

FUNCTION "FC_DewPoint" : Void
{ S7_Optimized_Access := 'TRUE' }

VAR_INPUT
    Temperature_C : Real;   // Air temperature in degrees Celsius
    Humidity_RH   : Real;   // Relative humidity in percent: > 0 to 100
END_VAR

VAR_OUTPUT
    DewPoint_C : Real;      // Calculated dew point in degrees Celsius
    Valid      : Bool;      // TRUE when calculation is valid
END_VAR

VAR_TEMP
    Gamma : Real;
END_VAR

VAR_CONSTANT
    B : Real := 17.625;
    C : Real := 243.04;
END_VAR

BEGIN
    // Validate the input range.
    // RH must be greater than zero because LN(0) is undefined.
    #Valid :=
        (#Temperature_C >= -40.0) AND
        (#Temperature_C <= 50.0) AND
        (#Humidity_RH > 0.0) AND
        (#Humidity_RH <= 100.0);

    IF #Valid THEN

        // Gamma =
        // LN(RH / 100) + (B * Temperature) / (C + Temperature)
        #Gamma :=
            LN(#Humidity_RH / 100.0)
            +
            ((#B * #Temperature_C) /
            (#C + #Temperature_C));

        // Dew point =
        // (C * Gamma) / (B - Gamma)
        #DewPoint_C :=
            (#C * #Gamma) /
            (#B - #Gamma);

    ELSE
        #Gamma := 0.0;
        #DewPoint_C := 0.0;
    END_IF;

END_FUNCTION