From 019284de7b13c8f116fd331e22dc010d438ddc62 Mon Sep 17 00:00:00 2001 From: Mikayla Date: Thu, 12 Dec 2024 03:18:21 +0000 Subject: [PATCH] #574 possible fix for RTU formed checking --- rtu/startup.lua | 21 +++++++++------------ rtu/threads.lua | 12 ++++++++++++ scada-common/ppm.lua | 29 ++++++++++++++++++++++++++++- scada-common/util.lua | 2 +- 4 files changed, 50 insertions(+), 14 deletions(-) diff --git a/rtu/startup.lua b/rtu/startup.lua index 2b5e8ef..ba2c861 100644 --- a/rtu/startup.lua +++ b/rtu/startup.lua @@ -31,7 +31,7 @@ local sna_rtu = require("rtu.dev.sna_rtu") local sps_rtu = require("rtu.dev.sps_rtu") local turbinev_rtu = require("rtu.dev.turbinev_rtu") -local RTU_VERSION = "v1.10.17" +local RTU_VERSION = "v1.10.18" local RTU_UNIT_TYPE = types.RTU_UNIT_TYPE local RTU_HW_STATE = databus.RTU_HW_STATE @@ -339,8 +339,7 @@ local function main() if formed == ppm.ACCESS_FAULT then println_ts(util.c("sys_config> failed to check if '", name, "' is formed")) - log.fatal(util.c("sys_config> failed to check if '", name, "' is a formed boiler multiblock")) - return false + log.warning(util.c("sys_config> failed to check if '", name, "' is a formed boiler multiblock")) end elseif type == "turbineValve" then -- turbine multiblock @@ -354,8 +353,7 @@ local function main() if formed == ppm.ACCESS_FAULT then println_ts(util.c("sys_config> failed to check if '", name, "' is formed")) - log.fatal(util.c("sys_config> failed to check if '", name, "' is a formed turbine multiblock")) - return false + log.warning(util.c("sys_config> failed to check if '", name, "' is a formed turbine multiblock")) end elseif type == "dynamicValve" then -- dynamic tank multiblock @@ -374,8 +372,7 @@ local function main() if formed == ppm.ACCESS_FAULT then println_ts(util.c("sys_config> failed to check if '", name, "' is formed")) - log.fatal(util.c("sys_config> failed to check if '", name, "' is a formed dynamic tank multiblock")) - return false + log.warning(util.c("sys_config> failed to check if '", name, "' is a formed dynamic tank multiblock")) end elseif type == "inductionPort" then -- induction matrix multiblock @@ -388,8 +385,7 @@ local function main() if formed == ppm.ACCESS_FAULT then println_ts(util.c("sys_config> failed to check if '", name, "' is formed")) - log.fatal(util.c("sys_config> failed to check if '", name, "' is a formed induction matrix multiblock")) - return false + log.warning(util.c("sys_config> failed to check if '", name, "' is a formed induction matrix multiblock")) end elseif type == "spsPort" then -- SPS multiblock @@ -402,8 +398,7 @@ local function main() if formed == ppm.ACCESS_FAULT then println_ts(util.c("sys_config> failed to check if '", name, "' is formed")) - log.fatal(util.c("sys_config> failed to check if '", name, "' is a formed SPS multiblock")) - return false + log.warning(util.c("sys_config> failed to check if '", name, "' is a formed SPS multiblock")) end elseif type == "solarNeutronActivator" then -- SNA @@ -431,7 +426,9 @@ local function main() if is_multiblock then if not formed then - log.info(util.c("sys_config> device '", name, "' is not formed")) + if formed == false then + log.info(util.c("sys_config> device '", name, "' is not formed")) + end elseif faulted then -- sometimes there is a race condition on server boot where it reports formed, but -- the other functions are not yet defined (that's the theory at least). mark as unformed to attempt connection later diff --git a/rtu/threads.lua b/rtu/threads.lua index 4ad5fcb..6b71fa8 100644 --- a/rtu/threads.lua +++ b/rtu/threads.lua @@ -466,6 +466,9 @@ end ---@param smem rtu_shared_memory ---@param unit rtu_registry_entry function threads.thread__unit_comms(smem, unit) + -- print a log message to the terminal as long as the UI isn't running + local function println_ts(message) if not smem.rtu_state.fp_ok then util.println_ts(message) end end + ---@class parallel_thread local public = {} @@ -538,6 +541,15 @@ function threads.thread__unit_comms(smem, unit) rtu_comms.send_remounted(unit.uid) elseif (is_formed == false) and unit.formed then log.warning(util.c(detail_name, " is no longer formed")) + elseif is_formed == nil then + log.error(util.c(detail_name, " failed to check if formed, attempting remount...")) + + local type, dev = ppm.remount(unit.name) + if type and dev then + handle_unit_mount(smem, println_ts, unit.name, type, dev, unit) + else + log.error(util.c(detail_name, " failed to remount")) + end end unit.formed = is_formed diff --git a/scada-common/ppm.lua b/scada-common/ppm.lua index 7d6071e..ea310a3 100644 --- a/scada-common/ppm.lua +++ b/scada-common/ppm.lua @@ -242,7 +242,7 @@ function ppm.mount_all() end end --- mount a particular device +-- mount a specified device ---@nodiscard ---@param iface string CC peripheral interface ---@return string|nil type, table|nil device @@ -266,6 +266,33 @@ function ppm.mount(iface) return pm_type, pm_dev end +-- unmount and remount a specified device +---@nodiscard +---@param iface string CC peripheral interface +---@return string|nil type, table|nil device +function ppm.remount(iface) + local ifaces = peripheral.getNames() + local pm_dev = nil + local pm_type = nil + + for i = 1, #ifaces do + if iface == ifaces[i] then + log.info(util.c("PPM: remount(", iface, ") -> is a ", pm_type)) + ppm.unmount(ppm_sys.mounts[iface].dev) + + ppm_sys.mounts[iface] = peri_init(iface) + + pm_type = ppm_sys.mounts[iface].type + pm_dev = ppm_sys.mounts[iface].dev + + log.info(util.c("PPM: remount(", iface, ") -> remounted a ", pm_type)) + break + end + end + + return pm_type, pm_dev +end + -- mount a virtual, placeholder device (specifically designed for RTU startup with missing devices) ---@nodiscard ---@return string type, table device diff --git a/scada-common/util.lua b/scada-common/util.lua index 86645f8..3023a49 100644 --- a/scada-common/util.lua +++ b/scada-common/util.lua @@ -24,7 +24,7 @@ local t_pack = table.pack local util = {} -- scada-common version -util.version = "1.4.6" +util.version = "1.4.7" util.TICK_TIME_S = 0.05 util.TICK_TIME_MS = 50