Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
dream
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
1
Issues
1
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
nexedi
dream
Commits
a13b5330
Commit
a13b5330
authored
Sep 12, 2014
by
Ioannis Papagiannopoulos
Committed by
Georgios Dagkakis
Nov 03, 2014
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
operation process and genInterruptionActions updated
parent
8339c23e
Changes
1
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
52 additions
and
40 deletions
+52
-40
dream/simulation/Machine.py
dream/simulation/Machine.py
+52
-40
No files found.
dream/simulation/Machine.py
View file @
a13b5330
...
@@ -401,7 +401,6 @@ class Machine(CoreObject):
...
@@ -401,7 +401,6 @@ class Machine(CoreObject):
# wait until the Broker has finished processing
# wait until the Broker has finished processing
self
.
expectedSignals
[
'brokerIsSet'
]
=
1
self
.
expectedSignals
[
'brokerIsSet'
]
=
1
yield
self
.
brokerIsSet
yield
self
.
brokerIsSet
self
.
expectedSignals
[
'brokerIsSet'
]
=
0
transmitter
,
eventTime
=
self
.
brokerIsSet
.
value
transmitter
,
eventTime
=
self
.
brokerIsSet
.
value
assert
transmitter
==
self
.
broker
,
'brokerIsSet is not sent by the stations broker'
assert
transmitter
==
self
.
broker
,
'brokerIsSet is not sent by the stations broker'
assert
eventTime
==
self
.
env
.
now
,
'brokerIsSet is not received on time'
assert
eventTime
==
self
.
env
.
now
,
'brokerIsSet is not received on time'
...
@@ -417,7 +416,6 @@ class Machine(CoreObject):
...
@@ -417,7 +416,6 @@ class Machine(CoreObject):
# wait until the Broker has waited times equal to loadTime (if any)
# wait until the Broker has waited times equal to loadTime (if any)
self
.
expectedSignals
[
'brokerIsSet'
]
=
1
self
.
expectedSignals
[
'brokerIsSet'
]
=
1
yield
self
.
brokerIsSet
yield
self
.
brokerIsSet
self
.
expectedSignals
[
'brokerIsSet'
]
=
0
transmitter
,
eventTime
=
self
.
brokerIsSet
.
value
transmitter
,
eventTime
=
self
.
brokerIsSet
.
value
assert
transmitter
==
self
.
broker
,
'brokerIsSet is not sent by the stations broker'
assert
transmitter
==
self
.
broker
,
'brokerIsSet is not sent by the stations broker'
assert
eventTime
==
self
.
env
.
now
,
'brokerIsSet is not received on time'
assert
eventTime
==
self
.
env
.
now
,
'brokerIsSet is not received on time'
...
@@ -427,10 +425,10 @@ class Machine(CoreObject):
...
@@ -427,10 +425,10 @@ class Machine(CoreObject):
# general process, it can be processing or setup
# general process, it can be processing or setup
#===========================================================================
#===========================================================================
def
operation
(
self
,
type
=
'Processing'
):
def
operation
(
self
,
type
=
'Processing'
):
#
identify the method to get the operation time and initialise the totalOperationTime
#
assert that the type is not None and is one of the already implemented ones
assert
type
!=
None
,
'there must be an operation type defined'
assert
type
!=
None
,
'there must be an operation type defined'
assert
type
in
set
([
'Processing'
,
'Setup'
]),
'the operation type provided is not yet defined'
assert
type
in
set
([
'Processing'
,
'Setup'
]),
'the operation type provided is not yet defined'
# XX
# identify the method to get the operation time and initialise the totalOperationTime
if
type
==
'Setup'
:
if
type
==
'Setup'
:
method
=
'calculateSetupTime'
method
=
'calculateSetupTime'
self
.
totalOperationTime
=
self
.
totalSetupTime
self
.
totalOperationTime
=
self
.
totalSetupTime
...
@@ -441,17 +439,18 @@ class Machine(CoreObject):
...
@@ -441,17 +439,18 @@ class Machine(CoreObject):
try
:
try
:
classMethod
=
getMethodFromName
(
'Dream.'
+
str
(
self
.
__class__
.
__name__
)
+
'.'
+
method
)
classMethod
=
getMethodFromName
(
'Dream.'
+
str
(
self
.
__class__
.
__name__
)
+
'.'
+
method
)
except
:
except
:
# if there is no module name as the self.__class__.__name__
parents
=
self
.
__class__
.
__bases__
parents
=
self
.
__class__
.
__bases__
classMethod
=
getMethodFromName
(
'Dream.'
+
str
(
parents
[
-
1
].
__name__
)
+
'.'
+
method
)
classMethod
=
getMethodFromName
(
'Dream.'
+
str
(
parents
[
-
1
].
__name__
)
+
'.'
+
method
)
# variables dedicated to hold the processing times, the time when the Entity entered,
# variables dedicated to hold the processing times, the time when the Entity entered,
# and the processing time left
# and the processing time left
# XX
# get the operation time, tinMStarts holds the processing time of the machine
self
.
totalOperationTimeInCurrentEntity
=
classMethod
(
self
)
# get the processing time, tinMStarts holds the processing time of the machine
self
.
totalOperationTimeInCurrentEntity
=
classMethod
(
self
)
# XX
# timer to hold the operation time left
self
.
tinM
=
self
.
totalOperationTimeInCurrentEntity
# timer to hold the processing time left
self
.
tinM
=
self
.
totalOperationTimeInCurrentEntity
# variables used to flag any interruptions and the end of the processing
# variables used to flag any interruptions and the end of the processing
self
.
interruption
=
False
self
.
interruption
=
False
# XX
# local variable that is used to check whether the operation is concluded
operationNotFinished
=
True
operationNotFinished
=
True
# if there is a failure that depends on the working time of the Machine
# if there is a failure that depends on the working time of the Machine
# send it the victimStartsProcess signal
# send it the victimStartsProcess signal
...
@@ -459,17 +458,14 @@ class Machine(CoreObject):
...
@@ -459,17 +458,14 @@ class Machine(CoreObject):
if
oi
.
type
==
'Failure'
:
if
oi
.
type
==
'Failure'
:
if
oi
.
deteriorationType
==
'working'
:
if
oi
.
deteriorationType
==
'working'
:
if
oi
.
expectedSignals
[
'victimStartsProcess'
]:
if
oi
.
expectedSignals
[
'victimStartsProcess'
]:
succeedTuple
=
(
self
,
self
.
env
.
now
)
self
.
sendSignal
(
receiver
=
oi
,
signal
=
oi
.
victimStartsProcess
)
oi
.
victimStartsProcess
.
succeed
(
succeedTuple
)
# this loop is repeated until the processing time is expired with no failure
# this loop is repeated until the processing time is expired with no failure
# check when the processingEndedFlag switched to false
# check when the processingEndedFlag switched to false
while
operationNotFinished
:
self
.
expectedSignals
[
'interruptionStart'
]
=
1
self
.
expectedSignals
[
'interruptionStart'
]
=
1
self
.
expectedSignals
[
'preemptQueue'
]
=
1
self
.
expectedSignals
[
'preemptQueue'
]
=
1
# XX
self
.
expectedSignals
[
'processOperatorUnavailable'
]
=
1
while
operationNotFinished
:
# dummy variable to keep track of the time that the operation starts after every interruption
# timeLastOperationStarted : dummy variable to keep track of the time that the processing starts after
# every interruption
# XX
self
.
timeLastOperationStarted
=
self
.
env
.
now
self
.
timeLastOperationStarted
=
self
.
env
.
now
# # if the type is setup then the time to record is timeLastProcessingStarted
# # if the type is setup then the time to record is timeLastProcessingStarted
# if type=='Setup':
# if type=='Setup':
...
@@ -484,13 +480,13 @@ class Machine(CoreObject):
...
@@ -484,13 +480,13 @@ class Machine(CoreObject):
# else (if interrupted()) set interruption flag to true (only if tinM==0),
# else (if interrupted()) set interruption flag to true (only if tinM==0),
# and recalculate the processing time left tinM, passivate while waiting for repair.
# and recalculate the processing time left tinM, passivate while waiting for repair.
# if a preemption has occurred then react accordingly (proceed with getting the critical entity)
# if a preemption has occurred then react accordingly (proceed with getting the critical entity)
# receivedEvent = yield self.env.timeout(self.tinM) | self.interruptionStart | self.preemptQueue
receivedEvent
=
yield
self
.
env
.
any_of
([
self
.
interruptionStart
,
self
.
env
.
timeout
(
self
.
tinM
),
receivedEvent
=
yield
self
.
env
.
any_of
([
self
.
interruptionStart
,
self
.
env
.
timeout
(
self
.
tinM
)
,
self
.
preemptQueue
])
self
.
preemptQueue
,
self
.
processOperatorUnavailable
])
if
self
.
interruptionStart
in
receivedEvent
:
# if a failure occurs while processing the machine is interrupted.
# if a failure occurs while processing the machine is interrupted.
if
self
.
interruptionStart
in
receivedEvent
:
transmitter
,
eventTime
=
self
.
interruptionStart
.
value
transmitter
,
eventTime
=
self
.
interruptionStart
.
value
assert
eventTime
==
self
.
env
.
now
,
'the interruption has not been processed on the time of activation'
assert
eventTime
==
self
.
env
.
now
,
'the interruption has not been processed on the time of activation'
self
.
interruptionStart
=
self
.
env
.
event
()
self
.
interruptionStart
=
self
.
env
.
event
()
# XX
self
.
genInterruptionActions
(
type
)
# execute interruption actions
self
.
genInterruptionActions
(
type
)
# execute interruption actions
#===========================================================
#===========================================================
# # release the operator if there is interruption
# # release the operator if there is interruption
...
@@ -501,14 +497,12 @@ class Machine(CoreObject):
...
@@ -501,14 +497,12 @@ class Machine(CoreObject):
while
1
:
while
1
:
self
.
expectedSignals
[
'interruptionEnd'
]
=
1
self
.
expectedSignals
[
'interruptionEnd'
]
=
1
yield
self
.
interruptionEnd
# interruptionEnd to be triggered by ObjectInterruption
yield
self
.
interruptionEnd
# interruptionEnd to be triggered by ObjectInterruption
self
.
expectedSignals
[
'interruptionEnd'
]
=
0
transmitter
,
eventTime
=
self
.
interruptionEnd
.
value
transmitter
,
eventTime
=
self
.
interruptionEnd
.
value
assert
eventTime
==
self
.
env
.
now
,
'the interruptionEnd was received later than anticipated'
assert
eventTime
==
self
.
env
.
now
,
'the interruptionEnd was received later than anticipated'
self
.
interruptionEnd
=
self
.
env
.
event
()
self
.
interruptionEnd
=
self
.
env
.
event
()
if
self
.
Up
and
self
.
onShift
:
if
self
.
Up
and
self
.
onShift
:
break
break
# XX
self
.
postInterruptionActions
()
# execute interruption actions
self
.
postInterruptionActions
()
#===========================================================
#===========================================================
# # request a resource after the repair
# # request a resource after the repair
#===========================================================
#===========================================================
...
@@ -517,31 +511,49 @@ class Machine(CoreObject):
...
@@ -517,31 +511,49 @@ class Machine(CoreObject):
yield
self
.
env
.
process
(
self
.
request
())
yield
self
.
env
.
process
(
self
.
request
())
self
.
timeWaitForOperatorEnded
=
self
.
env
.
now
self
.
timeWaitForOperatorEnded
=
self
.
env
.
now
self
.
operatorWaitTimeCurrentEntity
+=
self
.
timeWaitForOperatorEnded
-
self
.
timeWaitForOperatorStarted
self
.
operatorWaitTimeCurrentEntity
+=
self
.
timeWaitForOperatorEnded
-
self
.
timeWaitForOperatorStarted
# if the processing operator left
elif
self
.
processOperatorUnavailable
in
receivedEvent
:
transmitter
,
eventTime
=
self
.
processOperatorUnavailable
.
value
assert
self
.
env
.
now
==
eventTime
,
'the operator leaving has not been processed at the time it should'
self
.
processOperatorUnavailable
=
self
.
env
.
event
()
# carry interruption actions
self
.
genInterruptionActions
(
type
)
#===========================================================
# # release the operator
#===========================================================
yield
self
.
env
.
process
(
self
.
release
())
from
Globals
import
G
# append the entity that was stopped to the pending ones
if
G
.
Router
:
G
.
pendingEntities
.
append
(
self
.
currentEntity
)
#===========================================================
# # request a resource after the interruption
#===========================================================
self
.
timeWaitForOperatorStarted
=
self
.
env
.
now
yield
self
.
env
.
process
(
self
.
request
())
self
.
timeWaitForOperatorEnded
=
self
.
env
.
now
self
.
operatorWaitTimeCurrentEntity
+=
self
.
timeWaitForOperatorEnded
-
self
.
timeWaitForOperatorStarted
# carry post interruption actions
self
.
postInterruptionActions
()
# if the station is reactivated by the preempt method
# if the station is reactivated by the preempt method
elif
(
self
.
shouldPreempt
):
elif
(
self
.
shouldPreempt
):
if
(
self
.
preemptQueue
in
receivedEvent
):
if
(
self
.
preemptQueue
in
receivedEvent
):
transmitter
,
eventTime
=
self
.
preemptQueue
.
value
transmitter
,
eventTime
=
self
.
preemptQueue
.
value
assert
eventTime
==
self
.
env
.
now
,
'the preemption must be performed on the time of request'
assert
eventTime
==
self
.
env
.
now
,
'the preemption must be performed on the time of request'
self
.
preemptQueue
=
self
.
env
.
event
()
self
.
preemptQueue
=
self
.
env
.
event
()
# XX
self
.
genInterruptionActions
(
type
)
# execute interruption actions
self
.
genInterruptionActions
(
type
)
# execute interruption actions
#===========================================================
#===========================================================
# # release the operator if there is interruption
# # release the operator if there is interruption
#===========================================================
#===========================================================
if
self
.
shouldYield
(
operationTypes
=
{
"Processing"
:
1
},
methods
=
{
'isOperated'
:
1
}):
if
self
.
shouldYield
(
operationTypes
=
{
"Processing"
:
1
},
methods
=
{
'isOperated'
:
1
}):
yield
self
.
env
.
process
(
self
.
release
())
yield
self
.
env
.
process
(
self
.
release
())
# XX
self
.
postInterruptionActions
()
# execute interruption actions
self
.
postInterruptionActions
()
break
break
# if no interruption occurred the processing in M1 is ended
# if no interruption occurred the processing in M1 is ended
else
:
else
:
# XX
operationNotFinished
=
False
operationNotFinished
=
False
self
.
expectedSignals
[
'interruptionStart'
]
=
0
self
.
expectedSignals
[
'preemptQueue'
]
=
0
# carry on actions that have to take place when an Entity ends its processing
# XX
# self.endOperationActions(type)
# =======================================================================
# =======================================================================
# actions to be carried out when the processing of an Entity ends
# actions to be carried out when the processing of an Entity ends
...
@@ -559,12 +571,8 @@ class Machine(CoreObject):
...
@@ -559,12 +571,8 @@ class Machine(CoreObject):
# if object was blocked add the working time
# if object was blocked add the working time
if
self
.
isBlocked
:
if
self
.
isBlocked
:
self
.
addBlockage
()
self
.
addBlockage
()
# the machine is currently performing nothing
# set isProcessing to False
self
.
isProcessing
=
False
self
.
currentlyPerforming
=
None
self
.
currentlyPerforming
=
None
# set isBlocked to False
self
.
isBlocked
=
False
activeObjectQueue
=
self
.
Res
.
users
activeObjectQueue
=
self
.
Res
.
users
activeEntity
=
activeObjectQueue
[
0
]
activeEntity
=
activeObjectQueue
[
0
]
self
.
printTrace
(
activeEntity
.
name
,
interrupted
=
self
.
objName
)
self
.
printTrace
(
activeEntity
.
name
,
interrupted
=
self
.
objName
)
...
@@ -584,6 +592,10 @@ class Machine(CoreObject):
...
@@ -584,6 +592,10 @@ class Machine(CoreObject):
self
.
interruption
=
True
self
.
interruption
=
True
# start counting the down time at breatTime dummy variable
# start counting the down time at breatTime dummy variable
self
.
breakTime
=
self
.
env
.
now
# dummy variable that the interruption happened
self
.
breakTime
=
self
.
env
.
now
# dummy variable that the interruption happened
# set isProcessing to False
self
.
isProcessing
=
False
# set isBlocked to False
self
.
isBlocked
=
False
#===========================================================================
#===========================================================================
# actions to be performed after an operation (setup or processing)
# actions to be performed after an operation (setup or processing)
...
@@ -593,6 +605,7 @@ class Machine(CoreObject):
...
@@ -593,6 +605,7 @@ class Machine(CoreObject):
activeEntity
=
activeObjectQueue
[
0
]
activeEntity
=
activeObjectQueue
[
0
]
# set isProcessing to False
# set isProcessing to False
self
.
isProcessing
=
False
self
.
isProcessing
=
False
# the machine is currently performing no operation
self
.
currentlyPerforming
=
None
self
.
currentlyPerforming
=
None
# add working time
# add working time
self
.
totalOperationTime
+=
self
.
env
.
now
-
self
.
timeLastOperationStarted
self
.
totalOperationTime
+=
self
.
env
.
now
-
self
.
timeLastOperationStarted
...
@@ -636,8 +649,7 @@ class Machine(CoreObject):
...
@@ -636,8 +649,7 @@ class Machine(CoreObject):
if
oi
.
type
==
'Failure'
:
if
oi
.
type
==
'Failure'
:
if
oi
.
deteriorationType
==
'working'
:
if
oi
.
deteriorationType
==
'working'
:
if
oi
.
expectedSignals
[
'victimEndsProcess'
]:
if
oi
.
expectedSignals
[
'victimEndsProcess'
]:
succeedTuple
=
(
self
,
self
.
env
.
now
)
self
.
sendSignal
(
receiver
=
oi
,
signal
=
oi
.
victimEndsProcess
)
oi
.
victimEndsProcess
.
succeed
(
succeedTuple
)
# in case Machine just performed the last work before the scheduled maintenance signal the corresponding object
# in case Machine just performed the last work before the scheduled maintenance signal the corresponding object
if
self
.
isWorkingOnTheLast
:
if
self
.
isWorkingOnTheLast
:
# for the scheduled Object interruptions
# for the scheduled Object interruptions
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment