Анимация
JavaScript


Главная  Библионтека 

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 [ 106 ] 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225

QUEUE и ELEVATOR. Узлы, представляющие деятельность людей, будут находиться в пуле после основной программы.

001 002 003 004 005 006 007 008

МОДЕЛЬ РАБОТЫ ЛНФТА

IN EQU

LLINK1 EQU

RLINK1 EQU

NEXTINST EQU

OUT EQU

LLINK2 EQU

RLINK2 EQU

1:1 2:3 4:5 0:2 1:1 2:3 4:5

Определение полей внутри узлов.

009 * ТАБЛИЦЫ ФИКСИРОВАННОГО РАЗМЕРА И ЗАГОЛОВКИ СПИСКОВ

WAIT

.+2(LLINK1),.

+2(RLINK1)

Заголовок списка WAIT,

где всегда NEXTTIME = 0.

USER1

»-2(LLINK1),»

-2(RLINK1)

Это узел действия Ul,

Сначала только он

находится в списке WAIT.

ELEV1

Этот узел представляет

действия лифта, кроме

действий на шагах Е5 и Е9.

ELEV2

Этот узел представляет

независимые действия

лифта на шаге Е5.

ELEV3

Этот узел представляет

независимые действия

лифта на шаге Е9.

AVAIL

Связь со свободными узлами.

TIME

Текущее время моделирования.

QUEUE

»-3

»-3(LLINK2),»

-3(RLINK2)

Заголовок списка QUEUE [0] .

♦-3(LLINK2)

-3(RLINK2)

Заголовок списка QUEUE [1] .

*-3(LLINK2),.

-3(RLINK2)

Сначала все очереди

♦-3(LLINK2)..

-3(RLINK2)

пусты.

♦-3(LLINK2).»

-3(RLINK2)

Заголовок списка QUEUE [4].

ELEVATOR

»-3

»-3(LLINK2),«

-3(RLINK2)

Заголовок списка ELEVATOR.

"Дополнение" нулями таблицы CALL

[ (см. строки 183-186).

CALL

CALLUPiO], CALLCAR [0], CALLDOWN [0]

CALLUPEl], CALLCARCl], CALLDOWNCI]

CALLUPC2], CALLCAR [2], CALLDOWN [2]

CALLUPC3], CALLCAR [3], CALLDOWN [3]

CALLUPC4], CALLCAR [4], CALLDOWN [4]

"Дополнение" нулями таблицы CALL

(см строки 178-181).

Индикация открытых дверей.

активное состояние.



048 D2

049 D3

CON О CON О

Индикация состояния бездействия. Индикация открытых дверей, активное состояние 1

Следующая часть программы содержит основные подпрограммы и главные управляющие процедуры процесса моделирования. Подпрограммы INSERT и DELETE выполняют типичные манипуляции дважды связанными списками. Они помещают текущий узел в список QUEUE или ELEVATOR либо извлекают его из этих списков. (В программе "текущий узел" С всегда представлен индексным регистром 6.) Для работы со списком WAIT также предусмотрены некоторые подпрограммы. Так, подпрограмма SORTIN помещает текущий узел в список WAIT, сортируя его по полю NEXTTIME. А подпрограмма IMMED вставляет текущий узел в середину списка WAIT. Подпрограмма HOLD помещает текущий узел в список WAIT, причем значение поля NEXTTIME равно текущему времени плюс значение регистра А. Подпрограмма DELETEW удаляет текущий узел из списка WAIT.

Процедура CYCLE является сердцевиной модели управления, поскольку именно она определяет, какое действие будет выполнено дальше (а именно - первый элемент списка WAIT, который, как нам теперь известно, не пуст), и переходит к его выполнению. Существует два особых входа в процедуру CYCLE: во-первых, CYCLE1 устанавливает значение NEXTINST в текущем узле, а во-вторых, HOLDC выполняет то же самое с дополнительным вызовом подпрограммы HOLD. Таким образом, результат выполнения команды "JMP HOLDC" со значением t в регистре А будет заключаться в приостановке действий на t единиц по моделируемой шкале времени с переходом в дальнейшем к следующему адресу.

♦ ПОДПРОГРАММЫ И ПРОЦЕДУРА УПРАВЛЕНИЯ

INSERT

Вставить NODE (C) слева от NODE (rll).

3,1(LLINK2)

rI2 <- LLINK2(rIl).

3,6aLINK2)

