diff --git a/.vscode/settings.json b/.vscode/settings.json index 7978039..75bb696 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -4,6 +4,8 @@ "fs", "peripheral", "rs", - "bit" + "bit", + "parallel", + "colors" ] } \ No newline at end of file diff --git a/reactor-plc/plc.lua b/reactor-plc/plc.lua index 290ca64..5b84c7f 100644 --- a/reactor-plc/plc.lua +++ b/reactor-plc/plc.lua @@ -558,8 +558,10 @@ plc.comms = function (id, modem, local_port, server_port, reactor, rps, conn_wat -- feed the watchdog first so it doesn't uhh...eat our packets :) self.conn_watchdog.feed() + local protocol = packet.scada_frame.protocol() + -- handle packet - if packet.scada_frame.protocol() == PROTOCOLS.RPLC then + if protocol == PROTOCOLS.RPLC then if self.linked then if packet.type == RPLC_TYPES.LINK_REQ then -- link request confirmation @@ -678,7 +680,7 @@ plc.comms = function (id, modem, local_port, server_port, reactor, rps, conn_wat else log.debug("discarding non-link packet before linked") end - elseif packet.scada_frame.protocol() == PROTOCOLS.SCADA_MGMT then + elseif protocol == PROTOCOLS.SCADA_MGMT then if packet.type == SCADA_MGMT_TYPES.KEEP_ALIVE then -- keep alive request received, echo back if packet.length == 1 then diff --git a/reactor-plc/startup.lua b/reactor-plc/startup.lua index 1f3604f..1082afd 100644 --- a/reactor-plc/startup.lua +++ b/reactor-plc/startup.lua @@ -11,7 +11,7 @@ local config = require("config") local plc = require("plc") local threads = require("threads") -local R_PLC_VERSION = "alpha-v0.6.5" +local R_PLC_VERSION = "alpha-v0.6.6" local print = util.print local println = util.println @@ -46,7 +46,7 @@ local __shared_memory = { burn_rate_en = false, burn_rate = 0.0 }, - + -- core PLC devices plc_dev = { reactor = ppm.get_fission_reactor(), @@ -82,7 +82,7 @@ if smem_dev.reactor == nil then plc_state.degraded = true plc_state.no_reactor = true end -if networked and smem_dev.modem == nil then +if __shared_memory.networked and smem_dev.modem == nil then println("boot> wireless modem not found") log.warning("no wireless modem on startup") @@ -95,7 +95,8 @@ if networked and smem_dev.modem == nil then plc_state.no_modem = true end -function init() +-- PLC init +local init = function () if plc_state.init_ok then -- just booting up, no fission allowed (neutrons stay put thanks) smem_dev.reactor.scram() @@ -117,6 +118,7 @@ function init() log.debug("init> running without networking") end +---@diagnostic disable-next-line: undefined-field os.queueEvent("clock_start") println("boot> completed"); @@ -155,7 +157,7 @@ if __shared_memory.networked then smem_sys.plc_comms.send_rps_status() -- close connection - smem_sys.plc_comms.close(smem_sys.conn_watchdog) + smem_sys.plc_comms.close() end else -- run threads, excluding comms diff --git a/reactor-plc/threads.lua b/reactor-plc/threads.lua index e984b88..9dcb26e 100644 --- a/reactor-plc/threads.lua +++ b/reactor-plc/threads.lua @@ -51,6 +51,7 @@ threads.thread__main = function (smem, init) -- event loop while true do +---@diagnostic disable-next-line: undefined-field local event, param1, param2, param3, param4, param5 = os.pullEventRaw() -- handle event @@ -443,7 +444,7 @@ threads.thread__setpoint_control = function (smem) if running then -- do not use the actual elapsed time, it could spike -- we do not want to have big jumps as that is what we are trying to avoid in the first place - local min_elapsed_s = SETPOINT_CTRL_SLEEP / 1000.0 + local min_elapsed_s = SP_CTRL_SLEEP / 1000.0 -- clear so we can later evaluate if we should keep running running = false diff --git a/rtu/dev/redstone_rtu.lua b/rtu/dev/redstone_rtu.lua index 163b749..9683f57 100644 --- a/rtu/dev/redstone_rtu.lua +++ b/rtu/dev/redstone_rtu.lua @@ -27,7 +27,7 @@ redstone_rtu.new = function () return digital_read(rs.getInput(side)) end end - + self.rtu.connect_di(f_read) end @@ -61,7 +61,7 @@ redstone_rtu.new = function () rs.setOutput(side, digital_is_active(channel, level)) end end - + self.rtu.connect_coil(f_read, f_write) end diff --git a/rtu/modbus.lua b/rtu/modbus.lua index bb1817a..b64910f 100644 --- a/rtu/modbus.lua +++ b/rtu/modbus.lua @@ -64,7 +64,7 @@ modbus.new = function (rtu_dev, use_parallel_read) local access_fault = false local discrete_inputs, _, _, _ = self.rtu.io_count() local return_ok = ((di_addr_start + count) <= discrete_inputs) and (count > 0) - + if return_ok then for i = 1, count do local addr = di_addr_start + i - 1 @@ -197,7 +197,7 @@ modbus.new = function (rtu_dev, use_parallel_read) if access_fault then return_ok = false - readings = MODBUS_EXCODE.SERVER_DEVICE_FAIL + response = MODBUS_EXCODE.SERVER_DEVICE_FAIL end else response = MODBUS_EXCODE.ILLEGAL_DATA_ADDR @@ -210,13 +210,13 @@ modbus.new = function (rtu_dev, use_parallel_read) local response = nil local _, _, _, hold_regs = self.rtu.io_count() local return_ok = hr_addr <= hold_regs - + if return_ok then local access_fault = self.rtu.write_holding_reg(hr_addr, value) if access_fault then return_ok = false - readings = MODBUS_EXCODE.SERVER_DEVICE_FAIL + response = MODBUS_EXCODE.SERVER_DEVICE_FAIL end else response = MODBUS_EXCODE.ILLEGAL_DATA_ADDR @@ -238,7 +238,7 @@ modbus.new = function (rtu_dev, use_parallel_read) if access_fault then return_ok = false - readings = MODBUS_EXCODE.SERVER_DEVICE_FAIL + response = MODBUS_EXCODE.SERVER_DEVICE_FAIL break end end @@ -262,7 +262,7 @@ modbus.new = function (rtu_dev, use_parallel_read) if access_fault then return_ok = false - readings = MODBUS_EXCODE.SERVER_DEVICE_FAIL + response = MODBUS_EXCODE.SERVER_DEVICE_FAIL break end end diff --git a/rtu/rtu.lua b/rtu/rtu.lua index 83359d7..ec20c93 100644 --- a/rtu/rtu.lua +++ b/rtu/rtu.lua @@ -1,6 +1,8 @@ local comms = require("scada-common.comms") local ppm = require("scada-common.ppm") +local log = require("scada-common.log") local types = require("scada-common.types") +local util = require("scada-common.util") local modbus = require("modbus") @@ -12,6 +14,11 @@ local PROTOCOLS = comms.PROTOCOLS local SCADA_MGMT_TYPES = comms.SCADA_MGMT_TYPES local RTU_ADVERT_TYPES = comms.RTU_ADVERT_TYPES +local print = util.print +local println = util.println +local print_ts = util.print_ts +local println_ts = util.println_ts + rtu.init_unit = function () local self = { discrete_inputs = {}, @@ -136,6 +143,8 @@ rtu.comms = function (modem, local_port, server_port, conn_watchdog) conn_watchdog = conn_watchdog } + local insert = table.insert + -- open modem if not self.modem.isOpen(self.l_port) then self.modem.open(self.l_port) @@ -337,7 +346,7 @@ rtu.comms = function (modem, local_port, server_port, conn_watchdog) send_advertisement(units) else -- not supported - log.warning("RTU got unexpected SCADA message type " .. packet.type, true) + log.warning("RTU got unexpected SCADA message type " .. packet.type) end else -- should be unreachable assuming packet is from parse_packet() @@ -352,7 +361,6 @@ rtu.comms = function (modem, local_port, server_port, conn_watchdog) parse_packet = parse_packet, handle_packet = handle_packet, send_advertisement = send_advertisement, - send_heartbeat = send_heartbeat, unlink = unlink, close = close } diff --git a/rtu/startup.lua b/rtu/startup.lua index 5c4a6f4..18119c0 100644 --- a/rtu/startup.lua +++ b/rtu/startup.lua @@ -22,7 +22,7 @@ local imatrix_rtu = require("dev.imatrix_rtu") local turbine_rtu = require("dev.turbine_rtu") local turbinev_rtu = require("dev.turbinev_rtu") -local RTU_VERSION = "alpha-v0.6.1" +local RTU_VERSION = "alpha-v0.6.2" local rtu_t = types.rtu_t diff --git a/rtu/threads.lua b/rtu/threads.lua index db27c61..c113e1d 100644 --- a/rtu/threads.lua +++ b/rtu/threads.lua @@ -1,5 +1,6 @@ local comms = require("scada-common.comms") local log = require("scada-common.log") +local mqueue = require("scada-common.mqueue") local ppm = require("scada-common.ppm") local types = require("scada-common.types") local util = require("scada-common.util") @@ -46,6 +47,7 @@ threads.thread__main = function (smem) -- event loop while true do +---@diagnostic disable-next-line: undefined-field local event, param1, param2, param3, param4, param5 = os.pullEventRaw() if event == "timer" and param1 == loop_clock then @@ -210,6 +212,7 @@ threads.thread__unit_comms = function (smem, unit) -- load in from shared memory local rtu_state = smem.rtu_state + local rtu_comms = smem.rtu_sys.rtu_comms local packet_queue = unit.pkt_queue local last_update = util.time() @@ -228,7 +231,7 @@ threads.thread__unit_comms = function (smem, unit) -- received a packet unit.modbus_busy = true local return_code, reply = unit.modbus_io.handle_packet(packet) - rtu.send_modbus(reply) + rtu_comms.send_modbus(reply) unit.modbus_busy = false end diff --git a/supervisor/session/rtu.lua b/supervisor/session/rtu.lua index 90f6e95..2e79ec8 100644 --- a/supervisor/session/rtu.lua +++ b/supervisor/session/rtu.lua @@ -14,6 +14,10 @@ local println = util.println local print_ts = util.print_ts local println_ts = util.println_ts +local PERIODICS = { + KEEP_ALIVE = 2.0 +} + rtu.new_session = function (id, in_queue, out_queue) local log_header = "rtu_session(" .. id .. "): " @@ -97,7 +101,6 @@ rtu.new_session = function (id, in_queue, out_queue) -- RTU unit advertisement for i = 1, packet.length do local unit = packet.data[i] - unit end else log.debug(log_header .. "handler received unsupported SCADA_MGMT packet type " .. pkt.type) diff --git a/supervisor/session/svsessions.lua b/supervisor/session/svsessions.lua index 578c8ae..fa983a6 100644 --- a/supervisor/session/svsessions.lua +++ b/supervisor/session/svsessions.lua @@ -97,7 +97,7 @@ local function _free_closed(sessions) for i = 1, #sessions do local session = sessions[i] if session ~= nil then - if sessions[i].open then + if session.open then if sessions[move_to] == nil then sessions[move_to] = session sessions[i] = nil diff --git a/supervisor/unit.lua b/supervisor/unit.lua index e7569d6..95aa5f1 100644 --- a/supervisor/unit.lua +++ b/supervisor/unit.lua @@ -45,18 +45,18 @@ unit.new = function (for_reactor) table.insert(self.turbines, turbine) end - public.add_boiler = function (turbine) + public.add_boiler = function (boiler) table.insert(self.boilers, boiler) end public.add_redstone = function (field, accessor) -- ensure field exists - if redstone[field] == nil then - redstone[field] = {} + if self.redstone[field] == nil then + self.redstone[field] = {} end -- insert into list - table.insert(redstone[field], accessor) + table.insert(self.redstone[field], accessor) end local _update_annunciator = function ()