logo search
Чтоесть / Мое / Конспект лекций Для студентов специальности 080801

4.26. Краткая характеристика языкаPlus

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

Рассмотрим основные элементы языка PLUS.

Алфавит языка PLUS (GPSS World) содержит алфавитно-цифровые и специальные символы. Для задания имен используются алфавитно-цифровые символы (прописные буквы A-Z, строчные бук­вы a-z, цифры 0-9 и знак подчеркивания «_»). Для обозначения опе­раторов и пунктуации используются специальные символы («#», «*», «&», «+», «-», «/», «\», «,», «;»). В комментариях допускается исполь­зование символов русского алфавита «А-Я».

Имена - это созданные пользователем последовательности сим­волов, используемые для обозначения объектов, переменных и про­цедур. Имя должно начинаться с буквы, в нем можно использовать от 1 до 250 алфавитно-цифровых символов. При этом имена не должны совпадать с ключевыми словами GPSS и с СЧА. Следует отметить, что GPSS World не различает регистр алфавита.

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

Типы данных. Переменные пользователя, элементы матриц, ячейки, параметры транзактов могут иметь значения различных ти­пов данных. В GPSS World используются три основных тbпа данных:

целочисленный (Integer) - это 32-х битовые двоичные числа. Если при выполнении арифметической операции происходит пере­полнение целочисленного значения, производится автоматическое преобразование его в вещественное;

вещественный (Real) - это числа с плавающей точкой двойной точности. Для представления мантиссы используется 15 десятичных разрядов, а для порядка - значения в интервале от -306 до 306 ;

строковый (String) - это последовательность символов ASCII; строки не ограничены в размерах (максимальная их длина определя­ется параметрами настройки Edit/Setting.../Simulation).

Выражения могут быть вычисляемыми, численно вычисляемыми, вычисляемыми в виде строки.

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

Факторами выражений GPSS могут быть:

1) строковые константы;

2) вещественные константы;

3) целочисленные константы;

4) имена;

5) элементы PLUS-матрицы;

6) обращения к процедурам (значения, возвращаемы* процеду­рами);

7) стандартные числовые атрибуты.

Для объединения факторов в выражение используются операто­ры и вызовы процедур.

Операторы. В табл. 4.48 представлены арифметические опера­торы, используемые в выражениях GPSS World, перечисленные в по­рядке убывания их приоритетов.

Таблица 4.48

Все арифметические операторы автоматически преобразуют строковые операнды в числовые значения.

Перенастройку некоторых операторов можно выполнить через пункт меню Edit/Setting.. /Simulation.

К операторам языка PLUS также относятся:

PROCEDURE - определяет PLUS-процедуру;

EXPERIMENT - определяет PLUS-эксперимент;

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

BEGIN/END - составной оператор, создает блок PLUS-операторов;

присваивание - предназначен для изменения значений пере­менных;

вызов процедуры - вызывает библиотечную процедуру;

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

IF/THEN - условный оператор, проверяет выражение и, если результат равен «TRUE» (истина), выполняет действие;

IF/THEN/ELSE - условный оператор проверяет выражение и в зависимости от результата производит то или иное действие;

WHILE/DO - оператор цикла, несколько раз выполняет дейст­вие;

GOTO - оператор безусловного перехода, передает управление к метке внутри процедуры;

RETURN - останавливает выполнение процедуры и возвращает результат ее выполнения (после чего память, используемая процеду­рой, освобождается).

Процедуры языка PLUS могут записываться в любом месте мо­дели (кроме тела другой процедуры). Остальные операторы PLUS мо­гут появляться только внутри оператора PROCEDURE.

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

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

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

Эксперимент - это особая разновидность PLUS-процедуры пользователя. Для ее определения используется оператор EXPERIMENT. Эта процедура применяется для управления не­сколькими повторяющимися имитациями.

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

Эксперимент вызывается только командой CONDUCT, которую можно загрузить с помощью функциональной клавиши.

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

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

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

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

1. Процедура DoCommand. Транслирует строку аргумента и пе­редает результат трансляции выполняющейся модели. Эта процедура может вызываться только из экспериментов и процедур, вызванных из экспериментов.

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

3. Процедура Exit() завершает сеанс работы с GPSS World - ос­танавливает процесс моделирования и закрывает все окна GPSS.

Файловые процедуры (процедуры потоков данных) - процеду­ры управления потоками данных внутри PLUS-процедуры. Потоки данных используются для чтения и записи файлов или для хранения и доступа больших объемов данных в памяти. Файловые процедуры выполняют следующие операции:

Open( DataStream, FileNameString) - инициализирует поток данных;

Close( DataStream) - закрывает поток данных и извлекает код ошибки;

Read( DataStream) - считывает текстовую строку из потока данных;

Write( DataStream, String) - передает потоку данных текстовую строку;

Seek( DataStream, NewLinePosition) - устанавливает позицию текущей строки потока данных и извлекает предыдущую позицию строки.

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

Математические процедуры. К ним относятся:

ABS(Expression) - абсолютное значение;

ATN(Expression) - арктангенс (в радианах);

COS(Expression) - косинус;

EXP(Expression) - число е, возведенное в степень аргумента;

INT(Expression) - выделение целой части с отбрасыванием дробной части;

LOG(Expression) - натуральный логарифм;

SIN(Expression) - синус;

SQR(Expression) - квадратный корень;

TAN(Expression) - тангенс.

Вероятностные распределения - процедуры теоретических вероятностных распределений (см. параграф 4.13).

Строковые процедуры выполняют операции со строками:

Align(InsertString, SourceString, Offset) - вставляет одну стро­ку в другую с выравниванием по правому краю;

Catenate(Stringl, String!) - производит объединение строк;

Copies(SourceString, Count) - создает одну строку из несколь­ких копий исходной;

Datatype(Datum) - возвращает строку, содержащую тип данных аргумента;

Find(TestString, SourceString) - вычисляет смещение одной строки, содержащейся в другой строке;

Left(SourceString, MaxCount) - возвращает левую часть задан­ной строки;

Length(SourceString) - возвращает количество символов в строке;

Lowercase(SourceString) - переводит все прописные буквы в строке в строчные;

Place(InsertString, SourceString, Offset) - вставляет одну стро­ку в другую с выравниванием по левому краю;

PolyCatenate(Stringl, Stringl,...)- производит объединение двух или более строк;

Right(SourceString, MaxCount) - возвращает правую часть за­данной строки;

String(Datum) - преобразует данные в их строковый эквива­лент;

StringCompare(Stringl, StringZ) - сравнивает две строки;

Substring(SourceString, Offset, MaxCount) - возвращает под­строку заданной строки;

Trim(SourceString) - удаляет начальные и конечные пробелы;

Uppercase(SourceString) - переводит все строчные буквы в строке в прописные;

Value(Datum) - возвращает числовой эквивалент строки;

Word(SourceString, WordNumber) - возвращает заданное сло­во строки.

Процедуры запроса возвращают информацию о состоянии тран-закта, находящегося в модели. К ним относятся такие процедуры:

QueryXNExist(TransactionNumber) - возвращает 1, если тран-закт существует в модели, иначе - 0;

QueryXNParameter(TransactionNuraber, Parameter) - возвра­щает значение параметра транзакта. Если искомого параметра не су­ществует, происходит останов по ошибке;

QueryXNAssemblySet(TransactionNumber) - возвращает номер семейства, к которому принадлежит транзакт;

QueryXNPriority(TransactionNumber) - возвращает приоритет транзакта в виде целого числа;

QueryXNMl(TransactionNumber) - возвращает время входа транзакта в систему.