fix: don't override primary pump speed; warn in TUI if far from suggested 65%

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Dominik Moritz Roth 2026-03-15 11:20:27 +01:00
parent 2bb4207a98
commit 24a8999b18

View File

@ -5,7 +5,7 @@ Architecture:
- Rod PID: keeps CORE_TEMP at setpoint via ROD_BANK_POS_0_ORDERED - 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): 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 - MSCV PI: drives train power output, gated on steam availability
- Secondary pump feedforward: half of steam outlet + level PID - Secondary pump feedforward: half of steam outlet + level PID
- Bypass: hold at 0 - Bypass: hold at 0
@ -128,11 +128,11 @@ class TrainController:
out_min=-2.0, out_max=2.0, integral_max=3.0) out_min=-2.0, out_max=2.0, integral_max=3.0)
self.sec_level_target = 25_000.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.mscv = 9.0
self.sec_pump = 40.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) set_param(f'STEAM_TURBINE_{self.i}_BYPASS_ORDERED', 0.0)
self._params = [ self._params = [
@ -141,6 +141,7 @@ class TrainController:
f'STEAM_TURBINE_{self.i}_RPM', f'STEAM_TURBINE_{self.i}_RPM',
f'STEAM_TURBINE_{self.i}_BYPASS_ACTUAL', f'STEAM_TURBINE_{self.i}_BYPASS_ACTUAL',
f'GENERATOR_{self.i}_KW', 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_CIRCULATION_PUMP_{self.i}_ORDERED_SPEED',
f'COOLANT_SEC_{self.i}_LIQUID_VOLUME', f'COOLANT_SEC_{self.i}_LIQUID_VOLUME',
] ]
@ -172,6 +173,8 @@ class TrainController:
self.mscv = float(np.clip(new_mscv, 0.5, 100.0)) self.mscv = float(np.clip(new_mscv, 0.5, 100.0))
set_param(f'MSCV_{self.i}_OPENING_ORDERED', self.mscv) 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 sec_ff = steam_out / 2.0
level = s[f'COOLANT_SEC_{self.i}_LIQUID_VOLUME'] level = s[f'COOLANT_SEC_{self.i}_LIQUID_VOLUME']
level_error = self.sec_level_target - level level_error = self.sec_level_target - level
@ -499,10 +502,14 @@ def run_controller(stdscr):
_safe_addstr(stdscr, row, 32, _safe_addstr(stdscr, row, 32,
f'[{_bar(pwr_pct, 14)}] {power_error/1000:+5.1f}MW {tgt_str}') f'[{_bar(pwr_pct, 14)}] {power_error/1000:+5.1f}MW {tgt_str}')
row += 1 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, _safe_addstr(stdscr, row, 16,
f'Steam: {steam_out:5.1f} MSCV: {tc.mscv:4.1f} ' f'Steam: {steam_out:5.1f} MSCV: {tc.mscv:4.1f} Prim: ')
f'Prim: {tc.prim_pump:3.0f}% Sec: {tc.sec_pump:3.0f}% ' _safe_addstr(stdscr, row, 51, prim_str, prim_attr)
f'Lvl: {level:.0f}{level_error:+.0f})') _safe_addstr(stdscr, row, 56,
f' Sec: {tc.sec_pump:3.0f}% Lvl: {level:.0f}{level_error:+.0f})')
elif not is_active: elif not is_active:
hint = ' (+/Up to add)' if is_sel else '' hint = ' (+/Up to add)' if is_sel else ''
_safe_addstr(stdscr, row, 16, f'not controlled{hint}', _safe_addstr(stdscr, row, 16, f'not controlled{hint}',