#45 burn rate ramping is optional now

This commit is contained in:
Mikayla Fischler 2022-05-05 16:00:49 -04:00
parent 89be79192f
commit 83fa41bbd0
5 changed files with 64 additions and 40 deletions

View File

@ -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?") log.debug("sent out structure again, did supervisor miss it?")
elseif packet.type == RPLC_TYPES.MEK_BURN_RATE then elseif packet.type == RPLC_TYPES.MEK_BURN_RATE then
-- set the burn rate -- set the burn rate
if packet.length == 1 then if packet.length == 2 then
local success = false local success = false
local burn_rate = packet.data[1] 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 no known max burn rate, check again
if max_burn_rate == nil then if self.max_burn_rate == nil then
max_burn_rate = self.reactor.getMaxBurnRate() self.max_burn_rate = self.reactor.getMaxBurnRate()
self.max_burn_rate = max_burn_rate
end end
-- if we know our max burn rate, update current burn rate setpoint if in range -- if we know our max burn rate, update current burn rate setpoint if in range
if max_burn_rate ~= ppm.ACCESS_FAULT then if self.max_burn_rate ~= ppm.ACCESS_FAULT then
if burn_rate > 0 and burn_rate <= max_burn_rate then if burn_rate > 0 and burn_rate <= self.max_burn_rate then
setpoints.burn_rate = burn_rate if ramp then
success = true 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
end end

View File

@ -11,7 +11,7 @@ local config = require("config")
local plc = require("plc") local plc = require("plc")
local threads = require("threads") 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 print = util.print
local println = util.println local println = util.println
@ -43,6 +43,7 @@ local __shared_memory = {
}, },
setpoints = { setpoints = {
burn_rate_en = false,
burn_rate = 0.0 burn_rate = 0.0
}, },

View File

@ -422,7 +422,7 @@ threads.thread__setpoint_control = function (smem)
local reactor = plc_dev.reactor local reactor = plc_dev.reactor
-- check if we should start ramping -- 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 rps.is_active() then
if math.abs(setpoints.burn_rate - last_sp_burn) <= 5 then if math.abs(setpoints.burn_rate - last_sp_burn) <= 5 then
-- update without ramp if <= 5 mB/t change -- update without ramp if <= 5 mB/t change
@ -449,33 +449,37 @@ threads.thread__setpoint_control = function (smem)
running = false running = false
-- adjust burn rate (setpoints.burn_rate) -- adjust burn rate (setpoints.burn_rate)
if rps.is_active() then if setpoints.burn_rate_en then
local current_burn_rate = reactor.getBurnRate() if rps.is_active() then
if (current_burn_rate ~= ppm.ACCESS_FAULT) and (current_burn_rate ~= setpoints.burn_rate) then local current_burn_rate = reactor.getBurnRate()
-- calculate new burn rate
local new_burn_rate = current_burn_rate
if setpoints.burn_rate > current_burn_rate then -- we yielded, check enable again
-- need to ramp up if setpoints.burn_rate_en and (current_burn_rate ~= ppm.ACCESS_FAULT) and (current_burn_rate ~= setpoints.burn_rate) then
local new_burn_rate = current_burn_rate + (BURN_RATE_RAMP_mB_s * min_elapsed_s) -- calculate new burn rate
if new_burn_rate > setpoints.burn_rate then local new_burn_rate = current_burn_rate
new_burn_rate = setpoints.burn_rate
end if setpoints.burn_rate > current_burn_rate then
else -- need to ramp up
-- need to ramp down local new_burn_rate = current_burn_rate + (BURN_RATE_RAMP_mB_s * min_elapsed_s)
local new_burn_rate = current_burn_rate - (BURN_RATE_RAMP_mB_s * min_elapsed_s) if new_burn_rate > setpoints.burn_rate then
if new_burn_rate < setpoints.burn_rate then new_burn_rate = setpoints.burn_rate
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 end
-- set the burn rate
reactor.setBurnRate(new_burn_rate)
running = running or (new_burn_rate ~= setpoints.burn_rate)
end end
else
-- set the burn rate last_sp_burn = 0
reactor.setBurnRate(new_burn_rate)
running = running or (new_burn_rate ~= setpoints.burn_rate)
end end
else
last_sp_burn = 0
end end
end end

View File

@ -21,11 +21,16 @@ local RETRY_PERIOD = 1000
local PLC_S_CMDS = { local PLC_S_CMDS = {
SCRAM = 0, SCRAM = 0,
ENABLE = 1, ENABLE = 1,
BURN_RATE = 2, RPS_RESET = 2
RPS_RESET = 3 }
local PLC_S_DATA = {
BURN_RATE = 1,
RAMP_BURN_RATE = 2
} }
plc.PLC_S_CMDS = PLC_S_CMDS plc.PLC_S_CMDS = PLC_S_CMDS
plc.PLC_S_DATA = PLC_S_DATA
local PERIODICS = { local PERIODICS = {
KEEP_ALIVE = 2.0 KEEP_ALIVE = 2.0
@ -42,6 +47,7 @@ plc.new_session = function (id, for_reactor, in_queue, out_queue)
out_q = out_queue, out_q = out_queue,
commanded_state = false, commanded_state = false,
commanded_burn_rate = 0.0, commanded_burn_rate = 0.0,
ramping_rate = false,
-- connection properties -- connection properties
seq_num = 0, seq_num = 0,
r_seq_num = nil, 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 elseif message.qtype == mqueue.TYPE.DATA then
-- instruction with body -- instruction with body
local cmd = message.message 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 -- update burn rate
self.commanded_burn_rate = cmd.val self.commanded_burn_rate = cmd.val
self.ramping_rate = false
self.acks.burn_rate = false self.acks.burn_rate = false
self.retry_times.burn_rate_req = util.time() + INITIAL_WAIT 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
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 not self.acks.burn_rate then
if rtimes.burn_rate_req - util.time() <= 0 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 rtimes.burn_rate_req = util.time() + RETRY_PERIOD
end end
end end

View File

@ -14,7 +14,7 @@ local svsessions = require("session.svsessions")
local config = require("config") local config = require("config")
local supervisor = require("supervisor") local supervisor = require("supervisor")
local SUPERVISOR_VERSION = "alpha-v0.3.2" local SUPERVISOR_VERSION = "alpha-v0.3.3"
local print = util.print local print = util.print
local println = util.println local println = util.println