Siemens S7-300 does not come standard with Namur NE43 functionality on analog inputs. For one of our projects we created a block to evaluate sensor status according Namur NE43. The configuration uses SM331 analog input modules in 2-wire configuration. Namur NE43 capable temperature and pressure transmitters are connected to the analog inputs.

The block below is called from the main program, the block need to have a call for every analog input channel. In every call, the input is specified, as well as the range of the transmitter connected and the high and low alarm threshold. These figures are taken from a Data-block which can be edited by means of the HMI device connected to the PLC. In the block the raw value from the Analog to Digital converter is calculated to a real value which represents the measured temperature or pressure and is displayed on the HMI device. The alarm values are also specified as real values.

FUNCTION "ANALOG_INPUT" : VOID
TITLE =
//Function for evaluating analog inputs including Namur NE43.
VERSION : 0.1

VAR_INPUT
 Input : WORD ;        //PIW from analog input card
 LowVal : REAL ;       //Low value for range calculation.
 HighVal : REAL ;      //High Value for range calculation
 LowAlarm : REAL ;     //Low alarm threshold
 HighAlarm : REAL ;    //High alarm threshold
 EnableHighAl : BOOL ; //Enable high alarm (Set TRUE to enable)
 EnableLowAl : BOOL ;  //Enable Low alarm bit (Set TRUE to enable)
END_VAR

VAR_OUTPUT
 Value : REAL ;        //Sensor signal in engineering units.
 AlarmHigh : BOOL ;    //High Alarm bit
 AlarmLow : BOOL ;     //Low alarm bit
 Overrange : BOOL ;    //Namur NE43 sensor fault Overrange
 Underrange : BOOL ;   //Namur NE43 sensor fault Underrange
END_VAR

VAR_TEMP
 InReal : REAL ; 
 Range : REAL ; 
 Factor : REAL ; 
END_VAR

BEGIN

NETWORK
TITLE =Namur NE43 low alarm
//Value for evaluation Namur NE43 low = underrange
//3,6 mA = -691 = FD4D
 L #Input; 
 L -691; 
 <I ; 
 = #Underrange;

NETWORK
TITLE =Namur NE43 high alarm
//Value for evaluating Namur NE43 high = overrange
//21,5 mA == 7620 = 30240
 L #Input; 
 L 30240; 
 >I ; 
 = #Overrange;

NETWORK
TITLE = Conversion PeripheralInputWord (PIW) to real
 L #Input;
 ITD ;      //Integer to Double conversion.
 DTR ;      //Double to real conversion
 T #InReal;

NETWORK
TITLE =Calculation of range according high/low engineering units
 L #HighVal; 
 L #LowVal; 
 -R ; 
 T #Range;

NETWORK
TITLE =Calculation of range multiplication factor
//Max input analog is hex 6C00 => 27648 dec
 L #Range; 
 L 2.764800e+004; 
 /R ; 
 T #Factor;

NETWORK
TITLE =Calculation of real value analog input in engineering units
 L #InReal; 
 L #Factor; 
 *R ; 
 L #LowVal; 
 +R ; 
 T #Value; 

NETWORK
TITLE = Low Alarm
 A( ; 
 L #Value; 
 L #LowAlarm; 
 <R ; 
 ) ; 
 A #EnableLowAl; 
 = #AlarmLow; 

NETWORK
TITLE =High Alarm
A( ; 
 L #Value; 
 L #HighAlarm; 
 >R ; 
 ) ; 
 A #EnableHighAl; 
 = #AlarmHigh; 
END_FUNCTION

For testing purposes we used the DIVIZE A2007E-X 4-20 mA signal unit. This made it real easy to test our configuration.

The code is Step-7 source code, use at your own risc.