Партнерка на США и Канаду по недвижимости, выплаты в крипто

  • 30% recurring commission
  • Выплаты в USDT
  • Вывод каждую неделю
  • Комиссия до 5 лет за каждого referral

- 32 -

4. ПЕРЕМЕННЫЕ

4.1. Общая характеристика переменных

В GPSS/PC существуют два типа вычислительных объектов : пере­менные и функции. Вычислительные объекты широко используются, осо­бенно в качестве аргументов блоков.

При построении модели системы, пользователю возможно понадо­бится задать сложные логические или математические соотношения между атрибутами системы. Для этой цели в программе используются переменные.

В GPSS/PC имеется три типа переменных:

- арифметические переменные;

- арифметические переменные с "плавающей точкой";

- булевские переменные;

4.2. Арифметические переменные

Арифметические переменные представляют собой арифметические сочетания значений различных СЧА, в том числе и других арифметичес­ких переменных аналогично арифметическим выражениям в Фортране. Пе­ременная задается одним оператором, называемым оператором описания переменной (оператор VARIABLE), в нем содержится задаваемое арифме­тическое выражение. Например, следующий оператор описания VARIABLE определяет арифметическую переменную RSLTV:

RSLTV VARIABLE Q$WAITL+3-P7#FN$DSTRB

При любом обращении к переменной RSLTV (употребляется обозна­чение V$RSLTV) её значение вычисляется как текущая длина очереди WAITL плюс константа 3, минус произведение значения параметра 7, обрабатываемого в данный момент сообщения, на значение функции DSTRB.

Значение арифметической переменной может использоваться сле­дующим образом:

1) как аргумент поля блока. В этом случае значение арифмети­ческой переменной может представлять:

НЕ нашли? Не то? Что вы ищете?

- номер объекта j;

- номер объекта j логического атрибута (блок GATE);

- номер параметра сообщения (блоки ASSIGN, INDEX, LOOP, MARK, SPLIT);

- значение атрибута;

2) как аргумент функции;

3) как значение зависимой переменной атрибутивной функции;

4) как аргумент таблицы;

5) как операнд другой арифметической переменной или булевской переменной.

В арифметических переменных используются следующие пять ариф­метических операций:

+ - алгебраическое сложение;

- - алгебраическое вычитание;

# - алгебраическое умножение;

/ - алгебраическое деление; остаток отбрасывается. Сохраня­ется только частное;

@ - деление по модулю;

^ - возведение в степень;

\ - деление нацело.

В выражении переменной может быть задано произвольное число перечисленных выше операций в различных сочетаниях. Знак результата вычислений определяется по обычным алгебраическим правилам. Допус­тимы отрицательные значения переменных Выражения переменных анали­зируются слева направо. Возведение в степень, умножение, деление и деление по модулю выполняются раньше, чем сложение и вычитание. Пе­ред выполнением любой арифметической операции определяется значение каждого элемента, и выделяется его целая часть.

Все операции алгебраические. Постоянные без знака считаются положительными.

Любые стандартные числовые атрибуты, а также библиотечные функции и другие арифметические переменные, могут быть использованы в выражении арифметической переменной. Запрещается только использо­вание самой вычисляемой переменной. В противном случае происходит ошибка выполнения. Нельзя использовать непосредственно переменные со знаком, т. к. знаки в этом случае рассматриваются как знаки ариф­метических операций.

GPSS/PC допускает использование скобок в выражениях арифмети­ческих переменных. Скобки могут быть использованы для группировки членов или для обозначения операции умножения. Выражение переменной может содержать не более пяти пар скобок (не считая скобок, исполь­зуемых при описании матриц ячеек). В выражении, содержащем скобки, прежде всего вычисляется значение группы элементов, ограниченных самой правой из левых скобок. Число правых и левых скобок в выраже­нии должно быть одинаково. Ошибки при использовании обнаруживаются на фазе ввода. Например, выражение

5#FN3+5#V6+5#P11

может быть записано в виде

5#(FN3+V6+P11)

4.3. Формат операторов описания арифметических переменных

Оператор описания арифметической переменной содержит следую­щие три поля:

1) поле метки, содержащее имя переменной , которое будет ис­пользоваться при обращении к этой переменной;

2) поле операции, содержит слово VARIABLE;

3) поле операндов, содержит выражение, в котором содержатся стандартные числовые атрибуты, используемые для вычисления значения переменной.

Пробелы между символами недопустимы. Певый пробел записи счи­тается концом выражения. Для записи выражения, превышающего длину строки, можно ввести второй оператор VARIABLE с именем, отличным от имени первой переменной, и включить значение новой переменной в ка­честве одного из операндов в выражении первой арифметической пере­менной. Например,

VFIX1 VARIABLE Q9+3...V$VFIX2...-V$VFIX3...FNIO

VFIX2 VARIABLE 9+TB13-FN19*Q10

VFIX3 VARIABLE FN$TYPEF+S$POOL*R$RESCS-Q$ENTRY

VFIX1 содержит в качестве элементов переменные VFIX2 и VFIX3. Ниже приводятся примеры операторов описания переменных.

VADD VARIABLE P10+25

При обращении к арифметической переменной VADD её значение вычисляется как сумма значений параметра 10 сообщения, обрабатывае­мого в данный момент, и константы 25.

COMP VARIABLE X*P4/100

При обращении к арифметической переменной COMP значение этой переменной вычисляется как частное от деления значения, записанного в ячейке, номер которой определяется параметром 4 обрабатываемого в данный момент сообщения, на константу 100. Такой прием использу­ется для выделения среднего разряда в числе, записанном в ячейке . Например, пусть в параметре 4 обрабатываемого в данный момент сооб­щения записано число 125. Предположим, что в ячейке 125 хранится некоторое значение aaabcc. При обращении к переменной COMP происхо­дит следующее :

1) определяется значение параметра 4, получается число 125;

2) определяется значение aaabcc, хранимое в ячейке X*P4,т. е. в ячейке 125;

3) значение aaabcc делится на 100, получается aaab.

4.4. Арифметические переменные с плавающей точкой

Арифметические переменные с плавающей точкой аналогичны расс­мотренным выше арифметическим переменным, за исключением того, что все операции над операндами выражений переменных с плавающей точкой выполняются без преобразования операндов и промежуточных результа­тов к целому виду. Лишь окончательный результат вычисления преобра­зуется к целому числу.

4.5. Формат операторов описания арифметических переменных с плавающей точкой

Формат операторов описания арифметических переменных с плава­ющей точкой идентичен описанному выше формату операторов описания арифметических переменных, за исключением того, что в поле операции записывается слово FVARIABLE. Правила написания операторов те же, что и для арифметических переменных. Арифметическая переменная и переменная с плавающей точкой не могут иметь одинаковые номера. Ес­ли они имеют одинаковые номера, то при вычислении используется бо­лее позднее из двух описаний.

Различие результатов, полученных при вычислении переменных с плавающей и фиксированной точками, можно увидеть из приведенного ниже примера. Значение переменной FLOAT будет равно 36, поскольку

константа 10 будет умножена на 3.67, и от результата 36.7 будет

взята целая часть. Переменная FIXED равна 30, поскольку результат

промежуточной операции деления будет округлен до 3.

FLOAT FVARIABLE 10(11/3)

FIXED VARIABLE 10(11/3)

Примечание. Для переменных с плавающей точкой недопустима операция деления по модулю. Только при описании переменных с плава­ющей точкой допускается применение дробных констант. Стандартный числовой атрибут V используется для обращения как к арифметическим переменным, так и к переменным с плавающей точкой. Способ вычисле­ния переменной V определяется оператором описания этой переменной.

4.6. Булевские переменные

Булевские переменные дают возможность принимать решения в за­висимости от состояния и значения многих объектов GPSS, используя для этого только один блок.

Булевские переменные представляют собой логические выражения, составленные из различных стандартных числовых атрибутов, в том числе и других булевских переменных.

Булевские переменные описываются и используются так же, как арифметические переменные. Каждая булевская переменная должна иметь имя или номер, записанные в поле метки. В булевской переменной про­веряется одно или несколько логических условий. Результатом провер­ки является 1, если заданные условия удовлетворяются, и 0, если они не удовлетворяются.

4.7. Операторы, используемые при описании булевских переменных

В булевских переменных допускаются три типа операторов : ло­гические, булевские и операторы отношения.

Логические операторы связаны с объектами оборудования и ис­пользуются для определения состояния этих объектов. Имеются следую­щие логические операторы:

- FVj или Fj равен 1, если устройство j занято или обслужива­ет прерывание, в противном случае - 0;

- FNVj равен 1, если устройство j не занято и не обслуживает прерывание, в противном случае - 0;

- Ij равен 1, если устройство j обслуживает прерывание, в противном случае - 0;

- NIj равен 1, если устройство j не обслуживает прерывание, иначе - 0;

- NUj равен 1, если устройство j не используется, 0 - в про­тивном случае;

