#13 ISS tolerant of failed PPM calls, added comments
This commit is contained in:
parent
7e7e98ff6b
commit
03f9284f30
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
-- Internal Safety System
|
-- Internal Safety System
|
||||||
-- identifies dangerous states and SCRAMs reactor if warranted
|
-- identifies dangerous states and SCRAMs reactor if warranted
|
||||||
-- autonomous from main control
|
-- autonomous from main SCADA supervisor/coordinator control
|
||||||
function iss_init(reactor)
|
function iss_init(reactor)
|
||||||
local self = {
|
local self = {
|
||||||
reactor = reactor,
|
reactor = reactor,
|
||||||
@ -11,39 +11,90 @@ function iss_init(reactor)
|
|||||||
trip_cause = ""
|
trip_cause = ""
|
||||||
}
|
}
|
||||||
|
|
||||||
|
-- re-link a reactor after a peripheral re-connect
|
||||||
local reconnect_reactor = function (reactor)
|
local reconnect_reactor = function (reactor)
|
||||||
self.reactor = reactor
|
self.reactor = reactor
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- check for critical damage
|
||||||
local damage_critical = function ()
|
local damage_critical = function ()
|
||||||
return self.reactor.getDamagePercent() >= 100
|
local damage_percent = self.reactor.getDamagePercent()
|
||||||
|
if damage_percent == nil then
|
||||||
|
-- lost the peripheral or terminated, handled later
|
||||||
|
log._error("ISS: failed to check reactor damage")
|
||||||
|
return false
|
||||||
|
else
|
||||||
|
return damage_percent >= 100
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- check for heated coolant backup
|
||||||
local excess_heated_coolant = function ()
|
local excess_heated_coolant = function ()
|
||||||
return self.reactor.getHeatedCoolantNeeded() == 0
|
local hc_needed = self.reactor.getHeatedCoolantNeeded()
|
||||||
|
if hc_needed == nil then
|
||||||
|
-- lost the peripheral or terminated, handled later
|
||||||
|
log._error("ISS: failed to check reactor heated coolant level")
|
||||||
|
return false
|
||||||
|
else
|
||||||
|
return hc_needed == 0
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- check for excess waste
|
||||||
local excess_waste = function ()
|
local excess_waste = function ()
|
||||||
return self.reactor.getWasteNeeded() == 0
|
local w_needed = self.reactor.getWasteNeeded()
|
||||||
|
if w_needed == nil then
|
||||||
|
-- lost the peripheral or terminated, handled later
|
||||||
|
log._error("ISS: failed to check reactor waste level")
|
||||||
|
return false
|
||||||
|
else
|
||||||
|
return w_needed == 0
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- check if the reactor is at a critically high temperature
|
||||||
local high_temp = function ()
|
local high_temp = function ()
|
||||||
-- mekanism: MAX_DAMAGE_TEMPERATURE = 1_200
|
-- mekanism: MAX_DAMAGE_TEMPERATURE = 1_200
|
||||||
return self.reactor.getTemperature() >= 1200
|
local temp = self.reactor.getTemperature()
|
||||||
|
if temp == nil then
|
||||||
|
-- lost the peripheral or terminated, handled later
|
||||||
|
log._error("ISS: failed to check reactor temperature")
|
||||||
|
return false
|
||||||
|
else
|
||||||
|
return temp >= 1200
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- check if there is no fuel
|
||||||
local insufficient_fuel = function ()
|
local insufficient_fuel = function ()
|
||||||
return self.reactor.getFuel() == 0
|
local fuel = self.reactor.getFuel()
|
||||||
|
if fuel == nil then
|
||||||
|
-- lost the peripheral or terminated, handled later
|
||||||
|
log._error("ISS: failed to check reactor fuel level")
|
||||||
|
return false
|
||||||
|
else
|
||||||
|
return fuel == 0
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- check if there is no coolant
|
||||||
local no_coolant = function ()
|
local no_coolant = function ()
|
||||||
return self.reactor.getCoolantFilledPercentage() < 2
|
local coolant_filled = self.reactor.getCoolantFilledPercentage()
|
||||||
|
if coolant_filled == nil then
|
||||||
|
-- lost the peripheral or terminated, handled later
|
||||||
|
log._error("ISS: failed to check reactor coolant level")
|
||||||
|
return false
|
||||||
|
else
|
||||||
|
return coolant_filled < 2
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- if PLC timed out
|
||||||
local timed_out = function ()
|
local timed_out = function ()
|
||||||
return self.timed_out
|
return self.timed_out
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- check all safety conditions
|
||||||
local check = function ()
|
local check = function ()
|
||||||
local status = "ok"
|
local status = "ok"
|
||||||
local was_tripped = self.tripped
|
local was_tripped = self.tripped
|
||||||
@ -70,6 +121,7 @@ function iss_init(reactor)
|
|||||||
self.tripped = false
|
self.tripped = false
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- if a new trip occured...
|
||||||
if status ~= "ok" then
|
if status ~= "ok" then
|
||||||
log._warning("ISS: reactor SCRAM")
|
log._warning("ISS: reactor SCRAM")
|
||||||
self.tripped = true
|
self.tripped = true
|
||||||
@ -82,6 +134,7 @@ function iss_init(reactor)
|
|||||||
return self.tripped, status, first_trip
|
return self.tripped, status, first_trip
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- report a PLC comms timeout
|
||||||
local trip_timeout = function ()
|
local trip_timeout = function ()
|
||||||
self.tripped = false
|
self.tripped = false
|
||||||
self.trip_cause = "timeout"
|
self.trip_cause = "timeout"
|
||||||
@ -89,12 +142,14 @@ function iss_init(reactor)
|
|||||||
self.reactor.scram()
|
self.reactor.scram()
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- reset the ISS
|
||||||
local reset = function ()
|
local reset = function ()
|
||||||
self.timed_out = false
|
self.timed_out = false
|
||||||
self.tripped = false
|
self.tripped = false
|
||||||
self.trip_cause = ""
|
self.trip_cause = ""
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- get the ISS status
|
||||||
local status = function (named)
|
local status = function (named)
|
||||||
if named then
|
if named then
|
||||||
return {
|
return {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user