RTU device changes, bugfixes, docs

This commit is contained in:
Mikayla Fischler 2022-05-12 15:36:27 -04:00
parent 9695e94608
commit 969abca95d
10 changed files with 98 additions and 84 deletions

View File

@ -1,17 +1,15 @@
local rtu = require("rtu") local rtu = require("rtu.rtu")
local boiler_rtu = {} local boiler_rtu = {}
-- create new boiler (mek 10.0) device
---@param boiler table
boiler_rtu.new = function (boiler) boiler_rtu.new = function (boiler)
local self = { local self = {
rtu = rtu.init_unit(), rtu = rtu.init_unit(),
boiler = boiler boiler = boiler
} }
local rtu_interface = function ()
return self.rtu
end
-- discrete inputs -- -- discrete inputs --
-- none -- none
@ -47,9 +45,7 @@ boiler_rtu.new = function (boiler)
-- holding registers -- -- holding registers --
-- none -- none
return { return self.rtu.interface()
rtu_interface = rtu_interface
}
end end
return boiler_rtu return boiler_rtu

View File

@ -1,29 +1,28 @@
local rtu = require("rtu") local rtu = require("rtu.rtu")
local boilerv_rtu = {} local boilerv_rtu = {}
-- create new boiler (mek 10.1+) device
---@param boiler table
boilerv_rtu.new = function (boiler) boilerv_rtu.new = function (boiler)
local self = { local self = {
rtu = rtu.init_unit(), rtu = rtu.init_unit(),
boiler = boiler boiler = boiler
} }
local rtu_interface = function ()
return self.rtu
end
-- discrete inputs -- -- discrete inputs --
-- none self.rtu.connect_di(self.boiler.isFormed)
-- coils -- -- coils --
-- none -- none
-- input registers -- -- input registers --
-- multiblock properties -- 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.getLength)
self.rtu.connect_input_reg(self.boiler.getWidth) self.rtu.connect_input_reg(self.boiler.getWidth)
self.rtu.connect_input_reg(self.boiler.getHeight) 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 -- build properties
self.rtu.connect_input_reg(self.boiler.getBoilCapacity) self.rtu.connect_input_reg(self.boiler.getBoilCapacity)
self.rtu.connect_input_reg(self.boiler.getSteamCapacity) 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.getCooledCoolantCapacity)
self.rtu.connect_input_reg(self.boiler.getSuperheaters) self.rtu.connect_input_reg(self.boiler.getSuperheaters)
self.rtu.connect_input_reg(self.boiler.getMaxBoilRate) self.rtu.connect_input_reg(self.boiler.getMaxBoilRate)
self.rtu.connect_input_reg(self.boiler.getEnvironmentalLoss)
-- current state -- current state
self.rtu.connect_input_reg(self.boiler.getTemperature) self.rtu.connect_input_reg(self.boiler.getTemperature)
self.rtu.connect_input_reg(self.boiler.getBoilRate) self.rtu.connect_input_reg(self.boiler.getBoilRate)
@ -52,9 +52,7 @@ boilerv_rtu.new = function (boiler)
-- holding registers -- -- holding registers --
-- none -- none
return { return self.rtu.interface()
rtu_interface = rtu_interface
}
end end
return boilerv_rtu return boilerv_rtu

View File

@ -1,16 +1,20 @@
local rtu = require("rtu") local rtu = require("rtu.rtu")
local energymachine_rtu = {} local energymachine_rtu = {}
-- create new energy machine device
---@param machine table
energymachine_rtu.new = function (machine) energymachine_rtu.new = function (machine)
local self = { local self = {
rtu = rtu.init_unit(), rtu = rtu.init_unit(),
machine = machine machine = machine
} }
local rtu_interface = function () ---@class rtu_device
return self.rtu local public = {}
end
-- get the RTU interface
public.rtu_interface = function () return self.rtu end
-- discrete inputs -- -- discrete inputs --
-- none -- none
@ -29,9 +33,7 @@ energymachine_rtu.new = function (machine)
-- holding registers -- -- holding registers --
-- none -- none
return { return public
rtu_interface = rtu_interface
}
end end
return energymachine_rtu return energymachine_rtu

View File

@ -1,29 +1,28 @@
local rtu = require("rtu") local rtu = require("rtu.rtu")
local imatrix_rtu = {} local imatrix_rtu = {}
-- create new induction matrix (mek 10.1+) device
---@param imatrix table
imatrix_rtu.new = function (imatrix) imatrix_rtu.new = function (imatrix)
local self = { local self = {
rtu = rtu.init_unit(), rtu = rtu.init_unit(),
imatrix = imatrix imatrix = imatrix
} }
local rtu_interface = function ()
return self.rtu
end
-- discrete inputs -- -- discrete inputs --
-- none self.rtu.connect_di(self.boiler.isFormed)
-- coils -- -- coils --
-- none -- none
-- input registers -- -- input registers --
-- multiblock properties -- 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.getLength)
self.rtu.connect_input_reg(self.boiler.getWidth) self.rtu.connect_input_reg(self.boiler.getWidth)
self.rtu.connect_input_reg(self.boiler.getHeight) 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 -- build properties
self.rtu.connect_input_reg(self.imatrix.getMaxEnergy) self.rtu.connect_input_reg(self.imatrix.getMaxEnergy)
self.rtu.connect_input_reg(self.imatrix.getTransferCap) self.rtu.connect_input_reg(self.imatrix.getTransferCap)
@ -40,9 +39,7 @@ imatrix_rtu.new = function (imatrix)
-- holding registers -- -- holding registers --
-- none -- none
return { return self.rtu.interface()
rtu_interface = rtu_interface
}
end end
return imatrix_rtu return imatrix_rtu

View File

@ -1,4 +1,4 @@
local rtu = require("rtu") local rtu = require("rtu.rtu")
local rsio = require("scada-common.rsio") local rsio = require("scada-common.rsio")
local redstone_rtu = {} local redstone_rtu = {}
@ -6,16 +6,31 @@ local redstone_rtu = {}
local digital_read = rsio.digital_read local digital_read = rsio.digital_read
local digital_is_active = rsio.digital_is_active local digital_is_active = rsio.digital_is_active
-- create new redstone device
redstone_rtu.new = function () redstone_rtu.new = function ()
local self = { local self = {
rtu = rtu.init_unit() rtu = rtu.init_unit()
} }
local rtu_interface = function () -- get RTU interface
return self.rtu local interface = self.rtu.interface()
end
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 local f_read = nil
if color then if color then
@ -31,7 +46,11 @@ redstone_rtu.new = function ()
self.rtu.connect_di(f_read) self.rtu.connect_di(f_read)
end 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_read = nil
local f_write = nil local f_write = nil
@ -65,7 +84,9 @@ redstone_rtu.new = function ()
self.rtu.connect_coil(f_read, f_write) self.rtu.connect_coil(f_read, f_write)
end end
local link_ai = function (channel, side) -- link analog input
---@param side string
public.link_ai = function (side)
self.rtu.connect_input_reg( self.rtu.connect_input_reg(
function () function ()
return rs.getAnalogInput(side) return rs.getAnalogInput(side)
@ -73,7 +94,9 @@ redstone_rtu.new = function ()
) )
end end
local link_ao = function (channel, side) -- link analog output
---@param side string
public.link_ao = function (side)
self.rtu.connect_holding_reg( self.rtu.connect_holding_reg(
function () function ()
return rs.getAnalogOutput(side) return rs.getAnalogOutput(side)
@ -84,13 +107,7 @@ redstone_rtu.new = function ()
) )
end end
return { return public
rtu_interface = rtu_interface,
link_di = link_di,
link_do = link_do,
link_ai = link_ai,
link_ao = link_ao
}
end end
return redstone_rtu return redstone_rtu

View File

@ -1,17 +1,15 @@
local rtu = require("rtu") local rtu = require("rtu.rtu")
local turbine_rtu = {} local turbine_rtu = {}
-- create new turbine (mek 10.0) device
---@param turbine table
turbine_rtu.new = function (turbine) turbine_rtu.new = function (turbine)
local self = { local self = {
rtu = rtu.init_unit(), rtu = rtu.init_unit(),
turbine = turbine turbine = turbine
} }
local rtu_interface = function ()
return self.rtu
end
-- discrete inputs -- -- discrete inputs --
-- none -- none
@ -42,9 +40,7 @@ turbine_rtu.new = function (turbine)
-- holding registers -- -- holding registers --
-- none -- none
return { return self.rtu.interface()
rtu_interface = rtu_interface
}
end end
return turbine_rtu return turbine_rtu

View File

@ -1,19 +1,17 @@
local rtu = require("rtu") local rtu = require("rtu.rtu")
local turbinev_rtu = {} local turbinev_rtu = {}
-- create new turbine (mek 10.1+) device
---@param turbine table
turbinev_rtu.new = function (turbine) turbinev_rtu.new = function (turbine)
local self = { local self = {
rtu = rtu.init_unit(), rtu = rtu.init_unit(),
turbine = turbine turbine = turbine
} }
local rtu_interface = function ()
return self.rtu
end
-- discrete inputs -- -- discrete inputs --
-- none self.rtu.connect_di(self.boiler.isFormed)
-- coils -- -- coils --
self.rtu.connect_coil(function () self.turbine.incrementDumpingMode() end, function () end) self.rtu.connect_coil(function () self.turbine.incrementDumpingMode() end, function () end)
@ -21,10 +19,11 @@ turbinev_rtu.new = function (turbine)
-- input registers -- -- input registers --
-- multiblock properties -- 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.getLength)
self.rtu.connect_input_reg(self.boiler.getWidth) self.rtu.connect_input_reg(self.boiler.getWidth)
self.rtu.connect_input_reg(self.boiler.getHeight) 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 -- build properties
self.rtu.connect_input_reg(self.turbine.getBlades) self.rtu.connect_input_reg(self.turbine.getBlades)
self.rtu.connect_input_reg(self.turbine.getCoils) 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) self.rtu.connect_input_reg(self.turbine.getEnergyFilledPercentage)
-- holding registers -- -- 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 { return self.rtu.interface()
rtu_interface = rtu_interface
}
end end
return turbinev_rtu return turbinev_rtu

