# process variable (PV). Uses proportional integral (PI)
# control.
# Usage: update_pi arg1 arg2 arg3 arg4 arg5 arg6
- # Version: 0.1.1
+ # Version: 0.1.2
# Input: arg1: path_loop_name (control loop name path)
# arg2: var_pv (process variable)
# arg3: var_sp (set point)
local var_sp var_pv var_cv;
local tune_p tune_i;
local term_p term_i;
- local error sum;
+ local error sum sum_cand;
local path_sum path_var_sp path_var_pv path_tune_p path_tune_i;
path_loop_name="$1";
path_var_cv="$path_loop_name".cv
+ path_var_cv_bias="$path_loop_name".cv_bias
var_cv_bias="$6";
path_sum="$path_loop_name".sum
#yell "DEBUG:var_pv:$var_pv";
#yell "DEBUG:var_sp:$var_sp";
#yell "DEBUG:var_cv:$var_cv";
+ #yell "DEBUG:var_cv_bias:$var_cv_bias";
#yell "DEBUG:tune_p:$tune_p";
#yell "DEBUG:tune_i:$tune_i";
error="$(try echo "$var_sp - $var_pv" | bc -l)";
#yell "DEBUG:error:$error";
- sum="$(try echo "$sum + $error" | bc -l)";
+ sum_cand="$(try echo "$sum + $error" | bc -l)";
#yell "DEBUG:sum:$sum";
+ if [[ "$(try echo "$sum_cand > 2 * $sum " | bc -l)" -eq 1 ]]; then
+ sum="$(try echo "$sum + l($error)" | bc -l)"; # dampen integral sum spikes
+ else
+ sum="$sum_cand";
+ fi;
term_p="$(try echo "$tune_p * $error" | bc -l)";
#yell "DEBUG:term_p:$term_p";
term_i="$(try echo "$tune_i * $sum" | bc -l)";
echo "$tune_p" > "$path_tune_p";
echo "$tune_i" > "$path_tune_i";
echo "$var_cv" > "$path_var_cv";
+ echo "$var_cv_bias" > "$path_var_cv_bias";
# Output control variable to stdout
echo "$var_cv";