- Uj равен 1, если устройство j используется, 0 - в противном случае;

- SFj равен 1, если многоканальное устройство j заполнено, иначе - 0;

- SNFj равен 1, если многоканальное устройство j не заполне­но, иначе - 0;

- SЕj равен 1, если многоканальное устройство j пусто, иначе - 0;

- SNEj равен 1, если многоканальное устройство j не пусто, иначе - 0;

- SVj равен 1, если многоканальное устройство j находится в состоянии использования, 0 - в противном случае;

- SNVj равен 1, если многоканальное устройство j не использу­ется, 0 - в противном случае;

- LRj равен 1, если логический ключ j выключен, иначе - 0;

- LSj равен 1, если логический ключ j включен, иначе - 0;

Например,

FACIL BVARIABLE NI$UNIT

STORE BVARIABLE SF$MANY

Булевская переменная FACIL равна 1, если устройство не обслу­живает прерывание. Усли же устройство обслуживает прерывание, то FACIL равна 0. Булевская переменная STORE равна 1, если память MANY заполнена.

Операторы отношения производят алгебраические сравнения опе­рандов. Операндами могут быть целые константы или стандартные чис­ловые атрибуты. Все операторы отношения записываются в кавычках. Имеются следующие операторы отношений:

- 'G' - больше;

- 'L' - меньше;

- 'E' - равно;

- 'NE' - не равно;

- 'LE' - меньше или равно;

- 'GE' - больше или равно;

Например,

ATEST BVARIABLE V$FIXED'G'5

BTEST BVARIABLE FN3'LE'P4

CTEST BVARIABLE X4'GE'P6

Булевская переменная ATEST равна 1, если переменная FIXED больше 5, в противном случае она равна 0. Булевская переменная BTEST равна 1, если значение функции 3(FN3) меньше или равно значе­нию параметра 4. В противном случае BTEST равна нулю. Булевская пе­ременная CTEST равна 1, если значение ячейки 4 больше или равно значению параметра 6.

Использование атрибутов с плавающей точкой возможно только таким образом, как и в булевской переменной CTEST. Сравнение деся­тичных значений и значений с плавающей точкой недопустимо.

4.8. Булевские операторы

Существуют два булевских оператора. Оператор "OR" соответст­вует оператору "или", оператор "AND" соответствует оператору "и". Оператор "или" проверяет, выполняется ли хотя бы одно из проверяе­мых условий, оператор "и" требует выполнения обоих условий. Напри­мер,

BVAR1 BVARIABLE NI2"OR"SF3

BVAR2 BVARIABLE NI2"AND"SF3

BVAR3 BVARIABLE (V2'G'5)"AND"(FN12"OR"LR7)

BRAV1 равно 1, если выполняется одно из условий. BRAV2 равно 1, только если выполняются два условия. BRAV3 равно 1, если значе­ние переменной 2 больше 5, и устройство 2 не обслуживает прерыва­ние, или если логический ключ 7 выключен. Скобки нужны только для задания определенных булевских соотношений. Например, выражение I3"AND"(I2 "OR" I4) истинно, если устройство 3 и устройство 2 (либо устройство 4) обслуживают прерывание. Выражение I3"AND"I2"OR"I4 ис­тинно, если устройство 4 или устройства 2 и 3 обслуживают прерыва­ния. Скобки следует использовать только в тех случаях, когда они необходимы. Применение лишних скобок приводит к лишним затратам времени и увеличению используемого объема памяти. Если булевская переменная задается одним стандартным числовым атрибутом, как нап­ример,

SNA1 BVARIABLE V $ EQUAT,

то значение этой переменной будет равно 1, если значение СЧА

равно 0; и нулю, если значение СЧА ненулевое.

5. ФУНКЦИИ

5.1. Общая характеристика функций

В GPSS/PC два типа вычислительных объектов: арифметические переменные и функции. В моделях на GPSS/PC значения функций (FNj) - это часто используемые стандартные числовые атрибуты, так как мно­гие взаимоотношения в системах могут быть описаны в терминах функ­циональной зависимости между двумя переменными. Каждая функция GPSS/PC связывает значение аргумента функции, который представляет собой независимую переменную, со значениями зависимой переменной функции (FNj).

Другим важным применением функций является генерация значений случайных чисел. Для таких функций распределения вероятности аргу­ментом является случайное число 0<=RN<1, а значения зависимых пере­менных (FNj) являются случайными элементами переменных в моделях системы.

5.2. Операторы описания функций

Имя функции должно записываться в поле метки оператора описа­ния FUNCTION. Поле А оператора FUNCTION должно содержать аргумент (независимую переменную) функции. Аргументом может быть любой из стандартных числовых атрибутов, за исключением матрицы ячеек; в ка­честве аргумента функции может быть использовано и значение любой другой функции. Если в качестве аргумента функции используется слу­чайное число RNj, то значениями аргумента будут числа, равномерно распределенные в интервале 0<=RNj<1.

Следует отметить, что во всех других случаях использование случайных чисел RNj дает значение в диапазоне 0<=RNj<999. Запись в поле В определяет тип и число точек функции (число пар значений X[i] и Y[i]). Например, в выражении Cn C определяет тип, а n - чис­ло точек функции. Ниже перечислены типы функции и приведена мнемо­ника каждого типа:

- непрерывная числовая - С;

- дискретная числовая - D;

- табличная числовая - L;

- дискретная атрибутивная - E;

- табличная атрибутивная - М.

За каждым оператором описания FUNCTION должны следовать опе­раторы для задания координат (X[i] и Y[i]) функции. Не допускается использование комментариев между оператором описания FUNCTION и операторами, задающими значения функции. Для задания координат мож­но использовать нецелые числа, например:

RLGEX FUNCTION RN1,C5 0,0/.33,.45/.40,1.60/.70,2.75/1.00,3.90

При написании операторов, задающих значения координат функ -

ции, необходимо придерживаться следующих правил:

- запись должна начинаться в позиции 1;

- значения координат X[i] и Y[i] одной точки функции разделя­ются запятой;

- наборы координат разделяются знаком (/);

- координаты X[i] и Y[i], относящиеся к одной точке, должны задаваться одним оператором;

- каждое последующее значение X[i] должно быть больше преды­дущего;

- значения Y[i] не могут быть матрицами ячеек;

- каждая функция должна иметь, по крайней мере, две описанные точки.

Примеры:

ABC FUNCTION P3,D4

0,5/1,1002/3,20/4,25

FUN3 FUNCTION RN7,C4

0,0/5,12/.68,15/1.0,20

ACT FUNCTION Q$ALINE, C16

0,0/5,1/10,2/20,3/30,4/40,5/50,6/.../100,11

110,12/120,13/130,14/140,15

5.3. Непрерывные числовые функции

Когда значение аргумента непрерывной числовой функции попада­ет в интервал между двумя заданными значениями (X[i],X[i+1]), прог­рамма производит линейную интерполяцию для определения значения функции FN, находящегося в интервале между (Y[i],Y[i+1]) Значения Y[i] хранятся в памяти в виде чисел с плавающей точкой. Интерполя­ция производится при помощи арифметики с плавающей точкой с нецелы­ми числами. Однако от конечного результата интерполяции всегда бе­рется целая часть, и значение функции FN всегда является целым числом, за исключением следующих случаев:

- когда функция используется в качестве модификатора в бло­ках ADVANCE, GENERATE, ASSIGN;

- когда функция используется в качестве стандартного числово­го атрибута в операторе описания FVARIABLE;

- когда функция используется в качестве аргумента другой фун­кции;

5.4. Дискретные числовые функции

Дискретные числовые функции Dn задают одно и то же значение функции FN = Y[i] для всех значений аргумента X[i-1] < X <= X[i].

Интерполяция не производится, значение функции берется равным значению в правом конце интервала. Как и для непрерывных функций, значения функции задаются следующим образом:

1) FN=Y[1] - для всех значений аргумента <= X[1];

2) FN=Y[n] - для всех значений аргумента >=X[n].

Нецелые значения функций приводятся к целым путем выделения целой части.

5.5. Табличные числовые функции

Во многих случаях значениями аргумента X[i] являются непре­рывные последовательности целых чисел 1,2,3...n.

Машинное время, необходимое для вычисления значений таких функций, может быть значительно уменьшено, если эти функции описаны как табличные (Ln). В этом случае значения аргумента Х в операто­рах, задающих значения координат функции, программой ввода GPSS/PC не рассматриваются и принимаются равными X[1] = 1,

X[2] = 2,...X[i] = i,...X[n] = n.

Интерпретатор использует аргумент функции для прямого об - ращения к массиву заданных величин функции. Таким образом, не тре­буется последовательный просмотр таблицы, связанной с фукнцией.

Значения Y[i] должны быть записаны в соответствующих полях операторов, задающих значения координат. Для удобства программиста в операторах могут быть записаны значения Х, хотя они никогда не просматриваются. Если значение аргумента выходит за пределы интер­вала (1,n), то выдается сообщение об ошибке на этапе выполнения.

