osmarks

Untitled

Jan 26th, 2026 (edited)
161
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.16 KB | None | 0 0
  1. local modem = {peripheral.find("modem", function(_, o) return o.isWireless() end)}
  2. local gas_tanks = {peripheral.find "Ultimate Gas Tank"}
  3. local name = os.getComputerLabel()
  4. local function send(...)
  5. for _, modem in pairs(modem) do
  6. modem.transmit(48869, 48869, {...})
  7. end
  8. end
  9.  
  10. local last_fuel_issue = 0
  11. local reactor = peripheral.find "Reactor Logic Adapter"
  12. local last_error = nil
  13. local integral_error = 0
  14.  
  15. while true do
  16. if type(reactor.getEnergy()) == "string" then
  17. print("anomalous stringment", reactor.getEnergy())
  18. else
  19. local energy = reactor.getEnergy() / reactor.getMaxEnergy()
  20. send("mek_reactor_energy/" .. name, "fraction of fusion reactor's energy buffer which is full", energy)
  21. send("mek_reactor_plastemp/" .. name, "reported plasma temperature", reactor.getPlasmaHeat())
  22. send("mek_reactor_casetemp/" .. name, "reported case temperature", reactor.getCaseHeat())
  23. local any_too_low = false
  24. for _, tank in pairs(gas_tanks) do
  25. if tank.getStoredGas() / tank.getMaxGas() < 0.3 then
  26. any_too_low = true
  27. end
  28. end
  29. if any_too_low then
  30. last_fuel_issue = os.epoch "utc"
  31. end
  32.  
  33. local error = 0.5 - energy
  34. local derivative_error = error - (last_error or error)
  35. last_error = error
  36. integral_error = math.max(math.min(5, integral_error + error), -5)
  37.  
  38. print(("P=%.4f I=%.4f D=%.4f"):format(error, integral_error, derivative_error))
  39.  
  40. local control = 0.3 * error + 0.3 * derivative_error + 0.02 * integral_error
  41.  
  42. local injection_rate = 4 + math.floor(400 * math.min(math.max(control, 0), 1)) * 2
  43. print(injection_rate)
  44. if (os.epoch "utc" - last_fuel_issue) < 1000000 then -- 1000 seconds
  45. injection_rate = 8
  46. print "OVERRIDE"
  47. end
  48. reactor.setInjectionRate(injection_rate)
  49. send("mek_reactor_injectionrate/" .. name, "fuel injection rate (set by controller)", injection_rate)
  50. send("mek_reactor_powerout_rft/" .. name, "power output (RF/t)", reactor.getProducing() * 0.4)
  51. end
  52. sleep(1)
  53. end
  54.  
Advertisement
Add Comment
Please, Sign In to add comment