mirror of
https://github.com/MikaylaFischler/cc-mek-scada.git
synced 2024-08-30 18:22:34 +00:00
#7 PLC session comms link, accept statuses, functional keep-alives
This commit is contained in:
parent
7f0f423450
commit
f14d715070
@ -13,7 +13,7 @@ PLC_S_COMMANDS = {
|
||||
}
|
||||
|
||||
local PERIODICS = {
|
||||
KEEP_ALIVE = 1.0
|
||||
KEEP_ALIVE = 2.0
|
||||
}
|
||||
|
||||
-- PLC supervisor session
|
||||
@ -117,19 +117,15 @@ function new_session(id, for_reactor, in_queue, out_queue)
|
||||
self.sDB.mek_status.env_loss = mek_data[7]
|
||||
|
||||
self.sDB.mek_status.fuel = mek_data[8]
|
||||
self.sDB.mek_status.fuel_need = mek_data[9]
|
||||
self.sDB.mek_status.fuel_fill = mek_data[10]
|
||||
self.sDB.mek_status.waste = mek_data[11]
|
||||
self.sDB.mek_status.waste_need = mek_data[12]
|
||||
self.sDB.mek_status.waste_fill = mek_data[13]
|
||||
self.sDB.mek_status.cool_type = mek_data[14]
|
||||
self.sDB.mek_status.cool_amnt = mek_data[15]
|
||||
self.sDB.mek_status.cool_need = mek_data[16]
|
||||
self.sDB.mek_status.cool_fill = mek_data[17]
|
||||
self.sDB.mek_status.hcool_type = mek_data[18]
|
||||
self.sDB.mek_status.hcool_amnt = mek_data[19]
|
||||
self.sDB.mek_status.hcool_need = mek_data[20]
|
||||
self.sDB.mek_status.hcool_fill = mek_data[21]
|
||||
self.sDB.mek_status.fuel_fill = mek_data[9]
|
||||
self.sDB.mek_status.waste = mek_data[10]
|
||||
self.sDB.mek_status.waste_fill = mek_data[11]
|
||||
self.sDB.mek_status.cool_type = mek_data[12]
|
||||
self.sDB.mek_status.cool_amnt = mek_data[13]
|
||||
self.sDB.mek_status.cool_fill = mek_data[14]
|
||||
self.sDB.mek_status.hcool_type = mek_data[15]
|
||||
self.sDB.mek_status.hcool_amnt = mek_data[16]
|
||||
self.sDB.mek_status.hcool_fill = mek_data[17]
|
||||
end
|
||||
|
||||
local _copy_struct = function (mek_data)
|
||||
@ -152,12 +148,9 @@ function new_session(id, for_reactor, in_queue, out_queue)
|
||||
end
|
||||
end
|
||||
|
||||
local _handle_packet = function (message)
|
||||
local _handle_packet = function (rplc_pkt)
|
||||
local checks_ok = true
|
||||
|
||||
-- handle an incoming packet from the PLC
|
||||
rplc_pkt = message.get()
|
||||
|
||||
-- check sequence number
|
||||
if self.r_seq_num == nil then
|
||||
self.r_seq_num = rplc_pkt.scada_frame.seq_num()
|
||||
@ -189,12 +182,13 @@ function new_session(id, for_reactor, in_queue, out_queue)
|
||||
self.last_rtt = srv_now - srv_start
|
||||
|
||||
if self.last_rtt < 0 then
|
||||
log._warning(log_header .. "PLC KEEP_ALIVE round trip time less than 0 (" .. trip_time .. ")")
|
||||
elseif trip_time > 1000 then
|
||||
log._warning(log_header .. "PLC KEEP_ALIVE round trip time > 1s (" .. trip_time .. ")")
|
||||
log._warning(log_header .. "PLC KEEP_ALIVE round trip time less than 0 (" .. self.last_rtt .. ")")
|
||||
elseif self.last_rtt > 1200 then
|
||||
log._warning(log_header .. "PLC KEEP_ALIVE round trip time > 1.2s (" .. self.last_rtt .. ")")
|
||||
end
|
||||
|
||||
log._debug(log_header .. "RPLC RTT = ".. trip_time .. "ms")
|
||||
-- log._debug(log_header .. "RPLC RTT = ".. self.last_rtt .. "ms")
|
||||
-- log._debug(log_header .. "RPLC TT = ".. (srv_now - plc_send) .. "ms")
|
||||
else
|
||||
log._debug(log_header .. "RPLC keep alive packet length mismatch")
|
||||
end
|
||||
@ -330,16 +324,25 @@ function new_session(id, for_reactor, in_queue, out_queue)
|
||||
-- handle queue --
|
||||
------------------
|
||||
|
||||
if self.in_q.ready() then
|
||||
local handle_start = util.time()
|
||||
|
||||
while self.in_q.ready() do
|
||||
-- get a new message to process
|
||||
local message = self.in_q.pop()
|
||||
|
||||
if message.qtype == mqueue.TYPE.PACKET then
|
||||
-- handle a packet
|
||||
_handle_packet(message.message)
|
||||
elseif message.qtype == mqueue.TYPE.COMMAND then
|
||||
-- handle instruction
|
||||
|
||||
end
|
||||
|
||||
-- max 100ms spent processing queue
|
||||
if util.time() - handle_start > 100 then
|
||||
log._warning(log_header .. "exceeded 100ms queue process limit")
|
||||
break
|
||||
end
|
||||
end
|
||||
|
||||
----------------------
|
||||
|
@ -34,19 +34,19 @@ end
|
||||
function find_session(stype, remote_port)
|
||||
if stype == SESSION_TYPE.RTU_SESSION then
|
||||
for i = 1, #self.rtu_sessions do
|
||||
if self.rtu_sessions[i].r_host == remote_port then
|
||||
if self.rtu_sessions[i].r_port == remote_port then
|
||||
return self.rtu_sessions[i]
|
||||
end
|
||||
end
|
||||
elseif stype == SESSION_TYPE.PLC_SESSION then
|
||||
for i = 1, #self.plc_sessions do
|
||||
if self.plc_sessions[i].r_host == remote_port then
|
||||
if self.plc_sessions[i].r_port == remote_port then
|
||||
return self.plc_sessions[i]
|
||||
end
|
||||
end
|
||||
elseif stype == SESSION_TYPE.COORD_SESSION then
|
||||
for i = 1, #self.coord_sessions do
|
||||
if self.coord_sessions[i].r_host == remote_port then
|
||||
if self.coord_sessions[i].r_port == remote_port then
|
||||
return self.coord_sessions[i]
|
||||
end
|
||||
end
|
||||
|
@ -18,7 +18,7 @@ os.loadAPI("session/svsessions.lua")
|
||||
|
||||
os.loadAPI("supervisor.lua")
|
||||
|
||||
local SUPERVISOR_VERSION = "alpha-v0.1.6"
|
||||
local SUPERVISOR_VERSION = "alpha-v0.1.7"
|
||||
|
||||
local print = util.print
|
||||
local println = util.println
|
||||
@ -43,8 +43,9 @@ end
|
||||
-- start comms, open all channels
|
||||
local superv_comms = supervisor.superv_comms(config.NUM_REACTORS, modem, config.SCADA_DEV_LISTEN, config.SCADA_SV_LISTEN)
|
||||
|
||||
-- base loop clock (4Hz, 5 ticks)
|
||||
local loop_clock = os.startTimer(0.25)
|
||||
-- base loop clock (6.67Hz, 3 ticks)
|
||||
local MAIN_CLOCK = 0.15
|
||||
local loop_clock = os.startTimer(MAIN_CLOCK)
|
||||
|
||||
-- event loop
|
||||
while true do
|
||||
@ -87,7 +88,7 @@ while true do
|
||||
-- free any closed sessions
|
||||
svsessions.free_all_closed()
|
||||
|
||||
loop_clock = os.startTimer(0.25)
|
||||
loop_clock = os.startTimer(MAIN_CLOCK)
|
||||
elseif event == "timer" then
|
||||
-- another timer event, check watchdogs
|
||||
svsessions.check_all_watchdogs(param1)
|
||||
|
Loading…
Reference in New Issue
Block a user