Index: firmware/App/Controllers/ConductivitySensors.c =================================================================== diff -u -r43fcf6140ca7b3ec665067653a7d64dce65d71d4 -r5cfa1f3d17db625f92f046868812717e3f1f51c3 --- firmware/App/Controllers/ConductivitySensors.c (.../ConductivitySensors.c) (revision 43fcf6140ca7b3ec665067653a7d64dce65d71d4) +++ firmware/App/Controllers/ConductivitySensors.c (.../ConductivitySensors.c) (revision 5cfa1f3d17db625f92f046868812717e3f1f51c3) @@ -20,6 +20,7 @@ #include "FPGA.h" #include "TaskPriority.h" #include "TemperatureSensors.h" +#include "Utilities.h" /** * @addtogroup ConductivitySensors @@ -38,20 +39,20 @@ #define COND_SENSOR_CPI_CPO_MIN_VALUE 100 ///< Minimum inlet water conductivity #define MAX_ALLOWED_UNCHANGED_CONDUCTIVITY_READS 100 ///< New reading every 640 ms, expect to get new reading in 1s +#define MAX_CONDUCTIVITY_SENSOR_FAILURES 5 ///< maximum number of conductivity sensor errors within window period before alarm +#define MAX_CONDUCTIVITY_SENSOR_FAILURE_WINDOW_MS (60 * MS_PER_SECOND) ///< Conductivity sensor error window // ********** private data ********** /// Conductivity sensors' associated temperature sensors static U32 associateTempSensor[ NUM_OF_CONDUCTIVITY_SENSORS ] = { TEMPSENSORS_INLET_PRIMARY_HEATER_TEMP_SENSOR, ///< Inlet temperature sensor TEMPSENSORS_OUTLET_PRIMARY_HEATER_TEMP_SENSOR, ///< Outlet temperature sensor - TEMPSENSORS_CONDUCTIVITY_SENSOR_1_TEMP_SENSOR, ///< Conductivity sensor 1 temperature sensor - TEMPSENSORS_CONDUCTIVITY_SENSOR_2_TEMP_SENSOR, ///< Conductivity sensor 2 temperature sensor }; static U08 readCount[ NUM_OF_CONDUCTIVITY_SENSORS ]; ///< Read count for conductivity readings. static U32 internalErrorCount[ NUM_OF_CONDUCTIVITY_SENSORS ]; ///< Internal error count for conductivity readings. -static OVERRIDE_F32_T compensatedConductivityValues[ NUM_OF_CONDUCTIVITY_SENSORS ]; ///< Latest conductivity values. +static OVERRIDE_F32_T compensatedConductivityValues[ NUM_OF_CONDUCTIVITY_SENSORS ]; ///< Latest compensated conductivity values. static OVERRIDE_U32_T conductivityDataPublishInterval = { COND_SENSOR_REPORT_PERIOD, COND_SENSOR_REPORT_PERIOD, 0, 0 }; ///< Conductivity sensors publish time interval override @@ -60,7 +61,7 @@ // ********** private function prototypes ********** static void processCPiCPoSensorRead( U32 sensorId, U32 fgpaRead, U08 fpgaReadCount, U08 fpgaErrorCount ); -static F32 calcCompensatedConductivity( U32 conductivity, F32 temperature); +static F32 calcCompensatedConductivity( F32 conductivity, F32 temperature); static DATA_GET_PROTOTYPE( U32, getConductivityDataPublishInterval ); @@ -89,6 +90,9 @@ // TODO: Ability to change probe type // setFPGAConductivityProbeType( COND_SENSOR_PROBE_TYPE ); } + + initTimeWindowedCount( TIME_WINDOWED_COUNT_FPGA_CONDUCTIVITY_SENSOR_ERROR, + MAX_CONDUCTIVITY_SENSOR_FAILURES, MAX_CONDUCTIVITY_SENSOR_FAILURE_WINDOW_MS ); } /************************************************************************* @@ -109,15 +113,14 @@ { conductivityDataPublicationTimerCounter = 0; broadcastConductivityData( getConductivityValue(CONDUCTIVITYSENSORS_CPI_SENSOR), - getConductivityValue(CONDUCTIVITYSENSORS_CPO_SENSOR), - 0, - 0 ); + getConductivityValue(CONDUCTIVITYSENSORS_CPO_SENSOR) ); } } /************************************************************************* * @brief - * The checkInletWaterConductivity function checks conductivity value + * The checkInletWaterConductivity checks inlet water conductivity value + * and triggers an alarm when conductivity value is out of allowed range. * @details * Inputs : none * Outputs : Trigger alarms when conductivity is out of allowed range @@ -165,7 +168,7 @@ } else { - activateAlarmNoData( ALARM_ID_SOFTWARE_FAULT ); + activateAlarmNoData( ALARM_ID_DG_SOFTWARE_FAULT ); } return result; @@ -183,7 +186,7 @@ * @param temperature : Temperature to compensate conductivity with * @return compensated conductivity based on temperature *************************************************************************/ -static F32 calcCompensatedConductivity( U32 conductivity, F32 temperature) +static F32 calcCompensatedConductivity( F32 conductivity, F32 temperature) { // EC = EC_25 * (1 + temp_coef * (temperature - 25)) F32 const compensatedCoef = ( 1 + ( COND_SENSOR_TEMPERATURE_COEF * (temperature - COND_SENSOR_REFERENCE_TEMPERATURE) ) ); @@ -222,13 +225,16 @@ ++internalErrorCount[ sensorId ]; if ( internalErrorCount[ sensorId ] > MAX_ALLOWED_UNCHANGED_CONDUCTIVITY_READS ) { - activateAlarmNoData( ALARM_ID_SOFTWARE_FAULT ); + SET_ALARM_WITH_1_U32_DATA( ALARM_ID_CONDUCTIVITY_SENSOR_FAULT, sensorId ); } } } else { - SET_ALARM_WITH_1_F32_DATA( ALARM_ID_SOFTWARE_FAULT, fpgaErrorCount ); + if ( TRUE == incTimeWindowedCount( TIME_WINDOWED_COUNT_FPGA_CONDUCTIVITY_SENSOR_ERROR ) ) + { + SET_ALARM_WITH_1_U32_DATA( ALARM_ID_CONDUCTIVITY_SENSOR_FAULT, sensorId ); + } } }