Index: firmware/App/Services/PIControllers.c =================================================================== diff -u -ra9315539f527b92523b1598ff91e47db4d71dae2 -rdfc26c678cd9f0e2a2dda1d16a8d6b5f6660d689 --- firmware/App/Services/PIControllers.c (.../PIControllers.c) (revision a9315539f527b92523b1598ff91e47db4d71dae2) +++ firmware/App/Services/PIControllers.c (.../PIControllers.c) (revision dfc26c678cd9f0e2a2dda1d16a8d6b5f6660d689) @@ -27,6 +27,8 @@ // ********** private definitions ********** +#define MAX_ILIMIT 1.0F ///< Controller max Ilimit/maxErrorSumStep. + /// Enumeration of PI controller direction. typedef enum controller_Directions { @@ -60,8 +62,8 @@ /// PI Controllers - initial configurations. static PI_CONTROLLER_T piControllers[ NUM_OF_PI_CONTROLLERS_IDS ] = -{ // Kp Ki uMax uMin ref meas err esw esum ctrl Ilimit controller type - { 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.1, CONTROLLER_UNIDIRECTIONAL }, // PI_CONTROLLER_ID_RO_PUMP +{ // Kp Ki uMax uMin ref meas err esw esum ctrl Ilimit controller type + { 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.5, CONTROLLER_UNIDIRECTIONAL }, // PI_CONTROLLER_ID_RO_PUMP { 0.0, 0.0, 3000, 300, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 10.0, CONTROLLER_BIDIRECTIONAL }, // PI_CONTROLLER_ID_DRAIN_PUMP { 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.1, CONTROLLER_UNIDIRECTIONAL }, // PI_CONTROLLER_ID_RO_PUMP_MAX_PRES }; @@ -166,7 +168,7 @@ // Calculate error signal if ( controller->direction == CONTROLLER_UNIDIRECTIONAL ) { - // To make sure that the outcome will be positive + // Control should always be positive controller->errorSignal = fabs( referenceSignal ) - ( referenceSignal < 0.0 ? ( measuredSignal * -1.0 ) : measuredSignal ); } else @@ -281,5 +283,37 @@ return output; } +/*********************************************************************//** + * @brief + * The getPIControllerSignals function returns the latest requested signal sample. + * @details Inputs: none + * @details Outputs: maxErrorSumStep of controller ID + * @param controllerID ID filter number + * @param stepLimit maximum step limit + * @return latest sample requested + *************************************************************************/ +void setPIControllerStepLimit( PI_CONTROLLER_ID_T controllerID, F32 stepLimit ) +{ + PI_CONTROLLER_T *controller; + if ( controllerID < NUM_OF_PI_CONTROLLERS_IDS ) + { + SET_CONTROLLER( controller, controllerID ); + + if ( ( stepLimit > NEARLY_ZERO ) && ( stepLimit < MAX_ILIMIT ) ) + { + controller->maxErrorSumStep = stepLimit; + } + else + { + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DG_SOFTWARE_FAULT, SW_FAULT_ID_PI_CTRL_INVALID_STEP_LIMIT, (U32)stepLimit ) + } + + } + else + { // Invalid controller given + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DG_SOFTWARE_FAULT, SW_FAULT_ID_PI_CTRL_INVALID_CONTROLLER, (U32)controllerID ) + } +} + /**@}*/