Index: firmware/App/Controllers/Valves.c =================================================================== diff -u -rdb29226a158778db9c0bbcc202d3b56f9cf305c8 -r3f2ea9e243b2c4ee4459b58348cdf74baf526c1a --- firmware/App/Controllers/Valves.c (.../Valves.c) (revision db29226a158778db9c0bbcc202d3b56f9cf305c8) +++ firmware/App/Controllers/Valves.c (.../Valves.c) (revision 3f2ea9e243b2c4ee4459b58348cdf74baf526c1a) @@ -68,6 +68,7 @@ #define TRANSITION_STEP_CHANGE_IN_COUNTS 15000 ///< Step change in counts during normal operations #define MAX_DEVIATION_FROM_TARGET_IN_COUNTS 150 ///< Maximum deviation from target in counts +#define MAX_DEVIATION_FROM_TRAGET_IN_POS_B 1000 ///< Maximum allowed deviation from position B in counts #define MAX_ALLOWED_FAILED_HOMINGS 3U ///< Maximum allowed failed homings #define HOMING_EDGE_DETECTION_TIME_INTERVAL ( MS_PER_SECOND / ( 2 * TASK_PRIORITY_INTERVAL ) ) ///< The time that the valve must be at the edge to be considered for edge detection #define VALVES_CURRENT_THRESHOLD_AMPS 1.0 ///< Valves current threshold @@ -278,7 +279,7 @@ } else { - SET_ALARM_WITH_1_U32_DATA( ALARM_ID_INVALID_VALVE_SELECTED, (U32)valve ); + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_HD_SOFTWARE_FAULT, SW_FAULT_ID_HD_VALVES_INVALID_VALVE_SELECTED, (U32)valve ); } return result; @@ -309,7 +310,7 @@ } else { - SET_ALARM_WITH_1_U32_DATA( ALARM_ID_INVALID_VALVE_SELECTED, (U32)valve ); + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_HD_SOFTWARE_FAULT, SW_FAULT_ID_HD_VALVES_INVALID_VALVE_SELECTED, (U32)valve ); } return result; @@ -334,7 +335,7 @@ } else { - SET_ALARM_WITH_1_U32_DATA( ALARM_ID_INVALID_VALVE_SELECTED, (U32)valve ); + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_HD_SOFTWARE_FAULT, SW_FAULT_ID_HD_VALVES_INVALID_VALVE_SELECTED, (U32)valve ); } return position; @@ -1112,14 +1113,22 @@ // Check the valve is in Idle state, otherwise the position should not be checked if ( valvesStatus[ valve ].execState == VALVE_STATE_IDLE ) { + U32 maxDeviation = MAX_DEVIATION_FROM_TARGET_IN_COUNTS; + currentPostion = valvesStatus[ valve ].currentPositionInCounts; commandedPositionEnum = valvesStatus[ valve ].commandedPosition; commandedPoistion = valvesStatus[ valve ].positions[ commandedPositionEnum ]; + // If the current position is B, current relaxation requires looser range check + if ( VALVE_POSITION_B_OPEN == commandedPositionEnum ) + { + maxDeviation = MAX_DEVIATION_FROM_TRAGET_IN_POS_B; + } + // Check if the current position has deviated from the position it is supposed to be in // for more than a certain amount of time. If it has, raise an alarm // Absolute value is used for comparison to cover +/- from the commanded position - if ( abs( currentPostion - commandedPoistion ) > MAX_DEVIATION_FROM_TARGET_IN_COUNTS ) + if ( abs( currentPostion - commandedPoistion ) > maxDeviation ) { valvesStatus[ valve ].positionOutOfRangeCounter++; }