Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Еремичев.docx
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
101.04 Кб
Скачать

Основные правила и структура языка gpss.

     Для описания имитационной модели на языке GPSS полезно представить ее в виде схемы, на которой отображаются элементы СМО - устройства, накопители, узлы и источники . Описание на языке GPSS есть совокупность операторов (блоков), характеризующих процессы обработки заявок. Имеются операторы и для отображения возникновения заявок, задержки их в ОА, занятия памяти, выхода из СМО, изменения параметров заявок (например, приоритетов), вывода на печать накопленной информации, характеризующей загрузку устройств, наполненность очередей и т.п. 

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

     Пути продвижения заявок между ОА отображаются последовательностью операторов в описании модели на языке GPSS  специальными операторами передачи управления (перехода). Для моделирования используется событийный метод. Соблюдение правильной временной последовательности имитации событий в СМО обеспечивается интерпретатором GPSSPC - программной системой,  реализующий алгоритмы имитационного моделирования.    

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

Пример оператора:

110  L1    GENERATE     30,5                     Первый сегмент модели 

2....6.8.................18 ..19.............................................................70

<метка><название>   <поле переменных>                <комментарии>

    В поле переменных выделяют подполя, разделяемые при записи запятыми и служащие для указания чисел, стандартных числовых атрибутов (СЧА), символов, обозначающих метки, идентификаторов, указателей разновидностей операторов и т.п. Стандартные числовые атрибуты (см. в прил. 1) служат для сокращенного указания различных величин, фигурирующих в модели.  Подполя могут быть пустыми. Возможна запись комментария после последнего непустого поля через пробел. 

    

Основные операторы языка gpss.

 Основные операторы языка  GPSS  Можно поделить на группы. Некоторые операторы мы разберем подробно.

Устройства.

Устройства используются при моделировании систем для имитации работы оборудования единичной емкости, например, процессора, каналов передачи данных, устройств ввода-вывода, линии связи и т.д. Такое оборудование в любой момент времени может обрабатывать только один транзакт. Часто возникают ситуации, когда в течение определенного времени оборудование становится недоступным. Происходит это либо из-за механических неполадок, отсутствия рабочих или других аналогичных причин. Такую ситуацию можно смоделировать пропустив управляющий транзакт через блок PREEMPT, таким образом, что оно полностью займет многоканальное устройство или перехватит устройство. Недостаток этого способа для моделирования состояния недоступности оборудования заключается в том, что искажается статистика использования оборудования в течение всего периода моделирования. Блоки, реализующие доступность и недоступность оборудования предусмотрены, главным образом, для правильного отображения состояния недоступности в статистике использования оборудования. Недоступность устройства, которая моделируется с помощью блока FUNAVAIL, предупреждает (с некоторыми исключениями) занятие или прерывание устройства другими транзактами. Предусмотрены специальные режимы работы блока FUNAVAIL, задание которых приводит к следующим действиям над транзактами, связанными с недоступным устройством:

  • управляющему транзакту (транзакту, которое занимало и генерировало прерывание на устройстве в тот момент, когда оно стало недоступным) может быть разрешено продолжение использования этого устройства;

  • прерванные транзакты (те транзакты, которые были прерваны другими транзактами при использовании этого устройства) могут продолжать претендовать на устройство в течение периода недоступности; могут быть сняты из рассмотрения на использование устройства и направлены к вспомогательному блоку или могут претендовать на устройство только по окончании периода недоступности;

  • над задержанными транзактами (теми транзактами, которые ожидали устройство для его занятия или прерывания в момент, когда оно стало недоступным) совершаются те же действия, что и над прерванными транзактами.

Блок GATE, проверяющий состояние устройства Блок GATE позволяет проверить состояние устройств:

  • "занято" (U);

  • "свободно" (NU);

  • "прервано" (I);

  • "не прервано" (NI);

  • "доступно" (FV);

  • "недоступно" (FNV).

Блок GATE может задержать транзакт на входе, если не задан альтернативный выход. СЧА для устройств: F, FC, FI, FR, FT, FV. Блоки, связанные с устройствами: FAVAIL, FUNAVAIL, GATE FNV, GATE FV, GATE I, GATE NI, GATE NU, GATE U, PREEMPT (захват), PREEMPT (прерывание), RELEASE, RETURN,SEIZE.

Блок SEIZE используется для занятия устройства.

Формат: SEIZE <A>

В поле А задается название или номер устройства.

Свободный блок SEIZE позволяет вошедшему в него транзакту занять указанное устройство. Транзакт не может занять устройство, которое уже было занято и (или) прервано другим транзактом. При попытке транзакта войти в блок SEIZE всегда проверяется, занято ли устройство. Если устройство свободно, его можно занимать. Транзакт, занявший устройство, затем пытается перейти к следующему по номеру блоку. Устройство остается занятым до тех пор, пока занимающий его транзакт не войдет в соответствующий блок RELEASE. Прежде чем освободить устройство, транзакт может пройти через неограниченное число блоков. Когда устройство занято, транзакт задерживается на входе в блок SEIZE. В этом случае оно помещается в список задержки, связанный с этим устройством. Транзакты в этом списке задержки процедурой просмотра GPSS не обрабатываются. 

Блок RELEASE предназначен для освобождения устройства тем транзактом, которым оно было занято.

Формат: RELEASE <A>

В поле А задается название или номер освобождаемого устройства.

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

Очереди.

В GPSS объекты типа "очередь" вводятся для сбора статистических данных. Статистика об очередях собирается в моменты входа транзакта в блок QUEUE (вход в очередь) или в блок DEPART (выход из очереди).

Формат: QUEUE <A>,[<B>] В поле А задается номер или имя очереди, к длине которой добавляются единицы. Поле В определяет число единиц, на которое увеличивается текущая длина очереди. Если поле В пусто, то прибавляется единица.

DEPART <A>,[<B>] В поле А задается номер или имя очереди, длину которой нужно уменьшить. В поле В задается число единиц, на которое уменьшается длина очереди. Это число не должно превышать текущую длину очереди. Если поле В пусто, длина очереди уменьшается на единицу.

Важно отметить, что задержку транзакта в очереди вызывает не очередность транзактов, а условия, при которых транзакт входит в очередь (например, состояния объектов типа "устройство"). Только объекты типа "очереди" обеспечивают пользователя данными относительно задержки. Примером служит блок QUEUE, стоящий перед блоком SEIZE, задерживающим транзакты в случае занятости специфицированного устройства. Поскольку очереди в GPSS по природе своей являются статистическими объектами, списки транзактов, находящихся в очереди, не составляются.  СЧА очередей: Q, QA, QM, QC, QZ, QT, QX.

Многоканальные устройства (МКУ).

При моделировании систем, объекты GPSS типа "многоканальные устройства" используются для имитации работы объектов реальных систем, параллельно обрабатывающих поступающие заявки. Например, компьютер работающий в мультипрограммном режиме, автоматическая телефонная станция, трамвай или автобус и т.д. Объекты такого типа характеризуются определенным объемом и могут одновременно обрабатывать несколько транзактов. Число таких транзактов определяется емкостью многоканального устройства. СЧА многоканальных устройств: R, S, SA, SC, SE, SF, SR, SM, ST, SV. SNV. Блоки, связанные с МКУ: ENTER, LEAVE, SAVAIL, SUNAVAIL, STORAGE.

Оператор определения STORAGE определяет емкость многоканального устройства в текущей модели.

Формат: <NAME> STORAGE <A> Поле метки NAME определяет имя многоканального устройства. Операнд А определяет объем многоканального устройства.

Когда транзакт пытается войти в блок ENTER, то запрос на емкость многоканального устройства сравнивается с доступной емкостью многоканального устройства. Если запрос может быть выполнен, то транзакт входит в блок ENTER, и емкость доступной памяти многоканального устройства уменьшается. Если запрос транзакта не может быть удовлетворен, то транзакт входит в список задержки многоканального устройства. Многоканальное устройство никогда не может быть удалено из текущей модели, даже если оператор STORAGE удаляется из рабочей программы. Многоканальное устройство можно переопределить другим оператором STORAGE с тем же самым именем.