5.6. Дискретные (En) и табличные (Mn) атрибутивные функции

В предыдущих пунктах рассмотрены три типа числовых функций, значениями которых могут быть только числа. Имеется также два типа функций, значениями Y[i] которых могут быть любые СЧА, за исключе­нием матриц ячеек :

1) дискретные атрибутивные функции (En), подобные дискретным числовым функциям (Dn);

2) табличные атрибутивные функции (Mn), подобные табличным числовым функциям (Ln).

Как и в случае дискретных, непрерывных и табличных функ - ций, первым элементом упорядоченной пары точек используемой для за­дания такой функции, является костанта. Вторым же элементом каждой упорядоченной пары является СЧА. Это означает, что каждое значение функции задается при определении функции.

Значением FN дискретной атрибутивной функции для всех значе­ний аргумента X[i-1] < X <= X[i] является значение i-го стандартно­го числового атрибута СЧА[i]. Ниже приводится пример дискретной ат­рибутивной функции:

GETUP FUNCTION P7, E4

9, FR5/10, FR3/11, FR12/12, FR7

Функция GETUP в качестве аргумента использует седьмой пара­метр. Значением функции является коэффициент нагрузки некоторого устройства. Для значений седьмого параметра, равных 9, 10, 11, 12 значение функции равно соответственно коэффициенту нагрузки уст-

ройства номер 5, 3, 12, или 7.

Для аргументов выходящих за границы, интерпретатор GPSS/PC обрабатывает атрибутивно-значимые функции как дискретные. Для функ­ции GETUP, если значение P7 будет меньше 9, значение функции бу-

дет FR5, если P7 > 12 , то значением функции будет FR7.

Рассмотрим еще пример дискретной атрибутивной функции:

MIXED FUNCTION X$CAROL, E4 21, V$RED/25, X35/27, 10/36, Q$QUICK

Аргументом функции является сохраняемая величина. Если значе­ние X$CAROL меньше или равно 21, то функция принимает значение пе­ременной с именем RED; если X$CAROL равно 22, 23, 24 или 25 то зна­чение функции равно X35 и т. д. Из примера видно, что вторые члены упорядоченных пар, определяющих функцию могут быть разнотипными СЧА или константами.

Атрибутивные функции, у которых первые элементы упорядо - ченных пар, определяющих эти функциии, образуют неразрывную после­довательность чисел 1, 2, 3, и т. д. могут быть заданы табличным ти­пом (Mn). Описание таких функций отличается от описания дискретных атрибутивных функций только операндом B(Mn). Выигрыш от применения типа Mn состоит в скорости вычисления функции, сводящегося к прямой выборке значения функции по значению аргумента.

Ниже приводится пример табличной атрибутивной функции:

POINT FUNCTION PR, M5 1, V1/2, P2/3, X7/4, Q4/5, 99

5.7. Использование значений функций

Значения функций используются в программах на GPSS/PC в шести основных случаях:

- как аргументы полей блоков;

- как аргумент другой функции;

- как значение Y[i] атрибутивной функции;

- как аргумент таблицы;

- как операнд арифметической или булевской переменной;

- как среднее значение и/или модификатор в блоках GENERATE и ADVANCE или как модификатор в блоке ASSIGN.

При использовании в качестве аргумента блока значение функции может означать следующее:

- номер объекта;

- номер объекта для логического атрибута (блок GATE);

- номер n=1,2,...255 параметра сообщения (блоки ASSIGN, INDEX, LOOP, MARK и SPLIT);

- значение стандартного числового атрибута FN[j].

5.8. Генерация случайных чисел

В GPSS/PC имеется семь датчиков равномерно распределенных псевдослучайных чисел, обозначаемых RN1 - RN7. Если не используется оператор RMULT, то все датчики генерируют одинаковые последователь­ности чисел. Оператор RMULT позволяет получать разные последова­тельности. Наличие семи независимых датчиков позволяет воспроизво­дить определенные последовательности значений в нескольких прого­нах. Например, для сравнения нескольких вариантов моделируемой сис-

темы при одном входном потоке.

Примечание. Операторы CLEAR и RESET не изменяют значений ин­дексов и множителей датчиков. Способ изменения генерируемых датчика­ми последовательностей рассмотрен при описании оператора RMULT.

. БЛОКИ

6.1. Общая характеристика блоков

Блоки и сообщения - два основных типа объектов, составляющих основу GPSS/PC. Практически все изменения состояния модели происхо­дят в результате входа сообщений в блоки и последующего выполенения интерпретатором подпрограмм, связанных с соответствующими типами блоков.

В результате входа сообщения в блок происходит одно из двух основных изменений состояния:

1) сообщения генерируются или уничтожаются (сообщение - един­ственный тип объектов, присутствующих в модели временно). Блоки, создающие сообщения - GENERATE, SPLIT. Блоки, уничтожающие сообще­ния - TERMINATE, ASSEMBLE;

2) подпрограмма, соответствующая блоку, изменяет значения ат­рибутов одного или нескольких объектов. Это наиболее типичное изме­нение состояния модели. Может произойти изменение следующих атрибу­тов:

- изменение атрибутов вошедшего в блок сообщения. С этим ви­дом изменения состояния связаны блоки GENERATE, TERMINATE, ASSIGN, ADVANCE, TRANSFER, LINK, UNLINK, INDEX, MARK, COUNT, SELECT, LOOP, TEST, GATE, PRIORITY, BUFFER. Такие блоки, как JOIN, REMOVE, EXAMINE, SCAN и ALTER (связанные с объектом "групп") могут повлиять на атрибуты сообщений, которые являются элементами описанной груп­пы;

- изменение атрибутов других сообщений. Такие изменения про­изводятся блоками SPLIT, ASSEMBLE, MATCH, GATHER и TERMINATE, а также блоками SEIZE, RELEASE, PREEMPT, RETURN, ALTER и LOGIC, кото­рые могут повлиять на состояние сообщений, находящихся в списках задержки;

- изменение атрибутов других объектов. В последующих разделах описаны типы блоков, действующих на атрибуты ячеек сохраняемых ве­личин, логических ключей, устройств, многоканальных устройств, оче­редей и таблиц.

Значения счетчика числа задержанных в блоке j сообщений (Wj) и общего числа вошедших в блок сообщений (Nj) для каждого блока также изменяются по мере входа и выхода сообщений из блоков.

6.2. Выполнение подпрограмм, связанных с различными типами блоков

Для всех типов блоков (за исключением блока GENERATE) подп­рограмма начинает выполняться в тот момент, когда сообщение входит в блок. После выполнения подпрограммы сообщение либо сразу же пере­ходит к следующему блоку, либо задерживается из-за того, что не мо­жет в него войти. Определенные условия, задерживающие сообщения, созадют блоки MATCH, ASSEMBLE и GATHER.

Сообщения могут беспрепятственно войти в блок любого типа, кроме TEST, GATE, SIZE, PREEMPT и ENTER, которые при определенных условиях задерживают сообщение на входе. В случае задержки, несмот­ря на то, что сообщение в блок не входит, для него выполняется

большая часть подпрограммы, соответствующей данному блоку.

6.3. Операторы блоков GPSS/PC

Каждый блок задается оператором блока. Некоторые типы блоков требуют задания во вспомогательном поле указателей отношения или логических указателей. Ниже приведен список указателей для каждого типа блоков. В блоке TEST используются следующие указатели отноше­ния:

- 'L' - меньше;

- 'LЕ' - меньше или равно;

- 'G' - больше;

- 'GE' - больше или равно;

- 'E' - равно;

- 'NE' - не равно.

В блоке LOGIC используются следующие логические состояния:

- R - выключить;

- S - включить;

- I - инвертировать (изменить состояние ключа на противопо­ложное).

В блоке GATE используются следующие логические указатели:

- М, NM - условия синхронизации;

- U - устройство занято;

- NU - устройство свободно;

- I - устройство обслуживает прерывание;

- NI - устройство не обслуживает прерывание;

- SF - память заполнена;

- SNF - память не заполнена;

- SE - память пуста;

- SNE - память не пуста;

- LR - логический ключ выключен;

- LS - логический ключ включен;

- SV - память доступна;

- SNV - память недоступна;

- FV - устройство доступно;

- FNV - устройство недоступно.

В блоках COUNT, SELECT, ALTER, REMOVE, SCAN, UNLINK использу­ются следующие указатели отношения: 'L','LE','G','GE','E','NE', MAX(максимум) и MIN(минимум); и следующие логические указатели: SV, SNV, FV, FNV, U, Nu, I, NI, SF, SNF, SE, SNE, LR, LS.

6.4. Стандартные числовые атрибуты блоков

Блоки имеют два стандартных числовых атрибута:

- Wj - текущее число сообщений в блоке j;

- Nj - общее число сообщений, вошедших в блок j с момента последнего действия оператора RESET или CLEAR (или от начала счета, если операторов RESET и CLEAR - нет).

