From b10a8d94799657b5031b613c7e1abecd974a7a07 Mon Sep 17 00:00:00 2001 From: Mikayla Fischler Date: Thu, 21 Apr 2022 12:40:21 -0400 Subject: [PATCH] send ISS status automatically along with PLC status --- reactor-plc/config.lua | 2 +- reactor-plc/plc.lua | 32 ++++++++++++++++++++++++-------- reactor-plc/startup.lua | 14 +++++++------- scada-common/comms.lua | 6 +++--- 4 files changed, 35 insertions(+), 19 deletions(-) diff --git a/reactor-plc/config.lua b/reactor-plc/config.lua index 25f750c..dceeb21 100644 --- a/reactor-plc/config.lua +++ b/reactor-plc/config.lua @@ -1,4 +1,4 @@ --- set to false to run in standalone mode (safety regulation only) +-- set to false to run in offline mode (safety regulation only) NETWORKED = true -- unique reactor ID REACTOR_ID = 1 diff --git a/reactor-plc/plc.lua b/reactor-plc/plc.lua index 7b750e4..5c50065 100644 --- a/reactor-plc/plc.lua +++ b/reactor-plc/plc.lua @@ -207,9 +207,10 @@ function comms_init(id, modem, local_port, server_port, reactor, iss) l_port = local_port, reactor = reactor, iss = iss, - status_cache = nil, scrammed = false, - linked = false + linked = false, + status_cache = nil, + max_burn_rate = nil } -- open modem @@ -328,7 +329,7 @@ function comms_init(id, modem, local_port, server_port, reactor, iss) local _send_iss_status = function () local iss_status = { id = self.id, - type = RPLC_TYPES.ISS_GET, + type = RPLC_TYPES.ISS_STATUS, status = iss.status() } @@ -438,10 +439,17 @@ function comms_init(id, modem, local_port, server_port, reactor, iss) _send_ack(packet.type, self.reactor.activate() == ppm.ACCESS_OK) elseif packet.type == RPLC_TYPES.MEK_BURN_RATE then -- set the burn rate - local burn_rate = packet.data[1] - local max_burn_rate = self.reactor.getMaxBurnRate() local success = false + local burn_rate = packet.data[1] + local max_burn_rate = self.max_burn_rate + -- if no known max burn rate, check again + if max_burn_rate == nil then + max_burn_rate = self.reactor.getMaxBurnRate() + self.max_burn_rate = max_burn_rate + end + + -- if we know our max burn rate, update current burn rate if in range if max_burn_rate ~= ppm.ACCESS_FAULT then if burn_rate > 0 and burn_rate <= max_burn_rate then success = self.reactor.setBurnRate(burn_rate) @@ -449,9 +457,6 @@ function comms_init(id, modem, local_port, server_port, reactor, iss) end _send_ack(packet.type, success == ppm.ACCESS_OK) - elseif packet.type == RPLC_TYPES.ISS_GET then - -- get the ISS status - _send_iss_status(iss.status()) elseif packet.type == RPLC_TYPES.ISS_CLEAR then -- clear the ISS status iss.reset() @@ -526,6 +531,16 @@ function comms_init(id, modem, local_port, server_port, reactor, iss) _send(sys_status) end + local send_iss_status = function () + local iss_status = { + id = self.id, + type = RPLC_TYPES.ISS_STATUS, + status = iss.status() + } + + _send(iss_status) + end + local send_iss_alarm = function (cause) local iss_alarm = { id = self.id, @@ -548,6 +563,7 @@ function comms_init(id, modem, local_port, server_port, reactor, iss) handle_packet = handle_packet, send_link_req = send_link_req, send_status = send_status, + send_iss_status = send_iss_status, send_iss_alarm = send_iss_alarm, is_scrammed = is_scrammed, is_linked = is_linked, diff --git a/reactor-plc/startup.lua b/reactor-plc/startup.lua index 80cb626..1737f3f 100644 --- a/reactor-plc/startup.lua +++ b/reactor-plc/startup.lua @@ -10,7 +10,7 @@ os.loadAPI("scada-common/comms.lua") os.loadAPI("config.lua") os.loadAPI("plc.lua") -local R_PLC_VERSION = "alpha-v0.2.1" +local R_PLC_VERSION = "alpha-v0.2.2" local print = util.print local println = util.println @@ -90,6 +90,7 @@ function init() conn_watchdog = util.new_watchdog(3) log._debug("conn watchdog started") else + println("boot> starting in offline mode"); log._debug("running without networking") end @@ -220,13 +221,13 @@ while true do -- check safety (SCRAM occurs if tripped) if not plc_state.degraded then - local iss_tripped, iss_status, iss_first = iss.check() + local iss_tripped, iss_status_string, iss_first = iss.check() plc_state.scram = plc_state.scram or iss_tripped if iss_first then - println_ts("[ISS] reactor shutdown, safety tripped: " .. iss_status) + println_ts("[ISS] reactor shutdown, safety tripped: " .. iss_status_string) if networked then - plc_comms.send_iss_alarm(iss_status) + plc_comms.send_iss_alarm(iss_status_string) end end else @@ -244,6 +245,7 @@ while true do if plc_comms.is_linked() then if ticks_to_update <= 0 then plc_comms.send_status(iss_tripped, plc_state.degraded) + plc_comms.send_iss_status() ticks_to_update = UPDATE_TICKS end else @@ -275,9 +277,8 @@ while true do -- check for termination request if event == "terminate" or ppm.should_terminate() then - log._warning("terminate requested, exiting...") - -- safe exit + log._warning("terminate requested, exiting...") if plc_state.init_ok then plc_state.scram = true if reactor.scram() ~= ppm.ACCESS_FAULT then @@ -287,7 +288,6 @@ while true do println_ts("exiting, reactor failed to disable") end end - break end end diff --git a/scada-common/comms.lua b/scada-common/comms.lua index 4b77fb1..9181ce3 100644 --- a/scada-common/comms.lua +++ b/scada-common/comms.lua @@ -18,8 +18,8 @@ RPLC_TYPES = { MEK_SCRAM = 4, -- SCRAM reactor MEK_ENABLE = 5, -- enable reactor MEK_BURN_RATE = 6, -- set burn rate - ISS_ALARM = 7, -- ISS alarm broadcast - ISS_GET = 8, -- get ISS status + ISS_STATUS = 7, -- ISS status + ISS_ALARM = 8, -- ISS alarm broadcast ISS_CLEAR = 9 -- clear ISS trip (if in bad state, will trip immediately) } @@ -200,7 +200,7 @@ function rplc_packet() self.type == RPLC_TYPES.MEK_ENABLE or self.type == RPLC_TYPES.MEK_BURN_RATE or self.type == RPLC_TYPES.ISS_ALARM or - self.type == RPLC_TYPES.ISS_GET or + self.type == RPLC_TYPES.ISS_STATUS or self.type == RPLC_TYPES.ISS_CLEAR end