diff --git a/rtu/dev/boiler_rtu.lua b/rtu/dev/boiler_rtu.lua index 322c511..26b5ebc 100644 --- a/rtu/dev/boiler_rtu.lua +++ b/rtu/dev/boiler_rtu.lua @@ -1,17 +1,15 @@ -local rtu = require("rtu") +local rtu = require("rtu.rtu") local boiler_rtu = {} +-- create new boiler (mek 10.0) device +---@param boiler table boiler_rtu.new = function (boiler) local self = { rtu = rtu.init_unit(), boiler = boiler } - local rtu_interface = function () - return self.rtu - end - -- discrete inputs -- -- none @@ -47,9 +45,7 @@ boiler_rtu.new = function (boiler) -- holding registers -- -- none - return { - rtu_interface = rtu_interface - } + return self.rtu.interface() end return boiler_rtu diff --git a/rtu/dev/boilerv_rtu.lua b/rtu/dev/boilerv_rtu.lua index a609588..fca1f09 100644 --- a/rtu/dev/boilerv_rtu.lua +++ b/rtu/dev/boilerv_rtu.lua @@ -1,29 +1,28 @@ -local rtu = require("rtu") +local rtu = require("rtu.rtu") local boilerv_rtu = {} +-- create new boiler (mek 10.1+) device +---@param boiler table boilerv_rtu.new = function (boiler) local self = { rtu = rtu.init_unit(), boiler = boiler } - local rtu_interface = function () - return self.rtu - end - -- discrete inputs -- - -- none + self.rtu.connect_di(self.boiler.isFormed) -- coils -- -- none -- input registers -- -- multiblock properties - self.rtu.connect_input_reg(self.boiler.isFormed) self.rtu.connect_input_reg(self.boiler.getLength) self.rtu.connect_input_reg(self.boiler.getWidth) self.rtu.connect_input_reg(self.boiler.getHeight) + self.rtu.connect_input_reg(self.boiler.getMinPos) + self.rtu.connect_input_reg(self.boiler.getMaxPos) -- build properties self.rtu.connect_input_reg(self.boiler.getBoilCapacity) self.rtu.connect_input_reg(self.boiler.getSteamCapacity) @@ -32,6 +31,7 @@ boilerv_rtu.new = function (boiler) self.rtu.connect_input_reg(self.boiler.getCooledCoolantCapacity) self.rtu.connect_input_reg(self.boiler.getSuperheaters) self.rtu.connect_input_reg(self.boiler.getMaxBoilRate) + self.rtu.connect_input_reg(self.boiler.getEnvironmentalLoss) -- current state self.rtu.connect_input_reg(self.boiler.getTemperature) self.rtu.connect_input_reg(self.boiler.getBoilRate) @@ -52,9 +52,7 @@ boilerv_rtu.new = function (boiler) -- holding registers -- -- none - return { - rtu_interface = rtu_interface - } + return self.rtu.interface() end return boilerv_rtu diff --git a/rtu/dev/energymachine_rtu.lua b/rtu/dev/energymachine_rtu.lua index d2aee3f..e0e05af 100644 --- a/rtu/dev/energymachine_rtu.lua +++ b/rtu/dev/energymachine_rtu.lua @@ -1,16 +1,20 @@ -local rtu = require("rtu") +local rtu = require("rtu.rtu") local energymachine_rtu = {} +-- create new energy machine device +---@param machine table energymachine_rtu.new = function (machine) local self = { rtu = rtu.init_unit(), machine = machine } - local rtu_interface = function () - return self.rtu - end + ---@class rtu_device + local public = {} + + -- get the RTU interface + public.rtu_interface = function () return self.rtu end -- discrete inputs -- -- none @@ -29,9 +33,7 @@ energymachine_rtu.new = function (machine) -- holding registers -- -- none - return { - rtu_interface = rtu_interface - } + return public end return energymachine_rtu diff --git a/rtu/dev/imatrix_rtu.lua b/rtu/dev/imatrix_rtu.lua index 12fd942..56498e5 100644 --- a/rtu/dev/imatrix_rtu.lua +++ b/rtu/dev/imatrix_rtu.lua @@ -1,29 +1,28 @@ -local rtu = require("rtu") +local rtu = require("rtu.rtu") local imatrix_rtu = {} +-- create new induction matrix (mek 10.1+) device +---@param imatrix table imatrix_rtu.new = function (imatrix) local self = { rtu = rtu.init_unit(), imatrix = imatrix } - local rtu_interface = function () - return self.rtu - end - -- discrete inputs -- - -- none + self.rtu.connect_di(self.boiler.isFormed) -- coils -- -- none -- input registers -- -- multiblock properties - self.rtu.connect_input_reg(self.boiler.isFormed) self.rtu.connect_input_reg(self.boiler.getLength) self.rtu.connect_input_reg(self.boiler.getWidth) self.rtu.connect_input_reg(self.boiler.getHeight) + self.rtu.connect_input_reg(self.boiler.getMinPos) + self.rtu.connect_input_reg(self.boiler.getMaxPos) -- build properties self.rtu.connect_input_reg(self.imatrix.getMaxEnergy) self.rtu.connect_input_reg(self.imatrix.getTransferCap) @@ -40,9 +39,7 @@ imatrix_rtu.new = function (imatrix) -- holding registers -- -- none - return { - rtu_interface = rtu_interface - } + return self.rtu.interface() end return imatrix_rtu diff --git a/rtu/dev/redstone_rtu.lua b/rtu/dev/redstone_rtu.lua index 9683f57..2763e98 100644 --- a/rtu/dev/redstone_rtu.lua +++ b/rtu/dev/redstone_rtu.lua @@ -1,4 +1,4 @@ -local rtu = require("rtu") +local rtu = require("rtu.rtu") local rsio = require("scada-common.rsio") local redstone_rtu = {} @@ -6,16 +6,31 @@ local redstone_rtu = {} local digital_read = rsio.digital_read local digital_is_active = rsio.digital_is_active +-- create new redstone device redstone_rtu.new = function () local self = { rtu = rtu.init_unit() } - local rtu_interface = function () - return self.rtu - end + -- get RTU interface + local interface = self.rtu.interface() - local link_di = function (channel, side, color) + ---@class rtu_rs_device + --- extends rtu_device; fields added manually to please Lua diagnostics + local public = { + io_count = interface.io_count, + read_coil = interface.read_coil, + read_di = interface.read_di, + read_holding_reg = interface.read_holding_reg, + read_input_reg = interface.read_input_reg, + write_coil = interface.write_coil, + write_holding_reg = interface.write_holding_reg + } + + -- link digital input + ---@param side string + ---@param color integer + public.link_di = function (side, color) local f_read = nil if color then @@ -31,7 +46,11 @@ redstone_rtu.new = function () self.rtu.connect_di(f_read) end - local link_do = function (channel, side, color) + -- link digital output + ---@param channel RS_IO + ---@param side string + ---@param color integer + public.link_do = function (channel, side, color) local f_read = nil local f_write = nil @@ -65,7 +84,9 @@ redstone_rtu.new = function () self.rtu.connect_coil(f_read, f_write) end - local link_ai = function (channel, side) + -- link analog input + ---@param side string + public.link_ai = function (side) self.rtu.connect_input_reg( function () return rs.getAnalogInput(side) @@ -73,7 +94,9 @@ redstone_rtu.new = function () ) end - local link_ao = function (channel, side) + -- link analog output + ---@param side string + public.link_ao = function (side) self.rtu.connect_holding_reg( function () return rs.getAnalogOutput(side) @@ -84,13 +107,7 @@ redstone_rtu.new = function () ) end - return { - rtu_interface = rtu_interface, - link_di = link_di, - link_do = link_do, - link_ai = link_ai, - link_ao = link_ao - } + return public end return redstone_rtu diff --git a/rtu/dev/turbine_rtu.lua b/rtu/dev/turbine_rtu.lua index 1f1827f..5ff71a7 100644 --- a/rtu/dev/turbine_rtu.lua +++ b/rtu/dev/turbine_rtu.lua @@ -1,17 +1,15 @@ -local rtu = require("rtu") +local rtu = require("rtu.rtu") local turbine_rtu = {} +-- create new turbine (mek 10.0) device +---@param turbine table turbine_rtu.new = function (turbine) local self = { rtu = rtu.init_unit(), turbine = turbine } - local rtu_interface = function () - return self.rtu - end - -- discrete inputs -- -- none @@ -42,9 +40,7 @@ turbine_rtu.new = function (turbine) -- holding registers -- -- none - return { - rtu_interface = rtu_interface - } + return self.rtu.interface() end return turbine_rtu diff --git a/rtu/dev/turbinev_rtu.lua b/rtu/dev/turbinev_rtu.lua index 2be532b..aa7a108 100644 --- a/rtu/dev/turbinev_rtu.lua +++ b/rtu/dev/turbinev_rtu.lua @@ -1,19 +1,17 @@ -local rtu = require("rtu") +local rtu = require("rtu.rtu") local turbinev_rtu = {} +-- create new turbine (mek 10.1+) device +---@param turbine table turbinev_rtu.new = function (turbine) local self = { rtu = rtu.init_unit(), turbine = turbine } - local rtu_interface = function () - return self.rtu - end - -- discrete inputs -- - -- none + self.rtu.connect_di(self.boiler.isFormed) -- coils -- self.rtu.connect_coil(function () self.turbine.incrementDumpingMode() end, function () end) @@ -21,10 +19,11 @@ turbinev_rtu.new = function (turbine) -- input registers -- -- multiblock properties - self.rtu.connect_input_reg(self.boiler.isFormed) self.rtu.connect_input_reg(self.boiler.getLength) self.rtu.connect_input_reg(self.boiler.getWidth) self.rtu.connect_input_reg(self.boiler.getHeight) + self.rtu.connect_input_reg(self.boiler.getMinPos) + self.rtu.connect_input_reg(self.boiler.getMaxPos) -- build properties self.rtu.connect_input_reg(self.turbine.getBlades) self.rtu.connect_input_reg(self.turbine.getCoils) @@ -50,11 +49,9 @@ turbinev_rtu.new = function (turbine) self.rtu.connect_input_reg(self.turbine.getEnergyFilledPercentage) -- holding registers -- - self.rtu.conenct_holding_reg(self.turbine.setDumpingMode, self.turbine.getDumpingMode) + self.rtu.connect_holding_reg(self.turbine.setDumpingMode, self.turbine.getDumpingMode) - return { - rtu_interface = rtu_interface - } + return self.rtu.interface() end return turbinev_rtu diff --git a/rtu/modbus.lua b/rtu/modbus.lua index 0e5e16c..efc0c84 100644 --- a/rtu/modbus.lua +++ b/rtu/modbus.lua @@ -7,7 +7,7 @@ local MODBUS_FCODE = types.MODBUS_FCODE local MODBUS_EXCODE = types.MODBUS_EXCODE -- new modbus comms handler object ----@param rtu_dev rtu RTU device +---@param rtu_dev rtu_device|rtu_rs_device RTU device ---@param use_parallel_read boolean whether or not to use parallel calls when reading modbus.new = function (rtu_dev, use_parallel_read) local self = { diff --git a/rtu/rtu.lua b/rtu/rtu.lua index 9a353f9..cafb645 100644 --- a/rtu/rtu.lua +++ b/rtu/rtu.lua @@ -29,16 +29,20 @@ rtu.init_unit = function () io_count_cache = { 0, 0, 0, 0 } } - ---@class rtu - local public = {} - local insert = table.insert + ---@class rtu_device + local public = {} + + ---@class rtu + local protected = {} + + -- refresh IO count local _count_io = function () self.io_count_cache = { #self.discrete_inputs, #self.coils, #self.input_regs, #self.holding_regs } end - -- return IO counts + -- return IO count ---@return integer discrete_inputs, integer coils, integer input_regs, integer holding_regs public.io_count = function () return self.io_count_cache[0], self.io_count_cache[1], self.io_count_cache[2], self.io_count_cache[3] @@ -49,7 +53,7 @@ rtu.init_unit = function () -- connect discrete input ---@param f function ---@return integer count count of discrete inputs - public.connect_di = function (f) + protected.connect_di = function (f) insert(self.discrete_inputs, f) _count_io() return #self.discrete_inputs @@ -70,7 +74,7 @@ rtu.init_unit = function () ---@param f_read function ---@param f_write function ---@return integer count count of coils - public.connect_coil = function (f_read, f_write) + protected.connect_coil = function (f_read, f_write) insert(self.coils, { read = f_read, write = f_write }) _count_io() return #self.coils @@ -100,7 +104,7 @@ rtu.init_unit = function () -- connect input register ---@param f function ---@return integer count count of input registers - public.connect_input_reg = function (f) + protected.connect_input_reg = function (f) insert(self.input_regs, f) _count_io() return #self.input_regs @@ -121,7 +125,7 @@ rtu.init_unit = function () ---@param f_read function ---@param f_write function ---@return integer count count of holding registers - public.connect_holding_reg = function (f_read, f_write) + protected.connect_holding_reg = function (f_read, f_write) insert(self.holding_regs, { read = f_read, write = f_write }) _count_io() return #self.holding_regs @@ -146,7 +150,14 @@ rtu.init_unit = function () return ppm.is_faulted() end - return public + -- public RTU device access + + -- get the public interface to this RTU + protected.interface = function () + return public + end + + return protected end -- RTU Communications diff --git a/rtu/startup.lua b/rtu/startup.lua index 3b34670..b37e3fd 100644 --- a/rtu/startup.lua +++ b/rtu/startup.lua @@ -22,7 +22,7 @@ local imatrix_rtu = require("rtu.dev.imatrix_rtu") local turbine_rtu = require("rtu.dev.turbine_rtu") local turbinev_rtu = require("rtu.dev.turbinev_rtu") -local RTU_VERSION = "alpha-v0.6.3" +local RTU_VERSION = "alpha-v0.6.4" local rtu_t = types.rtu_t @@ -122,13 +122,13 @@ for reactor_idx = 1, #rtu_redstone do -- link redstone in RTU local mode = rsio.get_io_mode(conf.channel) if mode == rsio.IO_MODE.DIGITAL_IN then - rs_rtu.link_di(conf.channel, conf.side, conf.bundled_color) + rs_rtu.link_di(conf.side, conf.bundled_color) elseif mode == rsio.IO_MODE.DIGITAL_OUT then rs_rtu.link_do(conf.channel, conf.side, conf.bundled_color) elseif mode == rsio.IO_MODE.ANALOG_IN then - rs_rtu.link_ai(conf.channel, conf.side) + rs_rtu.link_ai(conf.side) elseif mode == rsio.IO_MODE.ANALOG_OUT then - rs_rtu.link_ao(conf.channel, conf.side) + rs_rtu.link_ao(conf.side) else -- should be unreachable code, we already validated channels log.error("init> fell through if chain attempting to identify IO mode", true) @@ -171,7 +171,7 @@ for i = 1, #rtu_devices do log.warning(message) else local type = ppm.get_type(rtu_devices[i].name) - local rtu_iface = nil + local rtu_iface = nil ---@type rtu_device local rtu_type = "" if type == "boiler" then