Подсчет Wj и Nj ведется автоматически.

6.5. Повторное описание блоков

Все блоки GPSS/PC могут быть описаны повторно при помощи но­вого оператора описания блока. Блоки MATCH, ASSEMBLE и GATHER могут быть повторно описаны только в том случае, если в момент чтения но­вого оператора описания блока счетчик Wj числа сообщений, находя­щихся в повторно описываемом блоке, равен нулю. Блок ADVANCE может быть повторно описан только в том случае, если на входе в блок нет задержанных сообщений.

Блок GENERATE при повторном описании может быть заменен толь­ко на блок GENERATE, в противном случае печатается сообщение об ошибке, обнаруживаемой программой ввода. Если в текущий момент вре­мени в блоке GENERATE находится сообщение, ожидающее входа в систе­му, то оно возвращается во внутренний список неактивных сообщений, а подпрограмма блока GENERATE подготавливает новое сообщение, ис­пользуя аргументы нового блока GENERATE.

6.6. Блок EXECUTE

Блок EXECUTE имеет следующий формат записи:

EXECUTE <A>

Этот блок позволяет входящему сообщению выполнять операции любого другого блока, не изменяя при этом обычного порядка прохож­дения блоков сообщением (исключения перечислены ниже).

Поле <А> задает номер блока ( альтернативными значениями поля <A> могут быть <имя> - имя блока; <положительное целое число> - но­мер блока; <СЧА> - СЧА, содержащий номер блока; СЧА*<параметр> - косвенная ссылка на номер блока) и при входе сообщения в блок вы­полняются такие же операции, как если бы сообщение вошло в блок с номером j. Затем сообщение переходит к следующему после EXECUTE блоку. Сообщения будут задержаны в блоке EXECUTE, а не в выполняе­мом блоке в следующих случаях:

- если выполняемый блок, указанный в поле А, является блоком ADVANCE с ненулевым временем задержки;

- если выполняемый блок, указанный в поле А, является блоком SEIZE, и если в тот момент времени, когда выполняется блок SEIZE, другое сообщение генерирует прерывание на том же устройстве;

- если выполняемый блок является блоком MATCH, и синхронизи­руемое сообщение в сопряженном блоке MATCH отсутствует;

- если выполняемый блок является блоком ASSEMBLE или GATHER, и заданное число сообщений не набрано.

Например, сообщение, входящее в блок MATCH и задержанное из-за того, что в сопряженном блоке MATCH нет синхронизируемого со­общения, перейдет к следующему блоку только тогда, когда другое со­общение из того же семейства попытается синхронизировать свое прод­вижение с продвижением сообщения, находящегося в блоке EXECUTE (а не в выполняемом блоке MATCH).

Необходимо заметить следующее:

- выполнение блока, который направляет сообщения не к следую­щему по номеру блоку (например, TRANSFER или LOOP с параметром цик­ла, не равным нулю), приводит к тому, что блок EXECUTE изменяет последовательность прохождения блоков сообщением;

- нельзя использовать в качестве выполняемого блока блок GENERATE. В противном случае происходит ошибка выполнения.

. СООБЩЕНИЯ

Как уже было сказано выше, практически все изменения состоя­ния моделей происходят в результате входа сообщений в блоки и пос­ледующего выполнения подпрограмм системы моделирования, связанных с соответствующими типами блоков. В этом разделе описаны различные типы блоков, изменяющие атрибуты и состояние сообщений. Только хо­рошо зная атрибуты сообщений и изменения, происходящие с ними в процессе счета, можно полностью использовать широкие возможности GPSS/PC для построения гибкой модели.

7.1. Стандартные числовые атрибуты сообщений

К атрибутам сообщений обращаются как к стандартным числовым атрибутам. Стандартные числовые атрибуты сообщений описаны в после­дующих пунктах.

7.1.1. Параметры сообщения

Каждое сообщение может иметь параметры. Сообщение может обра­щаться только к своим параметрам. Чтобы обратиться к параметрам других сообщений, необходимо использовать промежуточное средство, например, блок SAVEVALUE. В этом случае значения параметров записы­ваются в ячейки сохраняемых величин. Другой способ обращения к па­раметрам других сообщений - использование групп. Значения парамет­ров могут изменяться блоками ALTER, ASSIGN, COUNT, INDEX, LOOP, MARK, SCAN, SELECT и SPLIT.

7.1.2. Время прохождения сообщением части модели - М1

Стандартный числовой атрибут М1 представляет собой время про­хождения модели сообщением, обрабатываемым в данный момент. Это время вычисляется следующим образом:

_ _ _ _ _ _

| | | | | |

| Время прохож - | | Текущее значе - | | Отметка времени | М1 =| дения сооб - | = | чение абсо - | - | обрабатываемого |

| щением модели | | лютного услов - | | в данный момент |

|_ _| | ного времени | | сообщения |

|_ _| |_ _|

Текущее значение абсолютного условного времени записывается в отметке времени сообщения в двух случаях:

- в момент генерации сообщения в блоке GENERATE;

- в момент входа сообщения в блок MARK с пустым полем А. Следовательно, при помощи стандартного числового атрибута М1

можно измерить время прохождения модели или части модели обрабаты­ваемым в данный момент сообщением. Оно вычисляется как разность между текущим значением абсолютного условного времени и значением условного времени в момент генерации сообщения в блоке GENERATE или как разность между текущим значением абсолютного условного времени в момент, когда обрабатываемое сообщение в последний раз вошло в блок MARK с пустым полем А. Время М1 чаще всего употребляется как аргумент таблиц распределения, поскольку одной из основных характе­ристик функционирования для многих систем является время прохожде­ния сообщения через систему.

Непосредственное обращение ко времени прохождения модели дру­гих сообщений невозможно. Для косвенного обращения нужно записывать значения М1 различных сообщений в ячейки.

7.1.3. Запись времени прохождения в параметре сообщения - MPj

В поле А блока MARK может быть задан номер j параметра сооб­щения. При прохождении сообщения через такой блок MARK, текущее значение абсолютного условного времени записывается в j - м пара­метре сообщения. Впоследствии, при обращении, значение стандартного числового атрибута MPj вычисляется следующим образом:

_ _ _ _ _ _

| | | | | |

|Время прохож - | |Текущее значе - | |Значение j-го |

МPj =|дения, запи - | = |чение абсо - | - |параметра об - |

|санное в па - | |лютного услов - | |рабатываемого |

|раметре | |ного времени | |в настоящий |

|_ _| |_ _| |момент |

|сообщения |

|_ _|

7.1.4. Приоритет сообщения - PR

Каждое сообщение GPSS/PC имеет уровень приоритета, присваива­емый ему в момент создания. Значение приоритета (0-127) присваива­ется в блоке GENERATE или SPLIT и может изменяться блоком PRIORITY. При обращении к стандартному числовому атрибуту PR получают значе­ние приоритета сообщения, обрабатываемого в данный момент.

7.2. Логические атрибуты сообщения

Имеются два стандартных логических атрибута сообщений, значе­ния которых используются в блоках GATE M и GATE NM для управления потоками сообщений:

- атрибут М (синхронизация ) имеет значение "истина", если другое сообщение, принадлежащее к тому же семейству, что и сообще­ние, вошедшее в блок GATE M, находится в состоянии синхронизации в блоке с номером j. Таким блоком могут быть блоки MATCH, ASSEMBLE или GATHER;

- атрибут NM (синхронизации нет ) имеет значение "истина",

если в семействе, к которому принадлежит сообщение, обрабатываемое

в блоке GATE NM, нет других сообщений, которые находятся в состоя­нии синхронизации в блоке с номером j. К таким блокам относятся блоки MATCH, ASSEMBLE, GATHER.

7.3. Атрибуты сообщений, связанных с мультипликаций

В GPSS/PC имеется возможность имитации перемещения движущихся объектов в пространстве. Точки остановок движущихся объектов назы­ваются позициями. Средства мультипликации GPSS/PC позволяют визу­ально отслеживать на дисплее процесс имитации. Для этого использу­ется так называемое "позиционное окно" (POSITION WINDOW) системы.

Движущиеся по позициям объекты представляются в модели с по­мощью сообщений. Для реализации мультипликации, сообщения могут иметь специальные параметры с именами COLOR (цвет), SHAPE (форма объекта), исходная позиция (ROW - строка, COLUMN - столбец), конеч­ная позиция (TO-ROW, TO-COLUMN). Исходная и конечная позиция - коор­дитаты практически неограниченного поля, могут принимать положи­тельные нулевые и отрицательные значения. Координата(0,0) центр по­ля.

В позиционном окне может быть отображена любая часть этого поля, что позволяет следить за несколькими, даже не связанными меж­ду собой моделями динамических систем.

. БЛОКИ, ОРИЕНТИРОВАННЫЕ НА СООБЩЕНИЯ

