From 504ee0594f04cf22f5be63cb5536fddff186df70 Mon Sep 17 00:00:00 2001 From: Mikayla Fischler Date: Sun, 20 Aug 2023 22:56:51 -0400 Subject: [PATCH] #315 switch off dynamic tank fill mode if emergency coolant is required --- supervisor/facility.lua | 62 +++++++++++++++++++++++++++++----------- supervisor/unit.lua | 4 +++ supervisor/unitlogic.lua | 12 ++++++++ 3 files changed, 61 insertions(+), 17 deletions(-) diff --git a/supervisor/facility.lua b/supervisor/facility.lua index d03ad94..641f0c5 100644 --- a/supervisor/facility.lua +++ b/supervisor/facility.lua @@ -1,22 +1,27 @@ -local const = require("scada-common.constants") -local log = require("scada-common.log") -local rsio = require("scada-common.rsio") -local types = require("scada-common.types") -local util = require("scada-common.util") +local const = require("scada-common.constants") +local log = require("scada-common.log") +local rsio = require("scada-common.rsio") +local types = require("scada-common.types") +local util = require("scada-common.util") -local unit = require("supervisor.unit") +local unit = require("supervisor.unit") -local rsctl = require("supervisor.session.rsctl") +local qtypes = require("supervisor.session.rtu.qtypes") -local PROCESS = types.PROCESS -local PROCESS_NAMES = types.PROCESS_NAMES -local PRIO = types.ALARM_PRIORITY -local RTU_UNIT_TYPE = types.RTU_UNIT_TYPE -local WASTE = types.WASTE_PRODUCT -local WASTE_MODE = types.WASTE_MODE +local rsctl = require("supervisor.session.rsctl") + +local PROCESS = types.PROCESS +local PROCESS_NAMES = types.PROCESS_NAMES +local PRIO = types.ALARM_PRIORITY +local RTU_UNIT_TYPE = types.RTU_UNIT_TYPE +local CONTAINER_MODE = types.CONTAINER_MODE +local WASTE = types.WASTE_PRODUCT +local WASTE_MODE = types.WASTE_MODE local IO = rsio.IO +local DTV_RTU_S_DATA = qtypes.DTV_RTU_S_DATA + -- 7.14 kJ per blade for 1 mB of fissile fuel
-- 2856 FE per blade per 1 mB, 285.6 FE per blade per 0.1 mB (minimum) local POWER_PER_BLADE = util.joules_to_fe(7140) @@ -732,24 +737,47 @@ function facility.new(num_reactors, cooling_conf) self.io_ctl.digital_write(IO.F_ALARM, has_alarm) end - ----------------------------- - -- Update Waste Processing -- - ----------------------------- + ---------------- + -- Unit Tasks -- + ---------------- local insufficent_po_rate = false + local need_emcool = false + for i = 1, #self.units do local u = self.units[i] ---@type reactor_unit + + -- update auto waste processing if u.get_control_inf().waste_mode == WASTE_MODE.AUTO then if (u.get_sna_rate() * 10.0) < u.get_burn_rate() then insufficent_po_rate = true - break end end + + -- check if unit activated emergency coolant & uses facility tanks + if (cooling_conf.fac_tank_mode > 0) and u.is_emer_cool_tripped() and (cooling_conf.fac_tank_defs[i] == 2) then + need_emcool = true + end end + -- update waste product if self.waste_product == WASTE.PLUTONIUM or (self.pu_fallback and insufficent_po_rate) then self.current_waste_product = WASTE.PLUTONIUM else self.current_waste_product = self.waste_product end + + -- make sure dynamic tanks are allowing outflow if required + -- set all, rather than trying to determine which is for which (simpler & safer) + -- there should be no need for any to be in fill only mode + if need_emcool then + for i = 1, #self.tanks do + local session = self.tanks[i] ---@type unit_session + local tank = session.get_db() ---@type dynamicv_session_db + + if tank.state.container_mode == CONTAINER_MODE.FILL then + session.get_cmd_queue().push_data(DTV_RTU_S_DATA.SET_CONT_MODE, CONTAINER_MODE.BOTH) + end + end + end end -- call the update function of all units in the facility
diff --git a/supervisor/unit.lua b/supervisor/unit.lua index cae748d..1d3dd60 100644 --- a/supervisor/unit.lua +++ b/supervisor/unit.lua @@ -733,6 +733,10 @@ function unit.new(reactor_id, num_boilers, num_turbines) return false end + -- check if emergency coolant activation has been tripped + ---@nodiscard + function public.is_emer_cool_tripped() return self.emcool_opened end + -- get build properties of machines -- -- filter options diff --git a/supervisor/unitlogic.lua b/supervisor/unitlogic.lua index 6003ac8..080f529 100644 --- a/supervisor/unitlogic.lua +++ b/supervisor/unitlogic.lua @@ -10,11 +10,13 @@ local qtypes = require("supervisor.session.rtu.qtypes") local RPS_TRIP_CAUSE = types.RPS_TRIP_CAUSE local TRI_FAIL = types.TRI_FAIL +local CONTAINER_MODE = types.CONTAINER_MODE local DUMPING_MODE = types.DUMPING_MODE local PRIO = types.ALARM_PRIORITY local ALARM_STATE = types.ALARM_STATE local TBV_RTU_S_DATA = qtypes.TBV_RTU_S_DATA +local DTV_RTU_S_DATA = qtypes.DTV_RTU_S_DATA local IO = rsio.IO @@ -826,6 +828,16 @@ function logic.handle_redstone(self) end end + -- make sure dynamic tanks are allowing outflow + for i = 1, #self.tanks do + local session = self.tanks[i] ---@type unit_session + local tank = session.get_db() ---@type dynamicv_session_db + + if tank.state.container_mode == CONTAINER_MODE.FILL then + session.get_cmd_queue().push_data(DTV_RTU_S_DATA.SET_CONT_MODE, CONTAINER_MODE.BOTH) + end + end + if self.db.annunciator.EmergencyCoolant > 1 and not self.emcool_opened then log.info(util.c("UNIT ", self.r_id, " emergency coolant valve opened")) log.info(util.c("UNIT ", self.r_id, " turbines set to dump excess steam"))