Занятие третье по дисциплине: "Моделирование систем"
Тема: "Изучение основ моделирования в среде GPSS World"
Разделы:
1 Создание пользовательских переменных. 2
2 Использование логических ключей. 5
3 Функции плотностей распределения. 6
4 Введение в PLUS. Описание операторов языка. Использование процедур. 9
5 Библиотечные функции PLUS. 15
5.1 Математические и строковые. 15
5.2 Для работы с потоками. 17
Сегодняшнюю лекцию начнём с изучения команд языка GPSS, которые позволяют создавать пользовательские переменные.
Но, для начала, давайте вспомним какие команды и блоки для сохранения и задания каких-либо значений мы уже изучили ранее:
Таблица 1. Блоки и команды для манипуляции с сохранёнными данными
Наименование |
Описание |
EQU |
аналог задания константы |
ASSIGN |
сохранение и модификация значения параметра |
SAVEVALUE |
сохранение и модификация значения хранимой величины (ячейки) |
INITIAL |
инициализация ячеек, матриц, логических ключей |
MATRIX |
создание матрицы ячеек |
MSAVEVALUE |
сохранение и модификация значений ячеек матриц |
А теперь, перейдём к изучению самой команды VARIABLE.
Синтаксис команды таков:
<имя> VARIABLE <выражение>
Созданные с помощью этой команды переменные, несколько отличаются по своим характеристикам от переменных, используемых при программировании на таких языках как C++, Delphi. Дело в том, что в данных языках изменение значения переменной происходит явно, т.е. при прямом обращении к ней по имени.
В данном же случае, значение переменной вычисляется автоматически, при изменении параметров, включённых в операнд A нашей команды.
Чтобы лучше понять принцип работы данной команды, приведу несколько примеров.
Пример создания простой переменной, позволяющей узнать, сколько транзактов ожидало в очереди:
QueueEnter VARIABLE QC$MyQueue - QZ$MyQueue
Исходя из синтаксиса, можно определить, что именем переменной будет метка "QueueEnter". А выражением – запись "QC$MyQueue - QZ$MyQueue".
Здесь видно, что для вычисления переменной мы используем два СЧА, относящихся к классу очередей. Первый СЧА – это QC, возвращающий общее количество входов в очередь, а второй – QZ, который показывает число нулевых входов в очередь.
Сразу стоит оговориться, что нулевой вход – это когда транзакт прошёл через блоки QUEUE и DEPART, но не задерживался на них. Такое возможно, например, при появлении первого транзакта, который не стоит в очереди, а сразу переходи в следующие блоки.
Таким образом, вычислив разницу между общим и нулевыми количеством входов в очередь, получаем величину, показывающую, сколько транзактов ожидало в очереди. Причём будут учитываться и транзакты, которые находились в очереди ничтожно малый промежуток времени.
В качестве второго примера приведу следующую строку:
TimeDelay VARIABLE FN$HowLong#P$Percent
Для чего может случить такая переменная. Допустим, что некоторая функция с именем HowLong позволяет нам вычислить время задержки транзакта. Но на разных участках модели время задержки может варьироваться и определять в процентах от изначальной величины.
Тогда мы можем использовать приведённую ранее переменную, которая упрощает процесс подсчёта времени задержки и, что не маловажно, позволяет избежать повторения одинаковых частей кода и сократить процессорное время на вычисление необходимых выражений.
Все перечисленные плюсы относятся не только к последнему примеру, а к принципу использования переменных в языке GPSS вообще.
Теперь стоит указать на одну особенность, что переменные, созданные с помощью команды VARIABLE, возвращают вещественные числа. Но в режиме совместимости с версией GPSS PC, она будет возвращать целочисленные значения. Иначе говоря, дробная часть, после вычисления, будет отбрасываться.
Для работы с вещественными переменными в режиме совместимости с GPSS PC, предусмотрена другая команда – FVARIABLE. Которая по синтаксису и принципу работы аналогична команде VARIABLE, поэтому на ней мы останавливаться не будем.
Также существует и другая команда, для работы с переменными – BVARIABLE. Созданные с помощью данной команды переменные относятся к типу булевских. И, соответственно, могут хранить только значения "True" или "False". Данный тип переменных можно использовать в качестве флагов, при организации ветвлений.
Синтаксис данной команды аналогичен синтаксису предыдущих команд с небольшим ограничением, накладываемым на тип возвращаемого значения.
Пример использования команды:
BoolVariable BVARIABLE (QX$MyQueue'G'12)
или в другом виде:
BoolVariable BVARIABLE (QX$MyQueue>12)
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.