Supported platforms: CODESYS 3.5 SP19 SAFETY

S_NTCSensor (FUN)

Description

This function converts resistance value to temperature (°C). POU’s operational range is at least from -50 ℃ to 150 ℃. This POU can be used for NTC type temperature sensors.

Function uses beta parameter equation to calculate temperature from resistance value.

 

 

, where T25 = 298,15 K and T0 = 273,15 K.

 

 

Sensor hardware errors are diagnosed with SafeConversion library's function blocks S_ADCToVoltageOrCurrent or S_VoltageToResistance.  

 

Sensor value alarms and warnings are diagnosed with SafeDataValidation library function block S_ValueDiagnostic.

 

Inputs

Input variable name

Data type

Unit

Range

Description

S_i_SensorResistance

SAFEDINT

>0

NTC sensor resistance

S_i_ResistanceAt25degC

SAFEUDINT

-

Sensor's typical resistance value at 25°C.

S_i_Beta

SAFEUDINT

K

-

NTC sensor specific beta constant

Output

Data type

Unit

Range

Description

SAFEDINT

°C

-

Measured sensor temperature.

 

Return value is 150 °C if any of input parameters are zero or below zero.

Example code

This example contains the validation of 2 NTC (connected to TI input pin) sensors resistance signals, conversion from resistance to temperature and the diagnostic of temperature value .

 

 

Safe definitions:

 

PROGRAM S_TemperatureNTC
VAR_INPUT
    S_i_SafetySystemEnable: SAFEBOOL := FALSE;    
    i_NTC_A_Resistance:SAFEDINT := DINT#0;                        (*NTC A sensor resistance signal mOhm*)
    i_NTC_B_Resistance:SAFEDINT := DINT#0;                        (*NTC B sensor resistance signal mOhm*)
    i_NTC_A_Status:    EPEC_SC.Status;                            (*NTC A sensor resistance signal status*)    
    i_NTC_B_Status:    EPEC_SC.Status;                            (*NTC B sensor resistance signal status*)
    i_pEventCodeNTC_A: POINTER TO EPEC_DITF.EventCode := DWORD#0;
    i_pEventCodeNTC_B: POINTER TO EPEC_DITF.EventCode := DWORD#0;
END_VAR
VAR_OUTPUT
    o_S_Temperature:   SAFEDINT;
    o_TemperatureStatus:EPEC_SDV.Status;
END_VAR
VAR
    initDone:          BOOL;
    validationEnable:  BOOL;
    S_ValidatedResistance:SAFEDINT;
    S_Temperature:     SAFEDINT;
    resistance_status: EPEC_SDV.Status;
    S_NTCValidation:   EPEC_SDV.S_ValidateAI;    
    S_NTCDiagnostics:  EPEC_SDV.S_ValueDiagnostic;
END_VAR
VAR CONSTANT
    S_AI_TOLERANCE:   SAFEDINT := DINT#100;
    S_NTC_RES_AT_25C: SAFEUDINT := UDINT#10000;
    S_NTC_Beta:       SAFEUDINT := UDINT#3988;
END_VAR

 

Init at safe PRG:

IF NOT initDone THEN

    initDone := TRUE;
        
    S_NTCValidation.Init(    
        S_i_InvertedCh2 := FALSE,        
        S_i_DiagnosticDelay := 500,        
        S_i_SafeOutputValue := DINT#0,        
        S_i_Tolerance := S_AI_TOLERANCE,        
        S_i_SumValue := DINT#0,        
        i_pEventCode := i_pEventCodeNTC_A,        
        i_pEventCodeCh2 := i_pEventCodeNTC_B    
    );
    
    S_NTCDiagnostics.Init(    
        S_i_HighErrorLimit := DINT#100,        
        S_i_LowErrorLimit := DINT#-5,        
        S_i_EnableHighError := TRUE,        
        S_i_EnableLowError := TRUE,        
        S_i_DiagnosticDelay := UINT#1000,        
        S_i_SafeOutputValue := DINT#0,        
        i_pEventCode := i_pEventCodeNTC_A    
    );

END_IF

 

Code at safe PRG:

 

 

 

See also

 

How to validate temperature sensors

 

 

 

 

Source file S_NTCSensor.htm

Last updated 21-Feb-2025