Партнерка на США и Канаду по недвижимости, выплаты в крипто
- 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 формата "полуслово".
_


