Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- local modem = {peripheral.find("modem", function(_, o) return o.isWireless() end)}
- local gas_tanks = {peripheral.find "Ultimate Gas Tank"}
- local name = os.getComputerLabel()
- local function send(...)
- for _, modem in pairs(modem) do
- modem.transmit(48869, 48869, {...})
- end
- end
- local last_fuel_issue = 0
- local reactor = peripheral.find "Reactor Logic Adapter"
- local last_error = nil
- local integral_error = 0
- while true do
- if type(reactor.getEnergy()) == "string" then
- print("anomalous stringment", reactor.getEnergy())
- else
- local energy = reactor.getEnergy() / reactor.getMaxEnergy()
- send("mek_reactor_energy/" .. name, "fraction of fusion reactor's energy buffer which is full", energy)
- send("mek_reactor_plastemp/" .. name, "reported plasma temperature", reactor.getPlasmaHeat())
- send("mek_reactor_casetemp/" .. name, "reported case temperature", reactor.getCaseHeat())
- local any_too_low = false
- for _, tank in pairs(gas_tanks) do
- if tank.getStoredGas() / tank.getMaxGas() < 0.3 then
- any_too_low = true
- end
- end
- if any_too_low then
- last_fuel_issue = os.epoch "utc"
- end
- local error = 0.5 - energy
- local derivative_error = error - (last_error or error)
- last_error = error
- integral_error = math.max(math.min(5, integral_error + error), -5)
- print(("P=%.4f I=%.4f D=%.4f"):format(error, integral_error, derivative_error))
- local control = 0.3 * error + 0.3 * derivative_error + 0.02 * integral_error
- local injection_rate = 4 + math.floor(400 * math.min(math.max(control, 0), 1)) * 2
- print(injection_rate)
- if (os.epoch "utc" - last_fuel_issue) < 1000000 then -- 1000 seconds
- injection_rate = 8
- print "OVERRIDE"
- end
- reactor.setInjectionRate(injection_rate)
- send("mek_reactor_injectionrate/" .. name, "fuel injection rate (set by controller)", injection_rate)
- send("mek_reactor_powerout_rft/" .. name, "power output (RF/t)", reactor.getProducing() * 0.4)
- end
- sleep(1)
- end
Advertisement
Add Comment
Please, Sign In to add comment