Блок ENTER позволяет вошедшему транзакту использовать многоканальное устройство. Транзакт может быть задержан на входе в блок, если многоканальное устройство заполнено или имеющейся емкости недостаточно или устройство в данный момент недоступно.

Формат: ENTER <A>,[<B>] В операнде А указывается номер или имя многоканального устройства, куда входит транзакт. В поле В содержится число занимаемых единиц многоканального устройства. Если поле В пусто, то предполагается что занимается одна единица. Если это значение равно нулю, то транзакт никогда не задерживается на входе, а блок рассматривается как нерабочий.

Активный транзакт не может войти в блок ENTER, если запрос на многоканальное устройство не может быть удовлетворен.

Блок LEAVE освобождает определенное число единиц многоканального устройства. Занятый объем многоканального устройства уменьшается на число освобождаемых единиц. Оставшаяся емкость многоканального устройства увеличивается на ту же величину. Счетчик числа входов не изменяется. Недоступность многоканального устройства не влияет на блок LEAVE.

Формат: LEAVE <A> ,[<B>] Поле А блока LEAVE определяет номер или имя многокального устройства. Поле В - число освобождаемых единиц многоканального устройства. Если это поле пусто, предполагается 1. Число освобождаемых единиц не должно превышать текущее содержимое многоканального устройства.

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

Таблицы.

Для облегчения табулирования в GPSS предусмотрен специальный объект - таблица. Таблица состоит из частотных классов, куда заносится число попаданий конкретного числового атрибута в каждый конкретный частотный класс. Для каждой таблицы вычисляется также математическое ожидание и среднеквадратичное отклонение. Эта статистика является стандартной для всех таблиц. При задании таблиц могут понадобиться различные режимы работы таблиц. Режим работы зависит от того, какая статистика нужна. СЧА таблиц: TB, TC, TD. Блоки, связанные с таблицами: TABLE, QTABLE, TABULATE.

Оператор TABLE определяет аргумент, а также число и ширину частотных интервалов.

Формат: <NAME> TABLE <A>,<B>,<C>,<D> Метка NAME определяет имя таблицы. В поле А задается аргумент таблицы - элемент данных, чье частотное распределение будет табулироваться. В поле В задается верхний предел первого интервала. В поле С задается ширина частотного интервала - разница между верхней и нижней границей каждого частотного класса. В поле D задается число частотных интервалов.

Для сбора элементов данных транзакт должен войти в блок TABULATE с тем же именем таблицы, что определено в блоке TABLE. Когда транзакт входит в блок TABULATE, оценивается аргумент таблицы (операнд А в операторе TABLE). Если он меньше или равен операнду В в операторе TABLE, то выбирается первый частотный класс таблицы. Если аргумент таблицы не подходит для этого класса, то класс выбирается путем деления значения аргумента на операнд С оператора TABLE. Нижняя граница частотного класса включается в предыдущий класс. Если таблицы не достаточно для размещения этого значения, то выбирается последний частотный интервал. Затем выбирается целое из частотного класса и счетчик увеличивается на величину, определяемую операндом В оператора TABULATE. По умолчанию увеличение происходит на 1. В конце работы оператора TABULATE изменяются значения среднего и стандартного отклонения аргумента таблицы. Таблица может быть переопределена или переинициализирована другим оператором TABLE, с той же самой меткой, что и первая.

Блок TABULATE табулирует текущее значение заданного аргумента. Способ табуляции зависит от режима работы таблицы, который определяется оператором описания таблицы TABLE

Формат: TABULATE <A>,[<B>] В поле А задается номер или имя таблицы, в которую табулируется значение аргумента. Таблица должна быть определена оператором описания TABLE. В поле В задается число единиц, которые должны быть занесены в тот частотный интервал, куда попало значение аргумента. Если поле В пусто, эта величина полагается равной единице.

Переменные.

Переменные позволяют вычислять арифметические и булевские выражения. Они разделяются на три типа: целочисленные, действительные и булевские. Значение переменных считываются из СЧА Vj и СЧА BVj. Перед первым обращением переменные должны быть обязательно описаны блоками инициализации BVARIABLE,FVARIABLE и VARIABLE.

Оператор определения VARIABLE объявляет целочисленную переменную перед ее использованием.

Формат: <NAME> VARIABLE <A> В поле NAME задается название переменной. Поле А задается арифметическое выражение.

Сохраняемые величины.

Сохраняемые величины - объекты, которые используются для хранения и последующего использования арифметических выражений. Начальные значения для сохраняемых величин можно задать при помощи оператора определения INITIAL или с помощью блока SAVEVALUE. Блок SAVEVALUE также используется для замены, увеличения или уменьшения текущего значения сохраняемых величин. Сами значения сохраняемых величин считываются через СЧА Xj. Для сохраняемых величин возможен только полный сброс статистики по команде управления CLEAR.

Блок SAVEVALUE используется для замены, увеличения или уменьшения текущего значения сохраняемой величины.

Формат: SAVEVALUE <A> ,<B> Значение в поле А может заканчиваться знаками + или -, указывающими на сложение или вычитание из существующего значения. В поле В задается значение для запоминания, сложения или вычитания.

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

Группы транзактов.

Группы транзактов - объекты, которые применяются для классификации транзактов, но в отличие от параметров транзактов, носят более глобальный характер и позволяют оперировать сразу с множеством транзактов. Текущее количество элементов в группе считывается из СЧА GTj. С группами транзактов связаны пять блоков:JOIN (режим транзактов), REMOVE (режим транзактов), EXAMINE (режим транзактов), SCAN, ALTER.

Числовые группы.

Числовые группы - объекты в виде числовых списков, с операциями добавления, удаления и сравнения. Текущее количество элементов в группе считывается из СЧА GNj. С числовыми группами связаны блоки JOIN (числовой режим), REMOVE (числовой режим), EXAMINE (числовой режим).

Логические переключатели.

Логические переключатели используются для представления объектов, имеющих всего 2 состояния (включён/выключен). Их начальные значения можно задать при помощи оператора определения INITIAL. А блок LOGIC используется для изменения состояния переключателей. Для изменения направления движения транзактов, в зависимости от состояния логических переключателей, используются блоки GATE LR и GATE LS. СЧА LSj возвращает состояние, а LRj возвращает инверсное состояние логического переключателя.

Семейства транзактов.

Блоки GENERATE являются основным средством создания транзактов и ввода их в модель. Вход транзактов в блок GENERATE не допускается. Помимо блока GENERATE для создания транзактов используется также блок SPLIT, который создает заданное число копий вошедшего в блок транзакта. Эти копии принадлежат к тому же семейству, что и породивший их транзакт. Блок TERMINATE является основным средством уничтожения транзактов и удаления их из модели. Для удаления транзактов, принадлежащих к одному семейству, может быть также использован блок ASSEMBLE. Блоки MATCH и GATHER предназначены для управления движением транзактов, принадлежащих к одному семейству. Для управления такими транзактами используются блоки GATE М и GATE NM.

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

Формат: GENERATE [<A>],[<B>],[<C>],[<D>] ,[<E>] В поле А указывается время, которое определяет интервал между моментами генерации транзактов блоком GENERATE. Нельзя использовать в качестве операнда параметры транзакта. В поле В задается модификатор, который изменяет значения интервала генерации транзактов по сравнению с интервалом, указанным в поле А. Нельзя использовать в качестве операнда параметры транзакта.

Может быть два типа модификаторов:

  • модификатор-интервал;

  • модификатор-функция.

С помощью модификатора-интервала задается равномерный закон распределения времени между генерацией транзактов. При вычислении разницы значений, заданных в полях А и В, получается нижняя граница интервала, а при вычислении суммы - верхняя граница. После генерации очередного транзакта выбирается число из полученного интервала, и это будет значение времени, через которое следующий транзакт из блока GENERATE. Более сложные распределения могут быть представлены при использовании модификатора-функции, под действием которого вычисленное значение аргумента поля А умножается на значение функции, заданной в поле В. От значения функции целая часть не берется; отбрасывание дробной части производится только после умножения его на среднее значение. Следует обратить внимание на то, что транзакты генерируются с заданными интервалами только в том случае, если у блоков, следующих за блоком GENERATE (например, GATE, TEST, SEIZE, PREEMPT или ENTER), не выставлены блокирующие условия. Каждый последующий транзакт формирует только тогда, когда транзакт из блока GENERATE входит в следующий блок. Формирование последующих транзактов включает вычисление интервала времени, в течение которого подготовленный транзакт остается в блокеGENERATE. Вычисленное значение при сложении со значением абсолютного условного времени дает значение времени, при котором транзакт войдет в модель. Из-за возможных воздействий на модель при изменении заданного интервала генерации транзактов нежелательно, чтобы после блокаGENERATE следовал блок, создающий блокирующее условие. Если первый из вычисленных интервалов между моментами генерации транзактов равен 0, то этот интервал принимается равным 1. Если поля А и В пустые, что указывает на нулевой интервал между моментами генерации транзактов, то блокGENERATE будет генерировать транзакты до тех пор, пока не использует все транзакты, которые могут быть активными в какой-то определенный момент времени. Чтобы предупредить это, следует либо задать предел генерации (поле D), либо за блоком GENERATE должен следовать блок, который вызывает блокирующее условие. В поле С задается начальная задержка, котоpая относится к моменту формирования первого транзакта в блоке GENERATE при первом прогоне модели и после выполнения операции CLEAR. Начальная задержка - это момент времени, в который первый сгенерированный транзакт должен выйти из блокаGENERATE; поля А и В на задержку транзакта влияния не имеют. Начальная задержка может быть меньше, равна или больше среднего времени, заданного в поле А. Нельзя использовать в качестве операнда параметры транзакта. В поле D задается предел генерации. Эта величина представляет собой максимальное число транзактов, которое будет создано в блоке GENERATE. Нельзя использовать в качестве операнда параметры транзакта. Если поле D пусто, блок генерирует неограниченное число транзактов. Предел генерации инициализируется повторно операцией CLEAR. Поле Е определяет приоритет транзакта. Нельзя использовать в качестве операнда параметры транзакта. Если поле Е не задано, приоритет по умолчанию равен 0. В начальный момент времени в каждом блоке GENERATE производится подготовка к выходу одного транзакта. На этой стадии модель еще полностью не инициализирована для выполнения. Поэтому все СЧА, описанные в блоке GENERATE, должны быть уже определены. В модели блоку GENERATE должны предшествовать операторы описания INITIAL, FUNCTION и VARIABLE. Это делается для того, чтобы СЧА в блоке GENERATE, который ссылается на них, давали желаемые результаты. Когда транзакт покидает блок GENERATE, счетчик общего числа прошедших через блок транзактов (Nj) увеличивается на единицу. Так как последующий транзакт не генерируется до тех пор, пока предыдущий транзакт не покидает блокGENERATE, то содержимое счетчика текущего числа находящихся в блоке транзактов (Wj) никогда не превышает 1. При повторном описании блокаGENERATE при помощи нового оператора описания блока интерпретатор GPSS просматривает все находящиеся в данный момент модели транзакты и проверяет, есть ли среди них транзакты, связанные с повторно описываемым блоком GENERATE (таких транзактов может и не быть, если данный блок уже создал заданное число транзактов). Эти транзакты, если они есть, уничтожаются. Операнды нового блока GENERATE заменяют операнды предыдущего блока GENERATE и затем создается новый транзакт, используя спецификации нового блока. При использовании блока GENERATEнеобходимо помнить, что транзакт не должен входить в блок GENERATE. Если транзакт пытается это сделать, возникает ошибка выполнения. ОператорCLEAR удаляет из модели GPSS все транзакты, в том числе и те, которые связаны с блоками GENERATE. После завершения действия оператора CLEAR, транзакты генерируются в каждом блоке GENERATE, как если бы блок GENERATE встретилась в первый раз. Всем СЧА придаются новые значения, и начальная задержка снова воздействует на первый генерируемый транзакт. Предел генерации вновь устанавливается равным значению, полученному при повторном задании значений СЧА. Если в операторе описания блока GENERATE в поле D было задано максимальное число генерируемых блоком транзактов, и заданное число транзактов уже вышло из этого блока, т.е. блок уже закончил работу, то в процессе моделирования этот блок может быть снова запущен только в одном из двух случаев:

  1. выполнены операции, заданные оператором CLEAR, и производится повторный запуск всех блоков GENERATE;

  2. блок GENERATE описан повторно.

Блок TERMINATE удаляет из модели входящий транзакт.

Формат: TERMINATE [<A>] В поле А задается число единиц, на которое этот блок изменяет содержимое счетчика завершений, определяющего момент окончания моделирования. Операнд А может быть именем, положительным целым числом, СЧА или СЧА*<параметр>. По умолчанию значение, определяемое полем А, равно 0. Если поле А пусто, то транзакт уничтожается, а содержимое счетчика не изменяется.

Когда пользователь подготавливает модель, он задает время счета, указывая в операторе START значение счетчика завершений. Поскольку различные пути транзактов в модели имеют различные смысловые значения, каждый блок TERMINATE может либо уменьшать, либо не уменьшать содержимое счетчика завершений. Если содержимое счетчика уменьшилось до 0, счет завершается.

Списки пользователя.

В GPSS имеется дополнительный тип списков транзактов, названных списками пользователя, которые дают возможность удалять транзакты из списков текущих событий и переводить их во временно неактивное состояние с помощью блока LINK. Впоследствии эти транзакты возвращаются в список текущих событий блоком UNLINK. Использование таких списков позволяет обходить просмотр списка текущих событий, когда один или более транзакт не могут продвинуться дальше. Все это приводит к значительному снижению времени счета модели. СЧА списков пользователя: CA, CC, CH, CM, CT.

Матрицы.

Матрицы используются для хранения и последующего использования значений в арифметических выражениях. Матрица обязательно должна инициализироваться оператором определения MATRIX. Начальные значения матрицы можно задать при помощи оператора определения INITIAL. С матрицами связан следующий стандартный числовой атрибут MXj(a,b) - значение, записанное в строке a в столбце b матрицы j.

Команды для изменения движения транзактов в модели (TRANSFER, LOOP, TEST, GATE)

Блок TRANSFER позволяет транзакту, в зависимости от условий, заданных в операндах блока, занять устройство. Блок PREEMPT может задержать транзакт на входе.

Формат: TRANSFER [<A>],[<B>],[<C>],[<D>] Поле А задает режим выбора следующего блока, к которому должен перейти транзакт.

Существуют следующие режимы работы блока TRANSFER:

  • безусловный (пробел);

  • статистический (.);

  • BOTH;

  • ALL;

  • PICK;

  • функция (FN);

  • параметр (Р);

  • подпрограмма (SBR);

  • SIM.

Кроме того, операнд А может быть дробным числом, именем, положительным целым числом, СЧА или СЧА*<параметр>. Поля В и С задают возможные значения номеров следующих блоков или их положение. Использование значений описано при рассмотрении определенных режимов выбора. Операнды могут быть именем, положительным целым числом, СЧА или СЧА*<параметр>. Если поле В пусто, транслятор записывает в нем номер блока, следующего за блоком TRANSFER.

Безусловный режим выбора Если операнд А пропущен, то блок TRANSFER работает в безусловном режиме. Входящее в блок TRANSFER транзакт переходит к блоку, указанному в поле В. Если транзакт в этот блок войти не может, попытка направить транзакт к какому-либо другому блоку не производится. Например, XFER TRANSFER ,NEXT NEXT SEIZE 1 Транзакты, входящие в блок TRANSFER XFER, переходят к блоку NEXT. TRANSFER , V$TER Транзакты, которые входят в вышеприведенный блок TRANSFER, сразу переходят в блок, номер которого определяется переменной TЕR.

Статистический режим выбора Когда операнд А не является зарезервированным словом, блок TRANSFER работает в статистическом режиме выбора. Значение аргумента, записанного после точки (.) в поле А, рассматривается как трехзначное число, показывающее (в частях от тысячи), какой процент входящих в блок транзактов следует направить к блоку, указанному в поле С. Остальные транзакты направляются к блоку, указанному в поле В, или к следующему по номеру блоку, если операнд В пропущен. Для каждого транзакта выбирается один из двух возможных вариантов; после того как выбор сделан, второй вариант для этого транзакта не рассматривается. Числовое значение может быть задано при помощи любого стандартного числового атрибута. Если вычисленное значение аргумента меньше или равно нулю, будет происходить безусловная передача транзактов к блоку, указанному в поле В. Если же значение аргумента больше или равно 1000, то будет происходить безусловная передача транзактов к блоку, указанному в поле С. Например, BCD TRANSFER .709, BLK1, BLK2 Из общего числа транзактов, входящих в блок BCD, в среднем .709 будут пытаться войти в блок BLK2. Остальные .209 будут пытаться войти в блок BLK1. BCD TRANSFER .P1, BLK3, BLK4 Трехзначное число, записанное в параметре 1 транзактов, входящих в блок BCD, интерпретируется как вероятность (в частях от тысячи) того, что транзакт попытается войти в блок BLK4. В остальных случаях транзакт попытается войти в блок BLK3. CDE TRANSFER .X1, BLK5, BLK6 Если в момент входа транзакта в блок CDE в ячейке SAVEVALUE 1 записано число 30, то в среднем 3 % от общего числа транзактов будет направлено к блоку BLK6, а остальные 97 % попытаются войти в блок BLK5.

Режим BOTH Если в поле А стоит зарезервированное слово ВOTH, блок TRANSFER работает в режиме BOTH. В этом режиме каждый входящий транзакт сначала пытается перейти к блоку, указанному в поле В. Если это сделать не удается, транзакт пытается перейти к блоку, указанному в поле С. Если транзакт не сможет перейти ни к тому, ни к другому блоку, оно остается в блоке TRANSFER и будет повторять в том порядке попытки перехода при каждом просмотре списка текущих событий, до тех пор, пока не сможет выйти из блока TRANSFER. Ниже приведен фрагмент программы, в котором транзакт сначала пытается перейти к блоку TRY1. Если оно не может войти в этот блок, оно пытается войти в блок TRY2. Если транзакт не может войти и в этот блок, оно остается в списке текущих событий и повторяет эти попытки при каждом просмотре списка до тех пор, пока не выйдет из блока TRANSFER. TRANSFER BOTH, TRY1, TRY2 TRY1 SEIZE 1 TRY2 SEIZE 2

Режим ALL Если в поле А стоит зарезервированное слово ALL, блок TRANSFER работает в режиме ALL. В этом режиме каждый входящий транзакт прежде всего пытается перейти к блоку, указанному в поле В. Если транзакт в этот блок войти не может, то последовательно проверяются все блоки в определенном ряду в поисках первого, способного принять этот транзакт, включая блок, указанный операндом С. Номер каждого проверяемого блока вычисляется как сумма номера предыдущего блока и шага, заданного операндом D: N + M, N + 2M, N + 3M, ... L, где N - номер блока, указанного в поле В; М - значение шага, заданного в поле D; L - номер блока, указанного в поле С. Этот номер должен быть больше номера блока, указанного в поле В, на величину, кратную шагу М. Если операнд D не задан, то проверяется каждый блок, номер которого принадлежит этому ряду, включая блок, определенный операндом С . Блоки, номера которых выше номера блока, указанного в поле С, не проверяются. Как только первый блок, способный принять транзакт, будет найден, транзакт входит в этот блок и оттуда продолжает свое дальнейшее движение. Если транзакт не может перейти ни к одному из указанных блоков, оно остается в блоке TRANSFER и повторяет описанную выше процедуру при каждом просмотре списка текущих событий до тех пор, пока не выйдет из блока. Поскольку обычно в полях В и С записываются символические метки блоков, блоки следует располагать таким образом, чтобы при присвоении номеров разность между номерами блоков, указанных в полях В и С, была кратна шагу, указанному в поле D. Например, TRANSFER ALL, 60, 120, 10 В этом примере транзакт будет последовательно пытаться перейти к блокам 60, 70, 80, ... 120. TRANSFER ALL, NEXT1, NEXT2, 5 Здесь режим ALL допустим только в том случае, если разность между номерами, присвоенными блокам NEXT1 и NEXT2, кратна 5. TRANSFER ALL, 60, 120, 25 В данном примере режим ALL недопустим, потому что разность между номерами блоков, записанных в полях В и С, не является кратной шагу, указанному в поле D. Условными являются только режимы BOTH и ALL. Во всех остальных режимах выбор следующего блока производится в момент входа транзакта в блок. В режимах BOTH и АLL выбор следующего блока производится в момент снятия блокирующего условия. Следует отметить, что каждый раз, когда интерпретатор при просмотре списка текущих событий обнаруживает транзакт, задержанный в блоках TRANSFER BOTH или TRANSFER ALL, он пытается продвинуть транзакт, начиная с блока, указанного в поле В. Следовательно, в режиме BOTH в тех случаях, когда возможен переход к обоим блокам (В и С), блок В имеет некоторое преимущество. Аналогично, в режиме ALL в случае, когда возможен переход к нескольким блокам, блоки с меньшими номерами имеют некоторое преимущество перед блоками с большими номерами.

Режим PICK Если в поле А стоит зарезервированное слово PICK, блок TRANSFER работает в режиме PICK. В этом режиме из последовательности блоков с номерами N, N+1, N+2,...M (N - номер блока, указанного в поле В, а М - номер блока, указанного в поле С) случайным образом выбирается один блок, к которому должно быть направлен транзакт. Все блоки, включая указанные в полях В и С, выбираются с одинаковой вероятностью, равной 1/(М-N)+1. Транзакт пытается перейти только к выбранному для него блоку. Если транзакт не может сразу перейти к следующему блоку, то оно будет ждать в блоке TRANSFER до тех пор, пока не будет снято блокирующее условие. Номер блока в поле С должен быть больше или равен N+1. Например, TRANSFER PICK,30,39 Cообщение, вошедшее в блок TRANSFER, пытается войти в один из 10 блоков (30,31,...39) с равной вероятностью : 1/10.

Режим "функция" (FN) Если в поле А стоит зарезервированное слово FN, блок TRANSFER работает в режиме "функция". Вычисляется значение функции, номер которой задан в поле В блока TRANSFER; если результат нецелый, от него берется целая часть. Для определения номера следующего блока полученное целое число складывается с аргументом поля С (в поле С может быть записан ноль). Транзакт пытается перейти только к блоку с вычисленным номером. Транзакт остается в блоке TRANSFER до тех пор, пока не сможет перейти именно к этому блоку. Например, TRANSFER FN,3,PH3 Номер следую- = Значение функ- + Значение параметра 3 щего блока ции FN3 формата "полуслово".

Режим "параметр" Если в поле А стоит зарезервированное слово Р, блок TRANSFER работает в режиме "параметр". Значение аргумента поля В интерпретируется как номер j параметра входящего транзакта. Для определения следующего номера блока для данного транзакта, значение этого параметра складывается со значением аргумента поля С. Если операнд С не задан , номер следующего блока будет равен значению параметра. Например, TRANSFER P,12,37 Номер следующего Значение парамет- Значение,записан- блока = ра 12, вошедшего + ное в ячейке 37 в блок транзакта.

Режим "подпрограмма" (SBR) Если в поле А стоит зарезервированное слово SBR, блок TRANSFER работает в режиме "подпрограмма". Вошедший в блок TRANSFER транзакт будет пытаться перейти к блоку, указанному в поле В. Значение аргумента поля С интерпретируется как номер параметра; в этом параметре записывается номер j данного блока TRANSFER. Если такого параметра нет,то он создается. Этот режим блока TRANSFER обычно используется для перехода к подпрограмме, началом которой является блок, указанный в поле В.

Например, TRANSFER SBR,NEXT,10 Если в конце подпрограммы записать блок TRANSFER P,10,1, то транзакт сможет вернуться к блоку, следующему за блоком TRANSFER SBR, где следующий блок равен текущему значению, записанному в параметре под номером 10 (в данном случае это номер блока TRANSFER SBR) плюс 1.

Режим SIM Если в поле А стоит зарезервированное слово SIM, то блок TRANSFER работает в режиме SIM. Режим введен для случая, когда требуется одновременное выполнение нескольких условий. Каждый транзакт имеет свой индикатор задержки (назовем его индикатором SIM). В этом индикаторе записывается результат любой попытки транзакта войти в следующий блок. Если интерпретатор обнаруживает условия, препятствующие входу транзакта в блок, то индикатор SIM этого транзакта устанавливается в единицу. Если все условия перехода к следующему блоку удовлетворяются, то индикатор SIM остается равным нулю. Если не выполняется хотя бы одно из условий, то индикатор SIM данного транзакта устанавливается в единицу (в режимах BOTH и ALL индикатор SIM устанавливается в единицу только в том случае, когда переход невозможен ни к одному из указанных блоков). При входе транзакта в блок TRANSFER проверяется значение индикатора SIM. Если он равен нулю, транзакт направляется к следующему блоку, указанному в поле В. Если индикатор SIM равен единице, транзакт направляется к блоку, указанному в поле С, а индикатор SIM устанавливается в "0". В любом случае транзакт будет пытаться перейти только к выбранному для него блоку и будет находиться в блоке TRANSFER до выполнения соответствующих условий. В момент, когда создаются условия для выхода транзакта из блока TRANSFER, значение индикатора SIM не проверяется. Состояние индикатора SIM отмечается символом Х в колонке DELAY распечатки информации о транзактах. При задержке транзакта в блоках ASSEMBLE, GATHER или MATCH индикатор SIM в единицу не устанавливается.

Изменение индикатора SIM в блоке ADVANCE Каждый раз, когда транзакт выходит из блока ADVANCE с нулевым временем задержки, индикатор SIM становится равным нулю. После того, как транзакт покинул блок ADVANCE, оно может быть снова задержано по каким-либо причинам прежде, чем дойдет до тех блоков, в которых проверяется одновременность выполнения ряда условий. Следовательно, индикатор SIM может быть установлен в единицу до того, как начнется проверка условий. В таком случае перед блоками, в которых проверяется одновременное выполнение условий, следует поместить блок TRANSFER SIM, в котором в полях В и С указан один и тот же блок - первый из блоков, проверяющих условия. После прохождения через этот блок, индикатор SIM транзакта снова станет равным нулю. Например, TRANSFER SIM,10,10 Этот блок позволяет установить в "0" индикаторы всех транзактах, входящих в блок 10.

Внутренние операции блока TRANSFER При входе транзакта в блок TRANSFER (за исключением блоков, работающих в режимах BOTH и ALL) вычисляется номер следующего блока, к которому транзакт должен перейти, и транзакт пытается перейти к этому блоку. Вычисленный номер блока должен быть допустимым номером блока в текущей модели. Если транзакт не может перейти в этот блок, то номер блока запоминается. Номер вычисляется только один раз. Интерпретатор все время пытается продвинуть транзакт только к этому блоку. Если блок TRANSFER работает в режиме BOTH или ALL, запоминается номер последнего блока, указанного в поле С. Этот номер также вычисляется только один раз. Если транзакт не сможет перейти ни к одному из указанных в режимах BOTH или ALL блоков, интерпретатор будет повторять попытки для всех указанных блоков при каждом просмотре списка текущих событий. Эти попытки будут повторяться даже в том случае, если блокирующие условия не будут сняты. По этой причине, ипользование блока TRANSFER в режимах BOTH или ALL может увеличить время обработки. В этом случае транзакт можно поместить в список пользователя на время, пока не будет найден блок, способный принять транзакт. Это может быть сделано с помощью блоков LINK и UNLINK

Блоки.

Блок ADVANCE задерживает продвижение транзакта на заданный период времени.

Формат: ADVANCE <A> ,[<B>] В операнде А задается среднее время пребывания транзакта в блоке ADVANCE. Если время задержки равно 0, транзакт помещается в список текущих событий перед транзактами с таким же приоритетом. Транзакты с положительным временем задержки помещаются в список будущих событий. В операнде В указывается способ модификации среднего значения, заданного в операнде А.

Может быть два типа модификаторов:

  • модификатор-интервал;

  • модификатор-функция.

Интервал изменения среднего времени задержки может быть задан константой, значение которой не должно превосходить среднего времени задержки, вычисленного для данного транзакта. Эта константа определяет интервал, в котором времена задержки распределены равномерно. Все времена задержки выражаются целыми числами. Любое из (2В+1) целых чисел, заключенных в интервале (А-В, А+В), будет выбираться с вероятностью 1/(2B+1). Например, если среднее время задано равным 10, а константа, определяющая интервал изменения, равна 5, то время задержки транзакта в блоке изменяется от 5 до 15. Для каждого из входящих в блок ADVANCE транзактов выбирается только одно из возможных значений времени задержки. Любое целое число из интервала (5-15), включая границы 5 и 15, будет выбираться с вероятностью 1/11. Дробные значения времени задержки не допускаются, поскольку условное время интерпретатора принимает только целые значения. Константа, определяющая интервал времени задержки, не должна превосходить среднего времени задержки, в противном случае может быть получено отрицательное время задержки в блоке ADVANCE. Отрицательное значение задержки всегда считается ошибкой. Если в операнде В записан модификатор-функция, то вычисленное значение атрибута, заданного в операнде А, умножается на значение функции, заданной в поле В. Результат округляется до целого значения и используется как время задержки.

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

  • генерированное другим транзактом прерывание является для данного транзакта первым;

  • данный транзакт уже был прерван на каком-либо из занятых им устройств.

В первом случае происходит следующее:

  1. остаток времени, в течение которого транзакт должен был находиться в блоке ADVANCE, равен разнице вычисленного времени выхода транзакта из блока ADVANCE и текущего значения абсолютного условного времени;

  2. транзакт удаляется из списка будущих событий;

  3. транзакт рассматривается, как находящееся в состоянии прерывания;

  4. указывается, что транзакт находится в списке прерывания;

  5. счетчик прерываний устанавливается в единицу.

Находящийся в блоке ADVANCE транзакт, который уже был прерван на одном из устройств и переведен в состояние прерывания, может быть прервано еще на 255 занятых им устройствах. Счетчик прерывания увеличивается на единицу при каждом новом прерывании. Транзакт, занимающий блок ADVANCE и некоторое устройство, может находиться в списке текущих событий (например, когда блок ADVANCE имеет нулевую задержку). Обслуживание этого транзакта также может быть прервано другим транзактом. В этом случае удаление занимающего устройство транзакта из списка текущих событий и перевод его в состояние прерывания производится не сразу. Сначала устанавливается индикатор состояния прерывания. Транзакт, занимающий устройство, будет обрабатываться интерпретатором как обычно и перейдет в состояние прерывания только тогда, когда оно войдет в блок ADVANCE с ненулевой задержкой. Когда прерываемый транзакт входит в блок ADVANCE выполняются следующие операции:

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

  2. индикатор состояния прерывания устанавливается в единицу;

  3. транзакт удаляется из списка текущих событий;

  4. транзакт помещается в список прерываний.

Когда вычисленное значение времени задержки транзакта в блоке ADVANCE отлично от нуля, значения счетчика текущего числа транзакта в блоке Wj и счетчик общего числа входов Nj увеличиваются на единицу. Если вычисленное время задержки равно нулю, и транзакт может перейти к следующему блоку, то увеличивается только счетчик Nj. Если же транзакт не может войти в следующий блок, то увеличивается и счетчик Wj.

Блок MARK либо заменяет значение отметки времени транзакта на текущее значение абсолютного модельного времени (операнд А не определен), либо записывает значение условного модельного времени в заданный параметр транзакта (при использовании операнда А).

Формат: MARK <A> Операнд А содержит номер параметра транзакта, в который записывается значение абсолютного условного времени. Если такого параметра не существует, то он создается.

Исходное значение времени создания транзакта может быть заменено на текущее значение абсолютного условного времени при прохождении транзакта через блок MARK. Каждый транзакт имеет следующие два СЧА, связанных с временем прохождения участков модели данным транзактом:

  • M1 - время прохождения транзактом модели. Вычисление значения этого СЧА производится следующим образом: М1 = Текущее значение условного времени - Отметка времени обрабатываемого в данный момент транзакта.

  • MPj - промежуточное прохождение транзакта участка модели. Вычисление значения этого СЧА производится следующим образом: MPj = Текущее значение абсолютного условного времени - Значение параметра обрабатываемого в данный момент транзакта.

СЧА: Pj, MPj, MBj

Блок COUNT подсчитывает числа элементов заданного множества, удовлетворяющих указанному условию.

Формат: COUNT <X> <A>,<B>,<C>,[<D>],[<E>] <X> - здесь и далее -обозначение используемого логического или условного операторов. Данный операнд может принимать следующие значения: FNV, FV ,I, LS, LR, NI, NU, SE, SF, CNE, SNF, SNV, SV, U, 'E', 'G', 'GE', 'L', 'LE', MIN, MAX или 'NE'.

Блок COUNT определяет число объектов, удовлетворяющих заданному условию. Например, пользователю может понадобиться узнать число свободных устройств в определенном диапазоне номеров устройств или число памятей с коэффициентом использования меньше 50 (в частях от 1000) и т.д. Логический оператор задает логическое условие. Например, подсчет свободных устройств, подсчет выключенных логических ключей и т.д. Ниже приведен список логических операторов для различных типов объектов. Устройства имеют следующие логические условные операторы: - NU - устройство свободно (доступно); - U - устройство занято (в результате прохождения транзактом блока SEIZE или PREEMPT); - NI - устройство не прервано (т.е. либо оно свободно, либо занято транзактом, выполнившим блок SEIZE); - I - устройство прервано (устройство занято транзактом, выполнившим блок PREEMPT); - FV - устройство доступно; - FNV - устройство недоступно. Многоканальные устройства имеют следующие логические условные операторы: - SE - многоканальное устройство пусто (нулевое содержимое); - SNE - многоканальное устройство не пусто (ненулевое содержимое); - SF - многоканальное устройство заполнено; - SNF - многоканальное устройство не заполнено; - SV - многоканальное устройство доступно; - SNV - многоканальное устройство недоступно. Логические ключи имеют следующие логические операторы: - LR - проверка ключа на состояние "выключено"; - LS - проверка ключа на состояние "включено"; При использовании логических операторов поля D и E могут быть пустыми. В блоке COUNT используются следующие условные операторы: - 'L' - меньше. Условие выполняется, если значение стандартного числового атрибута, заданного в поле Е , меньше значения стандартного числового атрибута, заданного в поле D; - 'LE' - меньше или равно. Условие выполняется, если значение СЧА, заданного в поле Е, меньше или равно значению СЧА, заданного в поле D; - 'E' - равно. Условие выполняется, если значение СЧА, заданного в поле Е, равно значению СЧА, заданного в поле D; - 'NE' - не равно. Условие выполняется, если значение СЧА, заданного в поле Е, не равно значению СЧА, заданного в поле D; - 'G' - больше. Условие выполняется, если значение СЧА, заданного в поле Е, больше значения СЧА, заданного в поле D; - 'GE' - больше или равно. Условие выполняется, если значение СЧА, заданного в поле Е, больше или равно значению СЧА, заданного в поле D; - MAX - наибольшое значение из всех значений СЧА объектов, удовлетворяющих заданному условию; - MIN - наименьшее значение из всех значений СЧА объектов, удовлетворяющих заданному условию. Если используются условные операторы, то поля D и Е блока COUNT должны быть заданы. В поле А задается номер параметра вошедшего в блок транзакта, в котором будет организован счетчик числа объектов. В поле В определяется нижняя граница диапазона изменения номеров или имен объектов, для которых проверяется заданное условие. В поле С определяется верхняя граница диапазона изменения номеров или имен объектов, для которых проверяется заданное условие. Поле D задает сравниваемое значение (величина сравнения) для аргумента поля Е. Это значение используется совместно с заданными условными операторами ('E', 'NE', 'G', 'GE', 'L', 'LE'). Значение СЧА сравнивается со значением объекта, заданного аргументом поля Е. Если условный оператор не используется, поле D можно не задавать. Поле Е используется совместно с аргументом поля D и условным оператором. В поле Е задается какой-либо из стандартных числовых атрибутов просматриваемых объектов. Необходимо только записывать мнемоническое обозначение атрибута, поскольку диапазон изменения номеров объектов задан полями В и С.

СЧА: M1, MBj, MPj, PR, XN1

Блок SELECT выбирает первый объект в заданном диапазоне, который удовлетворяет определенному условию. Номер этого объекта записывается в заданный параметр вошедшего в блок транзакта. В основном, действия блока SELECT аналогичны действиям блока COUNT.

Формат: SELECT <X> <A>,<B>,<C>,[<D>],[<E>],[<F>]

<X> - обозначение логического или условного операторов. Логические и условные операторы имеют такой же смысл, как и в блоке COUNT. MIN и MAX задают работу блока соответственно в минимальном и максимальном режимах. В поле А задается номер параметра вошедшего в блок COUNT транзакта, куда записывается номер объекта, удовлетворяющего заданному условию. Поле В определяет нижнюю границу диапазона изменения номеров объектов, для которых проверяется заданное условие. Поле С определяет верхнюю границу диапазона изменения номеров объектов, для которых проверяется заданное условие. В поле D задается величина сравнения. Это значение используется совместно с условными операторами ('E', 'NE', 'GE, 'L', 'LE') для сравнения со значением атрибута объекта, заданного в поле Е. Если не используется условный оператор, поле D можно не задавать. Поле Е используется совместно с полем D и условным оператором X. В поле Е задается только мнемоническое обозначение СЧА объекта без указания конкретного номера, поскольку диапазон изменения номеров объектов задан полями В и С. В поле Е может быть задан любой из стандартных числовых атрибутов объекта. Поле F задает номер альтернативного блока для входящего транзакта, если заданным условиям не удовлетворяет ни один объект в диапазоне. Если операнд F не используется, то транзакт будет продвинут к следующему по номеру блоку.

СЧА: GNj, GTj

Функции.

В GPSS два типа вычислительных объектов: арифметические переменные и функции. В моделях на GPSS значения функций (FNj) - это часто используемые стандартные числовые атрибуты, так как многие взаимоотношения в системах могут быть описаны в терминах функциональной зависимости между двумя переменными. Каждая функция GPSS связывает значение аргумента функции, который представляет собой независимую переменную, со значениями зависимой переменной функции (FNj). Другим важным применением функций является генерация значений случайных чисел. Для таких функций распределения вероятности аргументом является случайное число 0<=RN<1, а значения зависимых переменных (FNj) являются случайными элементами переменных в моделях системы.

Когда значение аргумента непрерывной числовой функции попадает в интервал между двумя заданными значениями (X[i],X[i+1]), программа производит линейную интерполяцию для определения значения функции FNj, находящегося в интервале между (Y[i],Y[i+1]) Значения Y[i] хранятся в памяти в виде чисел с плавающей точкой. Интерполяция производится при помощи арифметики с плавающей точкой с нецелыми числами. Однако от конечного результата интерполяции всегда берется целая часть, и значение функции FNj всегда является целым числом, за исключением следующих случаев:

  • когда функция используется в качестве модификатора в блоках ADVANCE, GENERATE, ASSIGN;

  • когда функция используется в качестве стандартного числового атрибута в операторе определения FVARIABLE;

  • когда функция используется в качестве аргумента другой функции;

Дискретные числовые функции Dn задают одно и то же значение функции FNj = Y[i] для всех значений аргумента X[i-1] < X <= X[i]. Интерполяция не производится, значение функции берется равным значению в правом конце интервала. Как и для непрерывных функций, значения функции задаются следующим образом:

  • FNj=Y[1] - для всех значений аргумента <= X[1];

  • FNj=Y[n] - для всех значений аргумента >=X[n].

Нецелые значения функций приводятся к целым путем выделения целой части.

Во многих случаях значениями аргумента X[i] являются непрерывные последовательности целых чисел 1,2,3...n. Машинное время, необходимое для вычисления значений таких функций, может быть значительно уменьшено, если эти функции описаны как табличные (Ln). В этом случае значения аргумента Х в операторах, задающих значения координат функции, программой ввода GPSS не рассматриваются и принимаются равными X[1] = 1, X[2] = 2,...X[i] = i,...X[n] = n . Интерпретатор использует аргумент функции для прямого обращения к массиву заданных величин функции. Таким образом, не требуется последовательный просмотр таблицы, связанной с функцией. Значения Y[i] должны быть записаны в соответствующих полях операторов, задающих значения координат. Для удобства программиста в операторах могут быть записаны значения Х, хотя они никогда не просматриваются. Если значение аргумента выходит за пределы интервала (1,n), то выдается сообщение об ошибке на этапе выполнения.

Выше рассмотрены три типа числовых функций, значениями которых могут быть только числа. Имеется также два типа функций, значениями Y[i] которых могут быть любые СЧА, за исключением матриц ячеек:

  • дискретные атрибутивные функции (En), подобные дискретным числовым функциям (Dn);

  • табличные атрибутивные функции (Mn), подобные табличным числовым функциям (Ln).

Как и в случае дискретных, непрерывных и табличных функций, первым элементом упорядоченной пары точек используемой для задания такой функции, является константа. Вторым же элементом каждой упорядоченной пары является СЧА. Это означает, что каждое значение функции задается при определении функции. Значением FNj дискретной атрибутивной функции для всех значений аргумента X[i-1] < X <= X[i] является значение i-го стандартного числового атрибута СЧА[i]. Ниже приводится пример дискретной атрибутивной функции: GETUP FUNCTION P7, E4 9, FR5/10, FR3/11, FR12/12, FR7 Функция GETUP в качестве аргумента использует седьмой параметр. Значением функции является коэффициент нагрузки некоторого устройства. Для значений седьмого параметра, равных 9, 10, 11, 12 значение функции равно соответственно коэффициенту нагрузки устройства номер 5, 3, 12, или 7. Для аргументов выходящих за границы, интерпретатор GPSS обрабатывает атрибутивно-значимые функции как дискретные. Для функции GETUP, если значение P7 будет меньше 9, значение функции будет FR5, если P7 > 12 , то значением функции будет FR7. Рассмотрим еще пример дискретной атрибутивной функции: MIXED FUNCTION X$CAROL, E4 21, V$RED/25, X35/27, 10/36, Q$QUICK Аргументом функции является сохраняемая величина. Если значение X$CAROL меньше или равно 21, то функция принимает значение переменной с именем RED; если X$CAROL равно 22, 23, 24 или 25 то значение функции равно X35 и т.д. Из примера видно, что вторые члены упорядоченных пар, определяющих функцию могут быть разнотипными СЧА или константами. Атрибутивные функции, у которых первые элементы упорядоченных пар, определяющих эти функциии, образуют неразрывную последовательность чисел 1, 2, 3, и т.д. могут быть заданы табличным типом (Mn). Описание таких функций отличается от описания дискретных атрибутивных функций только операндом B(Mn). Выигрыш от применения типа Mn состоит в скорости вычисления функции, сводящегося к прямой выборке значения функции по значению аргумента. Ниже приводится пример табличной атрибутивной функции: POINT FUNCTION PR, M5 1, V1/2, P2/3, X7/4, Q4/5, 99

Значения функций используются в программах на GPSS в шести основных случаях:

  • как аргументы полей блоков;

  • как аргумент другой функции;

  • как значение Y[i] атрибутивной функции;

  • как аргумент таблицы;

  • как операнд арифметической или булевской переменной;

  • как среднее значение и/или модификатор в блоках GENERATE и ADVANCE или как модификатор в блоке ASSIGN.

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

  • номер объекта;

  • номер объекта для логического атрибута (блок GATE);

  • номер n=1,2,...255 параметра транзакта (блоки ASSIGN, INDEX, LOOP, MARK и SPLIT);

  • значение стандартного числового атрибута FNj.

В GPSS имеется семь датчиков равномерно распределенных псевдослучайных чисел, обозначаемых RN1 - RN7. Если не используется оператор RMULT, то все датчики генерируют одинаковые последовательности чисел. Оператор RMULT позволяет получать разные последовательности. Наличие семи независимых датчиков позволяет воспроизводить определенные последовательности значений в нескольких прогонах. Например, для сравнения нескольких вариантов моделируемой системы при одном входном потоке. Примечание. Команды управления CLEAR и RESET не изменяют значений индексов и множителей датчиков. Способ изменения генерируемых датчиками последовательностей рассмотрен при описании команды RMULT.

Генерация случайных чисел.

Генерация случайных чисел В GPSS имеется семь датчиков равномерно распределенных псевдослучайных чисел в интервале [0;1), обозначаемых RN1 - RN7. Если не используется оператор RMULT, то все датчики генерируют одинаковые последовательности чисел. Оператор RMULT позволяет получать разные последовательности. Наличие семи независимых датчиков позволяет воспроизводить определенные последовательности значений в нескольких прогонах. Например, для сравнения нескольких вариантов моделируемой системы при одном входном потоке. Примечание. Команды управления CLEAR и RESET не изменяют значений индексов и множителей датчиков. Способ изменения генерируемых датчиками последовательностей рассмотрен при описании команды RMULT. В GPSS для генерирования равномернораспределённых случайных чисел от нуля до единицы используется встроенное СЧА RNj. А для генерирования псевдослучайных чисел неравномерных видов распределений Оператор определения RANDOM служит для генерирования псевдослучайных чисел для неравномерных видов распределений.

Формат: NAME RANDOM [<A>],[<B>],[<C>],[<D>],[<E>] NAME - имя пользовательского ГСЧ. В поле A задается номер генератора случайных чисел равномерного распределения. По умолчанию используется первый ДПЧ. В поле B для каждого распределения задается своя константа. В поле С задаётся параметр датчика нужный для распределения.

Стандартные числовые атрибуты (СЧА).

В процессе моделирования интерпретатор GPSS автоматически регистрирует и корректирует информацию, касающуюся различных элементов, используемых в модели. Большая часть информации доступна только интерпретатору. Однако, к некоторым атрибутам объектов может обращаться и программист, манипулируя их значениями согласно логики модели. Такие атрибуты называются стандартными числовыми атрибутами (СЧА). Каждый объект GPSS имеет свой набор СЧА. Кроме СЧА объектов существуют еще системные числовые атрибуты, к которым пользователь может обращаться в модели, но не может изменять их значение. Имя СЧА состоит из двух частей. Первая часть указывает групповое имя, идентифицирующее тип объекта и тип информации об объекте. Вторая часть идентифицирует конкретного члена группы. Групповое имя состоит из одной-двух букв, фиксированных для информации об объектах определенного типа, например, Q - ссылка на текущее значение длины очереди, QA - целая часть среднего значения очереди и т.д. Объекты GPSS могут быть идентифицированы с помощью числовых или символьных имен. Если объект идентифицирован с помощью номера, то ссылка на его стандартный числовой атрибут записывается как СЧАj, где j - номер объекта (целое число). При символической идентификации объекта ссылка на его стандартный атрибут записывается как СЧА$<имя>, где <имя> - символьное имя объекта.

Системные СЧА

СЧА

Расшифровка

RN

Числовые последовательности считываются из датчиков псевдослучайных чисел (ДПЧ) с помощью СЧА RNj. Все датчики генерируют последовательность равномерно распределенных случайных дробных чисел от 0 до 0,999999999999999 (пятнадцать девяток после нуля). Количество датчиков не ограничено.

CRN

Используется для получения 29-ти видов неравномерных распределений. Точность вычислений зависит от используемых пользователем настроек.

C1

Текущее значение условного времени. Автоматически изменяется программой и устанавливается в 0 управляющими операторами CLEAR или RESET.

AC1

Текущее значение абсолютного времени. Автоматически изменяется программой. Эта величина не меняется под действием управляющего оператораRESET и устанавливается в 0 лишь под действием оператора CLEAR.

TG1

Число, равное текущему значению счетчика завершений. Транзакты, вошедшие в блоки TERMINATE с ненулевым операндом А, уменьшают значение этого счетчика на число, равное значению операнда А.

М1

Время пребывания в модели транзакта, обрабатываемого программой в данный момент. Эта величина может изменяться блоком MARK. Время пребывания вычисляется следующим образом: М1 равно разнице текущего значения абсолютного времени и отметки времени обрабатываемого транзакта.

PR

Приоритет обрабатываемого в данный момент транзакта. Эта величина может изменяться блоком PRIORITY. По умолчанию приоритет равен 0.

СЧА транзактов

СЧА

Расшифровка

XN1

Номер активного транзакта.

Pj или *j, или *<имя>, или *$<имя>

значение параметра j текущего транзакта или значение параметра с именем <имя> текущего транзакта.

MPj

Значение времени, равное разности абсолютного модельного времени и содержимого j-го параметра текущего транзакта.

MBj

Флаг синхронизации: 1, если транзакт в блоке j принадлежит тому же семейству, что и текущий транзакт; 0 - в противном случае.

СЧА блоков

СЧА

Расшифровка

Nj

Общее число транзактов, которые должны войти в j-й блок. Подсчет ведется программой автоматически. Например, N$RADIO - счетчик числа входов в блок RADIO.

Wj

Текущее число транзактов, которые находятся в блоке j. Значение этого счетчика подсчитывается автоматически. Например, W$SNOW - счетчик текущего числа транзактов в блоке SNOW.

СЧА устройств

СЧА

Расшифровка

Fj,Uj

Флаг занятости устройства. Эта величина равна 0, если устройство свободно, и 1 - во всех остальных случаях. Этот атрибут изменяется блоками SEIZE,RELEASE, PREEMPT (захват), PREEMPT (прерывание) и RETURN.

NUj

Флаг незанятости устройства: равно 1, если устройство свободно, и 0 - если занято. Статус занятости изменяется блоками SEIZE, RELEASE, PREEMPT (захват), PREEMPT (прерывание) и RETURN.

FIj,Ij

Флаг прерывания устройства: 1, если устройство находится в состоянии захват в режиме прерывания (блок PREEMPT (захват)), 0 - в противном случае.

NIj

Флаг непрерывания устройства: 1, если устройство не прервано в блоке PREEMPT (захват), 0 - иначе.

FRj

Коэффициент использования устройства FRj считается в обычном виде (например 0.709), а не в тысячных долях (например 709).

FCj

Общее число входов в устройство j.

FTj

Среднее время использования устройства одним транзактом.

FVj

Флаг доступности устройства: 1 - если доступно, 0 - недоступно. После начала моделирования устройство доступно. Устройство переводится в доступное блоком FAVAIL.

FNVj

Флаг недоступности устройства: 1 - если недоступно, 0 - доступно. Устройство переводится в недоступное с помощью блока FUNAVAIL.

СЧА МКУ

СЧА

Расшифровка

Sj

Текущее содержимое многоканального устройства j. Содержимое многоканального устройства может изменяться блоками ENTER и LEAVE.

Rj

Число свободных единиц многоканального устройства j. Эта величина может изменяться блоками ENTER и LEAVE.

SRj

Коэффициент использования многоканального устройства SRj в обычном виде (например 0.651), а не в тысячных долях (например 651).

SAj

Среднее содержимое многоканального устройства j (целая часть).

SMj

Максимальное содержимое многоканального устройства j.

SCj

Общее число входов в многоканальное устройство j.

STj

Среднее время пребывания транзактов в многоканальном устройстве j.

SEj

Флаг незанятости многоканального устройства j: 1 - свободно, 0 - занято.

SFj

Флаг заполненности многоканального устройства j: 1 - заполнено, 0 - не заполнено.

SVj

Флаг готовности многоканального устройства j: 1 - готово, 0 - не готово.

SNVj

Флаг неиспользуемости многоканального устройства j: 1 - неиспользуется, 0 - используется.

СЧА очередей

СЧА

Расшифровка

Qj

Длина соответствующей очереди j. Эта величина изменяется блоками QUEUE и DEPART.

QAj

Средняя длина очереди j.

QMj

Максимальная длина очереди j.

QCj

Общее число входов в очередь j.

QZj

Число нулевых входов в очередь j.

QTj

Среднее время пребывания транзакта в очереди j (включая нулевые входы).

QXj

Среднее время пребывания транзакта в очереди j (без нулевых входов).

СЧА таблиц

СЧА

Расшифровка

TBj

Вычисленное среднее таблицы j. Для занесения в таблицу используется блок TABULATE.

TCj

Общее число включений в таблицу j.

TDj

Вычисленное среднеквадратичное отклонение для таблицы.

СЧА сохраняемых величин

СЧА

Расшифровка

Xj

Содержимое хранимой величины j.

XHj

Содержимое хранимой величины j. СЧА XHj возвращает такое же значение, что и Xj.

СЧА матриц

СЧА

Расшифровка

MXj(a,b)

Содержимое элемента матрицы ячеек j, расположенного в строке a, столбце b.

СЧА функций

СЧА

Расшифровка

FNj

Вычисленное значение функции j. От значения функции берется целая часть, за исключением тех случаев, когда это значение используется в качестве модификатора в блоках GENERATE, ADVANCE или ASSIGN или в качестве аргумента другой функции.

СЧА переменных

СЧА

Расшифровка

Vj

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

BVj

Вычисленное значение (1 или 0) булевской переменной.

СЧА числовых групп

СЧА

Расшифровка

GNj

Текущее число элементов в числовой группе с номером j.

СЧА групп транзактов

СЧА

Расшифровка

GTj

Текущее число элементов в группе транзактов с номером j.

СЧА списков пользователя

СЧА

Расшифровка

CHj

Текущее число транзактов в j-том списке пользователя. Если СЧА обращается к несуществующему списку пользователя, то возвращается 0 и создаётся данный список пользователя.

CAj

Среднее число транзактов в j-том списке пользователя. Если СЧА обращается к несуществующему списку пользователя, то возвращается 0 и создаётся данный список пользователя.

CMj

Максимальное число транзактов в j-м списке пользователя. Если СЧА обращается к несуществующему списку пользователя, то возвращается 0 и создаётся данный список пользователя.

CCj

Число входов в j-й список пользователя. Если СЧА обращается к несуществующему списку пользователя, то возвращается 0 и создаётся данный список пользователя.

CTj

Среднее время пребывания транзакта в j-том списке пользователя. Если СЧА обращается к несуществующему списку пользователя, то возвращается 0 и создаётся данный список пользователя.

СЧА логических переключателей

СЧА

Расшифровка

LSj

Возвращает состояние логического переключателя j: 1 - установлен, 0 - не установлен.

LRj

Возвращает инверсное состояние логического переключателя j: 0 - установлен, 1 - не установлен.