Программирование в GPSS - Управление маршрутами транзактов в моделиВ тех случаях, когда естественный порядок движения транзактов сверху вниз по блокам модели необходимо определенным образом нарушить, можно воспользоваться блоками TRANSFER (переслать), LOOP (повторить) или TEST (проверить). В некоторых частных случаях для этого могут подойти, конечно, и ранее изученные блоки SPLIT и GATE. Блок TRANSFER имеет в общем случае четыре операнда. Операнд A задает режим выполнения блока, операнды В и С являются метками блоков. Наиболее простым является режим безусловного перехода блока TRANSFER. В этом режиме поле A в блоке пустое. Все транзакты переходят к блоку, указанному в поле B. Пример: TRANSFER ,NEXT.
Если в поле A записана десятичная дробь, начинающаяся точкой, то производится случайный выбор между блоками, определенными в полях B и C. Десятичная дробь в поле A задает вероятность перехода к блоку поля С. Например, блоком TRANSFER .370,CCC,BBB
37% всех транзактов будет передано в блок с меткой ВВВ, остальные 63% - в блок ССС. Описанный режим называется статистическим. Если в поле A блока TRANSFER записано мнемоническое обозначение BOTH, то для каждого транзакта, поступающего в этот блок, проверяются два пути. Сначала проверяется возможность перехода к блоку поля В, и, если транзакт не может войти в этот блок, он пытается перейти к блоку поля С. Если транзакт не может войти и в этот блок, он задерживается в блоке TRANSFER и опрос блоков, заданных в полях В и С, повторяется при каждом изменении модельного времени, пока не появляется возможность выхода. Примечание 1. Этот режим выбора может существенно увеличить время обработки модели, т.к., если оба выхода заблокированы, то проверка их состояния производится симулятором очень часто. Примечание 2. Если в блоке TRANSFER поле В, интерпретируемое как адрес блока, пустое, то считается, что оно указывает на блок, следующий за данным блоком TRANSFER. С помощью режима BOTH блока TRANSFER можно промоделировать, например, выбор заявками одного из двух каналов в двухканальной СМО:
TRANSFER BOTH,,SAM ;ВЫБОР СВОБ-ГО КАНАЛА SEIZE 1 ;ЗАНЯТИЕ 1-ГО КАНАЛА . . . SAM SEIZE 2 ;ЗАНЯТИЕ 2-ГО КАНАЛА.
Обобщением режима ВОТН является режим ALL, задаваемый мнемоническим обозначением ALL в поле A блока TRANSFER. Первый из блоков, возможность перехода к которым проверяется, определяется полем В, последний - полем С. В поле D задается индексная константа N. Транзакт проверяет по порядку возможность входа в блоки с номерами В, В+N, В+2N,..., B+MN=C и входит в первый из них, который это разрешает. Если же такой возможности не представляется, проверка повторяется при каждом изменении модельного времени. С помощью режима ALL можно промоделировать, например, выбор заявками одного из трех каналов в трехканальной СМО. Кроме описанных - безусловного, статистического режима, а также режимов ВОТН и ALL возможны еще пять режимов выполнения блока TRANSFER: SIM, PICK, SBR, FN и P. Эти режимы более специальные и могут быть изучены при необходимости с помощью документации и «помощи», имеющихся в составе пакета программ GPSS. Для организации циклического прохождения транзактов по определенному сегменту модели служит блок LOOP. В поле A указывается номер параметра транзакта, а в поле B задается метка какого-нибудь блока. Каждый раз, когда транзакт входит в блок LOOP, значение указанного параметра транзакта уменьшается на 1. Если после этого параметр не равен нулю, транзакт пересылается по заданной метке, в противном случае - к блоку, записанному под данным блоком LOOP. В следующем примере транзакты проходят через блок ADVANCE по 4 раза.
ASSIGN 1,4 ;ЗАНЕСТИ 4 в Р1 WAIT ADVANCE 15,FN$EXP ;ЖДАТЬ LOOP 1,WAIT ;ИДТИ К WAIT при Р1 <> 0.
Заметим, что, поскольку счетчик числа циклов задается в параметре транзакта, то он может у разных транзактов иметь разные начальные значения и, таким образом, число прохождений одного и того же цикла может быть у всех транзактов разным. Необходимо также учитывать, что в случае, когда в LOOP входит транзакт с нулевым или отрицательным значением параметра, указанного в поле A, симулятор выдает сообщение об ошибке и прекращает выполнение модели. Наиболее универсальными возможностями для управления маршрутами сообщений располагает блок TEST. В поле операции этого блока через пробел после слова TEST записывается мнемоническое обозначение одного из шести отношений: L, LE, E, NE, G или GE. В полях A и В записываются обозначения сравниваемых СЧА. Движение транзакта зависит от того, задана ли метка какого-нибудь блока в поле С. Если поле C пустое, то блок TEST выполняется в режиме отказа. В этом случае транзакт будет задерживаться на входе блока TEST при невыполнении указанного отношения между СЧА в полях A и В, или передаваться к следующему после TEST блоку - при выполнении отношения. Например, в следующих блоках транзакт будет задерживаться при невыполнении условий, расшифрованных в комментариях:
TEST E V1,X342 ;ЗНАЧЕНИЯ V1 И Х342 РАВНЫ TEST L S$DD,10 ;СОДЕРЖИМОЕ ПАМЯТИ DD<10 TEST LE Q6,17 ;В 6-й ОЧЕРЕДИ 17 ТРАНЗ-В TEST NE X903,X104 ;Х903№Х104
Если поле C содержит метку блока, то транзакт при невыполнении отношения между операндами A и B будет передан к указанному блоку. При выполнении отношения транзакт перейдет к следующему после TEST блоку. Режим выполнения блока TEST с меткой в поле C называется режимом условного перехода. Например, в следующих блоках транзакты будут передаваться по метке, записанной в поле C, если не выполняются условия, расшифрованные в комментариях:
TEST GE V$A,V$D,OTHER ;V$A V$D TEST L RN1,600,ALTRN ;RN1<600.
В блоке TEST можно в качестве СЧА использовать и булевские переменные, например: TEST E BV$PROV,1 ПРОПУСТИТЬ,ЕСЛИ BV$PROV=1 TEST E BV7,0,ABC ЕСЛИ BV7=1, ИДТИ К АВС.
Применение булевских переменных позволяет проверять в блоке TEST условия произвольной сложности.
|
