Merge branch 'devel' into 580-wired-comms-networking
This commit is contained in:
@@ -2,15 +2,12 @@
|
||||
-- Data Bus - Central Communication Linking for Supervisor Front Panel
|
||||
--
|
||||
|
||||
local psil = require("scada-common.psil")
|
||||
local util = require("scada-common.util")
|
||||
local const = require("scada-common.constants")
|
||||
local psil = require("scada-common.psil")
|
||||
local util = require("scada-common.util")
|
||||
|
||||
local pgi = require("supervisor.panel.pgi")
|
||||
|
||||
-- nominal RTT is ping (0ms to 10ms usually) + 150ms for SV main loop tick
|
||||
local WARN_RTT = 300 -- 2x as long as expected w/ 0 ping
|
||||
local HIGH_RTT = 500 -- 3.33x as long as expected w/ 0 ping
|
||||
|
||||
local databus = {}
|
||||
|
||||
-- databus PSIL
|
||||
@@ -65,9 +62,9 @@ end
|
||||
function databus.tx_plc_rtt(reactor_id, rtt)
|
||||
databus.ps.publish("plc_" .. reactor_id .. "_rtt", rtt)
|
||||
|
||||
if rtt > HIGH_RTT then
|
||||
if rtt > const.HIGH_RTT then
|
||||
databus.ps.publish("plc_" .. reactor_id .. "_rtt_color", colors.red)
|
||||
elseif rtt > WARN_RTT then
|
||||
elseif rtt > const.WARN_RTT then
|
||||
databus.ps.publish("plc_" .. reactor_id .. "_rtt_color", colors.yellow_hc)
|
||||
else
|
||||
databus.ps.publish("plc_" .. reactor_id .. "_rtt_color", colors.green_hc)
|
||||
@@ -96,9 +93,9 @@ end
|
||||
function databus.tx_rtu_rtt(session_id, rtt)
|
||||
databus.ps.publish("rtu_" .. session_id .. "_rtt", rtt)
|
||||
|
||||
if rtt > HIGH_RTT then
|
||||
if rtt > const.HIGH_RTT then
|
||||
databus.ps.publish("rtu_" .. session_id .. "_rtt_color", colors.red)
|
||||
elseif rtt > WARN_RTT then
|
||||
elseif rtt > const.WARN_RTT then
|
||||
databus.ps.publish("rtu_" .. session_id .. "_rtt_color", colors.yellow_hc)
|
||||
else
|
||||
databus.ps.publish("rtu_" .. session_id .. "_rtt_color", colors.green_hc)
|
||||
@@ -135,9 +132,9 @@ end
|
||||
function databus.tx_crd_rtt(rtt)
|
||||
databus.ps.publish("crd_rtt", rtt)
|
||||
|
||||
if rtt > HIGH_RTT then
|
||||
if rtt > const.HIGH_RTT then
|
||||
databus.ps.publish("crd_rtt_color", colors.red)
|
||||
elseif rtt > WARN_RTT then
|
||||
elseif rtt > const.WARN_RTT then
|
||||
databus.ps.publish("crd_rtt_color", colors.yellow_hc)
|
||||
else
|
||||
databus.ps.publish("crd_rtt_color", colors.green_hc)
|
||||
@@ -166,9 +163,9 @@ end
|
||||
function databus.tx_pdg_rtt(session_id, rtt)
|
||||
databus.ps.publish("pdg_" .. session_id .. "_rtt", rtt)
|
||||
|
||||
if rtt > HIGH_RTT then
|
||||
if rtt > const.HIGH_RTT then
|
||||
databus.ps.publish("pdg_" .. session_id .. "_rtt_color", colors.red)
|
||||
elseif rtt > WARN_RTT then
|
||||
elseif rtt > const.WARN_RTT then
|
||||
databus.ps.publish("pdg_" .. session_id .. "_rtt_color", colors.yellow_hc)
|
||||
else
|
||||
databus.ps.publish("pdg_" .. session_id .. "_rtt_color", colors.green_hc)
|
||||
|
||||
@@ -2,10 +2,12 @@ local comms = require("scada-common.comms")
|
||||
local log = require("scada-common.log")
|
||||
local mqueue = require("scada-common.mqueue")
|
||||
local util = require("scada-common.util")
|
||||
|
||||
local databus = require("supervisor.databus")
|
||||
|
||||
local pocket = {}
|
||||
|
||||
local DEV_TYPE = comms.DEVICE_TYPE
|
||||
local PROTOCOL = comms.PROTOCOL
|
||||
local MGMT_TYPE = comms.MGMT_TYPE
|
||||
|
||||
@@ -34,9 +36,10 @@ local PERIODICS = {
|
||||
---@param in_queue mqueue in message queue
|
||||
---@param out_queue mqueue out message queue
|
||||
---@param timeout number communications timeout
|
||||
---@param sessions svsessions_list list of computer sessions, read-only
|
||||
---@param facility facility facility data table
|
||||
---@param fp_ok boolean if the front panel UI is running
|
||||
function pocket.new_session(id, s_addr, i_seq_num, in_queue, out_queue, timeout, facility, fp_ok)
|
||||
function pocket.new_session(id, s_addr, i_seq_num, in_queue, out_queue, timeout, sessions, facility, fp_ok)
|
||||
-- print a log message to the terminal as long as the UI isn't running
|
||||
local function println(message) if not fp_ok then util.println_ts(message) end end
|
||||
|
||||
@@ -182,6 +185,47 @@ function pocket.new_session(id, s_addr, i_seq_num, in_queue, out_queue, timeout,
|
||||
end
|
||||
|
||||
if not valid then _send_mgmt(MGMT_TYPE.DIAG_ALARM_SET, { false }) end
|
||||
elseif pkt.type == MGMT_TYPE.INFO_LIST_CMP then
|
||||
local get = databus.ps.get
|
||||
|
||||
---@diagnostic disable-next-line: undefined-field
|
||||
local devices = { { DEV_TYPE.SVR, os.getComputerID(), get("version"), 0 } }
|
||||
|
||||
-- add the coordinator if connected
|
||||
if get("crd_conn") then
|
||||
table.insert(devices, { DEV_TYPE.CRD, get("crd_addr"), get("crd_fw"), get("crd_rtt") })
|
||||
end
|
||||
|
||||
-- add the PLCs if connected
|
||||
for i = 1, #facility.get_units() do
|
||||
local tag = "plc_" .. i
|
||||
|
||||
local addr = -1
|
||||
for _, s in ipairs(sessions.plc) do
|
||||
if s.reactor == i then
|
||||
addr = s.s_addr
|
||||
break
|
||||
end
|
||||
end
|
||||
|
||||
if get(tag .. "_conn") then
|
||||
table.insert(devices, { DEV_TYPE.PLC, addr, get(tag .. "_fw"), get(tag .. "_rtt"), i })
|
||||
end
|
||||
end
|
||||
|
||||
-- add connected RTUs
|
||||
for i = 1, #sessions.rtu do
|
||||
local s = sessions.rtu[i]
|
||||
table.insert(devices, { DEV_TYPE.RTU, s.s_addr, s.version, get("rtu_" .. s.instance.get_id() .. "_rtt") })
|
||||
end
|
||||
|
||||
-- add connected pocket computers
|
||||
for i = 1, #sessions.pdg do
|
||||
local s = sessions.pdg[i]
|
||||
table.insert(devices, { DEV_TYPE.PKT, s.s_addr, s.version, get("pdg_" .. s.instance.get_id() .. "_rtt") })
|
||||
end
|
||||
|
||||
_send_mgmt(MGMT_TYPE.INFO_LIST_CMP, devices)
|
||||
else
|
||||
log.debug(log_tag .. "handler received unsupported SCADA_MGMT packet type " .. pkt.type)
|
||||
end
|
||||
|
||||
@@ -46,6 +46,8 @@ local self = {
|
||||
facility = nil, ---@type facility|nil
|
||||
plc_ini_reset = {},
|
||||
-- lists of connected sessions
|
||||
---@class svsessions_list
|
||||
---@diagnostic disable: missing-fields
|
||||
sessions = {
|
||||
rtu = {}, ---@type rtu_session_struct[]
|
||||
plc = {}, ---@type plc_session_struct[]
|
||||
@@ -621,7 +623,7 @@ function svsessions.establish_pdg_session(nic, source_addr, i_seq_num, version)
|
||||
|
||||
local id = self.next_ids.pdg
|
||||
|
||||
pdg_s.instance = pocket.new_session(id, source_addr, i_seq_num, pdg_s.in_queue, pdg_s.out_queue, self.config.PKT_Timeout, self.facility, self.fp_ok)
|
||||
pdg_s.instance = pocket.new_session(id, source_addr, i_seq_num, pdg_s.in_queue, pdg_s.out_queue, self.config.PKT_Timeout, self.sessions, self.facility, self.fp_ok)
|
||||
table.insert(self.sessions.pdg, pdg_s)
|
||||
|
||||
local mt = {
|
||||
|
||||
@@ -24,7 +24,7 @@ local supervisor = require("supervisor.supervisor")
|
||||
|
||||
local svsessions = require("supervisor.session.svsessions")
|
||||
|
||||
local SUPERVISOR_VERSION = "v1.7.0"
|
||||
local SUPERVISOR_VERSION = "v1.7.1"
|
||||
|
||||
local println = util.println
|
||||
local println_ts = util.println_ts
|
||||
|
||||
Reference in New Issue
Block a user