В формуле могут использоваться операции сложить +, вычесть -, умножить *, разделить /, разделить по модулю @, найти отношение =, >, <, >=, <=.
Примеры.
11 FVARIABLE XH$1*FN$EXP/XH$2+1
15 VARI XH$6-XH$8
V1 VARIABLE XH$1*(P$1-1)
V2 VARI P$2+FN$NORM
V3 FVAR S$MON*XF$5/10;
V4 FVAR V$V2+3.5; переменная V4 вычисляется как сумма значения переменной V2 и числа 3.5.
5 FVAR FN$EXP*3.14
Примечание.
В приведенных выше примерах имена переменных V1,V2,V3,V4 должны быть объявлены. Переменные в первой, второй и в последней строке не объявляются и задаются номерами 11,15, 5.
РАЗДЕЛ III. СРЕДСТВА ЯЗЫКА, ИМИТИРУЮЩИЕ СТАТИЧЕСКИЕ И ДИНАМИЧЕСКИЕ СВОЙСТВА ТРАНЗАКТОВ ПРИ МОДЕЛИРОВАНИИ ДИСКРЕТНЫХ ПРОЦЕССОВ
Основной структурной единицей языка моделирования в GPSS является блок. Рассмотренные в предыдущей главе 2 блоки имитируют работу объектов – устройств, памяти, очереди, логических ключей и т.д. Для имитационного моделирования дискретных систем необходимо также иметь средства отображения свойств динамических объектов - транзактов, средства имитации параллельных независимых и взаимосвязанных процессов, их синхронизации. Ниже описываются группы таких блоков.
3.1. БЛОКИ, ВЛИЯЮЩИЕ НА ЗНАЧЕНИЯ ПАРАМЕТРОВ ТРАНЗАКТОВ
PRIORITY А [,BUFFER] устанавливает транзакту, входящему в данный блок, значение приоритета A (целое без знака в диапазоне от 0 до 127). Если операнд BUFFER отсутствует, то продолжается обработка текущего транзакта, иначе текущей транзакт помещается в список текущих событий и возобновляется просмотр списка для выбора текущего транзакта с учетом нового значения приоретета.
Примеры.
1. PRIORITY 4
Назначить транзакту приоритет 4 и попытаться продвинуть его по модели в следующий блок.
2. PRIORITY XF$4, BUFFER
Назначить транзакту приоритет, равный значению, хранящемуся в полнословной ячейке 4, поместить транзакт в список текущих событий и возобновить его просмотр.
ASSIGN A,B присваивает в текущем транзакте параметру, номер которого указан в поле А, значение, указанное в поле В; если номер поля сопровождается знаком + или -, то данный блок модифицирует (увеличивает или уменьшает) значение параметра на В.
Примеры.
1. ASSIGN 2,8; P(2):= 8
2. ASSIGN 4+,V$5; P(4):= P(4) + V$5,
INDEX A,B если поле А равно 1, то блок модифицирует значение первого параметра транзакта, вошедшего в данный блок, на величину, задаваемую полем В, если же в поле А записано некоторое другое число, то это число воспринимается как номер параметра транзакта и блок присваивает первому параметру транзакта сумму значения поля В и значения параметра, указанного полем А.
Примеры.
1. INDEX 1,2; P(1):= P(1) + 2
2. INDEX 2, FN$5; где - FN$5 - значение функции номеp 5, выбираемое из таблицы (см. ФУНКЦИИ И ПЕРЕМЕННЫЕ, рис.1).
INCREMENT A,B у величивает значение параметра, номер которого указан в поле А, на величину, указанную в поле В.
DECREMENT A,B у меньшает значение параметра, номер которого указан в поле А, на величину, указанную в поле В.
Примеры.
INCREMENT 5,7; P(5):= P(5) + 7
DECREMENT 5,7; P(5):= P(5) - 7
INCREMENT P$5,FN$7; P(P(5)):= P(P(5)) + FN$7 - здесь в поле А косвенное задание номера параметра транзакта: номер модифицируемого параметра определяется как содержимое пятого параметра транзакта, поступившего в данный блок.
DECREMENT P$5,FN$7; P(P(5)):= P(P(5)) - FN$7
INCREMENT XH$5,V$7; Р(ХН$5):= P(XH$5) + V$7
MARK A записывает текущее значение абсолютного модельного времени в указанный в поле А параметр транзакта; если же параметр не указан, то заменяет значение отметки времени (время создания транзакта) на текущее значение таймера.
USING A,B,C,D,E осуществляет доступ текущего транзакта к параметрам другого транзакта, номер которого указан в поле A. Параметр, номер которого определяется полем B (может иметь суффиксы PB, PF, PH), копируется в ячейку или в параметр, заданный в поле C. Если транзакт, заданный в поле A, не активен, то поле E не определено и требуемый транзакт не является активным, происходит ошибка.
LOCATE A,B,C,D определяет и записывает в параметр текущего транзакта номер блока, в который должен войти транзакт, определенный номером в поле A. Этот номер блока записывается в параметре или в ячейке, которые указаны в полях В и С. В поле В записывается СЧА ячейки или параметра (X, XB, XH, P, PF, PH), а в поле C - номер ячейки или параметра, указанного в поле В. Если требуемый транзакт не активен, то текущий транзакт переходит в альтернативный блок, указанный в поле D. Если поле D не задано и транзакт неактивный, то возникает ошибка.
Пример:
LOCATE XH$TRANS, P, 3, INACT
В параметр 3 текущего транзакта записывается номер следующего блока в который должен войти транзакт, при этом номер блока записан в полусловной ячейке с именем TRANS. Если данный транзакт не активен, то текущий транзакт посылается в блок с меткой INACT.
3.2. БЛОКИ, ОПРЕДЕЛЯЮЩИЕ НАПРАВЛЕНИЕ ПЕРЕМЕЩЕНИЯ
ТРАНЗАКТОВ ПО МОДЕЛИ
TRANSFER A,B,С,D пересылает транзакт в требуемую точку модели, где A - режим передачи, B,C - следующие блоки, D - значение индекса, используемое в режиме ALL.
Возможны такие режимы работы блока, задаваемые полем А:
1. ПРОБЕЛ - транзакт передается в блок, задаваемый полем В (безусловный переход);
2. ЧИСЛО, начинающееся точкой, означающее вероятность перехода в блок С, а дополнение числа до 1 означает вероятность перехода в блок В;
3. ALL - транзакт последовательно пытается перейти в блоки, определяемые значениями B, B+D, B+2D, …, C;
4. BOTH - транзакт последовательно пытается войти сначала в блок В, а затем в блок С до тех пор, пока один из них не станет доступным;
5. FN - поле В является номером функции, и следующий блок определяется суммой значения этой функции и поля С;
6. P - поле В является номером параметра транзакта и следующий блок определяется суммой значения этого параметра и поля С;
7. PICK - следующий блок выбирается с равной вероятностью из блоков с номерами B, B+1,…,C;
8. SBR - режим перехода к программе - номер текущего блока перемещается в параметр, указанный в поле С, а транзакт передается в блок, номер которого указан в поле В.
Примеры.
1. TERANSFER,NEXT; безусловная передача транзакта на блок с меткой NEXT
2. TRANSFER.355, FC1, UST1; передача транзактов с вероятностью 0,645 в блок FC1 и с вероятностью 0.355 в блок UST1.
TEST_r A, B проверяет выполнение определенного условия, задаваемого отношением r между стандартными числовыми атрибутами A и В, т.е. отношением (A r B):
1) если это условие выполняется, то транзакт входит в данный блок TEST и будет пытаться передвигаться в следующий блок;
2) если условие не выполняется, то:
- если указан блок С, то транзакт передается в этот блок С,
- если же С не задан, то транзакт блокируется, т.е. задерживается в предыдущем блоке до снятия условия блокировки.
Отношение r может принимать следующие значения:
E - равно;
NE - не равно;
L - меньше чем;
LE - меньше или равно;
G - больше чем;
GE - больше или равно.
Примеры.
1. TEST_E P$1,2,MET1; если значение первого параметра транзакта равно 2, то транзакт войдет в блок TEST и продолжит движение в следующий блок, иначе транзакт перейдет в блок с меткой MET1.
2. TEST_L FN$4,P$2; если значение функции 4 меньше значения параметра 2 данного транзакта, то транзакт входит в блок TEST, иначе задержится перед этим блоком (заблокируется движение данного транзакта).
GATE_R A,B проверяет значение внутреннего операнда R, являющегося стандартным логическим атрибутом и отражающего состояние устройства, памяти или ключа, номер которого задается полем А. При этом СЛА R может принимать значения:
U -устройство занято;
NU - устройство не занято;
I - устройство прервано;
NI - устройство не прервано;
SF - память заполнена;
SNF - память не заполнена;
SE - память пустая;
SNE - память не пустая;
LR - ключ выключен;
LS - ключ включен;
M - транзакт находится в состоянии синхронизации;
NM - транзакт не находится в состоянии синхронизации.
Примеры.
1. GATE_SF 1; если память номер 1 полна, то транзакт входит в блок GATE, иначе ждет ее заполнения.
2. GATE_NU P$2, МТК; если устройство, номер которого указан параметром 2, не занято, то транзакт входит в блок GATE, иначе он входит в блок с меткой МТК.
LOOP A,B используется для организации в модели циклов, т.е. с его помощью можно предусмотреть многократное прохождение транзактом заданной цепочки блоков. Здесь А - номер параметра, значение которого определяет число циклов; В - блок, на который переходит транзакт, если значение параметра с номером А не равно 0.
Пример.
LOOP 2, VTN; уменьшает значение параметра 2 на 1 и, если параметр 2 не равен 0, то переходит на блок с меткой VTN, иначе - к следующему блоку модели.
3.3. БЛОКИ, ОБЕСПЕЧИВАЮЩИЕ КОПИРОВАНИЕ И СИНХРОНИЗАЦИЮ ПЕРЕМЕЩЕНИЯ ТРАНЗАКТОВ ПО МОДЕЛИ
SPLIT A,B,C,D создает А копий текущего транзакта. Копии входят в блок, указанный в поле В, а текущий транзакт продолжает движение в следующий блок. Номера создаваемых копий транзактов записываются в параметры, номера которых указываются в поле С. Нумерация осуществляется таким образом: порядковый номер исходного транзакта после прохождения блока SPLIT увеличивается на 1, порядковый номер первой копии станет на 1 больше номера исходного транзакта, порядковый номер следующей копии станет на 1 больше порядкового номера предыдущей копии транзакта. В поле D указывается число параметров у транзактов-копий. Если поле D не задано, то число и тип параметров у копий такие же, как и у исходного транзакта.
Примеры.
SPLIT 4, THE
Создает 4 копии транзакта, которые посылаются в блок по метке ТНЕ, а текущий транзакт продолжает движение в следующий блок.
SPLIT 3,P$1,2,4
Создает 3 копии транзакта, которые поступают на блоки, указанные в первом параметре, номера транзактов-копий указываются во втором параметре, каждая копия будет иметь 4 параметра.
ASSEMBLE A объединяет транзакты одного семейства, накапливая и задерживая транзакты, являющиеся членами семейства, до тех пор пока их число не станет равным А. Когда последний транзакт войдет в блок, А-1 транзактов будет удалено из модели, кроме первого, который и продолжит движение.
GATHER A накапливает и задерживает транзакты, являющиеся членами семейства, до тех пор пока их число не станет равным А. Когда последний транзакт войдет в блок, все они одновременно (по времени моделирования) выходят из него в том порядке, в котором поступили.
МАТСН А синхронизирует два транзакта одного семейства: первый транзакт, достигнув блока MATCH, задерживается в нем до тех пор, пока другой транзакт данного семейства не достигнет сопряженного блока MATCH, указанного в поле А. Во время задержки устанавливается индикатор синхронизации. Он сбрасывается, когда транзакт того же семейства входит в соответствующий блок MATCH.
Пример.
АА МАТСН ВВ
……