F • Section 7 - Simulation Control
–
User Interface Forms
– Efficiency
– Monitoring
– User-Defined Distributions
– Interrupting and Suspending Processes
– Exercise 7
• Section 8 - Process Activation
– Externally Activated Processes
– Exercise 8
—————————— CACI Products Company ———————————————————————————— SimScript II.5 —————————————— 7-1
Part 1 - User Interface Forms
—————————— CACI Products Company ———————————————————————————— SimScript II.5 —————————————— 7-2
• In SIMLAB, SELECT PROBLEMD and run the model. Stop when the user interface form appears.
• In order to display user interface forms, first build the form with the SIMDRAW editor and save the form to a graphics.sg2 file with an appropriate name (e.g. “FORMNAME.FRM" ).
• To display the form, load “FORMNAME.FRM" and initialize a pointer variable to its address. i.e.
Define .FORM.PTR as a pointer variable
Show .FORM.PTR with “FORMNAME.FRM"
• Now the variable .FORM.PTR
contains the address of the form displayed on the screen.
—————————— CACI Products Company ———————————————————————————— SimScript II.5 —————————————— 7-3
• To initiate an interaction with a form, use the system function accept.f
• Accept.f requires two arguments
– address of the form (e.g. .FORM.PTR
)
– control routine (e.g. 'FORM.CTRL' )
• Since accept.f
is a function, it returns a text value equal to the last terminating button Reference Name selected by the user in the form. (Note: When the form is built, each field within the form has a Reference Name.)
Define .FIELD.ID as a text variable
.FIELD.ID = accept.f (.FORM.PTR, 'FORM.CTRL')
• The control routine, FORM.CTRL
is called by the function accept.f
, not the user. The control routine may be 0.
—————————— CACI Products Company ———————————————————————————— SimScript II.5 —————————————— 7-4
• To access the values in a form, use the system function dfield.f
• dfield.f
requires two arguments
– Reference Name (e.g. "RUN LENGTH" )
– address of form (e.g. .FORM.PTR
)
• Since dfield.f
is a function, it returns a pointer value equal to the address of the fields within the form.
Define .FIELD.PTR as a pointer variable
.FIELD.PTR = dfield.f("RUN LENGTH", .FORM.PTR)
• Now the pointer, .FIELD.PTR
, can be used as a subscript to gain access to the attributes of the field, "RUN LENGTH" .
—————————— CACI Products Company ———————————————————————————— SimScript II.5 —————————————— 7-5
• To access the field values, use the field attributes: ddval.a
: dtval.a
: dary.a
: numeric value associated with .FIELD.PTR
text value associated with .FIELD.PTR
array pointer associated with .FIELD.PTR
• For example:
.FIELD.PTR = dfield.f("RUN LENGTH", .FORM.PTR)
RUN.LENGTH = ddval.a(.FIELD.PTR) or
RUN.LENGTH = ddval.a(dfield.f("RUN LENGTH", .FORM.PTR))
—————————— CACI Products Company ———————————————————————————— SimScript II.5 —————————————— 7-6
1 Routine INITIALIZE
2
3 Define .FORM as a pointer variable
4 Define .FIELD as a text variable
5
6 '' Display the form and get run data from the user
7
8 Show .FORM with "INPUT.FRM"
9 Let .FIELD = accept.f(.FORM, 'FORM.CTRL')
10
11 '' Create the tug and docks
12
13 Create every TUG(1)
14 Let U.TUG(1) = NBR.TUGS
15 Create every DOCK(1)
16 Let U.DOCK(1) = NBR.DOCKS
17
18 '' Warning elimination
19
20 Let .FIELD = .FIELD
21
22 End ''INITIALIZE
—————————— CACI Products Company ———————————————————————————— SimScript II.5 —————————————— 7-7
1 Routine FORM.CTRL
2
3 Given
4 .FIELD,
5 .FORM
6 Yielding
7 .STATUS
8
9 '' Control routine for the input form
10
11 Define .FORM as a pointer variable
12 Define .FIELD as a text variable
13 Define .STATUS as an integer variable
14
15 Select case .FIELD
16
17 Case "RUN"
18 Let RUN.LENGTH = ddval.a(dfield.f("RUN LENGTH", .FORM))
19 Let NBR.DOCKS = 3
20 Let NBR.TUGS = 1
21 Return
22
23 Case "QUIT"
24 Stop
25
26 Default
27
28 Endselect ''.FIELD
29
30 '' Warning elimination
31 Let .STATUS = .STATUS
32
33 End ''FORM.CTRL
—————————— CACI Products Company ———————————————————————————— SimScript II.5 —————————————— 7-8
Part 2 - Efficiency
—————————— CACI Products Company ———————————————————————————— SimScript II.5 —————————————— 7-9
• An alpha variable is one byte and will never occupy a full computer word. Integers are frequently less than a full word. You can save memory by packing two or more variables in one word. (All of the following code is in the
Preamble)
Every HUMAN has a HMN.NAME, a HMN.AGE and ''0 to 99 a HMN.SEX ''M or F
Every HUMAN has a HMN.NAME, a (HMN.AGE (1/2) and
HMN.SEX (3/4))
—————————— CACI Products Company ———————————————————————————— SimScript II.5 —————————————— 7-10
Every HUMAN has a HMN.NAME, a HMN.AGE (1/2) in word 1 , a HMN.SSN, a HMN.SEX (3/4) in word 1
• Works only for attributes of temporary entities
—————————— CACI Products Company ———————————————————————————— SimScript II.5 —————————————— 7-11
• Some integer values take less than a full byte.
Every NETWORK has a NWK.SEMAPHORE.1, a NWK.SEMAPHORE.2, a NWK.SEMAPHORE.3,
''0 to 1 a NWK.SEMAPHORE.4 and a NWK.NUMBER
''0 to 99
Every NETWORK has a
(NWK.SEMAPHORE.1 (1-1),
NWK.SEMAPHORE.2 (2-2),
NWK.SEMAPHORE.3 (3-3),
NWK.SEMAPHORE.4 (4-4) and
NWK.NUMBER (9-32))
—————————— CACI Products Company ———————————————————————————— SimScript II.5 —————————————— 7-12
• You can pack attributes of permanent entities in a manner similar to that for field packing.
Every AIRPORT has an APT.STATUS (*/4) ''O OR C
—————————— CACI Products Company ———————————————————————————— SimScript II.5 —————————————— 7-13
• Every set definition
– Assigns 3 attributes to the owner
– Assigns 3 attributes to each member
– Copies 7 routines for filing and removing members
• File first (FF)
• File last (FL)
• File before (FB)
• File after (FA)
• Remove first (RF)
• Remove last (RL)
• Remove specific (RS)
—————————— CACI Products Company ———————————————————————————— SimScript II.5 —————————————— 7-14
• Suppose you have a set where you file members, never remove them and always search the set from start to finish -
- a read only FIFO set.
• You don't need the predecessor and membership attributes nor the remove routines. Further, you only need the file last routine.
Every SHIP belongs to a FLEET
Define FLEET as a FIFO set without P and M attributes and without FF, FB, FA and R routines
—————————— CACI Products Company ———————————————————————————— SimScript II.5 —————————————— 7-15
• Suppose a ship can be in a dock waiting line or a tug waiting line but never at the same time.
Every SHIP has a P.DOCK.WAITING.LINE in word 1, a P.TUG.WAITING.LINE in word 1, a S.DOCK.WAITING.LINE in word 2, a S.TUG.WAITING.LINE in word 2, a M.DOCK.WAITING.LINE in word 3, a M.TUG.WAITING.LINE in word 3, belongs to a DOCK.WAITING.LINE and belongs to a TUG.WAITING.LINE
• This makes P.DOCK.WAITING.LINE
and
P.TUG.WAITING.LINE
synonyms or equivalent.
—————————— CACI Products Company ———————————————————————————— SimScript II.5 —————————————— 7-16
Part 3 - Monitoring
—————————— CACI Products Company ———————————————————————————— SimScript II.5 —————————————— 7-17
• When something is about to happen or has just happened,
SIMSCRIPT II.5 can intercept control and pass it to a subroutine that you write. When done, control returns to where it came from.
Accumulate or tally
Graphics
Entities
Variables
• Suppose a communications center keeps a number of circuits in reserve. When the number of waiting messages exceeds a certain level, it brings another circuit up.
—————————— CACI Products Company ———————————————————————————— SimScript II.5 —————————————— 7-18
Preamble
Processes include MESSAGE
After activating MESSAGE call CIRCUIT.CHECKER
End ''Preamble
Routine CIRCUIT.CHECKER
Given
.MSG, ''Pointer to current message
.TIME
''time.a
If N.Q.CIRCUIT(1) > 10
Add 3 to U.CIRCUIT(1)
Endif ''N.Q.CIRCUIT(1)
End ''CIRCUIT.CHECKER
—————————— CACI Products Company ———————————————————————————— SimScript II.5 —————————————— 7-19
• Can use before or after with create or destroy entities activate or cancel processes file or remove from sets
• but not before create or after destroy
• SIMSCRIPT II.5 passes arguments to the routine including the address of the process notice. (See p. 80 in Reference
Manual for details – Page 98 of the acrobat reader)
—————————— CACI Products Company ———————————————————————————— SimScript II.5 —————————————— 7-20
• Can monitor assignment of variables
• Can pass control before getting a value from a variable
Preamble
Define INVENTORY as a real variable monitored on the right
End
– In another routine
Let .CURRENT.INVENTORY = INVENTORY
Right routine INVENTORY
Move to .LOCAL.VARIABLE
<STATEMENTS>
Return with .EXPRESSION
End ''Right routine INVENTORY
—————————— CACI Products Company ———————————————————————————— SimScript II.5 —————————————— 7-21
• Can pass control before receiving a new value
Preamble
Define FLOW.RATE as a real variable monitored on the left
End ''Preamble
– In another routine
Let FLOW.RATE
= 3000
Left routine FLOW.RATE
Enter with .LOCAL.VARIABLE
<STATEMENTS>
Move from .EXPRESSION
End ''Left routine FLOW.RATE
—————————— CACI Products Company ———————————————————————————— SimScript II.5 —————————————— 7-22
Part 4 - User-Defined Distributions
—————————— CACI Products Company ———————————————————————————— SimScript II.5 —————————————— 7-23
Message Priority Probability of Occurrence
3
2
5
4
1
.05
.20
.40
.30
.05
—————————— CACI Products Company ———————————————————————————— SimScript II.5 —————————————— 7-24
• Four steps:
Preamble
The system has a MESSAGE.PRIORITY random step variable
End
Define MESSAGE.PRIORITY as an integer stream 9 variable
– Outside the Preamble
Open unit 10 for input, name = "message.dat"
Use unit 10 for input
Read MESSAGE.PRIORITY
Let .PRIORITY = MESSAGE.PRIORITY
.05 5 .20 4 .40 3 .30 2 .05 1 *
—————————— CACI Products Company ———————————————————————————— SimScript II.5 —————————————— 7-25
f.message.priority
prob.a
ivalue.a
s.message.priority
If MESSAGE.PRIORITY were real ivalue.a would become rvalue.a
Probabilities are stored a cumulative values
Probabilities can safely sum to 1.0 + or - .005
.65
3
.95
2
.05
5
.25
4
1.0
1 random.e
—————————— CACI Products Company ———————————————————————————— SimScript II.5 —————————————— 7-26
1.0
Salary
15,000
20,000
30,000
40,000
50,000
60,000
Probability of Occurrence
0.0
0.10
0.40
0.30
0.15
0.05
0
5 15 25 35 45 55 65
—————————— CACI Products Company ———————————————————————————— SimScript II.5 —————————————— 7-27
• Same four steps:
Preamble
Permanent entities PROFESSION
Every PROFESSION has a SALARY.DISTRIBUTION random linear variable
End
Define SALARY.DISTRIBUTION as a real stream 6 variable
– Outside the Preamble
For each PROFESSION do
Read SALARY.DISTRIBUTION(PROFESSION)
Loop
LET .SALARY = SALARY.DISTRIBUTION(PROFESSION)
.0 15000 .10 20000 .50 30000 .80 40000
.95 50000 1.0 60000 *
—————————— CACI Products Company ———————————————————————————— SimScript II.5 —————————————— 7-28
Part 5 - Interrupting Processes
—————————— CACI Products Company ———————————————————————————— SimScript II.5 —————————————— 7-29
• Sometimes one process wants to interrupt another process
– Cause it to pause
– Preempt a resource
—————————— CACI Products Company ———————————————————————————— SimScript II.5 —————————————— 7-30
Process MESSAGE
For each .OLD.MESSAGE in the MESSAGE.SET
with STATUS(.OLD.MESSAGE) = ..IN.TRANSMISSION do
Compute .MIN.MSG as the minimum(.OLD.MESSAGE) of PRIORITY(.OLD.MESSAGE)
Loop ''each .OLD.MESSAGE in the MESSAGE.SET
If PRIORITY(.MIN.MSG) < PRIORITY(MESSAGE)
Interrupt MESSAGE called .MIN.MSG
Call TRANSMIT.MESSAGE
Resume the MESSAGE called .MIN.MSG
Endif ''PRIORITY(.MIN.MSG) < PRIORITY(MESSAGE)
—————————— CACI Products Company ———————————————————————————— SimScript II.5 —————————————— 7-31
• Interrupt
– The process being interrupted must be in the event set
(work, wait or activate)
– User must be file interrupted process in another set because interrupt will remove the process notice from the event set
– System will change time.a to the time remaining until the next activity
• Let time.a = time.a - time.v
• Resume
– System will reset time.a = time.a + time.v
– Refiles the process notice in the event set
—————————— CACI Products Company ———————————————————————————— SimScript II.5 —————————————— 7-32
If PRIORITY(.MIN.MSG) >= PRIORITY(MESSAGE)
Let STATUS(MESSAGE) = ..WAITING
File MESSAGE in MESSAGE.SET
Suspend
Call TRANSMIT.MESSAGE
Endif ''PRIORITY(.MIN.MSG) >= PRIORITY(MESSAGE)
End ''MESSAGE
• In another routine where suspended messages can be identified:
Reactivate the MESSAGE now
—————————— CACI Products Company ———————————————————————————— SimScript II.5 —————————————— 7-33
• Suspend:
– Process is active
– Process notice is not in event set
– Process notice was filed in a set before suspending itself
– Another process reactivated it -- put it back in event set
—————————— CACI Products Company ———————————————————————————— SimScript II.5 —————————————— 7-34
• Relinquish resources and remove notice from sets
Every MESSAGE has a FUTURE
Interrupt MESSAGE
Let FUTURE(MESSAGE) = ..NONE
Let time.a(MESSAGE) = 0
Resume MESSAGE
If FUTURE(MESSAGE) = ..NONE
Remove MESSAGE from MESSAGE.SET
''Relinquish any resources”
Return
Endif ''FUTURE(MESSAGE) = ..NONE
—————————— CACI Products Company ———————————————————————————— SimScript II.5 —————————————— 7-35
This page is intentionally blank
—————————— CACI Products Company ———————————————————————————— SimScript II.5 —————————————— 7-36
The Communications Center
C:\Program Files\Simscript3\models\MessageG
—————————— CACI Products Company ———————————————————————————— SimScript II.5 —————————————— 7-37
• Project located in MessageG subdirectory
– Messages arrive at a communications center about 15 seconds apart.
– If a circuit is free, the message is sent. If a circuit is not free and if the message priority is flash or immediate, the center will look for a message of lower priority and interrupt it to send the higher priority message. The interrupted message will be retransmitted in its entirety.
– If a message cannot interrupt another message, it waits to be transmitted.
• Modifications
– Make sure you understand how the user interface is set up. Try improving the graphics by modifying the clock
– Why does the graph end at 30 for messages created and interrupted, but not for waiting messages?
—————————— CACI Products Company ———————————————————————————— SimScript II.5 —————————————— 7-38
1 Preamble
2
3 '' The Communications Center Model - CACI Products Company
4 '' Demonstrates the use of Interrupt and Suspend
5 '' Graphics version of program demonstrating trace plot, level meter, clock
6 '' files: MESSAGEG.SRC, MESSAGE.DAT, MENU.FRM,
7 '' MESSAGES.GRF, BUSY.GRF, CLOCK.GRF
8
9 Normally mode is undefined
10
11 The system has a MESSAGE.PRIORITY random step variable
12 Define MESSAGE.PRIORITY as an integer stream 9 variable
13
14 Permanent entities
15 Every COMM.CENTER owns a MESSAGE.SET
16
17 Processes include
18 MESSAGE.GENERATOR
19
20 Every MESSAGE has
21 a PRIORITY,
22 a LENGTH,
23 a STATUS and
24 belongs to a MESSAGE.SET
25
26 Define PRIORITY, STATUS as integer variables
27 Define LENGTH as a real variable
28 Define MESSAGE.SET as a set ranked by high PRIORITY
29
30 Define RUN.LENGTH,
31 NUMBER.BUSY.CIRCUITS,
32 NUMBER.OF.MESSAGES,
33 NUMBER.OF.MESSAGES.INTERRUPTED,
34 TOTAL.NUMBER.OF.CIRCUITS
35 as integer variables
—————————— CACI Products Company ———————————————————————————— SimScript II.5 —————————————— 7-39
36
37 Define CLOCKTIME as a real variable
38
39 Display variables include
40 CLOCKTIME,
41 NUMBER.BUSY.CIRCUITS,
42 NUMBER.OF.MESSAGES,
43 NUMBER.OF.MESSAGES.INTERRUPTED,
44 N.MESSAGE.SET
45
46 Define ..FLASH to mean 5
47 Define ..IMMEDIATE to mean 4
48 Define ..PRIORITY to mean 3
49 Define ..ROUTINE to mean 2
50 Define ..DEFERRED to mean 1
51
52 Define ..IN.TRANSMISSION to mean 1
53 Define ..SUSPENDED to mean 2
54 Define ..INTERRUPTED to mean 3
55
56 Define minutes to mean units
57 Define seconds to mean /60 minutes
58
59 Define ..TEXT.PAUSE to mean Read as / using unit 5
60
61 End ''Preamble
—————————— CACI Products Company ———————————————————————————— SimScript II.5 —————————————— 7-40
1 Main
2
3 Call INITIALIZE
4 Call SET.GRAPHICS
5
6 Activate a MESSAGE.GENERATOR now
7 Start simulation
8 Call REPORT
9 ..TEXT.PAUSE
10
11 End ''Main
1 Routine INITIALIZE
2
3 Open unit 10 for input, name "MESSAGE.DAT"
4 Use unit 10 for input
5 Read MESSAGE.PRIORITY
6
7 Create every COMM.CENTER(1)
8 Let COMM.CENTER = 1
9
10 End ''INITIALIZE
—————————— CACI Products Company ———————————————————————————— SimScript II.5 —————————————— 7-41
1 Routine SET.GRAPHICS
2
3 Define .FORM as a pointer variable
4 Define .FIELD as a text variable
5
6 Show .FORM with "MENU.FRM"
7 Let .FIELD = accept.f(.FORM, 'FORM.CTRL')
8
9 Show CLOCKTIME with "CLOCK.GRF"
10 Show NUMBER.BUSY.CIRCUITS with "BUSY.GRF"
11 Show NUMBER.OF.MESSAGES,
12 N.MESSAGE.SET,
13 NUMBER.OF.MESSAGES.INTERRUPTED
14 with "MESSAGES.GRF"
15
16 Let .FIELD = .FIELD
17
18 Let timesync.v = 'CLOCK.UPDATE'
19 Let timescale.v = 100
20
21 End ''SET.GRAPHICS
1 Routine CLOCK.UPDATE
2 Given
3 .PROPOSED.TIME.V
4 Yielding
5 .NEW.TIME.V
6
7 Define .PROPOSED.TIME.V and
8 .NEW.TIME.V
9 as double variables
10
11 Let .NEW.TIME.V = .PROPOSED.TIME.V
12 Let CLOCKTIME = .PROPOSED.TIME.V
13
14 End ''CLOCK.UPDATE
—————————— CACI Products Company ———————————————————————————— SimScript II.5 —————————————— 7-42
1 Routine FORM.CTRL
2
3 Given
4 .FIELD.ID,
5 .FORM
6 Yielding
7 .STATUS
8
9 Define .FIELD.ID as a text variable
10 Define .FORM as a pointer variable
11 Define .STATUS as an integer variable
12
13 Select case .FIELD.ID
14
15 Case "RUN"
16 Let TOTAL.NUMBER.OF.CIRCUITS = ddval.a(dfield.f("CIRCUITS", .FORM))
17 Let RUN.LENGTH = int.f(ddval.a(dfield.f("RUN LENGTH", .FORM)))
18 Return
19
20 Case "QUIT"
21 Stop
22
23 Default
24
25 Endselect ''.FIELD.ID
26
27 Let .STATUS = .STATUS
28
29 End ''FORM.CTRL
—————————— CACI Products Company ———————————————————————————— SimScript II.5 —————————————— 7-43
1 Process MESSAGE.GENERATOR
2
3 Until time.v >= RUN.LENGTH
4 Do
5
6 Activate a MESSAGE now
7 Let PRIORITY(MESSAGE) = MESSAGE.PRIORITY
8 Let LENGTH(MESSAGE) = uniform.f(.25, 4.0, 1)
9 File MESSAGE in the MESSAGE.SET(COMM.CENTER)
10
11 Add 1 to NUMBER.OF.MESSAGES
12
13 Wait exponential.f(15, 2) seconds
14
15 Loop ''time.v >= RUN.LENGTH
16
17 End ''MESSAGE.GENERATOR
—————————— CACI Products Company ———————————————————————————— SimScript II.5 —————————————— 7-44
1 Process MESSAGE
2
3 Define .MIN.MSG,
4 .OLD.MESSAGE as pointer variables
5
6 If NUMBER.BUSY.CIRCUITS < TOTAL.NUMBER.OF.CIRCUITS
7
8 Call TRANSMIT.MESSAGE
9 Given
10 MESSAGE
11 Else
12
13 For each .OLD.MESSAGE in the MESSAGE.SET(COMM.CENTER)
14 with STATUS(.OLD.MESSAGE) = ..IN.TRANSMISSION
15 Do
16 Compute .MIN.MSG as the minimum(.OLD.MESSAGE) of
PRIORITY(.OLD.MESSAGE)
17 Loop ''each .MSG in the MESSAGE.SET(COMM.CENTER)
18
19 If PRIORITY(MESSAGE) >= ..IMMEDIATE and
20 PRIORITY(.MIN.MSG) < PRIORITY(MESSAGE)
21
22 Let STATUS(.MIN.MSG) = ..INTERRUPTED
23 Interrupt MESSAGE called .MIN.MSG
24 Add 1 to NUMBER.OF.MESSAGES.INTERRUPTED
25 Subtract 1 from NUMBER.BUSY.CIRCUITS
26 Let time.a(.MIN.MSG) = LENGTH(.MIN.MSG)
27 Call TRANSMIT.MESSAGE
28 Given
29 MESSAGE
30 Else
31
32 Let STATUS(MESSAGE) = ..SUSPENDED
33 Suspend
34 Call TRANSMIT.MESSAGE
35 Given
36 MESSAGE
37 Endif
—————————— CACI Products Company ———————————————————————————— SimScript II.5 —————————————— 7-45
38
39 Endif ''NUMBER.BUSY.CIRCUITS < TOTAL.NUMBER.OF.CIRCUITS
40
41 End ''MESSAGE
—————————— CACI Products Company ———————————————————————————— SimScript II.5 —————————————— 7-46
1 Routine TRANSMIT.MESSAGE
2 Given
3 .NEW.MESSAGE
4
5 Define .NUMBER.CIRCUITS as an integer variable
6
7 Define .NEW.MESSAGE,
8 .OLD.MESSAGE as pointer variables
9
10 Add 1 to NUMBER.BUSY.CIRCUITS
11 Let STATUS(.NEW.MESSAGE) = ..IN.TRANSMISSION
12 Wait LENGTH(.NEW.MESSAGE) minutes
13
14 Subtract 1 from NUMBER.BUSY.CIRCUITS
15 Remove .NEW.MESSAGE from the MESSAGE.SET(COMM.CENTER)
16
17 Let .NUMBER.CIRCUITS = NUMBER.BUSY.CIRCUITS
18
—————————— CACI Products Company ———————————————————————————— SimScript II.5 —————————————— 7-47
19 For each .OLD.MESSAGE in the MESSAGE.SET(COMM.CENTER)
20 with STATUS(.OLD.MESSAGE) not equal to ..IN.TRANSMISSION
21 while .NUMBER.CIRCUITS < TOTAL.NUMBER.OF.CIRCUITS do
22
23 Select case STATUS(.OLD.MESSAGE)
24
25 Case ..SUSPENDED
26 Reactivate the MESSAGE called .OLD.MESSAGE now
27
28 Case ..INTERRUPTED
29 Resume the MESSAGE called .OLD.MESSAGE
30 Add 1 to NUMBER.BUSY.CIRCUITS
31 Let STATUS(.OLD.MESSAGE) = ..IN.TRANSMISSION
32
33 Default
34 Endselect ''STATUS(.OLD.MESSAGE)
35 Add 1 to .NUMBER.CIRCUITS
36 Loop ''each .OLD.MESSAGE in the MESSAGE.SET(COMM.CENTER)
37
38 End ''TRANSMIT.MESSAGE
—————————— CACI Products Company ———————————————————————————— SimScript II.5 —————————————— 7-48
1 Routine REPORT
2
3 Print 5 lines with NUMBER.OF.MESSAGES,
4 TOTAL.NUMBER.OF.CIRCUITS,
5 RUN.LENGTH,
6 NUMBER.OF.MESSAGES.INTERRUPTED thus
*** messages were generated for a message center with ** circuits during a period of ** minutes.
*** messages were interrupted.
12
13 End ''REPORT
—————————— CACI Products Company ———————————————————————————— SimScript II.5 —————————————— 7-49
—————————— CACI Products Company ———————————————————————————— SimScript II.5 —————————————— 7-50