View File

@ -7,7 +7,7 @@ local MODBUS_FCODE = types.MODBUS_FCODE
local MODBUS_EXCODE = types.MODBUS_EXCODE local MODBUS_EXCODE = types.MODBUS_EXCODE
-- new modbus comms handler object -- 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 ---@param use_parallel_read boolean whether or not to use parallel calls when reading
modbus.new = function (rtu_dev, use_parallel_read) modbus.new = function (rtu_dev, use_parallel_read)
local self = { local self = {

View File

@ -29,16 +29,20 @@ rtu.init_unit = function ()
io_count_cache = { 0, 0, 0, 0 } io_count_cache = { 0, 0, 0, 0 }
} }
---@class rtu
local public = {}
local insert = table.insert local insert = table.insert
---@class rtu_device
local public = {}
---@class rtu
local protected = {}
-- refresh IO count
local _count_io = function () local _count_io = function ()
self.io_count_cache = { #self.discrete_inputs, #self.coils, #self.input_regs, #self.holding_regs } self.io_count_cache = { #self.discrete_inputs, #self.coils, #self.input_regs, #self.holding_regs }
end end
-- return IO counts -- return IO count
---@return integer discrete_inputs, integer coils, integer input_regs, integer holding_regs ---@return integer discrete_inputs, integer coils, integer input_regs, integer holding_regs
public.io_count = function () 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] 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 -- connect discrete input
---@param f function ---@param f function
---@return integer count count of discrete inputs ---@return integer count count of discrete inputs
public.connect_di = function (f) protected.connect_di = function (f)
insert(self.discrete_inputs, f) insert(self.discrete_inputs, f)
_count_io() _count_io()
return #self.discrete_inputs return #self.discrete_inputs
@ -70,7 +74,7 @@ rtu.init_unit = function ()
---@param f_read function ---@param f_read function
---@param f_write function ---@param f_write function
---@return integer count count of coils ---@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 }) insert(self.coils, { read = f_read, write = f_write })
_count_io() _count_io()
return #self.coils return #self.coils
@ -100,7 +104,7 @@ rtu.init_unit = function ()
-- connect input register -- connect input register
---@param f function ---@param f function
---@return integer count count of input registers ---@return integer count count of input registers
public.connect_input_reg = function (f) protected.connect_input_reg = function (f)
insert(self.input_regs, f) insert(self.input_regs, f)
_count_io() _count_io()
return #self.input_regs return #self.input_regs
@ -121,7 +125,7 @@ rtu.init_unit = function ()
---@param f_read function ---@param f_read function
---@param f_write function ---@param f_write function
---@return integer count count of holding registers ---@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 }) insert(self.holding_regs, { read = f_read, write = f_write })
_count_io() _count_io()
return #self.holding_regs return #self.holding_regs
@ -146,9 +150,16 @@ rtu.init_unit = function ()
return ppm.is_faulted() return ppm.is_faulted()
end end
-- public RTU device access
-- get the public interface to this RTU
protected.interface = function ()
return public return public
end end
return protected
end
-- RTU Communications -- RTU Communications
---@param modem table ---@param modem table
---@param local_port integer ---@param local_port integer

View File

@ -22,7 +22,7 @@ local imatrix_rtu = require("rtu.dev.imatrix_rtu")
local turbine_rtu = require("rtu.dev.turbine_rtu") local turbine_rtu = require("rtu.dev.turbine_rtu")
local turbinev_rtu = require("rtu.dev.turbinev_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 local rtu_t = types.rtu_t
@ -122,13 +122,13 @@ for reactor_idx = 1, #rtu_redstone do
-- link redstone in RTU -- link redstone in RTU
local mode = rsio.get_io_mode(conf.channel) local mode = rsio.get_io_mode(conf.channel)
if mode == rsio.IO_MODE.DIGITAL_IN then 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 elseif mode == rsio.IO_MODE.DIGITAL_OUT then
rs_rtu.link_do(conf.channel, conf.side, conf.bundled_color) rs_rtu.link_do(conf.channel, conf.side, conf.bundled_color)
elseif mode == rsio.IO_MODE.ANALOG_IN then 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 elseif mode == rsio.IO_MODE.ANALOG_OUT then
rs_rtu.link_ao(conf.channel, conf.side) rs_rtu.link_ao(conf.side)
else else
-- should be unreachable code, we already validated channels -- should be unreachable code, we already validated channels
log.error("init> fell through if chain attempting to identify IO mode", true) 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) log.warning(message)
else else
local type = ppm.get_type(rtu_devices[i].name) local type = ppm.get_type(rtu_devices[i].name)
local rtu_iface = nil local rtu_iface = nil ---@type rtu_device
local rtu_type = "" local rtu_type = ""
if type == "boiler" then if type == "boiler" then