Переменные

Для заданиясложных математических или логических соотношений между атрибутами системы в 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.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: