Переменные

Для заданиясложных математических или логических соотношений между атрибутами системы в GPSS используется понятие «переменные».

В GPSS имеется три типа переменных: арифметические, арифметические c «плавающей точкой», булевы.

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

– как операнд блока (в этом случае значение арифметической переменной может представлять собой номер объекта (устройства, МКУ, очереди и т. п.), номер параметра транзакта или значение стандартного числового атрибута);

– как аргумент функции (операндА);

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

– как аргумент таблицы (операндА);

– как операнд выражения другой арифметической или булевой переменной.

Для построения выражений, содержащих арифметические переменные, могут применяться следующие арифметические операции [3]:

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

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

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

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

/ – алгебраическое деление, остаток отбрасывается; при этом сохраняется только целая часть частного (прямой слэш);

\ – деление нацело (без остатка): перед делением у обоих операндов отбрасываются дробные части, результатом операции является целая часть частного (обратный слэш);

@ – деление по модулю.

Так как в GPSS знак «*» по умолчанию применяется для указания косвенной адресации, то для обозначения операции умножения используется знак «#». Однако пользователь может менять назначение операторов «#» и «*», для чего нужно воспользоваться флажком, имеющимся на странице «Simulation» (Моделирование) в меню настройки параметров.

Идея косвенной адресации заключается в том, что можно обратиться к любому объекту или СЧА через параметры транзактов, доступ к которым осуществляется через СЧА Pj, где j – номер параметра транзакта (например, 10), или Р$имя, где имя – имя (идентификатор) параметра транзакта. Так как обращение к объекту возможно только через параметр транзакта, то символ P может опускаться. Например, выражение Q*7 или Q*P7 определяет текущее значение длины очереди, номер которой задан в параметре 7 обрабатываемого в данный момент транзакта. Если в седьмом параметре хранится значение 3, то это будет текущее значение длины очереди c номером 3.

В выражениях может использоваться любое количество рассмотренных операций в различных комбинациях. Значения переменных могут быть отрицательными. Знак результата вычисляется по обычным алгебраическим правилам. Выражения анализируются слева направо. Операции над переменными выполняются в следующей последовательности в порядке убывания приоритетов: ^, #, /, \, @, –, +. [1] Вычисленное значение переменной является ее стандартным числовым атрибутом (СЧА).

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

ABS(A) – вычисляет абсолютное значение А;

ATN(A) – арктангенс А;

COS(A) – косинус А;

ЕХР(А) – экспоненту А;

INT(A) – выделяет целую часть А;

LOG(A) – вычисляет натуральный логарифм А;

SIN(A) – синус А;

SQR(A) – квадратный корень А;

TAN(A) – тангенс А.

Арифметические переменные задаются оператором VARIABLE, который называется оператором описания переменной и содержит арифметическое выражение.

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

метка VARIABLE А,

где метка – имя (числовое или символьное) переменной;

А – выражение, которое используется для вычисления значения переменной (может содержать константы, СЧА, функции и другие арифметические переменные).

При обращении к переменной используется обозначение V<номер переменной> или V$<имя переменной>, где V – это СЧА переменной.

П р и м е р описания переменной [4]:

RSL VARIABLE Q$WAITL+3–FN$DSTRB#P7,

где оператор описания VARIABLE определяет арифметическую переменную с именем RSL; при этом при любом обращении к переменной RSL (обозначение V$RSL) ее значение вычисляется как текущая длина очереди WAITL (Q$WAITL – СЧА регистратора очереди) плюс константа 3 и минус произведение значения функции с именем DSTRB и значения параметра Р7 обрабатываемого в данный момент транзакта. В данном выражении FN – СЧА для обращения к функции, P – СЧА транзакта.

Значение арифметического выражения вычисляется, когда активный транзакт входит в блок, оператор которого среди своих операндов содержит одну или более ссылок на арифметические переменные. Вычисленные значения имеют вещественный тип. [1]

В GPSS World промежуточные результаты и значения СЧА не округляются. Округление может задать только сам пользователь. Например:

PER VARIABLE (Q$QPARIK – P5#Q$BOX)\FN$DSTRB

Вычисленное значение переменной PER будет целым числом, так как использована операция деления нацелo. Для округления можно использовать и библиотечную функцию INT(A) выделения целой части. Например:

PER VARIABLE INT((Q$QPARIK – P5#Q$BOX)/FN$DSTRB)

Для деления в данном случае применена обычная операция.

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

Допускается использование скобок в выражениях арифметических переменных. В GPSS World выражения, записанные в круглых скобках, обрабатываются вычислительной процедурой встроенного алгоритмического языка PLUS, поэтому их можно использовать в качестве операндов блоков и операторов языка GPSS. Например:

ADVANCE ((Q$QPARIK – P5#Q$BOX)\FN$DSTRB)

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

П р и м е р ы описания переменных:

1. ADD VARIABLE P8+9

Значение арифметической переменной ADD вычисляется как сумма значений восьмого параметра активного в данный момент транзакта и константы 9.

2. F1 VARIABLE Q9+3#V$F2–V$F3#FN$IO

F2 VARIABLE 9+FN19#Q10

F3 VARIABLE FN$TYPE1+Q$ENTRY

Выражение для F1 содержит в качестве операндов переменные F2 и F3;

3. PROFIT VARIABLE V*P*FN*P2

При вычислении переменной PROFIT вначале определяется значение второго параметра текущего транзакта. Пусть в параметре P2 хранится значение 3. Затем вычисляется значение функции 3, пусть оно равно 10. После этого определяется значение параметра c номером 10 текущего транзакта, пусть содержимым этого параметра будет число 5. Тогда переменной PROFIT присваивается значение переменной 5;

4. COMP VARIABLE X*P4/100

Значе­ние переменной COMP вычисляется как частное от деления значения сохраняемой вели­чины (СЧА X), номер которой определяется четвертым параметром транзакта, обрабатываемого в данный момент, на константу 100.

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

Формат операторов описания арифметических переменных c «плавающей точкой» FVARIABLE идентичен рассмотренному формату опе­рандов описания арифметических переменных. Все операции над операндами выражений переменных c плавающей точкой выполняются без преобразования операндов и промежуточных результатов в целые значения. Лишь окончательный результат вычисления преобразуется в целое число.

П р и м е р описания арифметических переменных c «плавающей точкой»:

FLOAT FVARIABLE 10#(11/3)

FIXED VARIABLE 10#(11/3)

Значение переменной FLOAT равно 36: константа 10 умножается на 3,67 и от результата берется целая часть. Переменная FIXED равна 30: в результате промежуточной операции деления остаток отбрасывается, остается только целая часть, равная трем. Для переменных c «плавающей точкой» не допускается операция деления по модулю.

Использование дробных констант допускается только при описании переменных c «плавающей точкой».

Стандартный числовой атрибут V$<имя переменной> используется для обращения к значениям как арифметических переменных, так и переменных c «плавающей точкой».

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

Булевы переменныес использованием всего лишь одного блока дают возможность принимать решения в зависимости от состояния и значения атрибутов многих объектов GPSS. Булева переменная представляет собой логическое выражение, составленное из различных СЧА и (или) других булевых переменных. Выражение может также содержать библиотечные функции и Plus-процедуры. [1]

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

Булева переменная определяется командой BVARIABLE, которая имеет следующий формат:

метка BVARIABLE А,

где метка – имя (числовое или символьное) булевой переменной;

А – логическое выражение.

В выражении А можно использовать три типа операторов: логические, булевы и операторы отношений. Конечный результат преобразуется в целое значение 0, если равен нулю, или в целое значение 1, если отличен от нуля.

Логические операторы связаны c такими ресурсами, как ОКУ, МКУ и логические ключи; они используются для определения состояния данных объектов и представлены в табл. 1.2 [1, 4, 5].

Т а б л и ц а 1.2. Значения логических операторов

Логический оператор Значение оператора, отражающее состояние ресурса  
Fj или F$имя 1, если одноканальное устройство j занято, в противном случае – 0
FVj или FV$имя 1, если одноканальное устройство j доступно, в противном случае – 0
FIj или FI$имя 1, если ОКУ j обслуживает прерывание, иначе – 0
Ij или I$имя 1, если ОКУ j обслуживает прерывание, иначе – 0
NIj или NI$имя 1, если ОКУ j не обслуживает прерыва­ние, иначе – 0
NUj или NU$имя 1, если ОКУ j не используется, иначе – 0
Uj или U$имя 1, если ОКУ j используется, иначе – 0
SFj или SF$имя 1, если многоканальное устройство заполнено, иначе – 0
SNFj или SNF$имя 1, если МКУ jне заполнено, иначе – 0
SEj или SE$имя 1, если МКУ j пусто, иначе – 0
SNEj или SNE$имя 1, если МКУ j не пусто, иначе – 0
SVj или SV$имя 1, если МКУ j доступно, иначе – 0
LRj или LR$имя 1, если логический ключ j выключен, иначе – 0
LSj или LS$имя 1, если логический ключ jвключен, иначе – 0

Под j понимается номер.

Например:

Oky BVARIABLE FV$Rem1

can3 BVARIABLE SE$Use1

Prov1 BVARIABLE SF$Pusk

Prov2 BVARIABLE LS2

В первом примере булева переменная Oky равна 1, если ОКУ Rem1 доступно, и — 0, если не доступно. Во втором примере булева переменная can3 равна 1, если МКУ Use1 пусто. В третьем примере булева переменная Prov1 равна 1, если МКУ Pusk заполнено. В четвертом примере булева переменная Prov2 равна 1, если логический ключ номер 2 включен.

Операторы отношения выполняют алгебраическое сравнение операндов. Операндами могут быть константы или стандартные числовые атрибуты. Все операторы отношений записываются в кавычках: "G" (Greater) – больше; "L" (Less) – меньше; "E" (Equal) – равно; "NE" (Not Equal) – не равно; "LE" (Less than or Equal) – меньше или равно; "GE" (Greater than or Equal) – больше или равно. Например:

Prov1 BVARIABLE V$VseAvt"G"16

Prov2 BVARIABLE Q$QUNIT1"LE"P3

Булева переменная Prov1 равна 1, если переменная VseAvt больше 16, иначе – 0. Во втором примере булева переменная Prov2 равна 1, если текущая длина очереди QUNIT1 меньше или равна значению параметра 3 текущего транзакта.

Булевых оператора два: "OR" – «или» и "AND" – «и». Оператор «или» проверяет, выполняется ли хотя бы одно из проверяемых условий. Оператор «и» требует выполнения обоих условий. Например:

Con1 BVARIABLE FI$Rem"OR"SF4

CoN2 BVARIABLE FV$Rem"AND"SF$Pogr

Con3 BVARIABLE (V3"G"7)"AND"LS7

Булева переменная Con1 равна 1, если выполняется одно из условий: ОКУ Rem обслуживает прерывание или МКУ номер 4 заполнено. Булева переменная CoN2 равна 1, если выполняются оба условия: ОКУ Rem доступно и МКУ с именем Pogr заполнено. В третьем примере переменная Con3 равна 1, если выполняются оба условия: значение переменной номер 3 больше 7 и логический ключ номер 7 включен. Скобки в третьем примере нужны только для задания определенных булевых соотношений. Скобки следует использовать только в тех случаях, когда они необходимы.

Если булева переменная задается СЧА, как например:

Stan BVARIABLE V$TreAvt,

то вычисляется значение арифметической переменной с именем TreAvt, и если оно отлично от нуля — значение булевой переменной Stan будет равно 1, в противном случае — 0.