diff --git a/reactor-plc/plc.lua b/reactor-plc/plc.lua index 0d13091..efe6aaa 100644 --- a/reactor-plc/plc.lua +++ b/reactor-plc/plc.lua @@ -778,6 +778,7 @@ function plc.comms(id, version, modem, plc_channel, svr_channel, range, reactor, -- print a log message to the terminal as long as the UI isn't running local function println_ts(message) if not plc_state.fp_ok then util.println_ts(message) end end + local protocol = packet.scada_frame.protocol() local l_chan = packet.scada_frame.local_channel() local src_addr = packet.scada_frame.src_addr() @@ -789,6 +790,9 @@ function plc.comms(id, version, modem, plc_channel, svr_channel, range, reactor, elseif self.linked and ((self.r_seq_num + 1) ~= packet.scada_frame.seq_num()) then log.warning("sequence out-of-order: last = " .. self.r_seq_num .. ", new = " .. packet.scada_frame.seq_num()) return + elseif self.linked and src_addr ~= self.sv_addr then + log.debug("received packet from unknown computer " .. src_addr .. " while linked; channel in use by another system?") + return else self.r_seq_num = packet.scada_frame.seq_num() end @@ -796,8 +800,6 @@ function plc.comms(id, version, modem, plc_channel, svr_channel, range, reactor, -- feed the watchdog first so it doesn't uhh...eat our packets :) conn_watchdog.feed() - local protocol = packet.scada_frame.protocol() - -- handle packet if protocol == PROTOCOL.RPLC then ---@cast packet rplc_frame diff --git a/reactor-plc/startup.lua b/reactor-plc/startup.lua index 71ebcb2..5d0234f 100644 --- a/reactor-plc/startup.lua +++ b/reactor-plc/startup.lua @@ -18,7 +18,7 @@ local plc = require("reactor-plc.plc") local renderer = require("reactor-plc.renderer") local threads = require("reactor-plc.threads") -local R_PLC_VERSION = "v1.4.2" +local R_PLC_VERSION = "v1.4.3" local println = util.println local println_ts = util.println_ts diff --git a/rtu/rtu.lua b/rtu/rtu.lua index 5d2e2c8..a1cc9dc 100644 --- a/rtu/rtu.lua +++ b/rtu/rtu.lua @@ -330,13 +330,20 @@ function rtu.comms(version, modem, rtu_channel, svr_channel, range, conn_watchdo -- print a log message to the terminal as long as the UI isn't running local function println_ts(message) if not rtu_state.fp_ok then util.println_ts(message) end end - if packet.scada_frame.local_channel() == rtu_channel then + local protocol = packet.scada_frame.protocol() + local l_chan = packet.scada_frame.local_channel() + local src_addr = packet.scada_frame.src_addr() + + if l_chan == rtu_channel then -- check sequence number if self.r_seq_num == nil then self.r_seq_num = packet.scada_frame.seq_num() elseif rtu_state.linked and ((self.r_seq_num + 1) ~= packet.scada_frame.seq_num()) then log.warning("sequence out-of-order: last = " .. self.r_seq_num .. ", new = " .. packet.scada_frame.seq_num()) return + elseif rtu_state.linked and src_addr ~= self.sv_addr then + log.debug("received packet from unknown computer " .. src_addr .. " while linked; channel in use by another system?") + return else self.r_seq_num = packet.scada_frame.seq_num() end @@ -344,8 +351,7 @@ function rtu.comms(version, modem, rtu_channel, svr_channel, range, conn_watchdo -- feed watchdog on valid sequence number conn_watchdog.feed() - local protocol = packet.scada_frame.protocol() - + -- handle packet if protocol == PROTOCOL.MODBUS_TCP then ---@cast packet modbus_frame if rtu_state.linked then @@ -465,6 +471,8 @@ function rtu.comms(version, modem, rtu_channel, svr_channel, range, conn_watchdo -- should be unreachable assuming packet is from parse_packet() log.error("illegal packet type " .. protocol, true) end + else + log.debug("received packet on unconfigured channel " .. l_chan, true) end end diff --git a/rtu/startup.lua b/rtu/startup.lua index 113b513..58970f7 100644 --- a/rtu/startup.lua +++ b/rtu/startup.lua @@ -28,7 +28,7 @@ local sna_rtu = require("rtu.dev.sna_rtu") local sps_rtu = require("rtu.dev.sps_rtu") local turbinev_rtu = require("rtu.dev.turbinev_rtu") -local RTU_VERSION = "v1.3.2" +local RTU_VERSION = "v1.3.3" local RTU_UNIT_TYPE = types.RTU_UNIT_TYPE local RTU_UNIT_HW_STATE = databus.RTU_UNIT_HW_STATE