diff --git a/reactor-plc/plc.lua b/reactor-plc/plc.lua index 68671b9..9010610 100644 --- a/reactor-plc/plc.lua +++ b/reactor-plc/plc.lua @@ -614,22 +614,27 @@ plc.comms = function (id, modem, local_port, server_port, reactor, rps) log.debug("sent out structure again, did supervisor miss it?") elseif packet.type == RPLC_TYPES.MEK_BURN_RATE then -- set the burn rate - if packet.length == 1 then + if packet.length == 2 then local success = false local burn_rate = packet.data[1] - local max_burn_rate = self.max_burn_rate + local ramp = packet.data[2] -- if no known max burn rate, check again - if max_burn_rate == nil then - max_burn_rate = self.reactor.getMaxBurnRate() - self.max_burn_rate = max_burn_rate + if self.max_burn_rate == nil then + self.max_burn_rate = self.reactor.getMaxBurnRate() end -- if we know our max burn rate, update current burn rate setpoint if in range - if max_burn_rate ~= ppm.ACCESS_FAULT then - if burn_rate > 0 and burn_rate <= max_burn_rate then - setpoints.burn_rate = burn_rate - success = true + if self.max_burn_rate ~= ppm.ACCESS_FAULT then + if burn_rate > 0 and burn_rate <= self.max_burn_rate then + if ramp then + setpoints.burn_rate_en = true + setpoints.burn_rate = burn_rate + success = true + else + self.reactor.setBurnRate(burn_rate) + success = not self.reactor.__p_is_faulted() + end end end diff --git a/reactor-plc/startup.lua b/reactor-plc/startup.lua index cf2bb0f..deb2b82 100644 --- a/reactor-plc/startup.lua +++ b/reactor-plc/startup.lua @@ -11,7 +11,7 @@ local config = require("config") local plc = require("plc") local threads = require("threads") -local R_PLC_VERSION = "alpha-v0.6.2" +local R_PLC_VERSION = "alpha-v0.6.3" local print = util.print local println = util.println @@ -43,6 +43,7 @@ local __shared_memory = { }, setpoints = { + burn_rate_en = false, burn_rate = 0.0 }, diff --git a/reactor-plc/threads.lua b/reactor-plc/threads.lua index 42d8e33..e984b88 100644 --- a/reactor-plc/threads.lua +++ b/reactor-plc/threads.lua @@ -422,7 +422,7 @@ threads.thread__setpoint_control = function (smem) local reactor = plc_dev.reactor -- check if we should start ramping - if setpoints.burn_rate ~= last_sp_burn then + if setpoints.burn_rate_en and setpoints.burn_rate ~= last_sp_burn then if rps.is_active() then if math.abs(setpoints.burn_rate - last_sp_burn) <= 5 then -- update without ramp if <= 5 mB/t change @@ -449,33 +449,37 @@ threads.thread__setpoint_control = function (smem) running = false -- adjust burn rate (setpoints.burn_rate) - if rps.is_active() then - local current_burn_rate = reactor.getBurnRate() - if (current_burn_rate ~= ppm.ACCESS_FAULT) and (current_burn_rate ~= setpoints.burn_rate) then - -- calculate new burn rate - local new_burn_rate = current_burn_rate + if setpoints.burn_rate_en then + if rps.is_active() then + local current_burn_rate = reactor.getBurnRate() - if setpoints.burn_rate > current_burn_rate then - -- need to ramp up - local new_burn_rate = current_burn_rate + (BURN_RATE_RAMP_mB_s * min_elapsed_s) - if new_burn_rate > setpoints.burn_rate then - new_burn_rate = setpoints.burn_rate - end - else - -- need to ramp down - local new_burn_rate = current_burn_rate - (BURN_RATE_RAMP_mB_s * min_elapsed_s) - if new_burn_rate < setpoints.burn_rate then - new_burn_rate = setpoints.burn_rate + -- we yielded, check enable again + if setpoints.burn_rate_en and (current_burn_rate ~= ppm.ACCESS_FAULT) and (current_burn_rate ~= setpoints.burn_rate) then + -- calculate new burn rate + local new_burn_rate = current_burn_rate + + if setpoints.burn_rate > current_burn_rate then + -- need to ramp up + local new_burn_rate = current_burn_rate + (BURN_RATE_RAMP_mB_s * min_elapsed_s) + if new_burn_rate > setpoints.burn_rate then + new_burn_rate = setpoints.burn_rate + end + else + -- need to ramp down + local new_burn_rate = current_burn_rate - (BURN_RATE_RAMP_mB_s * min_elapsed_s) + if new_burn_rate < setpoints.burn_rate then + new_burn_rate = setpoints.burn_rate + end end + + -- set the burn rate + reactor.setBurnRate(new_burn_rate) + + running = running or (new_burn_rate ~= setpoints.burn_rate) end - - -- set the burn rate - reactor.setBurnRate(new_burn_rate) - - running = running or (new_burn_rate ~= setpoints.burn_rate) + else + last_sp_burn = 0 end - else - last_sp_burn = 0 end end diff --git a/supervisor/session/plc.lua b/supervisor/session/plc.lua index 2ee2770..1206ef6 100644 --- a/supervisor/session/plc.lua +++ b/supervisor/session/plc.lua @@ -21,11 +21,16 @@ local RETRY_PERIOD = 1000 local PLC_S_CMDS = { SCRAM = 0, ENABLE = 1, - BURN_RATE = 2, - RPS_RESET = 3 + RPS_RESET = 2 +} + +local PLC_S_DATA = { + BURN_RATE = 1, + RAMP_BURN_RATE = 2 } plc.PLC_S_CMDS = PLC_S_CMDS +plc.PLC_S_DATA = PLC_S_DATA local PERIODICS = { KEEP_ALIVE = 2.0 @@ -42,6 +47,7 @@ plc.new_session = function (id, for_reactor, in_queue, out_queue) out_q = out_queue, commanded_state = false, commanded_burn_rate = 0.0, + ramping_rate = false, -- connection properties seq_num = 0, r_seq_num = nil, @@ -447,12 +453,20 @@ plc.new_session = function (id, for_reactor, in_queue, out_queue) elseif message.qtype == mqueue.TYPE.DATA then -- instruction with body local cmd = message.message - if cmd.key == PLC_S_CMDS.BURN_RATE then + if cmd.key == PLC_S_DATA.BURN_RATE then -- update burn rate self.commanded_burn_rate = cmd.val + self.ramping_rate = false self.acks.burn_rate = false self.retry_times.burn_rate_req = util.time() + INITIAL_WAIT - _send(RPLC_TYPES.MEK_BURN_RATE, { self.commanded_burn_rate }) + _send(RPLC_TYPES.MEK_BURN_RATE, { self.commanded_burn_rate, self.ramping_rate }) + elseif cmd.key == PLC_S_DATA.RAMP_BURN_RATE then + -- ramp to burn rate + self.commanded_burn_rate = cmd.val + self.ramping_rate = true + self.acks.burn_rate = false + self.retry_times.burn_rate_req = util.time() + INITIAL_WAIT + _send(RPLC_TYPES.MEK_BURN_RATE, { self.commanded_burn_rate, self.ramping_rate }) end end @@ -535,7 +549,7 @@ plc.new_session = function (id, for_reactor, in_queue, out_queue) if not self.acks.burn_rate then if rtimes.burn_rate_req - util.time() <= 0 then - _send(RPLC_TYPES.MEK_BURN_RATE, { self.commanded_burn_rate }) + _send(RPLC_TYPES.MEK_BURN_RATE, { self.commanded_burn_rate, self.ramping_rate }) rtimes.burn_rate_req = util.time() + RETRY_PERIOD end end diff --git a/supervisor/startup.lua b/supervisor/startup.lua index 72ac729..a7ebcfe 100644 --- a/supervisor/startup.lua +++ b/supervisor/startup.lua @@ -14,7 +14,7 @@ local svsessions = require("session.svsessions") local config = require("config") local supervisor = require("supervisor") -local SUPERVISOR_VERSION = "alpha-v0.3.2" +local SUPERVISOR_VERSION = "alpha-v0.3.3" local print = util.print local println = util.println