Index: firmware/App/Controllers/ConductivitySensors.c =================================================================== diff -u -r0d94694b64f936805dd6c2f71fde1840bc9c1311 -r5c8f6d4d16252ed287dd7ee5a89ff814bce17eff --- firmware/App/Controllers/ConductivitySensors.c (.../ConductivitySensors.c) (revision 0d94694b64f936805dd6c2f71fde1840bc9c1311) +++ firmware/App/Controllers/ConductivitySensors.c (.../ConductivitySensors.c) (revision 5c8f6d4d16252ed287dd7ee5a89ff814bce17eff) @@ -68,10 +68,8 @@ #define EMSTAT_PICO_FIFO_EMPTY_MASK 0x8000 ///< Emstat Pico buffer empty indication bit. #define EMSTAT_NUM_OF_SENSORS_PER_BOARD 2 ///< Emstat Pico number of sensors per board. -#define EMSTAT_CPI_OR_CD1_INDEX 0 ///< Emstat board CPi index number. -#define EMSTAT_CPO_OR_CD2_INDEX 1 ///< Emstat board CPo index number. -#define EMSTAT_BOARD_CD1_INDEX 0 ///< Emstat board CD1 index number. -#define EMSTAT_BOARD_CD2_INDEX 1 ///< Emstat board CD2 index number. +#define EMSTAT_CPI_OR_CD1_INDEX 0 ///< Emstat board CPi index number. +#define EMSTAT_CPO_OR_CD2_INDEX 1 ///< Emstat board CPo index number. #define DATA_PUBLISH_COUNTER_START_COUNT 40 ///< Data publish counter start count. #define COND_SENSOR_BAD_STATUS_PERSISTENCE_PERIOD ( 1 * MS_PER_SECOND ) ///< Conductivity sensor bad status persistence period. @@ -100,14 +98,20 @@ BOOL packageStarted; ///< Emstat package started flag. U08 packageIndex; ///< Emstat package index number. U08 package[ 50 ]; ///< Emstat read buffer package. - EMSTAT_COND_AND_TEMP_T sensors[ EMSTAT_NUM_OF_SENSORS_PER_BOARD ]; - CONDUCTIVITY_SENSORS_T condSnsr1; ///< Emstat conductivity sensor 1 on the board. - TEMPERATURE_SENSORS_T condSnsr1TempSnsr; ///< Emstat conductivity sensor 1 temperature sensor. - CONDUCTIVITY_SENSORS_T condSnsr2; ///< Emstat conductivity sensor 2 on the board. - TEMPERATURE_SENSORS_T condSnsr2TempSnsr; ///< Emstat conductivity sensor 21 temperature sensor. + EMSTAT_COND_AND_TEMP_T sensors[ EMSTAT_NUM_OF_SENSORS_PER_BOARD ]; ///< Emstat conductivity and corresponding temperature sensors U16 fpgaPreviousCount; ///< Emstat FPGA previous count. - U08 fpgaInitialErrorCount; ///< Emstat FPGA initial error count. + U08 fpgaPreviousErrorCount; ///< Emstat FPGA previous error count. } EMSTAT_READ_T; + +/// Conductivity sensors structure +typedef struct +{ + U08 readCount; ///< Conductivity sensor FPGA read count. + U32 internalErrorCount; ///< Conductivity sensor internal error count. + OVERRIDE_F32_T compensatedCondValue; ///< Conductivity sensor compensated value + F32 rawCondValue; ///< Conductivity sensor raw value. + U32 sensorStatus; ///< Conductivity sensor status. +} COND_SENSOR_STATUS_T; #pragma pack(pop) // ********** private data ********** @@ -129,16 +133,17 @@ TEMPSENSORS_CONDUCTIVITY_SENSOR_2, ///< Post-bicarbonate temperature sensor }; // TODO remove -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 compensated conductivity values. -static F32 rawConductivityValues[ NUM_OF_CONDUCTIVITY_SENSORS ]; ///< Latest raw conductivity values. -static F32 roRejectionRatio; ///< Latest RO rejection ratio. -static U32 sensorStatus[ NUM_OF_CONDUCTIVITY_SENSORS ]; ///< Latest sensor hardware status. +static U08 readCount[ NUM_OF_CONDUCTIVITY_SENSORS ]; // TODO remove ///< Read count for conductivity readings. +static U32 internalErrorCount[ NUM_OF_CONDUCTIVITY_SENSORS ]; // TODO remove ///< Internal error count for conductivity readings. +static OVERRIDE_F32_T compensatedConductivityValues[ NUM_OF_CONDUCTIVITY_SENSORS ]; // TODO remove ///< Latest compensated conductivity values. +static F32 rawConductivityValues[ NUM_OF_CONDUCTIVITY_SENSORS ]; // TODO remove ///< Latest raw conductivity values. +static U32 sensorStatus[ NUM_OF_CONDUCTIVITY_SENSORS ]; // TODO remove ///< Latest sensor hardware status. static OVERRIDE_U32_T conductivityDataPublishInterval = { COND_SENSOR_REPORT_PERIOD, COND_SENSOR_REPORT_PERIOD, 0, 0 }; ///< Conductivity sensors publish time interval override. -static U32 conductivityDataPublishCounter; ///< Conductivity sensors data publish timer counter. +static F32 roRejectionRatio; ///< Latest RO rejection ratio. +static U32 condDataPublishCounter; ///< Conductivity sensors data publish timer counter. static EMSTAT_READ_T emstatBoardRead[ NUM_OF_EMSTAT_BOARDS ]; ///< EMSTAT board read. +static COND_SENSOR_STATUS_T condSensorStatus[ NUM_OF_CONDUCTIVITY_SENSORS ]; ///< Conductivity sensors status. static BOOL packageStarted; ///< Flag to indicate the start of a package measurement data. static U08 packageIndex; ///< Current package measurement data bytes index. @@ -176,20 +181,24 @@ void initConductivitySensors( void ) { U08 i; - roRejectionRatio = 0.0; - packageIndex = 0U; - packageStarted = FALSE; - conductivityDataPublishCounter = DATA_PUBLISH_COUNTER_START_COUNT; + roRejectionRatio = 0.0; + packageIndex = 0U; + packageStarted = FALSE; + condDataPublishCounter = DATA_PUBLISH_COUNTER_START_COUNT; for ( i = 0; i < NUM_OF_CONDUCTIVITY_SENSORS; i++ ) { + // TODO remove readCount[ i ] = 0; internalErrorCount[ i ] = 0; rawConductivityValues[ i ] = 0.0; compensatedConductivityValues[ i ].data = 0.0; compensatedConductivityValues[ i ].ovData = 0.0; compensatedConductivityValues[ i ].ovInitData = 0.0; compensatedConductivityValues[ i ].override = OVERRIDE_RESET; + // TODo remove + + memset( &condSensorStatus[ i ], 0x0, sizeof( COND_SENSOR_STATUS_T ) ); benignPolynomialCalRecord( &condSensorsCalRecord.condSensors[ i ] ); } @@ -211,19 +220,6 @@ emstatBoardRead[ EMSTAT_CD1_CD2_BOARD ].sensors[ EMSTAT_CPO_OR_CD2_INDEX ].condSnsr = CONDUCTIVITYSENSORS_CD2_SENSOR; emstatBoardRead[ EMSTAT_CD1_CD2_BOARD ].sensors[ EMSTAT_CPO_OR_CD2_INDEX ].condSnsrTempSnsr = TEMPSENSORS_CONDUCTIVITY_SENSOR_2; - // Each Emstat board covers two conductivity sensors - // CPi/CPo Emstat board conductivity sensors and their corresponding temperature sensors - emstatBoardRead[ EMSTAT_CPI_CPO_BOARD ].condSnsr1 = CONDUCTIVITYSENSORS_CPI_SENSOR; - emstatBoardRead[ EMSTAT_CPI_CPO_BOARD ].condSnsr1TempSnsr = TEMPSENSORS_INLET_PRIMARY_HEATER; - emstatBoardRead[ EMSTAT_CPI_CPO_BOARD ].condSnsr2 = CONDUCTIVITYSENSORS_CPO_SENSOR; - emstatBoardRead[ EMSTAT_CPI_CPO_BOARD ].condSnsr2TempSnsr = TEMPSENSORS_OUTLET_PRIMARY_HEATER; - - // CD1/CD2 Emstat board conductivity sensors and their corresponding temperature sensors - emstatBoardRead[ EMSTAT_CD1_CD2_BOARD ].condSnsr1 = CONDUCTIVITYSENSORS_CD1_SENSOR; - emstatBoardRead[ EMSTAT_CD1_CD2_BOARD ].condSnsr1TempSnsr = TEMPSENSORS_CONDUCTIVITY_SENSOR_1; - emstatBoardRead[ EMSTAT_CD1_CD2_BOARD ].condSnsr2 = CONDUCTIVITYSENSORS_CD2_SENSOR; - emstatBoardRead[ EMSTAT_CD1_CD2_BOARD ].condSnsr2TempSnsr = TEMPSENSORS_CONDUCTIVITY_SENSOR_2; - setFPGACPiProbeType( COND_CPI_SENSOR_PROBE_TYPE ); // TODO can we leave this here? setFPGACPoProbeType( COND_CPO_SENSOR_PROBE_TYPE ); // TODO can we leave this here? @@ -256,19 +252,22 @@ processCPiCPoSensorRead( CONDUCTIVITYSENSORS_CPI_SENSOR, getFPGACPi(), getFPGACPiReadCount(), getFPGACPiErrorCount(), getFPGACPiFault() ); processCPiCPoSensorRead( CONDUCTIVITYSENSORS_CPO_SENSOR, getFPGACPo(), getFPGACPoReadCount(), getFPGACPoErrorCount(), getFPGACPoFault() ); #endif - processCD1CD2EmstatSensorRead( getFPGAEmstatCD1CD2RxFifoCount(), getFPGAEmstatCD1CD2RxErrCount() ); + //processCD1CD2EmstatSensorRead( getFPGAEmstatCD1CD2RxFifoCount(), getFPGAEmstatCD1CD2RxErrCount() ); //processCD1CD2EmstatSensorRead( getFPGAEmstatCPiCPoRxFifoCount(), getFPGAEmstatCPiCPoRxErrCount() ); //processNewEmstatSensorRead( CONDUCTIVITYSENSORS_CPI_SENSOR, getFPGAEmstatCD1CD2RxFifoCount(), getFPGAEmstatCPiCPoRxErrCount() ); // TODO can this be replacing the top function? - processNewEmstatSensorRead( CONDUCTIVITYSENSORS_CPI_SENSOR, getFPGAEmstatCPiCPoRxFifoCount(), getFPGAEmstatCPiCPoRxErrCount() ); + //processNewEmstatSensorRead( CONDUCTIVITYSENSORS_CPI_SENSOR, getFPGAEmstatCPiCPoRxFifoCount(), getFPGAEmstatCPiCPoRxErrCount() ); - if ( ++conductivityDataPublishCounter >= getU32OverrideValue( &conductivityDataPublishInterval ) ) + //processEmstatBoard( EMSTAT_CPI_CPO_BOARD ); + processEmstatBoard( EMSTAT_CD1_CD2_BOARD ); + + if ( ++condDataPublishCounter >= getU32OverrideValue( &conductivityDataPublishInterval ) ) { CONDUCTIVITY_DATA_T data; calcRORejectionRatio(); - conductivityDataPublishCounter = 0; - data.roRejectionRatio = roRejectionRatio; + condDataPublishCounter = 0; + data.roRejectionRatio = roRejectionRatio; data.cpi = getConductivityValue( CONDUCTIVITYSENSORS_CPI_SENSOR ); data.cpo = getConductivityValue( CONDUCTIVITYSENSORS_CPO_SENSOR ); @@ -391,7 +390,9 @@ if ( sensorId < NUM_OF_CONDUCTIVITY_SENSORS ) { - result = getF32OverrideValue( &compensatedConductivityValues[ sensorId ] ); + OVERRIDE_F32_T value = condSensorStatus[ sensorId ].compensatedCondValue; + //result = getF32OverrideValue( &compensatedConductivityValues[ sensorId ] ); // TODO remove + result = getF32OverrideValue( &value ); } else { @@ -763,7 +764,7 @@ if ( getCurrentOperationMode() != DG_MODE_INIT ) { if ( ( fpgaReadCount != readPackage->fpgaPreviousCount ) && ( 0 == ( fpgaReadCount & EMSTAT_PICO_FIFO_EMPTY_MASK ) ) && - ( fpgaErrorCount != readPackage->fpgaInitialErrorCount ) ) + ( fpgaErrorCount != readPackage->fpgaPreviousErrorCount ) ) { readPackage->fpgaPreviousCount = fpgaReadCount; } @@ -773,42 +774,51 @@ if ( getSoftwareConfigStatus( SW_CONFIG_DISABLE_COND_SENSOR_CHECK ) != SW_CONFIG_ENABLE_VALUE ) #endif { - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_CONDUCTIVITY_SENSOR_FAULT, CONDUCTIVITYSENSORS_CD1_SENSOR, CONDUCTIVITYSENSORS_CD2_SENSOR ); + //SET_ALARM_WITH_2_U32_DATA( ALARM_ID_CONDUCTIVITY_SENSOR_FAULT, CONDUCTIVITYSENSORS_CD1_SENSOR, CONDUCTIVITYSENSORS_CD2_SENSOR ); } } } } static void processEmstatMeasurementDataPackage( U08 boardSensorIndex, EMSTAT_READ_T* readPackage, EMSTAT_VARIABLE_T* receivedPackage ) { - CONDUCTIVITY_SENSORS_T sensorId = readPackage->sensors[ boardSensorIndex ].condSnsr; - sensorStatus[ sensorId ] = hexStrToDec( (U08*)&receivedPackage->status, sizeof( receivedPackage->status ) ); - BOOL isSensorStatusGood = EMSTAT_PICO_GOOD_STATUS == sensorStatus[ sensorId ]; + CONDUCTIVITY_SENSORS_T sensorId = readPackage->sensors[ boardSensorIndex ].condSnsr; + condSensorStatus[ sensorId ].sensorStatus = hexStrToDec( (U08*)&receivedPackage->status, sizeof( receivedPackage->status ) ); + BOOL isSensorStatusBad = ( EMSTAT_PICO_GOOD_STATUS != condSensorStatus[ sensorId ].sensorStatus ? TRUE : FALSE ); - if ( EMSTAT_PICO_GOOD_STATUS == sensorStatus[ sensorId ] ) + if ( FALSE == isSensorStatusBad ) { U32 prefix = prefixStrToSIFactor( receivedPackage->prefix ); F32 resistance = ( ( F32 )( hexStrToDec( receivedPackage->value, sizeof( receivedPackage->value ) ) - EMSTAT_PICO_MEASUREMENT_OFFSET ) / prefix ); - //F32 temperature = getTemperatureValue( associateTempSensor[ sensorId ] ); // TODO remove F32 temperature = getTemperatureValue( readPackage->sensors[ boardSensorIndex ].condSnsrTempSnsr ); F32 conductivity = ( 1.0 / resistance * SIEMENS_TO_MICROSIEMENS_CONVERSION ); F32 compensatedCond = calcCompensatedConductivity( conductivity, temperature ); - internalErrorCount[ sensorId ] = 0; - compensatedConductivityValues[ sensorId ].data = getCalibrationAppliedConductivityValue( sensorId, compensatedCond ); - rawConductivityValues[ sensorId ] = conductivity; + condSensorStatus[ sensorId ].internalErrorCount = 0; + condSensorStatus[ sensorId ].compensatedCondValue.data = getCalibrationAppliedConductivityValue( sensorId, compensatedCond ); + condSensorStatus[ sensorId ].rawCondValue = conductivity; - // Clear the alarm - checkPersistentAlarm( ALARM_ID_DG_CONDUCTIVITY_SENSOR_BAD_STATUS, FALSE, sensorStatus[ sensorId ], EMSTAT_PICO_GOOD_STATUS ); + //internalErrorCount[ sensorId ] = 0; + //compensatedConductivityValues[ sensorId ].data = getCalibrationAppliedConductivityValue( sensorId, compensatedCond ); + //rawConductivityValues[ sensorId ] = conductivity; } + + // Check the conductivity sensors bad status alarm + checkPersistentAlarm( ALARM_ID_DG_CONDUCTIVITY_SENSOR_BAD_STATUS, isSensorStatusBad, condSensorStatus[ sensorId ].sensorStatus, EMSTAT_PICO_GOOD_STATUS ); + + if ( EMSTAT_PICO_TIMING_NOT_MET_STATUS == condSensorStatus[ sensorId ].sensorStatus ) + { + if ( ++condSensorStatus[ sensorId ].internalErrorCount > MAX_CONDUCTIVITY_SENSOR_FAILURES ) + { + SET_ALARM_WITH_1_U32_DATA( ALARM_ID_CONDUCTIVITY_SENSOR_FAULT, sensorId ); + } + } else { -#ifndef DISABLE_COND_STATUS_CHECK - checkPersistentAlarm( ALARM_ID_DG_CONDUCTIVITY_SENSOR_BAD_STATUS, TRUE, sensorStatus[ sensorId ], EMSTAT_PICO_GOOD_STATUS ); -#endif + condSensorStatus[ sensorId ].internalErrorCount = 0; } - if ( EMSTAT_PICO_TIMING_NOT_MET_STATUS == sensorStatus[ sensorId ] ) + /*if ( EMSTAT_PICO_TIMING_NOT_MET_STATUS == sensorStatus[ sensorId ] ) { if ( ++internalErrorCount[ sensorId ] > MAX_CONDUCTIVITY_SENSOR_FAILURES ) { @@ -818,7 +828,7 @@ else { internalErrorCount[ sensorId ] = 0; - } + }*/ } /*********************************************************************//** @@ -837,7 +847,7 @@ F32 conductivity = pow(compensatedValue, 4) * condSensorsCalRecord.condSensors[ (CAL_DATA_DG_COND_SENSORS_T)sensorId ].fourthOrderCoeff + pow(compensatedValue, 3) * condSensorsCalRecord.condSensors[ (CAL_DATA_DG_COND_SENSORS_T)sensorId ].thirdOrderCoeff + pow(compensatedValue, 2) * condSensorsCalRecord.condSensors[ (CAL_DATA_DG_COND_SENSORS_T)sensorId ].secondOrderCoeff + - compensatedValue * condSensorsCalRecord.condSensors[ (CAL_DATA_DG_COND_SENSORS_T)sensorId ].gain + + compensatedValue * condSensorsCalRecord.condSensors[ (CAL_DATA_DG_COND_SENSORS_T)sensorId ].gain + condSensorsCalRecord.condSensors[ (CAL_DATA_DG_COND_SENSORS_T)sensorId ].offset; return conductivity; } Index: firmware/App/Controllers/ConductivitySensors.h =================================================================== diff -u -r22176ce95e49213c48454f34ddf5d29b8109f2cb -r5c8f6d4d16252ed287dd7ee5a89ff814bce17eff --- firmware/App/Controllers/ConductivitySensors.h (.../ConductivitySensors.h) (revision 22176ce95e49213c48454f34ddf5d29b8109f2cb) +++ firmware/App/Controllers/ConductivitySensors.h (.../ConductivitySensors.h) (revision 5c8f6d4d16252ed287dd7ee5a89ff814bce17eff) @@ -88,7 +88,6 @@ void checkRORejectionRatio( void ); F32 getConductivityValue( U32 sensorId ); -F32 getRawConductivityValue( U32 sensorId ); BOOL testSetConductivityOverride( U32 sensorId, F32 value ); BOOL testResetConductivityOverride( U32 sensorId );