still queue packets if RTU is busy, determine busy state by queue length rather than flag

This commit is contained in:
Mikayla Fischler
2022-05-17 10:35:55 -04:00
parent 0eff8a3e6a
commit 31ede51c42
3 changed files with 14 additions and 12 deletions

View File

@ -336,30 +336,36 @@ rtu.comms = function (modem, local_port, server_port, conn_watchdog)
-- handle MODBUS instruction -- handle MODBUS instruction
if packet.unit_id <= #units then if packet.unit_id <= #units then
local unit = units[packet.unit_id] ---@type rtu_unit_registry_entry local unit = units[packet.unit_id] ---@type rtu_unit_registry_entry
local unit_dbg_tag = " (unit " .. packet.unit_id .. ")"
if unit.name == "redstone_io" then if unit.name == "redstone_io" then
-- immediately execute redstone RTU requests -- immediately execute redstone RTU requests
return_code, reply = unit.modbus_io.handle_packet(packet) return_code, reply = unit.modbus_io.handle_packet(packet)
if not return_code then if not return_code then
log.warning("requested MODBUS operation failed") log.warning("requested MODBUS operation failed" .. unit_dbg_tag)
end end
else else
-- check validity then pass off to unit comms thread -- check validity then pass off to unit comms thread
return_code, reply = unit.modbus_io.check_request(packet) return_code, reply = unit.modbus_io.check_request(packet)
if return_code then if return_code then
-- check if an operation is already in progress for this unit -- check if there are more than 3 active transactions
if unit.modbus_busy then -- still queue the packet, but this may indicate a problem
if unit.pkt_queue.length() > 3 then
reply = unit.modbus_io.reply__srv_device_busy(packet) reply = unit.modbus_io.reply__srv_device_busy(packet)
else log.debug("queueing new request with " .. unit.pkt_queue.length() ..
unit.pkt_queue.push_packet(packet) " transactions already in the queue" .. unit_dbg_tag)
end end
-- always queue the command even if busy
unit.pkt_queue.push_packet(packet)
else else
log.warning("cannot perform requested MODBUS operation") log.warning("cannot perform requested MODBUS operation" .. unit_dbg_tag)
end end
end end
else else
-- unit ID out of range? -- unit ID out of range?
reply = modbus.reply__gw_unavailable(packet) reply = modbus.reply__gw_unavailable(packet)
log.error("MODBUS packet requesting non-existent unit") log.error("received MODBUS packet for non-existent unit")
end end
public.send_modbus(reply) public.send_modbus(reply)

View File

@ -24,7 +24,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.5" local RTU_VERSION = "alpha-v0.6.6"
local rtu_t = types.rtu_t local rtu_t = types.rtu_t
@ -154,7 +154,6 @@ for entry_idx = 1, #rtu_redstone do
device = capabilities, -- use device field for redstone channels device = capabilities, -- use device field for redstone channels
rtu = rs_rtu, rtu = rs_rtu,
modbus_io = modbus.new(rs_rtu, false), modbus_io = modbus.new(rs_rtu, false),
modbus_busy = false,
pkt_queue = nil, pkt_queue = nil,
thread = nil thread = nil
} }
@ -218,7 +217,6 @@ for i = 1, #rtu_devices do
device = device, device = device,
rtu = rtu_iface, rtu = rtu_iface,
modbus_io = modbus.new(rtu_iface, true), modbus_io = modbus.new(rtu_iface, true),
modbus_busy = false,
pkt_queue = mqueue.new(), pkt_queue = mqueue.new(),
thread = nil thread = nil
} }

View File

@ -236,10 +236,8 @@ threads.thread__unit_comms = function (smem, unit)
-- received data -- received data
elseif msg.qtype == mqueue.TYPE.PACKET then elseif msg.qtype == mqueue.TYPE.PACKET then
-- received a packet -- received a packet
unit.modbus_busy = true
local _, reply = unit.modbus_io.handle_packet(msg.message) local _, reply = unit.modbus_io.handle_packet(msg.message)
rtu_comms.send_modbus(reply) rtu_comms.send_modbus(reply)
unit.modbus_busy = false
end end
end end