cc-mek-scada/rtu/dev/redstone_rtu.lua

114 lines
2.9 KiB
Lua
Raw Normal View History

2022-05-12 19:36:27 +00:00
local rtu = require("rtu.rtu")
local rsio = require("scada-common.rsio")
local redstone_rtu = {}
2022-02-08 20:42:06 +00:00
2022-03-23 19:36:14 +00:00
local digital_read = rsio.digital_read
local digital_is_active = rsio.digital_is_active
2022-05-12 19:36:27 +00:00
-- create new redstone device
redstone_rtu.new = function ()
2022-02-08 20:42:06 +00:00
local self = {
rtu = rtu.init_unit()
2022-02-08 20:42:06 +00:00
}
2022-05-12 19:36:27 +00:00
-- get RTU interface
local interface = self.rtu.interface()
---@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
}
2022-02-08 20:42:06 +00:00
2022-05-12 19:36:27 +00:00
-- link digital input
---@param side string
---@param color integer
public.link_di = function (side, color)
2022-02-08 20:42:06 +00:00
local f_read = nil
if color then
f_read = function ()
2022-03-23 19:36:14 +00:00
return digital_read(rs.testBundledInput(side, color))
2022-02-08 20:42:06 +00:00
end
else
f_read = function ()
2022-03-23 19:36:14 +00:00
return digital_read(rs.getInput(side))
2022-02-08 20:42:06 +00:00
end
end
2022-05-10 16:01:56 +00:00
2022-02-08 20:42:06 +00:00
self.rtu.connect_di(f_read)
end
2022-05-12 19:36:27 +00:00
-- link digital output
---@param channel RS_IO
---@param side string
---@param color integer
public.link_do = function (channel, side, color)
2022-02-08 20:42:06 +00:00
local f_read = nil
local f_write = nil
if color then
f_read = function ()
2022-03-23 19:36:14 +00:00
return digital_read(colors.test(rs.getBundledOutput(side), color))
2022-02-08 20:42:06 +00:00
end
2022-03-23 19:36:14 +00:00
f_write = function (level)
2022-02-08 20:42:06 +00:00
local output = rs.getBundledOutput(side)
2022-03-23 19:36:14 +00:00
local active = digital_is_active(channel, level)
2022-02-08 20:42:06 +00:00
2022-03-23 19:36:14 +00:00
if active then
colors.combine(output, color)
2022-02-08 20:42:06 +00:00
else
2022-03-23 19:36:14 +00:00
colors.subtract(output, color)
2022-02-08 20:42:06 +00:00
end
rs.setBundledOutput(side, output)
end
else
f_read = function ()
2022-03-23 19:36:14 +00:00
return digital_read(rs.getOutput(side))
2022-02-08 20:42:06 +00:00
end
2022-03-23 19:36:14 +00:00
f_write = function (level)
rs.setOutput(side, digital_is_active(channel, level))
2022-02-08 20:42:06 +00:00
end
end
2022-05-10 16:01:56 +00:00
2022-02-08 20:42:06 +00:00
self.rtu.connect_coil(f_read, f_write)
end
2022-05-12 19:36:27 +00:00
-- link analog input
---@param side string
public.link_ai = function (side)
2022-02-08 20:42:06 +00:00
self.rtu.connect_input_reg(
function ()
return rs.getAnalogInput(side)
end
)
end
2022-05-12 19:36:27 +00:00
-- link analog output
---@param side string
public.link_ao = function (side)
2022-02-08 20:42:06 +00:00
self.rtu.connect_holding_reg(
function ()
return rs.getAnalogOutput(side)
end,
function (value)
rs.setAnalogOutput(side, value)
end
)
end
2022-05-12 19:36:27 +00:00
return public
2022-02-08 20:42:06 +00:00
end
return redstone_rtu