Практически все изменения состояния в моделях GPSS/PC проис­ходят в результате входа сообщений в блоки и выполнения подпрог­рамм, связанных с этими блоками. В данном разделе описываются сле­дующие типы блоков: GENERATE, TERMINATE, ADVANCE, ASSIGN, INDEX, MARK, COUNT, SELECT, PRIORITY и BUFFER.

8.1. Блок GENERATE

Блок GENERATE является источником потока сообщений в модели. В данном блоке производится подготовка сообщений и запуск их в мо­дель через интервалы времени, заданные пользователем. Кроме задания правильной временной последовательности, пользователь может в блоке GENERATE задать некоторую информацию об атрибутах сообщений.

Блок GENERATE имеет следующий формат записи:

GENERATE [<A>],[<B>],[<C>],[<D>],[<E>]

В поле А указывается время, которое определяет интервал между моментами генерации сообщений блоком GENERATE. Операнд А может быть именем, положительным целым числом или непосредственно СЧА. Нельзя использовать в качестве операнда параметры сообщения.

В поле В задается модификатор, который изменяет значения ин­тервала генерации сообщений по сравнению с интервалом, указанным в поле А. Операнд В может быть именем, положительным целым числом или непосредственно СЧА. Нельзя использовать в качестве операнда пара­метры сообщения.

Может быть два типа модификаторов:

- модификатор - интервал;

- модификатор - функция.

С помощью модификатора-интервала задается равномерный закон распределения времени между генерацией сообщений. При вычислении разницы значений, заданных в полях А и В, получается нижняя граница интервала, а при вычислении суммы - верхняя граница. После генера­ции очередного сообщения выбирается число из полученного интервала, и это будет значение времени, через которое следующее сообщение выйдет из блока GENERATE.

Например:

GENERATE 25, 10

В этом случае генерация сообщений производится по равномерно­му закону из интервала - (15,35).

Более сложные распределения могут быть представлены при ис­пользовании модификатора-функции, под действием которого вычислен­ное значение аргумента поля А умножается на значение функции, за­данной в поле В. От значения функции целая часть не берется; отбра­сывание дробной части производится только после умножения его на среднее значение.

Следует обратить внимание на то, что сообщения генерируются с заданными интервалами только в том случае, если у блоков, следующих за блоком GENERATE (например, GATE, TEST, SEIZE, PREEMPT или

ENTER), не выставлены блокирующие условия. Каждое последующее сооб­щение формируется только тогда, когда сообщение из блока GENERATE входит в следующий блок. Формирование последующих сообщений включа­ет вычисление интервала времени, в течение которого подготовленное сообщение остается в блоке GENERATE. Вычисленное значение при сло­жении со значением абсолютного условного времени дает значение вре­мени, при котором сообщение войдет в модель.

Из-за возможных воздействий на модель при изменении заданного интервала генерации сообщений нежелательно, чтобы после блока GENERATE следовал блок, создающий блокирующее условие.

Если первый из вычисленных интервалов между моментами генера­ции сообщений равен 0, то этот интервал принимается равным 1. Если поля А и В пустые, что указывает на нулевой интервал между момента­ми генерации собщений, то блок GENERATE будет генерировать сообще­ния до тех пор, пока не использует все сообщения, которые могут быть активными в какой-то определенный момент времени. Чтобы пре­дупредить это, следует либо задать предел генерации (поле D), либо за блоком GENERATE должен следовать блок, который вызывает блокиру­ющее условие.

В поле С задается начальная задержка. Начальная задержка от­носится к моменту формирования первого сообщения в блоке GENERATE как при первом просчете модели, так и после выполнения операции CLEAR. Начальная задержка - это момент времени, в который первое сгенерированное сообщение должно выйти из блока GENERATE; поля А и В на задержку сообщения влияния не имеют. Начальная задержка может быть меньше, равна или больше среднего времени, заданного в поле А. Операнд С может быть именем, положительным целым числом или непос­редственно СЧА. Нельзя использовать в качестве операнда параметры сообщения.

В поле D задается предел генерации. Эта величина представляет собой максимальное число сообщений, которое будет создано в блоке GENERATE. Операнд D может быть именем, положительным целым числом или непосредственно СЧА. Нельзя использовать в качестве операнда параметры сообщения. Если поле D пусто, блок генерирует неограни­ченное число сообщений. Предел генерации инициализируется повторно операцией CLEAR.

Поле Е определяет приоритет сообщений. Операнд Е может быть именем, положительным целым числом или непосредственно СЧА. Нельзя использовать в качестве операнда параметры сообщения. Если поле Е не задано, приоритет по умолчанию равен 0.

В начальный момент времени в каждом блоке GENERATE произво­дится подготовка к выходу одного сообщения. На этой стадии модель еще полностью не инициализирована для выполнения. По этой причине все СЧА, описанные в блоке GENERATE, должны быть уже определены. В модели блоку GENERATE должны предшествовать операторы описания INITIAL, FUNCTION и VARIABLE. Это делается для того, чтобы СЧА в блоке GENERATE, который ссылается на них, давали желаемые результа­ты.

Когда сообщение покидает блок GENERATE, счетчик общего числа прошедших через блок сообщений (Nj) увеличивается на единицу. Так как последующее сообщение не генерируется до тех пор, пока предыду­щее сообщение не покидает блок GENERATE, то содержимое счетчика те­кущего числа находящихся в блоке сообщений (Wj) никогда не превыша­ет 1.

При повторном описании блока GENERATE при помощи нового опе­ратора описания блока интерпретатор GPSS просматривает все находя­щиеся в данный момент модели сообщения и проверяет, есть ли среди

них сообщения, связанные с повторно описываемым блоком GENERATE

(таких сообщений может и не быть, если данный блок уже создал за­данное число сообщений). Эти сообщения, если они есть, уничтожают­ся. Операнды нового блока GENERATE заменяют операнды предыдущего блока GENERATE и затем создается новое сообщение, используя специ­фикации нового блока.

При использовании блока GENERATE необходимо помнить, что со­общение не должно входить в блок GENERATE. Если сообщение пытается это сделать, возникает ошибка выполнения.

Оператор CLEAR удаляет из модели GPSS все сообщения, в том числе и те, которые связаны с блоками GENERATE. После завершения действия оператора CLEAR, сообщения генерируются в каждом блоке GENERATE, как если бы команда GENERATE встретилась в первый раз. Всем СЧА придаются новые значения, и начальная задержка снова воз­действует на первое генерируемое сообщение. Предел генерации вновь устанавливается равным значению, полученному при повторном задании значений СЧА.

Если в операторе описания блока GENERATE в поле D было задано максимальное число генерируемых блоком сообщений, и заданное число сообщений уже вышло из этого блока, т. е. блок уже закончил работу, то в процессе моделирования этот блок может быть снова запущен только в одном из двух случаев:

1) выполнены операции, заданные оператором CLEAR, и произво­дится повторный запуск всех блоков GENERATE;

2) блок GENERATE описан повторно.

8.2. Блок TERMINATE

Блок TERMINATE имеет следующий формат записи:

TERMINATE [<A>]

Блок TERMINATE удаляет из модели входящие сообщения.

В поле А задается число единиц, на которое этот блок изменяет содержимое счетчика завершений, определяющего момент окончания мо­делирования. Операнд А может быть именем, положительным целым чис­лом, СЧА или СЧА*<параметр>. По умолчанию значение, определяемое полем А, равно 0. Если поле А пусто, то сообщение уничтожается, а содержимое счетчика не изменяется.

Когда пользователь подготавливает модель, он задает время счета, указывая в операторе START значение счетчика завершений. Поскольку различные пути сообщений в модели имеют различные смысло­вые значения, каждый блок TERMINATE может либо уменьшать, либо не уменьшать содержимое счетчика завершений. Если содержимое счетчика уменьшилось до 0, счет завершается.

Расмотрим пример, в котором показывается возможность управле­ния временем моделирования.

1000

TERMINATE 1

START 5

...............

START 20

В этом примере отсутствует сама модель, а приведен только сегмент управления временем моделирования.

Каждое сообщение, входящее в блок TERMINATE, будет уменьшать содержимое счетчика на единицу. Предположим, что все остальные бло­ки TERMINATE в модели имеют пустые поля А, что означает, что содер­жимое счетчика не уменьшается. Тогда программа будет считать до тех пор, пока условное время не станет равным 5000, поскольку в первой карте START начальное содержимое счетчика задано равным 5. Посколь­ку блок GENERATE генерирует по одному сообщению через каждые 1000 единиц условного времени, пятое сообщение войдет в блок TERMINATE в момент, когда условное время будет равно 5000. Во второй команде START начальное значение счетчика задано равным 20, поэтому второй прогон будет продолжаться в течение 20000 единиц условного времени.

Каждый раз, когда сообщение входит в блок TERMINATE, общее число сообщений, вошедших в блок TERMINATE (Nj), увеличивается на единицу. Число сообщений, находящихся в данный момент времени в блоке TERMINATE, всегда равно нулю, т. е. Wj = 0.

Стандартным числовым атрибутом, связанным с описываемым опе­ратором, является TG1 - число, равное текущему значению счетчика завершений. TG1 возвращает содержимое счетчика завершений, которое уменьшается блоком TERMINATE при заданном операнде А. Эта величина первоначально задается оператором START и указывает на завершение моделирования, когда становится равной 0.

8.3. Блок ADVANCE

Блок ADVANCE имеет следующий формат записи:

ADVANCE <A>,[<B>]

Блок ADVANCE задерживает продвижение сообщения на заданный период времени. В поле А задается среднее время пребывания сообще­ния в блоке ADVANCE. Содержимое поля А может быть именем, любым це­лым числом, в том числе и 0, СЧА или СЧА*<параметр>. Если время за­держки pавно 0, сообщение помещается в список текущих событий перед сообщениями с таким же приоритетом. Сообщения с положительным вре­менем задержки помещаются в список будущих событий.

В поле В указывается способ модификации среднего значения, заданного в поле А. Операнд В может быть именем, положительным це­лым числом, СЧА или СЧА*<параметр>.

Может быть два типа модификаторов:

- модификатор-интервал;

- модификатор-функция.

Интервал изменения среднего времени задержки может быть задан константой, значение которой не должно превосходить среднего време­ни задержки, вычисленного для данного сообщения. Эта константа оп­ределяет интервал, в котором времена задержки распределены равно­мерно. Все времена задержки выражаются целыми числами. Любое из (2В+1) целых чисел, заключенных в интервале (А-В, А+В), будет выби-

раться с вероятностью 1/(2B+1).

Например, если среднее время задано равным 10, а константа, определяющая интервал изменения, равна 5, то время задержки сообще­ния в блоке изменяется от 5 до 15. Для каждого из входящих в блок ADVANCE сообщений выбирается только одно из возможных значений вре­мени задержки. Любое целое число из интервала (5-15), включая гра­ницы 5 и 15, будет выбираться с вероятностью 1/11. Дробные значения времени задержки не допускаются, поскольку условное время интерпре­татора принимает только целые значения. Константа, определяющая ин­тервал времени задержки, не должна превосходить среднего времени задержки, в противном случае может быть получено отрицательное вре­мя задержки в блоке ADVANCE. Отрицательное значение задержки всегда считается ошибкой.

Если в поле В записан модификатор-функция, то вычисленное значение атрибута, заданного в поле А, умножается на значение функ­ции, заданной в поле В. Результат округляется до целого значения и используется как время задержки.

8.3.1. Операции блока ADVANCE

После того, как сообщение вошло в блок ADVANCE и было включе­но в список будущих событий, другое сообщение может войти в блок PREEMPT и генерировать прерывание на устройстве, занятом сообщени­ем, находящимся в блоке ADVANCE. Для сообщения, находящегося в бло­ке ADVANCE, возможны два варианта:

1) генерированное другим сообщением прерывание является для данного сообщения первым;

2) данное сообщение уже было прервано на каком-либо из заня­тых им устройств.

В первом случае происходит следующее:

1) остаток времени, в течение которого сообщение должно было находиться в блоке ADVANCE, равен разнице вычисленного времени вы­хода сообщения из блока ADVANCE и текущего значения абсолютного ус­ловного времени;

2) сообщение удаляется из списка будущих событий;

3) сообщение рассматривается, как находящееся в состоянии прерывания;

4) указывается, что сообщение находится в списке прерывания;

5) счетчик прерываний устанавливается в единицу.

Находящееся в блоке ADVANCE сообщение, которое уже было прер­вано на одном из устройств и переведено в состояние прерывания, мо­жет быть прервано еще на 255 занятых им устройствах. Счетчик преры­вания увеличивается на единицу при каждом новом прерывании.

Сообщение, занимающее блок ADVANCE и некоторое устройство, может находиться в списке текущих событий (например, когда блок ADVANCE имеет нулевую задержку). Обслуживание этого сообщения также может быть прервано другим сообщением. В этом случае удаление зани­мающего устройство сообщения из списка текущих событий и перевод его в состояние прерывания производится не сразу. Сначала устанав­ливается индикатор состояния прерывания. Сообщение, занимающее уст­ройство, будет обрабатываться интерпретатором как обычно и перейдет в состояние прерывания только тогда, когда оно войдет в блок ADVANCE с ненулевой задержкой.

Когда прерываемое сообщение входит в блок ADVANCE выполняются следующие операции:

1) записывается отличное от нуля время задержки в блоке ADVANCE. Время пребывания сообщения в блоке ADVANCE будет отсчиты­ваться с момента, когда значение счетчика прерываний этого сообще­ния станет равным нулю. В этот момент сообщение будет включено в список будущих событий;

2) индикатор состояния прерывания устанавливается в единицу;

3) сообщение удаляется из списка текущих событий;

4) сообщение помещается в список прерываний.

Когда вычисленное значение времени задержки сообщения в блоке ADVANCE отлично от нуля, значения счетчика текущего числа сообщений в блоке (Wj) и счетчик общего числа входов (Nj) увеличиваются на единицу. Если вычисленное время задержки равно нулю, и сообщение может перейти к следующему блоку, то увеличивается только счетчик Nj. Если же сообщение не может войти в следующий блок, то увеличи­вается и счетчик Wj.

8.4. Блок ASSIGN

Блок ASSIGN имеет следующий формат записи:

ASSIGN <A>,<B>,[<C>]

Блок ASSIGN заменяет, увеличивает или уменьшает текущее зна­чение параметра сообщения на заданное значение.

В поле А задается номер параметра, которому присваивается значение. Операнд А может быть именем, положительным целым числом, СЧА, СЧА*<параметр> и следующими за ними знаками +,- . Если значе­ние параметра нужно увеличить или уменьшить, то справа в поле А ставится знак сложения или вычитания. Например, аргумент поля А мо­жет быть закодирован следующим образом:

1) 2 - заменяется текущее значение параметра 2;

2) 2- - вычитается заданное значение из текущего значения па­раметра 2;

3) 2+ - прибавляется заданное значение к текущему значению па­раметра 2;

Поле В определяет значение, которое следует добавить или вы­честь из значения параметра, заданного аргументом поля А, или заме­нить его. Если такой параметр не сущуствует, то он создается. Опе­ранд В может быть именем, любым целым числом, СЧА, или СЧА*<пара­метр>.

Пример:

ASSIGN 2000+,-3

В этом примере значение поля В, равное -3, добавляется к зна­чению параметра с номером 2000, который задан операндом А. Если та­кой параметр в сообщении отсутствует, то он создается со значением, равным 0, до того, как будет произведено добавление. Тогда значение параметра сообщения становится равным -3.

Поле С задает номер модификатора-функции. При использовании поля С значение аргумента поля В умножается на значение модификато­ра-функции (от функции берется целая часть). Полученное произведе­ние, от которого выделяется целая часть, становится значением, ко­торое изменяет значение параметра, заданного в поле А. Следует от­метить: если в поле С записано FN1, это не означает, что номер мо-

дификатора-функции равен 1, он равен целому значению FN1.

Рассмотрим модель, показывающую, как можно использовать блок ASSIGN для ввода информации о моделируемой системе в модель.

10 FUNCTION RN16 C3

0.075, 1/0.55, 2/.999, 3

1 FUNCTION...

.

.

.

2 FUNCTION...

.

.

.

3 FUNCTION...

.

.

.

GENERATE 200, 12

ASSIGN 8, FN10

ASSIGN 2, FN*P8

Предполагается, что система связи получает информационные со­общения трех типов, причем каждый из них характеризуется своим рас­пределением числа символов в сообщении. В модели в каждом сообщении параметр 8 будет указывать тип сообщения, а параметр 2 число симво­лов в сообщении.

Блок ASSIGN может использоваться для управления логикой моде­ли. Предположим, что система последовательно обрабатывает по одному символу поступившего информационного сообщения. Рассмотрим часть модели, в которой блок ASSIGN используется для построения цикла об­работки сообщения.

.

.

.

MET1 ASSIGN 1+,1

ADVANCE X1

TEST E P1,P2,MET1

.

.

.

Каждое сообщение представляет собой одно информационное сооб­щение и должно повторять блоки, изображающие процесс обработки сим­вола, в данном случае блок ADVANCE, столько раз, сколько символов в соответствующем информационном сообщении. Длина информационного со­общения записана в параметр 2.

Для организации цикла с соответствующим числом повторений для каждого сообщения, используются блоки ASSIGN и TEST.

Блок ASSIGN добавляет единицу к счетчику числа выполненных циклов обработки сообщения (счетчик организован в параметре 1). Предполагается, что параметр 1 устанавливается в "0" перед входом в цикл обработки. Пока не выполнится условие Р1 = Р2, блок TEST будет

возвращать сообщение к началу цикла. После выполнения условия из

блока TEST сообщение перейдет к следующему по номеру блоку.

