U2. Получение сигнала и ожидание. Установить гА <- FLOOR.
DECA
FLOOR - IN.
TEMP
Сохранить значение С.
JANZ
Соверпшть пересод, если FLOOR ф IN.
ENT6
ELEVl
Установить С Ч- LOC(ELEVl).
2.6(NEXTINST)
Находится ли лифт на шаге Е6?
DECA
JANZ
ENTA
Если да, перейти к шагу ЕЗ.
2,6(NEXTINST)
DELETEW
Удалить его из списка WAIT
и повторно вставить в начало списка WAIT.
Совершить переход, если D3 = 0.
В противном случае присвоить D1 ненулевое значение.
Установить D3 <- 0.
IMMED
Вставить ELEV1 в начало списка WAIT.
(rll и rI2 изменены.)
DEC2 0.1
rI2 <- OUT - IN.
ENTA
Совершить переход, если лифт направляется вверх.
CALL,1(5:5)
Установить CALLDOWNCIN] <- 1.
CALL.1(1:1)
Установить CALLUPCIN] ч- 1.
Если D2 = 0, вызвать подпрограмму DECISION.
ELEVl+2(NEXTINST)
DECA
Если лифт находится на шаге Е1, вызвать
DECISION
подпрограмму DECISION.
TEMP
из. Вход в очередь.
0.6(IN)
ENTl
QUEUE,1
гП <- LOC(QUEUE[IN]).
INSERT
Вставить NODE (С) с правого конца QUEUE [IN].
GIVEUPTIME
HOLDC
Подождать GIVEUPTIME единиц времени.
0,6(IN)
U4. Откгз от длительного ожидания.
DECA
IN(C) - FLOOR.
JANZ
JANZ
DELETE
AVAIL
0,6(RLINK1)
AVAIL
CYCLE
DELETE
ENTl
ELEVATOR
INSERT
ENTA
з.б(оит)
CALL.2(3:3)
J5NZ
CYCLE
DEC2
ENT5
ENT6
ELEV2
DELETEW
ENTA
FLOOR = IN(C). Cm. упр. 7.
U6. Выход из лисЬта. NODE (С) удаляется
из QUEUE или ELEVATOR. AVAIL <= С.
Продолжить моделирование. U5. Вход в лифт. NODE (С) удаляется из QUEUE.
Вставить его с правой стороны списка ELEVATOR.
Установить CALLCAR [OUT (С)] <- 1. Совершить переход, если STATE ф NEUTRAL rI20UT(C) - FLOOR.
Установить направление движения для STATE Установить С <- L0C(ELEV2). Удалить шаг Е5 из списка WAIT
Повторить шаг Е5 спустя 25 единиц времени.
Код сопрограммы Е представляет собой очень прямолинейную реализацию приведенного выше полуформального описания. Вероятно, наиболее интересная его часть связана с подготовкой независимых действий лифта на шаге ЕЗ и поиском в списках ELEVATOR и QUEUE на шаге Е4.
* СОПРОГРАММА Е
CYCLE1
Установить NEXTINST r- El, перейти к CYCLE.
El. Ожидание вызова. (Никаких действий.)
HOLDC
Е2. Изменение состояния?
CALL+1,4
Движение вверх (GOINGUP).
CALL+2,4
CALL+3,4
CALL+4.4
Есть ли вызовы на верхние этажи
CALL-1.4(3:3)
Если нет, посылали ли пассажиры лифта
CALL-2,4(3:3)
запрос для перехода к нижним этажам?
CALL-3,4(3:3)
CALL-4,4(3:3)
CALL-1,4
Движение вниз GOINGDOWN.
CALL-2.4
Действия те же, что и в строках 178-186.
CALL+4,4(3:3)
ENN5
Изменить направление движения в STATE.
CALL,4
Установить переменные CALL равными нулю.
JANZ
Совершить переход при вызове обратного
направления;
ENT5
в противном случае установить STATE
NEUTRAL.
ENT6 ELEV3
E3. Открытие дверей.
LDA 0,6
Если шаг Е9 уже запланирован,
JANZ DELETEW
удалить его из списка WAIT.
ENTA 300
JMP HOLD
Запланировать шаг Е9 спустя 300 единиц времени.
ENT6 ELEV2
ENTA 76
JMP HOLD
Запланировать шаг Е5 спустя 76 единиц времени.
ST6 D2
Установить D2 не равной нулю.
ST6 DI
Установить D1 не равной нулю.
ENTA 20
ENT6 ELEVl
JMP HOLDC
ENTA 0,4
Е4. Выход из лифта и вход в него.
SLA 4
Ввести значение FLOOR в поле OUT регистра гА.
ENT6 ELEVATOR
С Ч- LOC(ELEVATOR).
LD6 3,6(LLINK2)
C<-LLINK2(C).
CMP6 =ELEVATOR=
Поиск в списке ELEVATOR справа налево.
JE IF
Если С = LOC(ELEVATOR), завершить поиск.
CMPA 3.6(OUT)
Сравнить OUT (С) с FLOOR.
JNE IB
Если они не равны, продолжить поиск;
ENTA U6
в противном случае приготовиться
JMP 2F
к переходу человека к шагу U6.
LD6 QUEUE+3.4(RLINK2)
Установить С <- RLINK2 (LOC (QUEUE [FLOOR])).
CMP6 3,6(RLINK2)
Верно ли, что С = RLINK2(C)?
JE IF
Если верно, то очередь пуста.
JMP DELETEW
Если неверно, отменить шаг U4 для этого человека.
ENTA U5
Подготовиться к замене шага U4 шагом U5.
STA 2,6(NEXTINST)
Установить NEXTINST(C).
JMP IMMED
Поместить человека в начало списка WAIT.
ENTA 25
JMP E4A
Подождать 25 единиц времени и повторить шаг Е4
STZ DI
Установить D1 <- 0.
ST6 D3
Установить D3 не равной нулю.
JMP CYCLE
Вернуться к моделированию других событий.
JMP HOLDC
LDA DI
Е5. Закрытие дверей.
JAZ *+3
Верно ли, что D1 = 0?
ENTA 40
Если неверно, значит, люди все еше входят или выходят.
JMP E5A
Подождать 40 единиц времени и повторить шаг Е5.
STZ D3
Если D1 = 0, установить D3 <- 0.
ENT6 ELEVl
ENTA 20
JMP HOLDC
Подождать 20 единиц времени, затем перейти к шагу Е6.
245 246
J5N *+2
STZ CALL.4(1:3)
Е6. Подготовка к движению. Если STATE ф GOINGDOWN,
J5P *+2
то сбросить значения CALLUP и CALLCAR для этого этажа.