Краткое руководство по моделированию на языке GPSS (1049434), страница 6
Текст из файла (страница 6)
Синтаксис. MATCH A
Операнд | Назначение | Значение | Значение по умолчанию |
A | Имя или номер блока MATCH, сопряженного с данным. | Имя / число/ СЧА | Обязательный параметр |
Пример.
PROC1 MATCH PROC2
:
:
:
PROC2 MATCH PROC1
в этом случае два транзакта одного семейства могут пройти через сопряженные блоки MATCH только одновременно.
Останов процесса моделирования
Процедура останова модели включает 3 компонента:
-
счетчик останова
-
занесение начального значения в счетчик останова
-
изменение значения счетчика останова.
Останов моделирования происходит, когда содержимое счетчика останова пронимает значение 0.
Счетчик останова – системный параметр. Работа со счетчиком останова выполняется с помощью оператора START и блока TERMINATE.
Оператор START завершает описание программы моделирования и в параметре А содержит начальное значение счетчика останова.
Изменение содержимого счетчика останова выполняется блоком TERMINATE, содержащим параметр А. При поступлении активного транзакта на блок TERMINATE происходит не только его уничтожение, но и выполняется вычитание из счетчика останова содержимого параметра А блока TERMINATE.
Пример управления окончанием моделирования по числу транзактов:
GENERATE 1000
<сегмент модели>
TERMINATE 1
START 20
Моделирование завершится, когда через сегмент модели пройдет 20 транзактов. Эта величина первоначально задается оператором START и уменьшается каждый раз при входе транзакта в блок TERMINATE. После поступления 20 транзактов на блок TERMINATE счетчик останова станет равным 0 и моделирование завершится.
Пример управления окончанием моделирования по времени:
GENERATE 15,5
<сегмент модели>
TERMINATE
GENERATE 720
TERMINATE 1
START 1
Основной сегмент модели содержит блоки TERMINATE, у которых отсутствует параметр А. Для останова по времени создается отдельный сегмент, содержащий указанные блоки. Моделирование завершится, когда модельное время будет равно 720 единицам модельного времени, поскольку именно в этот момент времени из генератора выйдет первый транзакт, и счетчик останова обнулится.
ПРИЛОЖЕНИЕ
Список дополнительных блоков и расширений
Блоки работы со списками пользователя
Блок LINK
Назначение. Блок помещает активный транзакт в список пользователя.
Синтаксис. LINK A,B[,C]
Операнд | Назначение | Значение | Значение по умолчанию |
A | Список пользователя, в который должен быть помещен входящий в блок транзакт. | Имя, число, СЧА | Обязательный параметр |
B | Дисциплина помещения нового транзакта в список пользователя. | LIFO, FIFO, СЧА транзакта | Обязательный параметр |
C | Имя блока, куда переходит транзакт, если индикатор компоновки списка пользователя находится в выключенном состоянии (сброшен) | Имя, число, СЧА | Нет |
Особенности выполнения.
-
При помещении транзакта в список он удаляется из всех других списков, кроме групп транзактов и списков прерываний.
-
Транзакт остается в списке пользователя до тех пор, пока какой-либо другой транзакт не войдет в блок UNLINK и не считает его из списка.
-
Если в операнде В указано FIFO (первым вошел, первым вышел), транзакты помещаются в конец списка.
-
Если в операнде В указано LIFO (последним вошел, первым вышел), вновь прибывшие транзакты помещаются в начало списка.
-
Если в операнде В не используется LIFO или FIFO, то применяется СЧА транзакта - PR, M1 или Р. Может быть использована косвенная адресация. Если задано PR, транзакты помещаются в список пользователя в приоритетном порядке. Если задан номер параметра, транзакт помещается в список пользователя позади тех транзактов, значение соответствующего параметра которых меньше, чем у входящего транзакта.
-
Если задан операнд С, то используется флаг «Индикатор компоновки». Если индикатор компоновки списка пользователя выключен(сброшен) , блок LINK не поместит транзакт в список . Вместо этого транзакт перейдет к блоку указанному в операнде С, после чего индикатор компоновки будет включен (установлен). Следующие транзакты, входящие в блок LINK, будут помещены в список пользователя. Индикатор компоновки управляется блоками LINK и UNLINK. Он выключается (сбрасывается), когда блок UNLINK определяет, что список пользователя пуст.
Примеры.
1. LINK CHANEL,FIFO
Транзакт, вошедший в блок LINK , будет добавлен в конец очереди с именем CHANEL.
2. LINK CHANNEL,PR,LABEL_CH
Если список пользователя CHANNEL пуст (индикатор компоновки списка пользователя выключен) ,транзакт перейдет к блоку с именем LABEL_CH и индикатор компоновки будет включен. Следующие транзакты, входящие в блок LINK, будут помещены в список пользователя. Индикатор компоновки выключится, когда блок UNLINK определит, что список пользователя пуст.
Блок UNLINK
Назначение. Блок считывает транзакты из списка пользователя.
Синтаксис. UNLINK [X] A,B[,C][,D][,E][,F]
Операнд | Назначение | Значение | Значение по умолчанию |
X | Операция сравнения для операндов D и Е. | Условная операция отношения | E |
A | Список пользователя, из которого будет считан один или несколько транзактов. | Имя, число, СЧА | Обязательный операнд. |
B | Блок, куда переходят считанные транзакты. | Имя, число, СЧА | Обязательный операнд |
C | Максимальное количество транзактов, которые будут считаны | Имя, число, СЧА, ALL | ALL |
D | Определяет условия считывания транзактов из очереди | Имя, число, СЧА, BACK | Нет |
E | Используется совместно с операндом D и X для определения условия считывания транзактов из списка | Имя, число, СЧА | Нет |
F | Нет |
Особенности выполнения.
-
Блок UNLINK считывает транзакты из списка пользователя и направляет их в указанный блок. Транзакты, которые необходимо исключить, можно выбирать, также можно наложить ограничение на количество исключаемых транзактов.
-
Если транзакт входит в блок UNLINK, когда в списке нет транзактов, индикатор компоновки списка пользователя сбрасывается.
-
Можно ограничить число считываемых из списка транзактов с помощью операнда С. Если операнд С опущен, то берется ALL.
-
Если операнды D, Е и условный оператор опущены, исключаются все транзакты с начала списка, пока список не будет исчерпан, или не будет достигнут предел исключаемых транзактов (операнд С).
-
Операнд D может быть булевой переменной, номером параметра или словом «BACK».
Если операнд D является булевой переменной, он вычисляется относительно транзакта, находящегося в списке пользователя, и если результат не нулевой, транзакт исключается.
Если в операнде D указано BACK, транзакты исключаются, начиная с конца списка пользователя, пока не будет достигнут предел.
В противном случае операнд вычисляется относительно транзакта, находящегося в списке пользователя, и используется в качестве номера параметра, значение которого возвращается членом списка пользователя, как конечный результат. Это конечное значение сравнивается с результатом вычисления операнда Е.
Если операнд D задает параметр, а Е не используется, параметр транзакта из списка пользователя сравнивается с таким же параметром активного транзакта. Если они равны, транзакт, находящийся в списке, считывается из списка.
-
Операнд Е используется только в том случае, если используется оператор отношения. В этом случае обязательно требуется операнд D. Список пользователя проверяется, начиная с начала. Если условие, заданное оператором отношения, выполняется для операндов D и Е, исключается каждый транзакт, (вплоть до предела (операнд С)). Если в операнде Е используется СЧА транзакта, он вычисляется относительно активного транзакта.
-
Оператор отношения используется для определения соотношения между атрибутом транзакта (операнд D) и значением операнда Е. Если отношение выполняется, то транзакт считывается из списка. В качестве оператора отношения могут быть использованы Е, G, GE, L, LE или NE. По умолчанию в качестве оператора отношения используется Е (равно).
-
Операнд F используется для определения блока, куда будет направлен входящий транзакт, в случае, если предел исключения транзактов (операнд С) не может быть достигнут, или из списка пользователя не может быть удален ни один транзакт.
Примеры.
1. UNLINK CHANNEL,LABEL_CH,1
Считывается один транзакт из начала списка CHANNEL и он направляется в блок с именем LABEL_CH. Транзакт, вошедший в UNLINK, переходит к следующему блоку.
2. UNLINK BUFFER,FAC_2,1,BACK
Считывается из списка пользователя с именем BUFFER один транзакт с конца списка и он направляется в блок с именем FAC_2.
3. UNLINK E P$BUF,MET_1,ALL,COND,P$COND,MET_2
Считываются из списка пользователя, номер которого записан в параметре BUF вошедшего транзакта, и направляются в блок с именем MET_1 все транзакты, содержимое параметра COND которых равно содержимому одноименного параметра вошедшего транзакта. Если таких транзактов в списке нет, то вошедший транзакт будет направлен в блок с именем MET_2, в противном случае - к следующему блоку.
Приборы с прерыванием
Блок PREEMPT
Назначение. Блок позволяет транзакту, в зависимости от условий, заданных в операндах блока, занять прибор, даже если он занят другим транзактом (абсолютный приоритет).
Синтаксис. PREEMPT A [,B][,C][,D][,E]
Операнд | Назначение | Значение | Значение по умолчанию |
A | имя занимаемого прибора | Имя, число, СЧА | Обязательный операнд |
B | Условия занятия прибора | PR | Режим прерывания |
C | Блок, куда должен перейти прерванный транзакт | Имя, число, СЧА | Нет |
D | Параметр прерванного транзакта, в который записывается оставшееся время, если транзакт удаляется из списка будущих событий | Имя, число, СЧА | Нет |
E | Режим удаления | RE | Нет |
Особенности выполнения.
-
Если прибор находится в состоянии «не готов к использованию», то транзакт помещаются в список задержки прибора в конец своего приоритетного класса.
-
Операнд В задает приоритетный режим (PR) или режим прерывания, если операнд опущен.
-
При работе в приоритетном режиме транзакт, занимающий уже прибор, может быть прерван только транзактом, приоритет которого выше приоритета данного транзакта. Если приоритет входящего транзакта ниже, то он помещается в список задержки в конец своего приоритетного класса.
-
В режиме прерывания, если прибор уже используется, поступивший транзакт помещается в список отложенных прерываний. Транзактам из списка отложенных прерываний право занять прибор предоставляется раньше, чем транзактам из списков прерываний или задержки.
-
Прерванный транзакт теряет управление прибором , но может претендовать на дообслуживание, когда прервавший его транзакт входит в соответствующий блок RETURN(если только не задан операнд Е).
-
Прерванные транзакты помещаются в список прерываний в порядке приоритета.
-
Операнд С задает блок, куда должен попытаться перейти прерванный транзакт в этот же момент модельного времени.
-
Если прерываемый транзакт находится в списке будущих событий(вошел в блоке ADVANCE), то для него выполняются следующие действия:
-
вычисляется остаток времени, в течение которого транзакт должен был находиться в блоке ADVANCE, равный разнице планируемого времени выхода транзакта из блока ADVANCE и текущего значения абсолютного условного времени; Операнд D задает номер параметра прерванного транзакта, куда записывается вычисленный остаток времени. Если такой параметр не существует, то он создается.
-
транзакт удаляется из списка будущих событий;
-
транзакт рассматривается, как находящийся в состоянии прерывания и помещается в список прерывания;
-
счетчик прерываний увеличивается на единицу.
-
Прерываемый транзакт может находиться в списке текущих событий (например, когда блок ADVANCE имеет нулевую задержку). В этом случае удаление транзакта из списка текущих событий и перевод его в состояние прерывания производится не сразу. Сначала устанавливается индикатор состояния прерывания. Транзакт, занимающий прибор, будет обрабатываться интерпретатором как обычно и перейдет в состояние прерывания только тогда, когда оно войдет в блок ADVANCE с ненулевой задержкой.
-
Поле Е задает один из следующих режимов:
- режим удаления(RE). Задание этого режима означает, что прерванный транзакт более не претендует на пользование прибором. Прерванный транзакт пытается войти в блок, заданный полем С (если в поле Е стоит RE, то должно быть указано и поле С). При использовании RE прерванный транзакт не должен входить в блоки RELEASE и RETURN, связанные с прерванным транзактом;
- если режим RE не задан, т.е. поле Е - пусто, то прерванный транзакт по возвращении в список текущих событий будет вновь пытаться занять прибор.
-
Прерванный транзакт “борется” за прибор, даже если он перемещен операндом С (если RE не используется в операнде Е). Если прерванный транзакт все еще “борется” за прибор, то попытка транзакта войти в блок TERMINATE приводит к ошибке. Такой транзакт перед входом в блок TERMINATE должен войти в блок RELEASE или блок RETURN.
-
Транзакт может быть прерван на любом количестве приборов и продолжать циркулировать в модели при выполнении следующих двух условий:
- транзакт вошел в блок ADVANCE с положительным временем;