СЧА, связанным с описанным оператором, является Р<параметр> или *<параметр> - значение параметра. P<параметр> возвращает значе­ние параметра, заданного <параметром>.

8.5. Блок INDEX

Блок INDEX имеет следующий формат записи:

INDEX <A>,<B>

Блок INDEX к определенному в поле А значению параметра сооб­щения прибавляет величину, определенную полем В. Результат записы­вается в параметр 1. Поле А задает номер параметра, значение кото­рого увеличивается на значение аргумента поля В. Если параметра с таким номером не существует, то возникает ошибка выполнения. Одна­ко, если для обрабатываемого сообщения не существует параметра с номером 1, то он создается.

Операнд А может быть именем, положительным целым числом, СЧА или СЧА*<параметр>.

Поле В задает числовую величину, которая прибавляется к со­держимому параметра. Операнд В может быть именем, любым целым чис­лом, СЧА или СЧА*<параметр>.

Пример:

INDEX 2,1

В этом примере, когда сообщение входит в блок INDEX, его па­раметру с номером 1 присваивается сумма 1 и значения параметра 2 данного сообщения.

СЧА, связанным с описываемым оператором, является P<номер па­раметра> или *<номер параметра> - значение параметра. Возвращает значение параметра с указанным номером.

8.6. Блок MARK

Блок MARK имеет следующий формат записи:

MARK [<A>]

Блок MARK либо заменяет значение отметки времени сообщения на текущее значение абсолютного условного времени (операнд А не опре­делен), либо записывает значение условного времени в заданный пара­метр сообщения (при использовании операнда А).

Поле А содержит номер параметра, в который записывается зна­чение абсолютного условного времени. Если такого параметра не су­ществует, то он создается. Операнд А может быть именем, положитель­ным целым числом, СЧА или СЧА*<параметр>.

Примеры:

MARK BEGINNING

В этом примере, когда сообщение входит в блок MARK, его пара­метру с именем BEGINNING присваивается значение абсолютного услов­ного времени АС1.

MARK

В этом примере значение отметки времени обрабатываемого в данный момент сообщения становится равным значению абсолютного ус­ловного времени.

Исходное значение времени создания сообщения может быть заме­нено на текущее значение абсолютного условного времени при прохож­дении сообщения через блок MARK. Каждое сообщение имеет следующие два стандартных числовых атрибута, связанных с временем прохождения участков модели данным сообщением:

1) М1 - время прохождения сообщением модели. Вычисление зна­чения этого СЧА производится следующим образом:

_ _ _ _

| | | |

| Текущее значение | | Отметка времени |

М1 = | условного | - | обрабатываемого |

| времени | | в данный момент |

|_ _| | сообщения |

|_ _|

2) MPj - промежуточное прохождение сообщением участка модели. Вычисление значения этого СЧА производится следующим образом:

_ _ _ _

| | | |

| Текущее значение | | Значение параметра |

MPj = | абсолютного | - | обрабатываемого в |

| условного времени | | данный момент |

|_ _| | сообщения |

|_ _|

8.7. Блок COUNT

Блок COUNT имеет следующий формат записи:

COUNT <X> <A>,<B>,<C>,[<D>],[<E>]

<X> - здесь и далее -обозначение используемого логического или условного операторов. Данный операнд может принимать следующие значения:

FNV, FV, I,LS, LR, NI, NU, SE, SF, CNE, SNF, SNV, SV, U,'E','G','GE','L','LE',

MIN, MAX или 'NE'.

Блок COUNT определяет число объектов, удовлетворяющих задан­ному условию. Например, пользователю может понадобиться узнать чис­ло свободных устройств в определенном диапазоне номеров устройств или число памятей с коэффициентом использования меньше 50 (в частях от 1000) и т. д.

Логический оператор задает логическое условие. Например, под -

счет свободных устройств, подсчет выключенных логических ключей и

т. д. Ниже приведен список логических операторов для различных типов

объектов. Устройства имеют следующие логические условные операторы:

- NU - устройство свободно (доступно);

- U - устройство занято (в результате выполнения сообщени­ем блока SEIZE или PREEMPT);

- NI - устройство не прервано (т. е. либо оно свободно, либо занято сообщением, выполнившим блок SEIZE);

- I - устройство прервано (устройство занято сообщением, вы­полнившим блок PREEMPT);

- FV - устройство доступно;

- FNV - устройство недоступно.

Многоканальные устройства имеют следующие логические условные операторы:

- SE - многоканальное устройство пусто (нулевое содержимое);

- SNE - многоканальное устройство не пусто (ненулевое содер­жимое);

- SF - многоканальное устройство заполнено;

- SNF - многоканальное устройство не заполнено;

- SV - многоканальное устройство доступно;

- SNV - многоканальное устройство недоступно.

Логические ключи имеют следующие логические операторы:

- LR - проверка ключа на состояние "выключено";

- LS - проверка ключа на состояние "включено";

При использовании логических операторов поля D и E могут быть пустыми.

В блоке COUNT можно использовать следующие условные операто­ры:

- 'L' - меньше. Условие выполняется, если значение стандарт­ного числового атрибута, заданного в поле Е, меньше значения стан­дартного числового атрибута, заданного в поле D;

- 'LE' - меньше или равно. Условие выполняется, если значение СЧА, заданного в поле Е, меньше или равно значению СЧА, заданного в поле D;

- 'E' - равно. Условие выполняется, если значение СЧА, задан­ного в поле Е, равно значению СЧА, заданного в поле D;

- 'NE' - не равно. Условие выполняется, если значение СЧА, заданного в поле Е, не равно значению СЧА, заданного в поле D;

- 'G' - больше. Условие выполняется, если значение СЧА, за­данного в поле Е, больше значения СЧА, заданного в поле D;

- 'GE' - больше или равно. Условие выполняется, если значение СЧА, заданного в поле Е, больше или равно значению СЧА, заданного в поле D;

- MAX - наибольшое значение из всех значений СЧА объектов, удовлетворяющих заданному условию;

- MIN - наименьшее значение из всех значений СЧА объектов, удовлетворяющих заданному условию.

Если используются условные операторы, то поля D и Е блока COUNT должны быть заданы.

В поле А задается номер параметра вошедшего в блок сообщения, в котором будет организован счетчик числа объектов. Операнд А может быть именем, положительным целым числом, СЧА или СЧА*<параметр>.

В поле В определяется нижняя граница диапазона изменения но­меров или имен объектов, для которых проверяется заданное условие. Операнд В может быть именем, положительным целым числом, СЧА или СЧА*<параметр>.

В поле С определяется верхняя граница диапазона изменения но­меров или имен объектов, для которых проверяется заданное условие. Операнд С может быть именем, положительным целым числом, СЧА или СЧА*<параметр>. Значение поля С должно быть больше либо равно зна­чению, заданному в поле В. Номер проверяемых объектов не должен превышать 32768.

Поле D задает сравниваемое значение (величина сравнения) для аргумента поля Е. Операнд D может быть именем, любым целым числом, СЧА или СЧА*<параметр>. Это значение используется совместно с за­данными условными операторами ('E', 'NE', 'G', 'GE', 'L', 'LE'). Значение СЧА сравнивается со значением объекта, заданного аргумен­том поля Е. Если условный оператор не используется, поле D можно не задавать.

Поле Е используется совместно с аргументом поля D и условным оператором. В поле Е задается какой-либо из стандартных числовых атрибутов просматриваемых объектов. Необходимо только записывать мнемоническое обозначение атрибута, поскольку диапазон изменения номеров объектов задан полями В и С.

Рассмотрим несколько примеров использования блока COUNT.

COUNT 'LE' 1,1,5,X10,FC

В этом примере подсчитывается число устройств (из устройств 1-5 включительно), у которых счетчик числа входов (FC) меньше или равен текущему значению ячейки 10. Результат подсчета будет записан в параметре 1 вошедшего в блок COUNT сообщения.

В нижеприведенном примере подсчитывается число заполненных многоканальных устройств (SF) при изменении номеров в интервале 10-20 (включительно). Результат подсчета записывается в параметре 5 вошедшего в блок сообщения.

COUNT SF 5,10,20

8.8. Блок SELECT

Блок SELECT имеет следующий формат записи:

SELECT <X> <A>,<B>,<C>,[<D>],[<E>],[<F>]

Блок SELECT выбирает первый объект в заданном диапазоне, ко­торый удовлетворяет определенному условию. Номер этого объекта за­писывается в заданный параметр вошедшего в блок сообщения. В основ­ном, действия блока SELECT аналогичны действиям блока COUNT.

<X> - обозначение логического или условного операторов.

Логические и условные операторы имеют такой же смысл, как и в блоке СOUNT.

MIN и MAX задают работу блока соответственно в минимальном и максимальном режимах.

В поле А задается номер параметра вошедшего в блок COUNT со­общения, куда записывается номер объекта, удовлетворяющего заданно­му условию.