LLINK2(C) <- rI2.

3,1(LLINK2)

LLINK2(rIl) Ч- C.

3,2(RLINK2)

RLINK2(rI2) 4- C.

3,6(RLINK2)

RLINK2(C) <- rll.

»

Выйти из подпрограммы.

DELETE

Удалить NODE (С) из списка.

3,6(LLINK2)

Р <- LLINK2(C)

3,6(RLINK2)

Q г- RLINK2(C),

3,2(LLINK2)

LLINK2(Q) <- P.

3,1(RLINK2)

RLINK2(P) <- Q

Выйти из подпрограммы.

IMMED

Вставить NODE (С) в начале списка WAIT.

TIME

Установить NEXTTIME (С) (- TIME.

ENTl

WAIT

Р <- LOC(WAIT)

Вставить NODE (С) справа от NODE(P).

HOLD

TIME

г А <- TIME + г А.

SORTIN

Рассортировать NODE (С) в списке WAIT.

Установить NEXTTIME (С) <-гА.

ENTl

WAIT

Р <- LOC(WAIT)

0.1(LLINKl)

Р <- LLINKl(Р)

CMPA

Сравнить значения в полях NEXTTIME слева направо.



Повторять до тех пор,

пока NEXTTIME (С) > NEXTTIME (Р).

0,1(RLNK1)

Q г- RLINK1 (Р).

0,6(RLINK1)

RLINKKC) <- Q.

0,6(LLINK1)

LLINKKC) <-Р.

0,1(RLINK1)

RLINKKP) •(- С.

0,2(LLINK1)

LLINKl(Q) <- С

Выйти из подпрограммы.

DELETEW

Удалить NODE (С) из списка WAIT.

0,6(LLINK1)

(Такой же код, как в строках 058-063,

0,6(RLINK1)

но LLINK 1 и RLINK 1 используются

0,2(LLINK1)

вместо LLINK2 и RLINK2.)

0.1(RLINK1)

CYCLE1

2,6(NEXTINST)

Установить NEXTINST(C) <- rJ.

CYCLE

HOLDC

2,6(NEXTINST)

Установить NEXTINST (С) <-г J.

HOLD

Вставить NODE (С) в список WAIT с задержкой гА.

CYCLE

WAIT(RLINKl)

Установить текущий узел С <- RLINK 1 (LOC (WAIT)

TIME

TIME NEXTTIME(С).

DELETEW

Удалить NODE (С) из списка WAIT.

Перейти к NEXTINST(C).

Теперь рассмотрим код сопрограммы U. В начале шага U1 текущим узлом С является узел USER1 (см. выше строки 012-014) и указанные в строках 099 и 100 действия повторно помещают человека USER1 в список WAIT так, что следующий человек появится в системе спустя INTERTIME единиц времени. В строках 101-114 создается узел для этого нового человека и записываются этажи входа (IN) и выхода (OUT). Стек AVAIL является односвязным по полю RLINK1 каждого узла. Обратите внимание, что в строках 101-108 действие "С <= AVAIL" вьшолняется с помощью метода POOLMAX, 2.2.3-(7); при этом вряд ли здесь понадобится проверка события переполнения (OVERFLOW), так как общий размер пула (количество людей в данной модели работы лифта в произвольный момент времени) едва ли превышает 10 узлов (40 слов). Возврат узла в стек AVAIL представлен в строках 156-158.

Во всей этой программе индексный регистр 4 равен переменной FLOOR, а индексный регистр 5 положителен, отрицателен или равен нулю в зависимости от текущего состояния, т. е. при выполнении условия STATE = GOINGUP. STATE = GOINGDOWN или STATE = NEUTRAL соответственно. Переменные GALLUP [j], CALLCAR [j] и CALLDOWN[j] занимают соответственно поля (1:1), (3:3) и (5:5) ячеек CALL-1-j".

* СОПРОГРАММА и

Ul. Вход в систему, ожидание следующего человека.

U1 JMP

VALUES

Вычислить IN, OUT, GIVEUPTIME, INTERTIME

INTERTIME

INTERTIME вычисляется подпрограммой VALUES

HOLD

Разместить NODE (С) в списке WAIT

с задержкой INTERTIME.

AVAIL

С <- AVAIL.

Если AVAIL ф Л, совершить переход

POOLMAX(0:2)

INC6

С <- POOLMAX + 4.



0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 [ 106 ] 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225