#445 fixed PPM undefined field logic and improved RTU unit fault handling

This commit is contained in:
Mikayla Fischler
2024-03-09 13:24:06 -05:00
parent d1e4ea586e
commit 79c93f1562
11 changed files with 49 additions and 67 deletions

View File

@@ -67,9 +67,11 @@ function rtu.load_config()
return cfv.valid()
end
-- create a new RTU unit
-- create a new RTU unit<br>
-- if this is for a PPM peripheral, auto fault clearing MUST stay enabled once access begins
---@nodiscard
function rtu.init_unit()
---@param device table|nil peripheral device, if applicable
function rtu.init_unit(device)
local self = {
discrete_inputs = {},
coils = {},
@@ -86,6 +88,10 @@ function rtu.init_unit()
---@class rtu
local protected = {}
-- function to check if the peripheral (if exists) is faulted
local function _is_faulted() return false end
if device then _is_faulted = device.__p_is_faulted end
-- refresh IO count
local function _count_io()
self.io_count_cache = { #self.discrete_inputs, #self.coils, #self.input_regs, #self.holding_regs }
@@ -112,9 +118,8 @@ function rtu.init_unit()
---@param di_addr integer
---@return any value, boolean access_fault
function public.read_di(di_addr)
ppm.clear_fault()
local value = self.discrete_inputs[di_addr].read()
return value, ppm.is_faulted()
return value, _is_faulted()
end
-- coils: single bit read-write
@@ -133,9 +138,8 @@ function rtu.init_unit()
---@param coil_addr integer
---@return any value, boolean access_fault
function public.read_coil(coil_addr)
ppm.clear_fault()
local value = self.coils[coil_addr].read()
return value, ppm.is_faulted()
return value, _is_faulted()
end
-- write coil
@@ -143,9 +147,8 @@ function rtu.init_unit()
---@param value any
---@return boolean access_fault
function public.write_coil(coil_addr, value)
ppm.clear_fault()
self.coils[coil_addr].write(value)
return ppm.is_faulted()
return _is_faulted()
end
-- input registers: multi-bit read-only
@@ -163,9 +166,8 @@ function rtu.init_unit()
---@param reg_addr integer
---@return any value, boolean access_fault
function public.read_input_reg(reg_addr)
ppm.clear_fault()
local value = self.input_regs[reg_addr].read()
return value, ppm.is_faulted()
return value, _is_faulted()
end
-- holding registers: multi-bit read-write
@@ -184,9 +186,8 @@ function rtu.init_unit()
---@param reg_addr integer
---@return any value, boolean access_fault
function public.read_holding_reg(reg_addr)
ppm.clear_fault()
local value = self.holding_regs[reg_addr].read()
return value, ppm.is_faulted()
return value, _is_faulted()
end
-- write holding register
@@ -194,9 +195,8 @@ function rtu.init_unit()
---@param value any
---@return boolean access_fault
function public.write_holding_reg(reg_addr, value)
ppm.clear_fault()
self.holding_regs[reg_addr].write(value)
return ppm.is_faulted()
return _is_faulted()
end
-- public RTU device access