Операнд А может быть именем, положительным целым числом, СЧА или СЧА*<параметр>.

Поле В определяет нижнюю границу диапазона изменения номеров объектов, для которых проверяется заданное условие. Операнд В может

быть именем, положительным целым числом, СЧА или СЧА*<параметр>.

Поле С определяет верхнюю границу диапазона изменения номеров объектов, для которых проверяется заданное условие. Операнд С может быть именем, положительным целым числом, СЧА или СЧА*<параметр>.

В поле D задается величина сравнения. Это значение использу­ется совместно с условными операторами ('E', 'NE', 'GE, 'L', 'LE'). Операнд D может быть именем, любым целым числом, СЧА или СЧА*<пара­метр>.

Значение стандартного числового атрибута сравнивается со зна­чением атрибута объекта, заданного в поле Е. Если не используется условный оператор, поле D можно не задавать.

Поле Е используется совместно с полем D и условным операто­ром. В поле Е задается только мнемоническое обозначение СЧА объекта без указания конкретного номера, поскольку диапазон изменения номе­ров объектов задан полями В и С. В поле Е может быть задан любой из стандартных числовых атрибутов объекта.

Поле F задает номер альтернативного блока для входящего сооб­щения, если заданным условиям не удовлетворяет ни один объект в ди­апазоне. Операнд F может быть именем, положительным целым числом, СЧА или СЧА*<параметр>.Если операнд F не используется, то сообщение будет продвинуто к следующему по номеру блоку. Рассмотрим примеры использования блока SELECT.

SELECT MAX 1,5,10,,FR

В данном примере из устройств с номерами 5-10(включительно) выбирается устройство с максимальным коэффициентом использования (FR). Номер выбранного устройства записывается в параметре 1 вошед­шего сообщения.

В следующем примере из очередей с номерами 10-20 (включитель­но) выбирается первая очередь, длина которой (Q) больше или равна значению ячейки 5(X5). Номер очереди, удовлетворяющей этому усло­вию, записывается в параметре 10 вошедшего в блок сообщения.

SELECT 'GE' 10, 10, 20, X5, Q

8.9. Блок PRIORITY

Блок PRIORITY имеет следующий формат записи:

PRIORITY <A>,[<B>]

Блок PRIORITY присваивает сообщению нужный приоритет. Приори­тет сообщений влияет на порядок обработки сообщений процедурой просмотра и порядок занятия сообщениями объектов оборудования.

Поле А задает новое значение приоритета. Операнд А может быть именем, любым целым числом, СЧА или СЧА*<параметр>.

Новое значение приоритета может быть меньше, больше или равно текущему значению приоритета.

Поле В определяет режим BUFFER, в нем указывается значение "BU".

В общем случае процедура просмотра списка текущих сообщений пытается продвинуть обрабатываемое сообщение в следующий блок. Од­нако, если в поле В блока PRIORUTY записано слово BU, то после присвоения сообщению нового значения приоритета блок PRIORITY ста-

новится эквивалентным блоку BUFFER. Сообщение помещается в список

текущих событий в конец своего нового приоритетного класса, проце­дура просмотра возвращается к началу списка текущих событий и начи­нает просмотр снова. Поскольку блок BUFFER не задерживает сообще­ния, вошедшие в этот блок, сообщение будет обработано процедурой просмотра снова при том же значении условного времени. Режим BUFFER подробно рассматривается при описании блока BUFFER.

Например:

PRIORITY 10

В этом примере вошедшему в блок сообщению присваивается прио­ритет, равный 10.

8.9.1. Внутренние операции блока PRIORITY

Блок PRIORITY назначает новый уровень приоритета и затем пе­ремещает сообщение в списке текущих событий так, чтобы оно стало последним среди сообщений с соответствующим значением приоритета. Эта операция выполняется и в том случае, когда новое значение прио­ритета равно старому. Бывают случаи, когда нужно изменить положение сообщения в том же классе приоритетов, в котором оно находится. Например, это может быть сделано перед входом сообщения в блок SPLIT. Поскольку сообщение окажется последним в своем классе прио­ритетов, копии (вновь созданные сообщения) сообщений, созданные блоком SPLIT, будут расположены в списке текущих событий непосредс­твенно за породившим их сообщением, поскольку каждая копия помеща­етсяв список текущих событий в конец соответствующего класса.

При входе сообщения в блок PRIORITY автоматически устанавли­вается флаг изменения состояния. Следовательно, после того, как ин­терпретатор закончит продвижение сообщения, вошедшего в блок PRIORITY, он автоматически вернется к началу просмотра списка теку­щих событий. Возврат к началу списка необходим, поскольку в случае, если блок PRIORITY уменьшил приоритет вошедшего в него сообщения, интерпретатор пропустит все сообщения, находящиеся в списке текущих событий, начиная с того места, где рассматриваемое сообщение нахо­дилось до входа в блок PRIORITY, кончая его новым местом в списке. Установка флага изменения состояния и возврат к началу списка обес­печивает просмотр всех пропущенных сообщений в тот же момент услов­ного времени.

В режиме BUFFER интерпретатор немедленно возвращается к нача­лу списка текущих событий. Флаг изменения состояния также сразу же устанавливается в "О".

СЧА, связанным с описываемым оператором, является PR - значе­ние приоритета обрабатываемого сообщения.

8.10. Блок BUFFER

Блок BUFFER имеет следующий формат записи:

BUFFER

Блок BUFFER используется для немедленного прекращения обра -

ботки сообщения и возврата интерпретатора к началу списка текущих

событий. Обрабатываемое сообщение помещается в список текущих собы­тий после сообщений с тем же классом приоритетов.

Интерпретатор пытается продвигать активное сообщение так да­леко, на сколько это возможно в текущей модели.

В обычном режиме интерпретатор удаляет активное сообщение из списка текущих событий, вызывает процедуру обработки следующего блока и, если не произойдет ни одно из событий, прекращающих прод­вижение сообщения, помещает обрабатываемое сообщение в список теку­щих событий перед сообщениями с тем же классом приоритетов. Если на пути продвижения сообщения произойдет одно из следующих событий:

1) сообщение входит в блок ADVANCE с положительной задержкой и переводится в список будущих событий;

2) сообщение не может войти ни в один из указанных последую­щих блоков;

3) сообщение входит в блоки MATCH, ASSEMBLE или GATHER, кото­рые производят следующие действия:

- либо уничтожают сообщения (последние n-1 сообщения в блоке ASSEMBLE);

- либо переводят сообщение в состояние синхронизации (блоки MATCH и GATHER и первое сообщение в блоке ASSEMBLE);

4) сообщение уничтожается блоком TERМINATE;

5) сообщение переводится в список пользователя в блоке LINK; обычно интерпретатор переходит к обработке другого сообщения.

Обработка сообщения, вошедшего в блок BUFFER, является исклю­чением из этого правила. После входа сообщения в блок BUFFER интер­претатор помещает сообщение в конец соответствующего класса приори­тетов и возвращается к первому сообщению списка текущих событий (т. е. сообщению, имеющему наивысший приоритет). Поскольку блок BUFFER не задерживает входящие в него сообщения, эти сообщения об­рабатываются при том же значении условного времени.

Если входящее в блок BUFFER сообщение стоит первым в списке текущих событий, то блок BUFFER не выполняет никаких полезных опе­раций и является лишним. Отметим также, что ни одно из сообщений, стоящих в списке текущих событий за сообщением, вошедшим в блок BUFFER, не будет обработано до тех пор, пока интерпретатор не вер­нется к обработке сообщения, вошедшего в блок BUFFER и не закончит его обработку.

Блок PRIORITY, в поле В которого записано слово BUFFER, экви­валентен блоку BUFFER после того, как сообщение помещено в конец соответствующего класса приоритетов, заданного аргументом поля А. В результате интерпретатор возвращается к началу списка текущих собы­тий. Поскольку блок PRIORITY, так же как и блок BUFFER, не задержи­вает входящие в него сообщения, сообщение с измененным значением приоритета будет обработано в тот же момент условного времени.

В результате действия приведенных ниже блоков PRIORITY, входя­щее в них сообщение будет обработано последним, т. е. после всех ос­тальных сообщений, находящихся в списке текущих событий.

ASSIGN 1, PR, PH

K PRIORITY 0, BUFFER

K+1 PRIORITY PH1

Блок PRIORITY с номером К помещает сообщение в конец списка текущих событий. Текущее значение приоритета сообщения записано в параметре 1 формата "полуслово" с тем, чтобы его можно было восста­новить, когда сообщение войдет в блок К+1. В режиме BUFFER интерп-

ретатор возвращается к началу списка текущих событий. Он просматри­вает все сообщения в списке текущих событий и опять встречает сооб­щение, вошедшее в блок PRIORITY с номером К. Это сообщение входит в блок PRIORITY с номером К+1, который восстанавливает первоначальный уровень приоритета сообщения, записанный в параметре 1 формата "по­луслово".

_