Commit 7e69c3ff authored by Georgios Dagkakis's avatar Georgios Dagkakis

failure can be of different types according to how TTF is measured

parent edb0a270
......@@ -34,7 +34,8 @@ from ObjectInterruption import ObjectInterruption
class Failure(ObjectInterruption):
def __init__(self, victim=None, distribution=None, index=0, repairman=None, offshift=False):
def __init__(self, victim=None, distribution=None, index=0, repairman=None, offshift=False,
deteriorationType='constant'):
#Process.__init__(self)
ObjectInterruption.__init__(self,victim)
if distribution:
......@@ -53,6 +54,12 @@ class Failure(ObjectInterruption):
self.type="Failure"
self.id=0
# shows how the time to failure is measured
# 'constant' means it counts not matter the state of the victim
# 'onShift' counts only if the victim is onShift
# 'working' counts only working time
self.deteriorationType=deteriorationType
if(self.distType=="Availability"):
# --------------------------------------------------------------
......@@ -95,10 +102,13 @@ class Failure(ObjectInterruption):
self.victim.expectedDownTime=self.env.now+remainingTimeToFailure
failureNotTriggered=True
if self.deteriorationType=='constant':
yield self.env.timeout(remainingTimeToFailure)
else:
while failureNotTriggered:
timeRestartedCounting=self.env.now
# TODO: can also wait for interruptionStart signal of the victim and check whether the interruption is caused by a shiftScheduler
receivedEvent=yield self.env.timeout(remainingTimeToFailure) | self.victim.interruptionStart #offShift
receivedEvent=yield self.env.timeout(remainingTimeToFailure) | self.victim.interruptionStart
# the failure should receive a signal if there is a shift-off triggered
if self.victim.interruptionStart in receivedEvent:
# TODO: the signal interruptionStart is reset by the time it is received by the victim. not sure if will be still triggered when it is checked here
......@@ -113,7 +123,10 @@ class Failure(ObjectInterruption):
else:
failureNotTriggered=False
# interrupt the victim only if it was not previously interrupted
if not self.victim.interruptionStart.triggered:
self.interruptVictim() # interrupt the victim
self.victim.Up=False
self.victim.timeLastFailure=self.env.now
self.outputTrace("is down")
......@@ -147,6 +160,9 @@ class Failure(ObjectInterruption):
yield self.env.timeout(self.rngTTR.generateNumber()) # wait until the repairing process is over
# add the failure time only if the victim was interrupted by this failure
if self.victim.interruptedBy == 'Failure':
self.victim.totalFailureTime+=self.env.now-failTime
self.reactivateVictim() # since repairing is over, the Machine is reactivated
self.victim.Up=True
......
......@@ -90,7 +90,9 @@ class ShiftScheduler(ObjectInterruption):
yield self.victim.endedLastProcessing
self.victim.endedLastProcessing=self.env.event()
self.interruptVictim() # interrupt processing operations if any
# interrupt the victim only if it was not previously interrupted
if not self.victim.interruptionStart.triggered:
self.interruptVictim() # interrupt the victim
self.victim.onShift=False # get the victim off-shift
self.victim.timeLastShiftEnded=self.env.now
self.outputTrace("is off shift")
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment