Федеральное государственное образовательное учреждение высшего профессионального образования Ставропольский государственный аграрный университет Экономический факультет Кафедра Информационных Систем и Технологий Лабораторная работа № 11 по дисциплине «Информационные технологии в экономике» ТЕМА «Первоначальное знакомство с системой GPSS WORLD» г. Ставрополь 2015 г. Тема: ознакомление с рабочей средой системы GPSS WORLD. Цель занятия: познакомиться с рабочей средой системы GPSS WORLD. 2 1. ЯЗЫК МОДЕЛИРОВАНИЯ СИСТЕМ GPSS 1.1. Общие сведения о языке GPSS Язык моделирования GPSS (General Purpose System Simulation) разработан фирмой IBM в США и с 1962 года входит в стандартное математическое обеспечение машин серии IBM 360/370. По сравнению с другими языками моделирования язык GPSS получил наиболее широкое распространение. Он включен в учебные курсы вузов по моделированию систем у нас в стране и изучается в аналогичных курсах во многих колледжах и университетах США и других стран. В учебном пособии рассматривается одна из версий языка GPSS, реализованная в среде MS DOS для компьютеров класса IBM XT и выше. Язык GPSS ориентирован на решение задач статистического моделирования на ЭВМ процессов с дискретными событиями. Такими процессами описывается прежде всего функционирование систем массового обслуживания произвольной структуры и сложности: систем обработки данных, систем транспорта и связи, технологических процессов, а также функционирование вычислительных систем и разного рода автоматизированных систем. Язык основан на схеме транзактов (сообщений). Под транзактом понимается формальный объект, который “путешествует” по системе (перемещается от блока к блоку), встречая на пути всевозможные задержки, вызванные занятостью тех или иных единиц оборудования. Транзакты имеют прямую аналогию с заявками в системах массового обслуживания. В качестве транзакта может выступать программа обработки информации, телефонный вызов, отказ системы при исследовании надежности и т.д. Каждый транзакт обладает совокупностью параметров (до100), которые называются атрибутами транзакта. В процессе имитации атрибуты могут меняться в соответствии с логикой работы исследуемой системы. Язык GPSS - язык интерпретируемого типа, он связан с пошаговым выполнением операторов, называемых блоками. Совокупности блоков описывают функционирование самой моделируемой системы либо содержат информацию о порядке моделирования (о продвижении транзактов). Каждое продвижение транзакта (сообщения) является событием в модели. Комплекс программ, планирующий выполнение событий, реализующий функционирование блоков моделей, регистрирующий статистическую информацию о продолжении транзактов, называется симулятором. Симулятор регистрирует время наступления каждого из известных на данный момент событий и выполняет их с нарастающей временной последовательностью. Симулятор обеспечивает отсчет модельного времени в принятых единицах, называемых абсолютным условным временем. С каждым сообщением связано относительное условное время, отчет которого начинается при входе сообщения в моделируемую систему и заканчивается при выходе сообщения из системы. Оcновными функциями управляющих операторов/блоков языка являются: 1) создание и уничтожение транзактов, 2) изменение их атрибутов, 3) задержка транзактов, 4) изменение маршрутов транзактов в системе: Основные группы объектов языка: 1) объекты, имитирующие единицы оборудования системы (устройство, память и логические переключатели); 2) статистические объекты (очередь, таблица), 3) вычислительные объекты (ячейка, арифметическая и логические переменные), 3 4) списки, 5) прочие объекты. В рассматриваемой версии языка реализованы следующие объекты языка: устройство, память, очередь, таблица, ячейка, арифметическая переменная. Устройство имитирует единицу оборудования, которое может одновременно обрабатывать только один транзакт. Устройство аналогично обслуживающему прибору в системе массового обслуживания (СМО). Оно служит для моделирования таких средств обработки элементов потоков, как устройства ЭВМ, каналы связи, станки, и т.п. На устройствах можно реализовать самые различные дисциплины обслуживания транзактов, включающие учет требуемого времени обслуживания, значения приоритетов, возможности прерывания и т.д. Память (накопитель) имитирует единицу оборудования, в которой может обрабатываться (храниться) несколько транзактов одновременно. Память позволяет легко моделировать средства обработки с ограниченной емкостью (стоянки автотранспорта, портовые причалы, устройства памяти ЭВМ, каналы телекоммуникаций, конвейеры и т.п.) Очередь - объект, связанный со сбором статистики о задержках, возникающих на прохождения транзакта. Чаще всего очередь помещают перед устройством либо памятью. Следует учитывать, что естественно образующиеся в процессе моделирования очереди транзактов обрабатываются стимулятором автоматически, а описываемый объект языка служит лишь для обеспечения вывода на печать соответствующих статистических данных. Таблица обеспечивает накопление в процессе моделирования статистики о какомлибо заданном случайном параметре модели. По окончании прогона модели эта статистика автоматически обрабатывается и выводится на печать, в частности, в виде таблицы относительных частот попадания значений случайного параметра (аргумента таблицы) в указанные частотные интервалы. Печатаются также среднее значение и среднее квадратное отклонение аргумента. Ячейки используются для записи, накопления и хранения численных значений различных входных и выходных параметров моделируемой системы. Эти значения могут быть использованы для организации счетчиков числа проходящих транзактов, для вывода значений варьируемых параметров модели, для временного хранения значений стандартных числовых атрибутов (СЧА). Значения ячеек всегда выводятся на печать. Арифметическая переменная позволяет выполнить заданную последовательность арифметических операций над любыми СЧА модели для вычисления значения зависимости от них параметра. Любая программа на GPSS связана с созданием транзактов, проведением их через последовательность блоков и уничтожением транзактов. При этом создание или генерация транзактов основывается на знании закономерностей информационных потоков, циркулирующих в моделируемой системе, а путь прохождения транзакта через блоки определяется спецификой работы оборудования исследуемой системы. Вложить в рамки формальной схемы GPSS конкретное смысловое содержание, определяемое исследуемой системой - задача непростая: для этого необходимо знать как формализмы языка, так и логику работы моделируемой системы. Тем не менее, программирование на GPSS существенно облегчает пользователю процесс моделирования, сокращая и время чистого программирования (по сравнению с универсальными алгоритмическими языками), и время отладки программы. 1.2. Синтаксис языка 4 Алфавит. Алфавит языка GPSS состоит из латинских букв от А до Z, цифр от 0 до 9 и следующих специальных символов: $ ,#, *, +, - , /, (,), ‘ , точка, запятая, пробел. Индентификаторы. Они должны содержать от трех до пяти алфавитноцифровых символов, причем первые три символа должны быть буквы. Идентификаторы используются для формирования имен объектов и блоков. Исключение составляют ячейки и атрибуты транзактов, которые могут обозначаться не только идентификаторами, но и просто числами. Блоки/операторы. Каждый блок языка записывается в отдельной строке и имеет следующую структуру: метка операция операнды комментарии. Каждое поле отделяется друг от друга пробелами, обязательным является только поле операции, остальные поля могут отсутствовать. Метка является именем-идентификатором блока. Поле операндов может содержать от 1до 7 подполей: А, В, С, D, E ,F, G, содержимое которых отделяется друг от друга запятой. Для пропуска одного из подполей поля операндов ставится просто запятая: А, , С. Комментарии, кроме поля комментариев, могут быть заданы отдельной строкой: любая строка, начинающая с символа “*”, тоже будет комментарием. Стандартные числовые атрибуты. В процессе моделирования язык GPSS автоматически регистрирует и корректирует определенную информацию различных объектов, используемых в модели. Доступ к этой информации осуществляется с помощью СЧА, которые однозначно определяют статус объектов модели. СЧА меняются в процессе имитации, изменить их может как симулятор, так и пользователь. Для указания конкретного объекта, по которому необходимо получить требуемую информацию, за именем СЧА должно следовать числовое имя этого объекта. Если используется символьное имя, то между СЧА и именем объекта ставится знак $. В таблице 1 приведены некоторые СЧА основных объектов языка. Здесь каждый СЧА обозначается либо имя СЧА i, либо имя СЧА $ имя объекта где i обозначает номер объекта. Таблица 1 Объект Стандартный числовой атрибут Назначение 1 2 3 N$имя объекта Число транзактов, вошедших в блок с указанным именем Число транзактов, находящихся в указанном блоке Случайное число в диапазоне 0 ч 999. При использовании СЧА в качестве аргумента функции представляются действительными числами в диапазоне 0.- 0.999999 Значение параметра Значение приоритета Текущее содержимое памяти Свободный объем памяти Текущая длина очереди Значение арифметической переменной Блок W$имя объекта Генераторы случайных чисел Транзакт Память Очередь Переменные Rni Pi PR S$имя объекта R$имя объекта Q$ имя объекта V$ имя переменной 5 1 Ячейки Функции 2 3 X$ имя ячейки или Xi FN$ имя функции Значение ячейки Значение функции Мнемокоды. В некоторых блоках языка требуется указывать состояние объектов, для этого используются следующие коды: Состояние объекта Память: пуста не пуста заполнена не заполнена Устройство: свободно занято Мнемокод E NE F NF NU U 1.3. Блоки языка GPSS 1.3.1. Создание и уничтожение транзактов Генерирование транзактов - GENERATE. Этот блок генерирует поток сообщений транзактов, поступающих в систему. Программа составляется с учетом того, что в этот блок не могут входить транзакты. В простых программах это обычно первый блок, временные интервалы между поступающими в систему транзактами определяются содержимым поля операндов. Код поля: А - среднее время между поступлениями транзактов в систему (по умолчанию равно 1); В - модификатор времени; С - начальная задержка (время появления первого транзакта); D - общее число транзактов, которое должно быть сгенерировано этим блоком (по умолчанию - неограниченное число транзактов); E - приоритет транзакта, может принимать значения от 0 до 127. Приоритет возрастает в соответствии с номером (по умолчанию равен 0); F - число параметров (атрибутов) транзакта (по умолчанию равно 12). В поле В может быть модификатор двух типов: модификатор-интервал и модификатор-функция. Если задан модификатор-интервал (просто число), то для каждого временного интервала поступления транзактов длительность определяется как значение случайной величины, равномерно распределенной на интервале [А-В, А+В]. Например, блок GENERATE 10,5 будет генерировать транзакты через интервалы времени, длительность каждого из которых выбирается случайно в пределах от 5 до 15 . Необходимо помнить, что время в GPSS всегда целое. Поэтому в пределах от 5 до 15 минут могут выбираться только целые значения времени. Каждое из этих значений будет выбираться с одинаковой вероятностью. Таким образом, блок генерирует случайный поток транзактов, в котором время между тразактами равномерно распределено в диапазоне А В и имеет среднее значение А. При использовании модификатора-функции интервал времени между транзактами определяется произведением содержимого полей А и В. Функция определяется специальными блоками языка, которые будут рассмотрены чуть позже. 6 В программе может быть несколько блоков GENERATE. Все эти блоки работают параллельно и начинают генерировать транзакты одновременно с момента начала моделирования. Необходимо помнить, что смысл единицы времени в языке GPSS (секунда, минута, час, день и т.д.) закладывает пользователь, поэтому при написании программы необходимо все операнды, связанные со временем, привести к единому масштабу. Блок уничтожения транзактов - TERMINATE. Обычно для простых программ это последний блок программы. Транзакты, попадающие в этот блок уничтожаются и больше не участвуют в процессе моделирования. Никаких других действий этот блок не выполняет, если единственный возможный операнд А в блоке не задан. Если же операнд А задан, то его значение вычитается из содержимого блока транзактов. Первоначальная величина счетчика устанавливается специальным управляющим блоком START и пишется в поле А этой карты. Когда в результате входа очередного транзакта в блок TERMINATE значение счетчика становится нулевым или отрицательным, симулятор прекращает моделирование и передает управление программе вывода, которая распечатывает накопленные симулятором данные о модели. Например: TERMINATE 1 START 100 Через программу модели пропускается 100 транзактов. Если ни в одном блоке TERMINATE не задан операнд А, то моделирование будет продолжаться, пока программа не будет снята. Если в программе несколько блоков TERMINATE, то обычно операнд А задается только в одном блоке; чаще всего - в блоке, относящемся к имитатору интервала времени моделирования (таймеру). GENERATE 480 TERMINATE 1 START 1 Таймер взаимодействует только с блоком START и никак не связан с содержательной стороной остальных фрагментов модели. Таймер служит для задания времени моделирования. 1.3.2. Задержка транзактов в блоках Блок ADVANCE предназначен для задержки транзактов на определенные интервалы модельного времени. Обязательный операнд А задает время задержки транзакта в блоке ADVANCE. Необязательный операнд В является модификатором-функцией или модификатороминтервалом. Значение операнда В используется здесь для модификации значения операнда А также, как в блоке GENERATE. Любой транзакт входит в блок ADVANCE беспрепятственно. В нем транзакт задерживается на период модельного времени, величина которого определяется операндами А и В. После этого транзакт направляется к следующему блоку. Например, в блоке ADVANCE 10 транзакт будет задержан на 10 единиц модельного времени. В блоке ADVANCE 10,Р1 7 транзакт будет задерживаться на случайное время, выбранное из диапазона 10 значение первого параметра транзакта (следует помнить, что значение первого параметра при этом не должно превышать 10, т.к. время не может быть отрицательным). 1.3.3. Работа с устройствами Блок SEIZE - занять устройство. При входе транзакта в блок SEIZE выполняется операция занятия устройства, имя которого задается операндом А блока SEIZE. Занятие устройства транзактом выполняется следующим образом. Когда транзакт направляется из какого-нибудь блока в блок SEIZE, симулятор проверяет, свободно ли следующее устройство. Если оно не свободно, транзакт не может войти в этот блок. Он остается в предыдущем блоке до тех пор, пока устройство не освободится. Если же устройство свободно, то транзакт передвигается в блок SEIZE, занимает устройство и в тот же момент времени направляется к следующему за SEIZE блоку. Блок RELEASE - освободить устройство. При входе транзакта в блок RELEASE происходит освобождение устройства, имя которого задается операндом А. При составлении моделей пользователь должен соблюдать правило: освободить устройство может только тот транзакт, который его занимает. Если транзакт попытается освободить устройство, занятое другим транзактом, симулятор прервет выполнение модели и выдаст сообщение об ошибке. В момент освобождения устройства должен быть решен вопрос о том, какой из задержанных транзактов (перед блоком SEIZE) имеет право первым занять устройство. Этот вопрос решается следующим образом: когда транзакты задерживаются перед блоком SEIZE, они регистрируются симулятором в списке, где упорядочиваются по приоритетам: любой транзакт с более высоким приоритетом ставится впереди транзакта, имеющего более низкий приоритет. Если у двух транзактов одинаковые приоритеты, то они упорядочиваются между собой по времени прихода: впереди ставится транзакт, который раньше обратился к устройству. В момент освобождения устройства его занимает тот из задержанных транзактов, который находится в списке первым. Транзакт может занимать любое число устройств. Освободить занятые устройства транзакт может в любом порядке. 1.3.4. Сбор статистических данных с помощью очередей Некоторые виды статистических данных накапливаются симулятором автоматически. Другие виды данных могут быть получены с помощью специальных блоков. При необходимости сбора данных по задержке транзактов перед блоками занятия устройства или памяти используются блоки и DEPART. Блок QUEUE - поставить в очередь. При входе транзакта в этот блок он ставится в очередь, имя которой задается операндом А. В начальный момент времени, когда очередь пуста, ее длина равно нулю. В момент входа в блок QUEUE ее длина увеличивается на величину, указанную в поле В. Если операнд В пуст, то длина очереди увеличивается на единицу. Блок DEPART - вывести из очереди. При входе транзакта в блок DEPART длина очереди, имя которой задается операндом А, уменьшается на величину, указанную в операнде В. При использовании пустого поля В в блоках QUEUE длина очереди равна текущему числу транзактов в этой очереди. Транзакты могут проходить любое число блоков QUEUE и DEPART с произвольными значениями полей А и В, чередующихся в любом порядке. 8 Необходимо помнить, что данные блоки не влияют на реальное образование очередей транзактов, а служат только для сбора статистических данных. Поэтому пользователь должен следить за правильным расположением этих блоков, чтобы не получать отрицательные длины образуемых очередей. Симулятор только подсчитывает статистику по очередям и не считает за ошибку отрицательные длины очередей. 1.3.5. Функции При использовании в блоках GENERATE и ADVANСE поля В в качестве модификатора функции, саму функцию необходимо описать специальным блоком языка FUNCTION. В поле метки данного блока стоит имя функции. В операнде А блока FUNCTION указывается аргумент функции, а в операнде В - тип функций и количество пар аргументов и значений. Существует два типа функций: С и Д. Функции типа С непрерывны, типа Д - дискретны. Например, С12 означает, что функция непрерывна и для ее описания будет использоваться 12 пар аргументов-функций. При описании любой из функций с помощью языка GPSS происходит интерполяция. Для дискретных функций - кусочно-постоянная интерполяция, для непрерывных - линейная интерполяция. Координаты функции, задаваемые парами, являются узлами интерполяции. За блоком описания функции FUNCTION всегда следует блок задания функции, в котором задаются координаты и значения функции. Каждая пара чисел координата-значение отделяется друг от друга слешем, пробелы недопустимы. В паре аргумент отделяется от значения функции запятой. Например, функция, график которой показан на рис.1.1,а, описывается на языке GPSS следующим образом: FUNC1 FUNCTION RN1, D3 .4,26.0/.8,40.8/1,6.08 Непрерывная функция показана на рис. 1.1,б: FUNC2 FUNCTION RN2,С3 0,10/.6,26/1,45 FN1 FN2 45 40,8 26,0 26 6,08 0 0 0,4 0,8 1 RN1 a 0,6 б Рис.1.1 - Графики дискретной (а) и непрерывной (б) функций 9 1 RN2 Блоки описания и задания функции располагаются в начале программы, между блоками SIMULATE и первым блоком GENERATE. Координаты точек функции записываются как числа с фиксированной точкой. Поскольку язык оперирует с целочисленными величинами, любое значение функции округляется до целого числа. Исключением являются использование функции в качестве модификатора в поле В блоков GЕNЕRATE и ADVANCE. Здесь округление до целого происходит после умножения значения соответствующей функции на содержимое поля А этих блоков. В языке существует 8 датчиков равномерно распределенных случайных чисел, которые обозначаются RNI - RN8. Эти датчики выдают равновероятные целочисленные значения из диапазона 0 999. Если датчик используется в качестве аргумента функции, то он выдает вещественные числа в диапазоне 0 1. Для генерации случайных величин, распределенных по экспоненциальному закону, можно использовать встроенную функцию с именем XPDIS. Для нормально распределенных величин используется встроенная функция с именем SNORM. Для этих функций блоки описания необязательны. 1.3.6. Изменение маршрутов сообщений Блок TRANSFER позволяет осуществлять безусловные и статистические переходы. Тип перехода определяется в операнде А, направление перехода - в операндах В и С. В режиме безусловного перехода операнд А в блоке пуст. Все транзакты переходят к блоку, указанному в поле В. Например: TRANSFER,NEXT Если блок, к которому направляется транзакт, в текущий момент системного времени не может его принять (например, блок SEIZE), то транзакт остается в блоке TRANSFER и повторяет попытку перехода при каждом пересчете системного времени симулятором. Если в поле А блока TRANSFER записана десятичная дробь, начинающаяся точкой, то блок работает в режиме статистического перехода. Здесь десятичная дробь определяет вероятность перехода транзакта к блоку, имя которого указывается в поле С. При этом поле В пустое. С вероятностью (1 - <A>) транзакт переходит к блоку, следующему за блоком TRANSFER. Если оба блока заняты, то транзакт остается в блоке TRANSFER и повторяет попытку перехода к выбранному ранее блоку при каждом изменении системного времени. Условный переход. Для организации условного перехода используется оператор IF, операнд А которого указывает условие перехода транзактов, а в поле В указывается имя блока, куда направляются транзакты, если условие перехода выполняется. При описании условия используются операции отношения: >, <, =, а также различные СЧА объектов, числовые константы, мнемокоды. Например, при входе транзакта в оператор IF KASS = NU,KAS1 проверяется условие свободно ли устройство с именем KASS. Если устройство свободно, то транзакт направляется к блоку с именем KAS1, в противном случае транзакт направляется к блоку, стоящему непосредственно за оператором IF. Условная задержка транзакта. В случае если необходимо задержать транзакт перед каким-либо блоком до выполнения определенного условия, используется оператор WAITIF. В поле А этого оператора задается условие задержки и транзакт остается в данном блоке до тех пор, пока это условие истинно, как только условие становится ложным, транзакт продолжает свой путь. 10 Здесь для описания условия используется только операция сравнения, где слева указывается имя памяти либо устройства, чье состояние проверяется, а справа - мнемокод состояния. Например, в блоке WAITIF STR=F транзакт будет задержан до тех пор, пока память с именем STR будет полной. 1.3.7. Работа с памятью Память - особый объект языка, который призван имитировать разного рода накопители, используемые в исследуемых системах, в которых может одновременно находиться несколько транзактов. Для каждой применяемой памяти пользователь должен указать ее емкость - объем памяти, определяющий максимальное количество транзактов, которые могут одновременно находиться в ней. Для указания емкости используется оператор описания памяти STORAGE. Как любой оператор описания языка этот блок помещается между блоком SIMULATE и первым блоком GENERATE. Поле метки содержит имя памяти, а операнд А указывает емкость памяти. Например, для описания памяти емкостью 10 единиц используется блок STR STORAGE 10. В начальный момент времени все памяти пустые. Если в ходе моделирования транзакт обращается к неописанной памяти, ее объем принимается равным 231 -1 единиц. Блок ENTER - занять память. В поле А блока указывается имя памяти, в которую помещается транзакт, в поле В - число единиц памяти, занимаемых транзактом при входе. Когда транзакт входит в блок ENTER, определяется число свободных единиц памяти. Если значение операнда В не превышает числа свободных единиц памяти, то число занятых единиц увеличивается на значение операнда В. В этом случае транзакт входит в блок ENTER без задержки. Если же значение операнда В превышает число свободных единиц памяти, транзакт задерживается перед входом в блок ENTER. Задержанные при обращении к памяти транзакты упорядочиваются по приоритету. Если поле В в блоке ENTER пустое, то число занимаемых единиц памяти принимается равным единице. Пусть транзакт “х” задержан перед входом в блок ENTER. Если для транзакта “у”, приходящего после “х”, свободной емкости памяти достаточно, то “у” войдет в блок без задержки. Блок LEAVE - освободить память. В поле А блока указывается имя освобождаемой памяти, в поле В - число освобождаемых единиц. В случае пустого поля В число освобождаемых единиц памяти принимается равным единице. При входе транзакта в блок LEAVE количество занятых единиц памяти, указанной в поле А, уменьшается на значение операнда В. Перед входом в блок транзакты не задерживаются. Транзакт не должен освобождать большее число единиц памяти, чем их всего занято. Если же транзакт пытается это сделать, то симулятор выдает на печать сообщение об ошибке и прекращает выполнение модели. В тот момент модельного времени, когда транзакт освобождает память, симулятор просматривает список задержанных у памяти транзактов, если они есть. Для каждого очередного транзакта проверяется, может ли он теперь быть обслужен памятью. Если такая возможность есть, то симулятор перемещает этот транзакт в блок ENTER, и в результате число занятых единиц памяти соответствующим образом увеличивается. Транзакт не обязан освобождать такое же число единиц памяти, какое занимал. Он может освобождать память, которую не занимал. Транзакт имеет право занимать и освобождать любое количество памятей, при этом операции занятия и освобождения могут чередоваться в произвольном порядке. 11 1.3.8. Вычислительные объекты языка Арифметические переменные. Для того чтобы использовать в программе переменную, необходимо сначала ее описать оператором описания VARIABLE либо FVARIABLЕ. В поле метки оператора записывается имя переменной, в операнде А арифметическое выражение, составляемое из СЧА, знаков арифметических операций и круглых скобок. Используются следующие арифметические операции: +, -, *, /, @ - взять остаток от деления. Приоритет операций стандартный. Деление на ноль не считается ошибкой, и результатом такого деления является ноль. Остаток от деления также считается равным нулю. При вычислении переменной, описанной оператором VARIABLE, от всех СЧА в арифметическом выражении и от результатов всех операций берется целая часть. При вычислении переменной, описанной FVARIABLЕ, этого не делается. Однако окончательное значение переменной, независимо от используемого оператора описания, округляется до целого числа. Например, если описаны переменные VAR1 VARIABLE 10* (11/3) VAR2 FVARIABLE 10* (11/3), то значение VAR1 будет равно 30, значение VAR2 - 36. При использовании переменной в программе указывается СЧА переменной: V$<имя переменной>, например, ADVANCE V$VAR1 - задержать транзакт на время, заданное переменной VAR1. Ячейки служат для хранения некоторых постоянных или изменяющихся значений данных программы. В отличие от большинства объектов языка ячейка может обозначаться как именем, так и числом. Для работы с ячейками, обозначаемыми числом, используется блок SAVEVALUE. В поле А этого блока указывается номер ячейки, сохраняющей значение, и вид изменения этого значения (“+”-накопление, “-” -уменьшение). В поле В содержится либо СЧА, либо целое число, которое добавляется либо вычитается, либо заменяет содержимое ячейки. Например: SAVEVALUE 10+,1 - при поступлении транзакта в блок, к содержимому 10-Й ячейки прибавляется единица. Или SAVEVALUE 1,V$VAR1 - при поступлении транзакта в блок, в первую ячейку записывается значение переменной VAR1. Для работы с поименованными ячейками используются операторы LET, LET+, LET-, позволяющие записать, прибавить или вычесть число из ячейки соответственно. В поле А этих блоков указывается СЧА ячейки: X$<имя ячейки>, в поле В - арифметическое выражение из СЧА ячеек либо число. Например, LET X$UCHI,5 LET+ X$UCH2,X$UCH1 LET- X$UCH3,X$UCH1+X$UCH2 Чаще всего на базе ячеек организуются разного рода счетчики. Перед началом имитации содержимое всех используемых в программе ячеек устанавливается в 0. Если же требуется задать значение какой-либо из ячеек до начала моделирования, то для этого используется оператор LET, в поле А которого задается арифметическое выражение присваивания. Например, LET X$UCH1=10 - присвоить ячейке с именем UCH1 значение 10. Этот оператор должен помещаться между блоком SIMULATE и первым блоком GENERATE. 1.3.9. Приоритеты 12 Каждый транзакт может иметь свой приоритет - от 0 до 127. Чем больше номер, тем больше приоритет. Предпочтение в системе отдается транзактам с большим приоритетом, ранее поступившим. Для изменения приоритета транзакта в процессе его путешествия по системе используется блок PRIORITY. Поле А этого блока определяет значение присваиваемого приоритета. Например, при прохождении через блок PRIORITY 3 транзакту будет присвоен приоритет 3. 1.3.10. Изменение параметров транзакта Каждый транзакт может иметь до 100 параметров (атрибутов). Значения параметрам присваиваются с помощью блока ASSIGN. В поле А этого блока указывается номер параметра и вид его изменения, в поле В определяется записываемое в параметр значение. Приписывая к номеру параметра в поле А символ + или -, можно обеспечить не запись значения поля В в параметр, а добавление или вычитание этого значения из значения параметра. В поле В значение может быть задано как целым числом, так и СЧА. Например: ASSIGN 1,10 занести 10 в Р1 ASSIGN 2+,V$VAR1 добавить в Р2 значение переменной VAR1 ASSIGN 3-,S$STR вычесть из Р3 значение текущего содержимого памяти Используя блок ASSIGN, можно организовывать циклы в программе. Например, если необходимо прогнать транзакт 10 раз через блок ADVANCE, это можно осуществить следующим образом: ASSIGN 1,10 занести 10 в Р1 транзакта PROD ADVANCE 52 ASSIGN 1-,1 вычесть 1 из Р1 IF P1>0,PROD продолжить цикл, пока счетчик не обнулился 1.3.11. Статистические таблицы Объект типа таблицы представляет собой эквивалент понятия “гистограмма”. Гистограммы применяются для статистического анализа такой случайной величины, функция распределения которой неизвестна, но зато имеется достаточно большое число независимых реализаций этой величины. Для того, чтобы таблицы можно было использовать в модели, они должны быть описаны. Для описания таблицы используется блок TABLE. В поле метки этого блока задается имя таблицы, в поле А - аргумент таблицы в виде СЧА. Здесь аргументом таблицы является исследуемая случайная величина. Исключением может быть время, проводимое транзактом в очереди. Если необходимо исследовать это время, то в поле А блока TABLE указывается имя очереди, время нахождения в которой нас интересует. В поле В указывается верхняя граница первого частотного интервала, в поле С - ширина интервалов, а в поле D - их число, включающее оба полубесконечных интервала. Например, если нас интересует гистограмма времени, проводимого одним транзактом в очереди LIN, то мы можем описать таблицу следующим блоком: TBL TABLE LIN,10,20,5 Графически гистограмма должна располагаться следующим образом: 13 1-й интервал 2-й 3-й 4-й 5-й интервал tLIN 50 70 10 20 Если таблица описана, то транзакты могут фиксировать в ней информацию с помощью блока TABULATE. В поле А этого блока указывается имя таблицы, в которой накапливается информация. При входе транзакта в блок TABULATE вычисляется значение аргумента указанной таблицы и определяется, в какой из интервалов таблицы это значение попадает. После этого счетчик соответствующей интервальной частоты увеличивается на 1. В результате моделирования на печать по каждой таблице выдается информация в виде, показанном в приложении Б. Для каждой таблицы автоматически осуществляются оценки среднего и среднеквадратического отклонений. 1.3.12. Синхронизация транзактов Любые элементы в системах прямо или опосредованно связаны, взаимодействуют. Зависимость между процессами, протекающими в разных частях системы, нередко выражается в форме синхронизации, то есть в форме взаимного согласования этих процессов по времени. Блок SPLIT предназначен для моделирования одновременного начала нескольких процессов. В момент входа транзакта в блок SPLIT создается несколько копий этого транзакта. Число копий задается в поле А. Все копии переходят в блок, определенный в поле В. Исходный (порождающий) транзакт переходит к блоку, следующему за SPLIT. Если поле С блока SPLIT пустое, то все копии идентичны породившему их транзакту. Например, при входе транзакта в блок SPLIT 4,NEXT порождается четыре транзакта, идентичных вошедшему, и передается в блок, в поле метки которого записано NEXT. Породивший их транзакт передается в блок, записанный после блока SPLIT. Всего из блока SPLIT выходит пять транзактов. Если поле С непустое, то его значение интерпретируется как номер параметра транзакта. Пусть N - значение этого параметра в момент входа транзакта в блок SPLIT. Тогда в момент выхода из SPLIT данный параметр у исходного транзакта будет иметь значение N+1, а у копий транзактов соответственно N+2, N+3,..., N+K, где К - общее число вышедших из блока SPLIT транзактов. Например, если транзакт, имеющий нуль в десятом параметре, войдет в блок SPLIT 2,АВСD,10, то параметр Р10 у этого транзакта приобретет значение 1, а у копий - соответственно 2 и 3. Транзакты-копии могут двигаться в модели независимо друг от друга. Копии могут проходить блоки SPLIT и порождать новые копии. Множество, состоящее из исходного транзакта и всех его копий, называется семейством транзактов. Копия члена семейства является членом того же семейства. Любой транзакт - член только одного семейства. Блок ASSEMBLE - одновременное завершение нескольких процессов. Блок собирает заданное в поле А число транзактов одного семейства и превращает их в один транзакт. Первый из транзактов какого-либо семейства, вошедший в блок, задерживается до тех пор, пока в этом блоке не накопится заданное число транзактов того же семейства. 14 После этого первый транзакт выходит из блока ASSEMBLE, а остальные транзакты этого семейства уничтожаются. В одном блоке ASSEMBLE могут одновременно проходить сборку транзакты, принадлежащие к разным семействам. Например, если в блок ASSEMBLE 4 поступают транзакты разных семейств, то транзакты каждого семейства собираются по четыре и каждая четверка превращается в один транзакт. 1.3.13. Прерывание работы устройства Блок PREEMPT - захватить устройство. Транзакт, попадающий в блок PREEMPT, захватывает устройство, имя которого указано в поле А блока. Если при захвате устройства оно свободно, то транзакт просто занимает устройство, в этом случае блок PREEMPT работает аналогично блоку SEIZE. Если при входе транзакта в блок PREEMPT устройство занято другим транзактом, то в этом случае транзакт входит в блок PREEMPT, а устройство прерывает обслуживание занимающего его транзакта и переключается на обслуживание транзакта, вошедшего в блок PREEMPT. При этом из состояния “занято” устройство переходит в состояние “захвачено”. Когда транзакт, захватывающий устройство, освободит его, устройство возобновит прерванное обслуживание другого транзакта и перейдет в состояние “занято”. Если прерываемый транзакт в момент прерывания находится в блоке ADVANCE, то, начиная с момента прерывания, отчет времени пребывания транзакта в этом блоке прекращается до тех пор, пока не будет восстановлено обслуживание транзакта. Таким образом, в момент восстановления прерванного обслуживания транзакта время, оставшееся этому транзакту до выхода из блока ADVANCE, такое же, каким оно считалось непосредственно в момент прерывания. Такое прерывание обслуживания называется прерыванием с последующим дообслуживанием. Все транзакты, задержанные при обращении к устройству, упорядочиваются по приоритету. Кроме поля А, в блоке PREEMPT могут быть заданы операнды В, С, D и Е. Операнд В записывается в виде обозначения РR, задающего приоритетный режим работы блока. В этом режиме транзакт захватывает устройство, если оно свободно или обслуживает менее приоритетный транзакт. Прерывание обслуживания менее приоритетного транзакта происходит с последующим дообслуживанием. Для определения последующего движения прерванных транзактов используются другие операнды. В поле С может быть указана метка какого-либо блока, на который будет передан прерванный транзакт. При этом прерванный транзакт продолжает претендовать на данное устройство. В поле D блока может быть задан номер параметра транзакта. Тогда, если прерванный транзакт находится в блоке ADVANCE, то вычисляется остаток времени обслуживания (время дообслуживания), и полученное значение помещается в параметр, заданный в поле D. Прерванный транзакт при этом будет послан в блок, указанный в поле С. Прерванный транзакт продолжает претендовать на данное устройство. Если в поле Е блока записано обозначение RE, то прерванный транзакт больше не будет претендовать на данное устройство. Блок RETURN - освободить устройство. Этот блок используется в паре с блоком PREEMPT. Если транзакт захватил устройство посредством блока PREEMPT, то освободить его он может только в блоке RETURN. Имя освобождаемого устройства задается в поле А блока. 1.3.14. Управляющие блоки 15 Блок SIMULATE означает начало имитации и указывает симулятору на необходимость выполнения моделирования. В этом блоке может использоваться поле А, в котором в этом случае указывается количество повторений моделирования. Например, SIMULATE 5 показывает, что модель должна быть выполнена пять раз. По умолчанию модель выполняется один раз. Блок START воспринимается как команда симулятору начать выполнение прочитанной части модели. В этом блоке в поле А также задается начальное значение счетчика транзактов. Здесь также может быть использовано поле В в значении NP, что означает - не выводить статистику по окончании моделирования. Если задан блок START 1,NP, то подается вывод всей информации об устройствах, памятях, очередях, таблицах и ячейках. В этом случае выводится только информация о переменных, указанных в блоках PRINT. Блок PRINT выводит информацию о переменных, СЧА которых указано в поле А этого блока. В поле С блока START можно задать начальное значение счетчика промежуточной печати. Содержимое этого счетчика уменьшается при входе транзактов в блок TERMINATE так же, как содержимое счетчика в поле А. Когда значение счетчика в поле С становится равным нулю или отрицательным, производится выдача статистики в обычном формате и восстанавливается начальное значение этого счетчика. После этого выполнение модели продолжается. Например, при использовании карты START 5,,1 совместно с блоком TERMINATE 1 выдача статистики в процессе моделирования будет произведена 5 раз. Блок RESET предназначается для стирания в заданный момент времени статистики о предыстории процесса. Достигнутое состояние объектов при этом сохраняется. Применение блока RESET позволяет уменьшить затраты машинного времени на сбор статистики о стационарном (в смысле вероятностных характеристик) процессе в тех случаях, когда предшествующий ему переходный процесс вносит заметные искажения в накапливаемую статистику. Обычно блок RESET помещается в модели после блока START, а после RESET располагается следующий блок START. После прочтения блока RESET засылается нулевое содержимое в счетчики числа входов в блоки, коэффициенты использования устройств и памятей, а также обнуляются все накопленные статистики. При этом сохраняются текущие состояния и значения устройств, памятей, очередей, ячеек и датчиков случайных чисел. Блок CLEAR переводит всю модель - всю статистику и все объекты - в исходное состояние. Исключением является лишь датчик случайных чисел - он не возвращается к начальному значению. Применение блока CLEAR позволяет осуществить независимые реализации моделируемого случайного процесса. 16 2. РАЗРАБОТКА И ЭКСПЛУАТАЦИЯ МОДЕЛЕЙ В GPSS WORLD 1. Создание объекта «Модель» Пример 1. В ремонтное подразделение с одним каналом гут поступать неисправные средства связи (СС) двух типов. СС первого и второго монтируются одними и теми же мастерами ремонтного отделения. Интервалы времени поступления СС первого типа распределены равномерно 20±10 часов. Распределение интервалов времени поступления СС второго типа 15±8 часов. Поступающие СС ремонтируются в последовательности: первым поступило — первым отремонтировано. На ремонт СС первого типа затрачивается 6±2 часа, второго типа — 8±4 часов. Функционирование ремонтного подразделения можно промоделировать посредством двух независимых сегментов или последовательностей блоков. Первая последовательность моделирует ремонт СС первого типа, а вторая - второго типа. В качестве единицы модельного времени взята 1 мин. Время моделирования — 3 суток (72 часа). При построения модели используем следующие идентификаторы: О Reml — ремонтное подразделение с одним каналом обслуживания; О RemQ — общая очередь неисправных СС в ремонт, О RemQl — очередь неисправных СС первого типа; О RemQ2 — очередь неисправных СС второго типа; О VrRem — имя таблицы, в которой будет табулироваться общее время нахождения неисправного СС в ремонте; О VrReml — имя таблицы, в которой будет табулироваться время нахождения в ремонте неисправного СС первого типа; О VrRem2 — имя таблицы, в которой будет табулироваться время нахождения в ремонте неисправного СС второго типа. 1. Запуск GPSS World Запуск GPSS World производится двойным щелчком мыши на его значке, который после установки программы располагается на рабочем столе. Окно Notices (Заметки) появляется самостоятельно. Оно (рис. 1) содержит текущую информацию об обновлениях и другие полезные сведения. Рис. 1. Окно Notices (Заметки) 17 После закрытия окна Notices появляется главное окно (рис. 2) GPSS World. Рис. 2. Главное окно GPSS World Главное окно состоит из нескольких компонентов. В верхней части расположена строка заголовка. Ниже находится основное меню, а еще ниже - панель инструментов, за которой расположена клиентская область. В самой нижней части главного окна размещена строка состояния, разделенная на три части. Левая часть строки состояния показывает подсказки с информацией об используемых пунктах меню. Средняя часть строки состояния показывает сообщения об ошибках. Правая часть строки состояния имеем небольшую область, используемую для отображения модельного времени в процессе выполнения модели. Включение или выключение показа модельного времени (таймера) для каждого объекта «Процесс моделирования» производится установкой или сбросом флажка View ▶ Simulation Сlock (Вид ▶ Модельное время). Все объекты GPSS World имеют меню в их собственных окнах. Однако большинство действий запускается из главного окна с помощью основного меню (File, Edit, View, Windows, Help (Файл, Правка, Поиск, Вид, Окно, Справка)). Каждый пункт основного меню имеет команды подменю, большинство из которых доступны для использования только в определенных случаях. Это сделано для оказания помощи в выборе правильных действий. В недоступном (отключенном) состоянии команды меню отображаются серым цветом и не могут быть выбраны. Существуют три варианта работы с моделью: o выбор с помощью мыши последовательности пунктов меню; o нажатие клавиши [Alt] для активизации меню с последующим нажатием подчеркнутого символа в названии каждого пункта меню; o использование клавиш быстрого доступа, указанных справа от пунктов меню. Нам необходимо создать новый объект «Модель». Операторы модели написаны. Теперь нужно их ввести. 18 2. Ввод операторов модели Для обработки текста GPSS World имеет текстовый редактор. Выберем File ► New (Файл ► Новый). После этого появится меню: Рис. 3. Меню выбора объекта типа «Модель» или текстового объекта Так как нужно создать объект «Модель», выберем Model. Откроется окно текстового редактора: Рис. 4. Окно текстового редактора Приведем программу на GPSS Примера 1. ; Пример 1 ; Определение таблиц VrRem1 Table M1,420,180,5 VrRem2 Table M1,420,180,5 VrRem Table M1,420,180,5 ;Сегмент имитации ремонта СС первого типа GENERATE 600,300 ; Источник СС первого типа QUEUE RemQ ; Встать в общую очередь QUEUE RemQ1 ; Встать в очередь СС первого типа SEIZE Rem1 ; Занять ремонтное подразделение 19 DEPART RemQ ; Покинуть общую очередь DEPART RemQ1 ; Покинуть очередь СС первого типа ADVANCE 360,120 ; Имитация ремонта RELEASE Rem1 ; Освободить ремонтное подразделение TABULATE VrRem1 ; Данные о СС первого типа TRANSFER ,Met1 ; Отремонтированные СС первого типа ;Сегмент имитации ремонта СС второго типа GENERATE 720,480 ; Источник СС второго типа QUEUE RemQ ; Встать в общую очередь QUEUE RemQ2 ; Встать в очередь СС второго типа SEIZE Rem1 ; Занять ремонтное подразделение DEPART RemQ ; Покинуть общую очередь DEPART RemQ2 ; Покинуть очередь СС второго типа ADVANCE 480,240 ; Имитация ремонта RELEASE Rem1 ; Освободить ремонтное подразделение TABULATE VrRem2 ; Данные о СС второго типа в таблицу Met1 TABULATE VrRem ; Данные о СС обоих типов в таблицу TERMINATE ; Отремонтированные СС первого и второго типов ;Сегмент задания времени моделирования GENERATE 4320 TERMINATE 1 Модель примера 1 начинается с заголовка, выделенного жирным. В текстовом редакторе GPSS World по умолчанию используется шрифт Courier New. Данный шрифт облегчает выравнивание колонок текста модели и особенно стандартного отчета, так как все символы этого шрифта имеют одинаковую ширину. Однако этот шрифт можно изменить. Изменим его, например, дли заголовков сегментов модели. Выберем File ► Font (Файл ► Шрифт) и получим окно установки шрифта. Установим Times New Roman, жирный, 10 (рис. 5). Рис. 5. Окно установки шрифта 20 Для набора второй строки изменим шрифт жирный на курсив жирный. После набора этой строки вернемся к шрифту Courier New и приступим к вводу команды определения таблиц. Введем имя VrReml. Для перехода к вводу TABLE следует воспользоваться клавишей [Tab]. Интервалы табуляции установлены по умолчанию. Но они также могут быть изменены в настройках объекта «Модель» на странице Function Key. (поле Model Tabstops). Оставим интервалы табуляции без изменения и продолжим набор команды, определяющей таблицу с именем VrReml. Следующие две команды определения таблиц отличаются от первой команды только последними символами в именах. Поэтому можно воспользоваться копированием первой команды и последующим ее редактированием. Выделим строку и поместим ее в буфер обмена Существуют три способа выделения текста. При первом способе можно поместить курсор в начале строки и «протащить» его вдоль страницы, удерживая левую клавишу мыши нажатой. Подсвеченный текст считается выделенным. При втором способе нужно щелкнуть мышью слева от первого символа V имени VrRem1. Затем, нажав и удерживая клавишу [Shift], щелкнуть мышью справа от последнего символа (5) Ml, 420, 180, 5. Третий способ состоит в копировании отдельного слова. Для этого нужно два раза щелкнуть мышью на слове. Для помещения копии выделенного текста выберем Edit ► Сору (Правка ► Копировать). Теперь поместим курсор в начало следующей (пустой) строки и выберем Edit ► Paste (Правка ► Вставить). Для вырезания, копирования и вставки выделенного фрагмента текста можно также использовать комбинацию клавиш [Ctrl]+[X], [Ctrl]+[C], [Ctrl]+[V]. После редактирования имен таблиц получим (рис. 6). Рис. 5. Окно тестового редактора с командами определения таблиц Можно таким же образом продолжить ввод остальных операторов модели. Однако мы воспользуемся окном Insert GPSS Blocks (Вставить блок GPSS) и окнами создания блоков. Выберем Edit ► Insert GPSS Blocks... (Правка ► Вставить блок GPSS...). В окне (рис.7) выберем GENERATE и щелкнем левой кнопкой мыши. 21 Рис. 7. Меню блоков GPSS Появится окно создания блока GENERATE (рис. 8) с курсором в окошке операнда А. Введем 600. Для перехода в окошко операнда В нажмем клавишу [Tab] и затем введем 300. Далее последовательным нажатием клавиши [Tab] либо мышью переведем курсор в окошко Comment. Введем комментарий: Источник СС первого типа (рис. 9). Рис. 8. Окно создания блока GENERATE (пустое) 22 Рис. 9. Окно создания блока GENERATE (заполненное) Теперь нужно нажать ОК. В модели появится оператор GENERATE 600,300; Источник СС первого типа Продолжим ввод операторов модели и получим (рис. 10). Рис.10. Фрагмент модели примера 1 в окне текстового редактора Для внесения изменений в текст используются и другие опции меню Edit (Правка). Для отмены неверно сделанного изменения, т. е. возвращения файла к предыдущему состоянию, используется пункт меню Undo (Отмена) ([Ctrl]+[Z]). Команда Delete Line (Удалить строку) ([Ctrl]+[D]) удаляет строку, на которой расположен курсор. Команда Insert Line (Вставить строку) ([Ctrl]+[I]) помещает новую строку ниже строки, на которой расположен курсор. 23 Рассмотрим команды меню Search (Поиск), которые также могут использоваться для редактирования текста. Команда Find ► Replace (Найти ► Заменить) и диалоговое окно Find Replace (рис. 11) подобны аналогичным в других текстовых редакторах. Рис. 11. Диалоговое окно Find Replace Для сохранения объекта «Модель» создадим папку МОДЕЛЬ. Далее выберем File ► Save As... (Файл ► Сохранить как...). В появившемся окне (рис. 12) вместо Untitled укажем Пример_1 и нажмем Сохранить ([Ctrl]+[S]). В последующем для открытия этой модели или какой-либо другой необходимо использовать команду File ► Open (Файл ► Открыть) ([Ctrl]+[O]). Рис. 12. Диалоговое окно Save As... (Сохранить как...) 2. Создание объекта «Процесс моделирования» Объект «Процесс моделирования» представляет собой оттранслированный объект «Модель». Для трансляции объекта «Модель» необходимо выбрать Command ► Create Simulation (Команда ► Создать процесс моделирования) ([Ctrl]+[Alt]+[S]). По этой команде транслятор GPSS проверяет модель на наличие синтаксических ошибок. При отсутствии синтаксических ошибок транслятор активизирует все интерактивные команды и окна для того, чтобы можно было следить за состоянием процесса моделирования и управления им. Однако чаще всего синтаксические ошибки в объекте «Модель» имеются. Предположим, что есть они и в модели Пример_1. Пусть при вводе третьем строки вместо Table набрано Tale и, поскольку следующие две строки (четвертая и пятая) были введены 24 посредством копирования, эта ошибка оказалась и в них. Вследствие ошибок объект «Процесс моделирования» не может быть создан. В окне JOURNAL (Журнал) транслятор выдаст список сообщении об ошибках трансляции (рис. 13). Рис. 13. Окно JOURNAL со списком сообщений об ошибках трансляции Для поиска ошибок и их исправления следует воспользоваться командой Search ► Next Error (Поиск ► Следующая ошибка) ([Ctrl]+[Alt]+[N]). При первом выполнении этой команды курсор мыши помещается в строке текста модели с ошибкой (рис. 14). Рис. 14. Курсор мыши в строке текста модели с ошибкой Ошибка исправляется и, поскольку ошибок три, то еще дважды применяется команда Search ► Next Error. Следует иметь в виду, что помимо помещения курсора мыши в строку с 25 ошибкой каждая ошибка при этом также описывается в строке состояния главного окна (см. рис. 14). Команда Search ► Previous Error (Поиск ► Предыдущая ошибка) ([Ctrl]+[Alt]+[P]) позволяет просмотреть список ошибок трансляции в тексте модели в обратном направлении. После исправления ошибок повторно выполняется трансляция. Ее можно также выполнить командой Command ► Retranslate (Команда ► Повторная трансляция) ([Ctrl]+[Alt]+[R]). В случае отсутствия ошибок, обнаруживаемых транслятором, в окне JOURNAL появляется об этом сообщение (рис. 15). Рис. 15. Окно JOURNAL с сообщением об отсутствии ошибок Теперь можно запустить процесс моделирования. Для этого нужно выбрать Command ► Start (Команда ► Старт). Появится диалоговое окно (рис. 16), в котором имеется возможность заменить 1 на любое количество прогонов, например, на 100 или 100,NP (NP стандартный отчет не выводится). Рис. 16. Диалоговое окно команды Start После нажатия 0К произойдет останов по ошибке выполнения и в окне JOURNAI будет выдано об этом сообщение (рис. 17). Сообщение указывает, что транзакт пытается освободить ОКУ, которое не было им занято, т. е. в блоке RELEASE в данной модели нужно было указать Reml, а не Rem. При останове по ошибке транслятор не создает список ошибок выполнения, подобный списку ошибок трансляции. Поэтому использовать команду Search ► Next Error нельзя. Строку с ошибкой нужно найти самостоятельно. Для этого следует воспользоваться командой Search 26 Рис. 17. Окно JOURNAL с сообщением об ошибке выполнения ► Go To Line… (Поиск ►Перейти к строке…) ([Ctrl]+[Alt]+[G]). Номер строки, которую нужно найти, указан в сообщении об ошибке выполнения (см. рис. 17, Line 14). Объект «Процесс моделирования» создан. 3.3. Отчеты По окончании работы модели система автоматически создает отчет. Статистическая информация выводится только о тех объектах, которые присутствуют в модели. В общем же стандартный отчет содержит кроме общей характеристики модели следующие сведения: o об именах объектов модели; o блоках модели; o устройствах; o многоканальных устройствах; o очередях; o списках пользователя; o статистических таблицах; o матрицах; o группах транзактов; o числовых группах; o логических переключателях; o сохраняемых величинах; o списке текущих событий; o списке будущих событий. Необходимость в выводе списков текущих и будущих событий определяет операнд D команды START. Если операнд D не равен нулю, списки выводятся. Вывод отчета может быть заблокирован. Для этого в поле операнда В команды START необходимо записать NP. Создание стандартных отчетов можно также отключить, сняв флажок Create Standard Report (Создавать стандартные отчеты) на странице Reports (Отчеты) журнала настроек модели. 27 Каждому отчету присваивается имя. Это имя по умолчанию составляется из имени файла модели, порядкового номера процесса моделирования, созданною из этого файла, и номера отчета данного процесса моделирования. Нумерация отчета начинается с 1. У файлов с отчетами имеется расширение .qpr. Например, Пример_1.1.1. qpr, Пример_1.1.2. qpr и т. д. При удалении некоторых отчетов их порядковые номера в сеансе работы будут непоследовательными. Имя отчета, формируемое системой, пользователь изменить не может. Отчеты являются специально отформатированными файлами. Если возникает необходимость сохранить какой-либо отчет с именем пользователя, его нужно скопировать в буфер обмена, а из него — в соответствующий файл. Любой отчет можно распечатать из окна Report (Отчет) с помощью команды File ► Print (Файл ► Печать) в главном меню. Отчет может настраиваться. Откройте модель Пример_1. Выберите Edit ► Settings (Правка ► Настройки) Перейдите на страницу Reports (отчеты) (рис. 18). Вы увидите перечень объектов GPSS, данные о которых по умолчанию включаются в отчет. По желанию пользователя перечень объектов можно изменить, сняв или установив соответствующие флажки. Рис. 18. Страница Reports (Отчеты) журнала настроек модели Запустите процесс моделирования. По его завершению автоматически появляется окно Report (Отчет) (рис. 19). Окно Report (Отчет) предоставляет возможности редактирования текста, изменения шрифта, цвета текста и печати. Закройте окно отчета. Ответьте No (Нет) на вопрос о сохранении файла отчета. Используйте команду RFPORT для получения отчета в момент времени, когда транзакт пытается войти в интересующий вас блок. Щелкните мышью в любом месте окна Journal (Журнал), которое вы не закрыли. Выберите сначала Command ► CLEAR (Команда ► CLEAR), потом Window ► Simulation Window ► Blocks Window (Окно ► Окно процесса моделирования ► Окно «Блоки»). В окне Blocks (Блоки) выберите блок TERMINATE (блок 21), затем нажмите кнопку Place (Поместить) на панели инструментов окна Blocks (Блоки). В блок 21 было помешено условие остановки. Выберите Command ► START (Команда ► СТАРТ). 28 Рис. 19. Окно Report (Отчет) Вместо 1 наберите 100 и нажмите ОК. Процесс моделирования остановится и транзакт будет задержан в блоке 20 с меткой Metl. Выберите Command ► Custom... (Команда ► Выбрать...). Введите команду REPORT и нажмите ОК. Сразу же появится окно с отчетом для момента времени, в который было остановлено моделирование. Контрольные вопросы 1. 2. 3. 4. 5. 6. На решение каких задач моделирования ориентирован язык GPSS? Что понимается под транзактом? Перечислите основные функции управляющих операторов/блоков языка GPSS. Перечислите основные группы объектов языка GPSS. Синтаксис языка GPSS. Блоки языка GPSS. Содержание отчета и его форма 1. 2. 3. 4. Форма отчета письменная. Выполнить пример 1. Продемонстрировать данную работу на ПК. Ответить на контрольные вопросы. Литература 1. Боев В. Моделирование систем. Инструментальные средства GPSS World. Санкт-Петербург:BHV-Санкт-Петербург, 2004 г. - 368 стр. 2. Вентцель Е.С. Исследование операций.- М.: Сов.радио, 1972. 3. Гнеденко Б.В., Коваленко И.Н. Введение в теорию массового обслуживания. М.: Высш. шк., 1987. 29 4. Разработка САПР. Кн. 9. Имитационное моделирование: Практ. пособие / В.М.Черненький: Под ред. А.В. Петрова. М.: Высш. шк., 1990. 5. Советов Б.Я. Моделирование систем. Практикум: Учебное пособие для вузов/ Б.Я. Советов, С.А. Яковлев. – 2-е изд., перераб. и доп. – М.: Высш. шк., 2003. – 295 с.:ил. 6. Шрайбер Г.Дж. Моделирование на GPSS.- М.: Высш. шк., 1980. 30