diff --git a/scripts/reactor_control.py b/scripts/reactor_control.py index 979744f..a88414c 100644 --- a/scripts/reactor_control.py +++ b/scripts/reactor_control.py @@ -5,7 +5,7 @@ Architecture: - Rod PID: keeps CORE_TEMP at setpoint via ROD_BANK_POS_0_ORDERED Per-train control (trains 1/2/3, 0-indexed as 0/1/2 in param names): - - Primary pump: fixed 65% (higher than 50% improves heat transfer per manual) + - Primary pump: not touched; warns in TUI if far from suggested 65% - MSCV PI: drives train power output, gated on steam availability - Secondary pump feedforward: half of steam outlet + level PID - Bypass: hold at 0 @@ -128,11 +128,11 @@ class TrainController: out_min=-2.0, out_max=2.0, integral_max=3.0) self.sec_level_target = 25_000.0 - self.prim_pump = 65.0 + self.prim_pump = float(nucon.get(f'COOLANT_CORE_CIRCULATION_PUMP_{self.i}_ORDERED_SPEED') or 50.0) + self.PRIM_PUMP_SUGGESTED = 65.0 # warn in TUI if far from this self.mscv = 9.0 self.sec_pump = 40.0 - set_param(f'COOLANT_CORE_CIRCULATION_PUMP_{self.i}_ORDERED_SPEED', self.prim_pump) set_param(f'STEAM_TURBINE_{self.i}_BYPASS_ORDERED', 0.0) self._params = [ @@ -141,6 +141,7 @@ class TrainController: f'STEAM_TURBINE_{self.i}_RPM', f'STEAM_TURBINE_{self.i}_BYPASS_ACTUAL', f'GENERATOR_{self.i}_KW', + f'COOLANT_CORE_CIRCULATION_PUMP_{self.i}_ORDERED_SPEED', f'COOLANT_SEC_CIRCULATION_PUMP_{self.i}_ORDERED_SPEED', f'COOLANT_SEC_{self.i}_LIQUID_VOLUME', ] @@ -172,6 +173,8 @@ class TrainController: self.mscv = float(np.clip(new_mscv, 0.5, 100.0)) set_param(f'MSCV_{self.i}_OPENING_ORDERED', self.mscv) + self.prim_pump = s.get(f'COOLANT_CORE_CIRCULATION_PUMP_{self.i}_ORDERED_SPEED', self.prim_pump) + sec_ff = steam_out / 2.0 level = s[f'COOLANT_SEC_{self.i}_LIQUID_VOLUME'] level_error = self.sec_level_target - level @@ -499,10 +502,14 @@ def run_controller(stdscr): _safe_addstr(stdscr, row, 32, f'[{_bar(pwr_pct, 14)}] {power_error/1000:+5.1f}MW {tgt_str}') row += 1 + prim_warn = abs(tc.prim_pump - tc.PRIM_PUMP_SUGGESTED) > 10 + prim_attr = YELLOW if prim_warn else 0 + prim_str = f'{tc.prim_pump:3.0f}%{"!" if prim_warn else " "}' _safe_addstr(stdscr, row, 16, - f'Steam: {steam_out:5.1f} MSCV: {tc.mscv:4.1f} ' - f'Prim: {tc.prim_pump:3.0f}% Sec: {tc.sec_pump:3.0f}% ' - f'Lvl: {level:.0f} (Δ{level_error:+.0f})') + f'Steam: {steam_out:5.1f} MSCV: {tc.mscv:4.1f} Prim: ') + _safe_addstr(stdscr, row, 51, prim_str, prim_attr) + _safe_addstr(stdscr, row, 56, + f' Sec: {tc.sec_pump:3.0f}% Lvl: {level:.0f} (Δ{level_error:+.0f})') elif not is_active: hint = ' (+/Up to add)' if is_sel else '' _safe_addstr(stdscr, row, 16, f'not controlled{hint}',