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:
parent
2bb4207a98
commit
24a8999b18
@ -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}',
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user