diff --git a/install_manifest.json b/install_manifest.json index 7c887c7..e5b85b2 100644 --- a/install_manifest.json +++ b/install_manifest.json @@ -1 +1 @@ -{"versions": {"installer": "v1.5a", "bootloader": "0.2", "comms": "2.1.1", "graphics": "1.0.1", "lockbox": "1.0", "reactor-plc": "v1.5.1", "rtu": "v1.4.1", "supervisor": "v0.19.2", "coordinator": "v0.19.1", "pocket": "alpha-v0.5.2"}, "files": {"system": ["initenv.lua", "startup.lua"], "common": ["scada-common/ppm.lua", "scada-common/comms.lua", "scada-common/psil.lua", "scada-common/rsio.lua", "scada-common/constants.lua", "scada-common/mqueue.lua", "scada-common/tcd.lua", "scada-common/crash.lua", "scada-common/log.lua", "scada-common/types.lua", "scada-common/util.lua", "scada-common/network.lua"], "graphics": ["graphics/element.lua", "graphics/events.lua", "graphics/flasher.lua", "graphics/core.lua", "graphics/elements/listbox.lua", "graphics/elements/textbox.lua", "graphics/elements/displaybox.lua", "graphics/elements/pipenet.lua", "graphics/elements/rectangle.lua", "graphics/elements/div.lua", "graphics/elements/multipane.lua", "graphics/elements/tiling.lua", "graphics/elements/colormap.lua", "graphics/elements/indicators/alight.lua", "graphics/elements/indicators/icon.lua", "graphics/elements/indicators/power.lua", "graphics/elements/indicators/rad.lua", "graphics/elements/indicators/state.lua", "graphics/elements/indicators/light.lua", "graphics/elements/indicators/vbar.lua", "graphics/elements/indicators/led.lua", "graphics/elements/indicators/coremap.lua", "graphics/elements/indicators/data.lua", "graphics/elements/indicators/ledpair.lua", "graphics/elements/indicators/hbar.lua", "graphics/elements/indicators/trilight.lua", "graphics/elements/indicators/ledrgb.lua", "graphics/elements/controls/switch_button.lua", "graphics/elements/controls/spinbox_numeric.lua", "graphics/elements/controls/hazard_button.lua", "graphics/elements/controls/push_button.lua", "graphics/elements/controls/radio_button.lua", "graphics/elements/controls/multi_button.lua", "graphics/elements/controls/tabbar.lua", "graphics/elements/controls/checkbox.lua", "graphics/elements/controls/sidebar.lua", "graphics/elements/animations/waiting.lua"], "lockbox": ["lockbox/init.lua", "lockbox/LICENSE", "lockbox/kdf/pbkdf2.lua", "lockbox/util/bit.lua", "lockbox/util/array.lua", "lockbox/util/stream.lua", "lockbox/util/queue.lua", "lockbox/digest/sha2_224.lua", "lockbox/digest/sha1.lua", "lockbox/digest/sha2_256.lua", "lockbox/digest/md5.lua", "lockbox/mac/hmac.lua"], "reactor-plc": ["reactor-plc/renderer.lua", "reactor-plc/threads.lua", "reactor-plc/databus.lua", "reactor-plc/plc.lua", "reactor-plc/config.lua", "reactor-plc/startup.lua", "reactor-plc/panel/front_panel.lua", "reactor-plc/panel/style.lua"], "rtu": ["rtu/renderer.lua", "rtu/threads.lua", "rtu/rtu.lua", "rtu/databus.lua", "rtu/modbus.lua", "rtu/config.lua", "rtu/startup.lua", "rtu/panel/front_panel.lua", "rtu/panel/style.lua", "rtu/dev/sps_rtu.lua", "rtu/dev/envd_rtu.lua", "rtu/dev/boilerv_rtu.lua", "rtu/dev/redstone_rtu.lua", "rtu/dev/sna_rtu.lua", "rtu/dev/imatrix_rtu.lua", "rtu/dev/turbinev_rtu.lua"], "supervisor": ["supervisor/renderer.lua", "supervisor/databus.lua", "supervisor/supervisor.lua", "supervisor/unit.lua", "supervisor/config.lua", "supervisor/startup.lua", "supervisor/unitlogic.lua", "supervisor/facility.lua", "supervisor/panel/pgi.lua", "supervisor/panel/front_panel.lua", "supervisor/panel/style.lua", "supervisor/panel/components/rtu_entry.lua", "supervisor/panel/components/pdg_entry.lua", "supervisor/session/coordinator.lua", "supervisor/session/svqtypes.lua", "supervisor/session/pocket.lua", "supervisor/session/svsessions.lua", "supervisor/session/rtu.lua", "supervisor/session/plc.lua", "supervisor/session/rsctl.lua", "supervisor/session/rtu/boilerv.lua", "supervisor/session/rtu/txnctrl.lua", "supervisor/session/rtu/unit_session.lua", "supervisor/session/rtu/turbinev.lua", "supervisor/session/rtu/envd.lua", "supervisor/session/rtu/imatrix.lua", "supervisor/session/rtu/sps.lua", "supervisor/session/rtu/qtypes.lua", "supervisor/session/rtu/sna.lua", "supervisor/session/rtu/redstone.lua"], "coordinator": ["coordinator/coordinator.lua", "coordinator/renderer.lua", "coordinator/iocontrol.lua", "coordinator/sounder.lua", "coordinator/config.lua", "coordinator/startup.lua", "coordinator/process.lua", "coordinator/ui/dialog.lua", "coordinator/ui/pgi.lua", "coordinator/ui/style.lua", "coordinator/ui/layout/main_view.lua", "coordinator/ui/layout/unit_view.lua", "coordinator/ui/layout/front_panel.lua", "coordinator/ui/components/reactor.lua", "coordinator/ui/components/pkt_entry.lua", "coordinator/ui/components/process_ctl.lua", "coordinator/ui/components/unit_overview.lua", "coordinator/ui/components/boiler.lua", "coordinator/ui/components/unit_detail.lua", "coordinator/ui/components/imatrix.lua", "coordinator/ui/components/turbine.lua", "coordinator/session/pocket.lua", "coordinator/session/apisessions.lua"], "pocket": ["pocket/pocket.lua", "pocket/renderer.lua", "pocket/config.lua", "pocket/coreio.lua", "pocket/startup.lua", "pocket/ui/main.lua", "pocket/ui/style.lua", "pocket/ui/components/conn_waiting.lua", "pocket/ui/pages/turbine_page.lua", "pocket/ui/pages/reactor_page.lua", "pocket/ui/pages/home_page.lua", "pocket/ui/pages/unit_page.lua", "pocket/ui/pages/boiler_page.lua"]}, "depends": {"reactor-plc": ["system", "common", "graphics", "lockbox"], "rtu": ["system", "common", "graphics", "lockbox"], "supervisor": ["system", "common", "graphics", "lockbox"], "coordinator": ["system", "common", "graphics", "lockbox"], "pocket": ["system", "common", "graphics", "lockbox"]}, "sizes": {"manifest": 5722, "system": 1991, "common": 97476, "graphics": 147714, "lockbox": 34900, "reactor-plc": 97621, "rtu": 102265, "supervisor": 322235, "coordinator": 226362, "pocket": 37639}} \ No newline at end of file +{"versions": {"installer": "v1.5a", "bootloader": "0.2", "comms": "2.1.2", "graphics": "1.0.1", "lockbox": "1.0", "reactor-plc": "v1.5.2", "rtu": "v1.5.0", "supervisor": "v0.19.2", "coordinator": "v0.19.1", "pocket": "alpha-v0.5.2"}, "files": {"system": ["initenv.lua", "startup.lua"], "common": ["scada-common/ppm.lua", "scada-common/comms.lua", "scada-common/psil.lua", "scada-common/rsio.lua", "scada-common/constants.lua", "scada-common/mqueue.lua", "scada-common/tcd.lua", "scada-common/crash.lua", "scada-common/log.lua", "scada-common/types.lua", "scada-common/util.lua", "scada-common/network.lua"], "graphics": ["graphics/element.lua", "graphics/events.lua", "graphics/flasher.lua", "graphics/core.lua", "graphics/elements/listbox.lua", "graphics/elements/textbox.lua", "graphics/elements/displaybox.lua", "graphics/elements/pipenet.lua", "graphics/elements/rectangle.lua", "graphics/elements/div.lua", "graphics/elements/multipane.lua", "graphics/elements/tiling.lua", "graphics/elements/colormap.lua", "graphics/elements/indicators/alight.lua", "graphics/elements/indicators/icon.lua", "graphics/elements/indicators/power.lua", "graphics/elements/indicators/rad.lua", "graphics/elements/indicators/state.lua", "graphics/elements/indicators/light.lua", "graphics/elements/indicators/vbar.lua", "graphics/elements/indicators/led.lua", "graphics/elements/indicators/coremap.lua", "graphics/elements/indicators/data.lua", "graphics/elements/indicators/ledpair.lua", "graphics/elements/indicators/hbar.lua", "graphics/elements/indicators/trilight.lua", "graphics/elements/indicators/ledrgb.lua", "graphics/elements/controls/switch_button.lua", "graphics/elements/controls/spinbox_numeric.lua", "graphics/elements/controls/hazard_button.lua", "graphics/elements/controls/push_button.lua", "graphics/elements/controls/radio_button.lua", "graphics/elements/controls/multi_button.lua", "graphics/elements/controls/tabbar.lua", "graphics/elements/controls/checkbox.lua", "graphics/elements/controls/sidebar.lua", "graphics/elements/animations/waiting.lua"], "lockbox": ["lockbox/init.lua", "lockbox/LICENSE", "lockbox/kdf/pbkdf2.lua", "lockbox/util/bit.lua", "lockbox/util/array.lua", "lockbox/util/stream.lua", "lockbox/util/queue.lua", "lockbox/digest/sha2_224.lua", "lockbox/digest/sha1.lua", "lockbox/digest/sha2_256.lua", "lockbox/digest/md5.lua", "lockbox/mac/hmac.lua"], "reactor-plc": ["reactor-plc/renderer.lua", "reactor-plc/threads.lua", "reactor-plc/databus.lua", "reactor-plc/plc.lua", "reactor-plc/config.lua", "reactor-plc/startup.lua", "reactor-plc/panel/front_panel.lua", "reactor-plc/panel/style.lua"], "rtu": ["rtu/renderer.lua", "rtu/threads.lua", "rtu/rtu.lua", "rtu/databus.lua", "rtu/modbus.lua", "rtu/config.lua", "rtu/startup.lua", "rtu/panel/front_panel.lua", "rtu/panel/style.lua", "rtu/dev/sps_rtu.lua", "rtu/dev/envd_rtu.lua", "rtu/dev/boilerv_rtu.lua", "rtu/dev/redstone_rtu.lua", "rtu/dev/sna_rtu.lua", "rtu/dev/imatrix_rtu.lua", "rtu/dev/dynamicv_rtu.lua", "rtu/dev/turbinev_rtu.lua"], "supervisor": ["supervisor/renderer.lua", "supervisor/databus.lua", "supervisor/supervisor.lua", "supervisor/unit.lua", "supervisor/config.lua", "supervisor/startup.lua", "supervisor/unitlogic.lua", "supervisor/facility.lua", "supervisor/panel/pgi.lua", "supervisor/panel/front_panel.lua", "supervisor/panel/style.lua", "supervisor/panel/components/rtu_entry.lua", "supervisor/panel/components/pdg_entry.lua", "supervisor/session/coordinator.lua", "supervisor/session/svqtypes.lua", "supervisor/session/pocket.lua", "supervisor/session/svsessions.lua", "supervisor/session/rtu.lua", "supervisor/session/plc.lua", "supervisor/session/rsctl.lua", "supervisor/session/rtu/boilerv.lua", "supervisor/session/rtu/txnctrl.lua", "supervisor/session/rtu/unit_session.lua", "supervisor/session/rtu/turbinev.lua", "supervisor/session/rtu/envd.lua", "supervisor/session/rtu/imatrix.lua", "supervisor/session/rtu/sps.lua", "supervisor/session/rtu/qtypes.lua", "supervisor/session/rtu/sna.lua", "supervisor/session/rtu/redstone.lua"], "coordinator": ["coordinator/coordinator.lua", "coordinator/renderer.lua", "coordinator/iocontrol.lua", "coordinator/sounder.lua", "coordinator/config.lua", "coordinator/startup.lua", "coordinator/process.lua", "coordinator/ui/dialog.lua", "coordinator/ui/pgi.lua", "coordinator/ui/style.lua", "coordinator/ui/layout/main_view.lua", "coordinator/ui/layout/unit_view.lua", "coordinator/ui/layout/front_panel.lua", "coordinator/ui/components/reactor.lua", "coordinator/ui/components/pkt_entry.lua", "coordinator/ui/components/process_ctl.lua", "coordinator/ui/components/unit_overview.lua", "coordinator/ui/components/boiler.lua", "coordinator/ui/components/unit_detail.lua", "coordinator/ui/components/imatrix.lua", "coordinator/ui/components/turbine.lua", "coordinator/session/pocket.lua", "coordinator/session/apisessions.lua"], "pocket": ["pocket/pocket.lua", "pocket/renderer.lua", "pocket/config.lua", "pocket/coreio.lua", "pocket/startup.lua", "pocket/ui/main.lua", "pocket/ui/style.lua", "pocket/ui/components/conn_waiting.lua", "pocket/ui/pages/turbine_page.lua", "pocket/ui/pages/reactor_page.lua", "pocket/ui/pages/home_page.lua", "pocket/ui/pages/unit_page.lua", "pocket/ui/pages/boiler_page.lua"]}, "depends": {"reactor-plc": ["system", "common", "graphics", "lockbox"], "rtu": ["system", "common", "graphics", "lockbox"], "supervisor": ["system", "common", "graphics", "lockbox"], "coordinator": ["system", "common", "graphics", "lockbox"], "pocket": ["system", "common", "graphics", "lockbox"]}, "sizes": {"manifest": 5750, "system": 1991, "common": 97755, "graphics": 147714, "lockbox": 34900, "reactor-plc": 95247, "rtu": 105052, "supervisor": 322235, "coordinator": 226372, "pocket": 37639}} \ No newline at end of file diff --git a/rtu/dev/boilerv_rtu.lua b/rtu/dev/boilerv_rtu.lua index 6815a3c..0197421 100644 --- a/rtu/dev/boilerv_rtu.lua +++ b/rtu/dev/boilerv_rtu.lua @@ -2,7 +2,7 @@ local rtu = require("rtu.rtu") local boilerv_rtu = {} --- create new boiler (mek 10.1+) device +-- create new boiler device ---@nodiscard ---@param boiler table ---@return rtu_device interface, boolean faulted diff --git a/rtu/dev/dynamicv_rtu.lua b/rtu/dev/dynamicv_rtu.lua new file mode 100644 index 0000000..ff2e0f2 --- /dev/null +++ b/rtu/dev/dynamicv_rtu.lua @@ -0,0 +1,51 @@ +local rtu = require("rtu.rtu") + +local dynamicv_rtu = {} + +-- create new dynamic tank device +---@nodiscard +---@param dynamic_tank table +---@return rtu_device interface, boolean faulted +function dynamicv_rtu.new(dynamic_tank) + local unit = rtu.init_unit() + + -- disable auto fault clearing + dynamic_tank.__p_clear_fault() + dynamic_tank.__p_disable_afc() + + -- discrete inputs -- + unit.connect_di(dynamic_tank.isFormed) + + -- coils -- + unit.connect_coil(function () dynamic_tank.incrementContainerEditMode() end, function () end) + unit.connect_coil(function () dynamic_tank.decrementContainerEditMode() end, function () end) + + -- input registers -- + -- multiblock properties + unit.connect_input_reg(dynamic_tank.getLength) + unit.connect_input_reg(dynamic_tank.getWidth) + unit.connect_input_reg(dynamic_tank.getHeight) + unit.connect_input_reg(dynamic_tank.getMinPos) + unit.connect_input_reg(dynamic_tank.getMaxPos) + -- build properties + unit.connect_input_reg(dynamic_tank.getTankCapacity) + unit.connect_input_reg(dynamic_tank.getChemicalTankCapacity) + -- current state + -- tanks/containers + unit.connect_input_reg(dynamic_tank.getInputItem) + unit.connect_input_reg(dynamic_tank.getOutputItem) + unit.connect_input_reg(dynamic_tank.getStored) + unit.connect_input_reg(dynamic_tank.getFilledPercentage) + + -- holding registers -- + unit.connect_holding_reg(dynamic_tank.getContainerEditMode, dynamic_tank.setContainerEditMode) + + -- check if any calls faulted + local faulted = dynamic_tank.__p_is_faulted() + dynamic_tank.__p_clear_fault() + dynamic_tank.__p_enable_afc() + + return unit.interface(), faulted +end + +return dynamicv_rtu diff --git a/rtu/dev/turbinev_rtu.lua b/rtu/dev/turbinev_rtu.lua index f8d6d5e..17e6675 100644 --- a/rtu/dev/turbinev_rtu.lua +++ b/rtu/dev/turbinev_rtu.lua @@ -2,7 +2,7 @@ local rtu = require("rtu.rtu") local turbinev_rtu = {} --- create new turbine (mek 10.1+) device +-- create new turbine device ---@nodiscard ---@param turbine table ---@return rtu_device interface, boolean faulted diff --git a/rtu/panel/front_panel.lua b/rtu/panel/front_panel.lua index 640811d..dc0dd44 100644 --- a/rtu/panel/front_panel.lua +++ b/rtu/panel/front_panel.lua @@ -26,6 +26,7 @@ local UNIT_TYPE_LABELS = { "REDSTONE", "BOILER", "TURBINE", + "DYNAMIC TANK", "IND MATRIX", "SPS", "SNA", diff --git a/rtu/startup.lua b/rtu/startup.lua index 255d957..aa182d9 100644 --- a/rtu/startup.lua +++ b/rtu/startup.lua @@ -22,6 +22,7 @@ local rtu = require("rtu.rtu") local threads = require("rtu.threads") local boilerv_rtu = require("rtu.dev.boilerv_rtu") +local dynamicv_rtu = require("rtu.dev.dynamicv_rtu") local envd_rtu = require("rtu.dev.envd_rtu") local imatrix_rtu = require("rtu.dev.imatrix_rtu") local redstone_rtu = require("rtu.dev.redstone_rtu") @@ -29,7 +30,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.4.1" +local RTU_VERSION = "v1.5.0" local RTU_UNIT_TYPE = types.RTU_UNIT_TYPE local RTU_UNIT_HW_STATE = databus.RTU_UNIT_HW_STATE @@ -342,6 +343,18 @@ local function main() log.fatal(util.c("configure> failed to check if '", name, "' is a formed turbine multiblock")) return false end + elseif type == "dynamicValve" then + -- dynamic tank multiblock + rtu_type = RTU_UNIT_TYPE.DYNAMIC_VALVE + rtu_iface, faulted = dynamicv_rtu.new(device) + is_multiblock = true + formed = device.isFormed() + + if formed == ppm.UNDEFINED_FIELD or formed == ppm.ACCESS_FAULT then + println_ts(util.c("configure> failed to check if '", name, "' is formed")) + log.fatal(util.c("configure> failed to check if '", name, "' is a formed dynamic tank multiblock")) + return false + end elseif type == "inductionPort" then -- induction matrix multiblock rtu_type = RTU_UNIT_TYPE.IMATRIX diff --git a/rtu/threads.lua b/rtu/threads.lua index c27052d..55a4b7a 100644 --- a/rtu/threads.lua +++ b/rtu/threads.lua @@ -10,6 +10,7 @@ local modbus = require("rtu.modbus") local renderer = require("rtu.renderer") local boilerv_rtu = require("rtu.dev.boilerv_rtu") +local dynamicv_rtu = require("rtu.dev.dynamicv_rtu") local envd_rtu = require("rtu.dev.envd_rtu") local imatrix_rtu = require("rtu.dev.imatrix_rtu") local sna_rtu = require("rtu.dev.sna_rtu") @@ -181,21 +182,22 @@ function threads.thread__main(smem) databus.tx_unit_hw_type(unit.uid, unit.type) end + -- note for multiblock structures: if not formed, indexing the multiblock functions results in a PPM fault + if unit.type == RTU_UNIT_TYPE.BOILER_VALVE then unit.rtu, faulted = boilerv_rtu.new(device) - -- if not formed, indexing the multiblock functions would have resulted in a PPM fault unit.formed = util.trinary(faulted, false, nil) elseif unit.type == RTU_UNIT_TYPE.TURBINE_VALVE then unit.rtu, faulted = turbinev_rtu.new(device) - -- if not formed, indexing the multiblock functions would have resulted in a PPM fault + unit.formed = util.trinary(faulted, false, nil) + elseif unit.type == RTU_UNIT_TYPE.DYNAMIC_VALVE then + unit.rtu, faulted = dynamicv_rtu.new(device) unit.formed = util.trinary(faulted, false, nil) elseif unit.type == RTU_UNIT_TYPE.IMATRIX then unit.rtu, faulted = imatrix_rtu.new(device) - -- if not formed, indexing the multiblock functions would have resulted in a PPM fault unit.formed = util.trinary(faulted, false, nil) elseif unit.type == RTU_UNIT_TYPE.SPS then unit.rtu, faulted = sps_rtu.new(device) - -- if not formed, indexing the multiblock functions would have resulted in a PPM fault unit.formed = util.trinary(faulted, false, nil) elseif unit.type == RTU_UNIT_TYPE.SNA then unit.rtu, faulted = sna_rtu.new(device) @@ -441,6 +443,12 @@ function threads.thread__unit_comms(smem, unit) unit.rtu, faulted = turbinev_rtu.new(device) unit.formed = device.isFormed() unit.modbus_io = modbus.new(unit.rtu, true) + elseif type == "dynamicValve" and unit.type == RTU_UNIT_TYPE.DYNAMIC_VALVE then + -- dynamic tank multiblock + unit.device = device + unit.rtu, faulted = dynamicv_rtu.new(device) + unit.formed = device.isFormed() + unit.modbus_io = modbus.new(unit.rtu, true) elseif type == "inductionPort" and unit.type == RTU_UNIT_TYPE.IMATRIX then -- induction matrix multiblock unit.device = device diff --git a/scada-common/comms.lua b/scada-common/comms.lua index a9fa5a5..6a8324d 100644 --- a/scada-common/comms.lua +++ b/scada-common/comms.lua @@ -14,7 +14,7 @@ local max_distance = nil ---@type number|nil maximum acceptable t ---@class comms local comms = {} -comms.version = "2.1.1" +comms.version = "2.1.2" ---@enum PROTOCOL local PROTOCOL = { diff --git a/scada-common/types.lua b/scada-common/types.lua index 9e68632..91e6469 100644 --- a/scada-common/types.lua +++ b/scada-common/types.lua @@ -89,16 +89,18 @@ types.RTU_UNIT_TYPE = { REDSTONE = 1, -- redstone I/O BOILER_VALVE = 2, -- boiler mekanism 10.1+ TURBINE_VALVE = 3, -- turbine, mekanism 10.1+ - IMATRIX = 4, -- induction matrix - SPS = 5, -- SPS - SNA = 6, -- SNA - ENV_DETECTOR = 7 -- environment detector + DYNAMIC_VALVE = 4, -- dynamic tank, mekanism 10.1+ + IMATRIX = 5, -- induction matrix + SPS = 6, -- SPS + SNA = 7, -- SNA + ENV_DETECTOR = 8 -- environment detector } types.RTU_UNIT_NAMES = { "redstone", "boiler_valve", "turbine_valve", + "dynamic_valve", "induction_matrix", "sps", "sna", @@ -115,6 +117,7 @@ function types.rtu_type_to_string(utype) elseif utype == types.RTU_UNIT_TYPE.REDSTONE or utype == types.RTU_UNIT_TYPE.BOILER_VALVE or utype == types.RTU_UNIT_TYPE.TURBINE_VALVE or + utype == types.RTU_UNIT_TYPE.DYNAMIC_VALVE or utype == types.RTU_UNIT_TYPE.IMATRIX or utype == types.RTU_UNIT_TYPE.SPS or utype == types.RTU_UNIT_TYPE.SNA or @@ -328,6 +331,17 @@ types.RPS_TRIP_CAUSE = { FORCE_DISABLED = "force_disabled" } +---@alias container_mode +---| "BOTH" +---| "FILL" +---| "EMPTY" + +types.CONTAINER_MODE = { + BOTH = "BOTH", + FILL = "FILL", + EMPTY = "EMPTY" +} + ---@alias dumping_mode ---| "IDLE" ---| "DUMPING"