Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Бычков Программирование в системе моделирования ГПСС-2010

.pdf
Скачиваний:
61
Добавлен:
16.08.2013
Размер:
562.49 Кб
Скачать

 

ASSIGN

3,7

 

 

LABL2

начало тела цикла

 

тело цикла

 

LOOP

3,LABL2

 

 

Впримере счетчик цикла со значением 7 организован в третьем параметре транзакта блоком ASSIGN. Участок модели от блока с меткой LABL2 до блока LOOP будет выполняться семь раз. (При условии, что внутри этого участка модели нет других условий выхода транзакта.)

3.2.Обработка прерываний с многоуровневыми приоритетами

ВGPSS имеется возможность организовать обработку заявок (транзактов) с различными приоритетами.

Первая форма блока PREEMPT (п. 2.2.2) реализует только два уровня приоритетов. Нижний уровень задает блок SEIZE, верхний – простая форма блока PREEMPT.

Вторая более сложная форма блока PREEMPT обеспечивает режим многоуровневого прерывания.

“Захватить устройство по многоуровневому приоритету” [Метка] PREEMPT Имя_устройства,PR,

[Метка_блока],[Номер_параметра],RE При многоуровневом прерывании транзакт с приоритетом

n или выше войдет в блок PREEMPT и прервет обработку транзакта с меньшим, чем n приоритетом. При обработке транзакта с приоритетом n блоком PREEMPT транзакт с меньшим приоритетом не сможет войти в блок и будет поставлен в очередь задержек к блоку.

Поле А блока содержит имя устройства. Поле В должно содержать ключевое слово PR. Поле С содержит метку блока, которому передается прерванный транзакт. Поле D содержит номер параметра прерванного транзакта, куда записывается время, которое осталось ему провести на обслуживании. Поле E должно содержать ключевое слово RE, обозначающее, что прерванный транзакт вернул устройство и более не претендует на обслуживание на нем.

41

Все параметры блока PREEMPT позиционные, и если какой-либо из них опущен, то вместо него должна быть поставлена запятая– PREEMPT WERK1,PR,MET7,,RE.

Пример:

 

Метка

Операция

A, B, C, D, E, F, G

 

PREEMPT

WERK1,PR,MET7,3,RE

 

ADVANCE

134,54

 

RETURN

WERK1

 

 

MET7

SEIZE

WERK2

 

ADVANCE

P3

 

RELEASE

WERK2

В приведенном примере транзакт с более высоким приоритетом прервет обслуживание на устройстве WERK1 транзакта с меньшим приоритетом и направит его на блок SEIZE c меткой МЕТ7. В параметре 3 прерванного транзакта будет записано время дообслуживания.

Таким образом, все прерванные транзакты будут направляться на продолжение обработки на метку MET7.

Время обработки

каждый транзакт получает в блоке

ADVANCE 134,54.

Устройство WERK2 дообслужит

прерванные транзакты в порядке общей очереди за время, записанное в параметре P3 каждого транзакта.

Пример:

 

Метка

Операция

A, B, C, D, E, F, G

 

ASSIGN

3,30

ARB1

PREEMPT

WERK1,PR,ARB1,3,RE

 

ADVANCE

P3

 

RETURN

WERK1

Каждый транзакт,

проходящий через блок ASSIGN,

получает в третьем

параметре значение 30. Приоритеты

транзактов различны. Далее транзакт входит в блок

PREEMPT.

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

Если же приоритет входящего больше, то он прерывает обслуживание предыдущего. При этом предыдущий транзакт передается на метку, указанную в третьем операнде блока –

42

ARB1. В параметр 3 отстраненного транзакта записывается время, которое ему осталось "досиживать" в блоке ADVANCE, когда до него дойдет очередь. Отстраненный на время от обслуживания транзакт не прошел через блок RETURN, поэтому последний операнд блока PREEMPT содержит ключевое слово RE, которое означает, что отстраненный транзакт освобождает обслуживающее его устройство.

Блок ADVANCE использует косвенную форму задания времени задержки транзакта – через значение третьего параметра транзакта. Транзакт, проходя через блок RETURN, освобождает (возвращает) устройство, захваченное соответствующим ему блоком PREEMPT.

Если устройство, указанное в PREEMPT, еще не занято, то блок PREEMPT действует как SEIZE.

3.3. Сравнение значений. Блок TEST

Для сравнения значения двух величин и выбора направления движения транзакта в зависимости от результата сравнения может быть использован блок

TEST:

“Сравнить значения”

[Метка] TEST Операция Первый_операнд,Второй_операнд [,Метка_передачи_транзакта]

Операция -> E|NE|GE|LE|G|L

В поле операции блока TEST через пробел или подчеркивание указывается символический код операции сравнения двух величин, которые указаны в поле операндов блока TEST.

Коды операций:

E – операнды равны; NE – операнды не равны;

GE – первый операнд больше или равен второму; LE – первый операнд меньше или равен второму; G – первый операнд больше второго;

L – первый операнд меньше второго.

Первый операнд указывается в поле А, второй – в поле В. Если условие, заданное операцией сравнения,

43

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

Пример:

 

Метка

Операция

A, B, C, D, E, F, G

MET1

TEST E

P3,7,LABL3

 

ASSIGN

5+,1

 

 

LABL3

 

Блок TEST в примере сравнивает значение параметра P3, входящего в него транзакта, c 7. Если значение третьего параметра транзакта равно 7, то транзакт передается на следующий блок ASSIGN. Если значение P3 не равно 7, то транзакт передается на блок с меткой LABL3.

3.4. Переменные

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

Имеется три типа переменных:

-арифметические целочисленные (VARIABLE);

-арифметические с плавающей точкой(FVARIABLE);

-булевские (BVARIABLE).

Рассмотрим правила описания переменных.

“Описать арифметическую целочисленную переменную” Имя_переменной_или_номер VARIABLE

Алгебраическое_выражение

Пример: PRIOR VARIABLE RN1@7+1 12 VARIABLE RN1@7+1

Переменная PRIOR и переменная 12 получают равномерно распределенные значения в интервале от 1 до 7.

44

RN1 – датчик случайных чисел, дает случайное равномерно распределенное значение в интервале от 0 до 999. Операция

@получает остаток от деления. “Алгебраическое_выражение”, в поле операндов блока

VARIABLE, может содержать:

-целые арифметические константы;

-другие арифметические переменные;

-стандартные числовые атрибуты;

-знаки арифметических операций;

-допускается не более 5 пар скобок. Арифметические операции следующие:

+ – сложение;

-– вычитание; * – умножение;

/ – деление, результат – целая часть от частного; @ – деление, результат – остаток от деления, который

считается положительным.

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

Результат вычисления арифметической целочисленной переменной – целое число, которое получается округлением путем отбрасывания дробной части.

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

Обращение к переменной выполняется как V$PRIOR или

V12.

Пример:

 

 

Метка

Операция

A, B, C, D, E, F, G

LNGTH

VARIABLE

RN1/10+1

PRIO

VARIABLE

RN2@10 + 1

 

 

 

 

ASSIGN

3,V$LNGTH

 

PRIORITY

V$PRIO

 

В примере описана целочисленная переменная LNGTH,

которая использует датчик случайных чисел RN1, который

дает значения в интервале от 0 до 999. ПеременнаяLNGTH

используется для получения

случайных значений в

45

интервале от 1 до 100.

 

Первая

переменная вычисляется каждый

раз, когда

транзакт

проходит через блок ASSIGN.

Полученное

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

Вторая целочисленная переменная PRIO позволяет получить случайные значения в интервале от 1 до 10.

Датчик случайных чисел RN2 аналогичен RN1 и дает значения в интервале от 0 до 999.

Вторая переменная вычисляется всякий раз, когда транзакт проходит через блок PRIORITY, и служит для назначения приоритета транзакту случайным образом в диапазоне от 1 до 10.

“Описать арифметическую переменную с плавающей точкой”

Имя_переменной_или_номер FVARIABLE Алгебраическое_выражение

Пример: PRIOR1 FVARIABLE RN2@7+1

Результат вычисления переменной PRIOR1 аналогичен результату вычисления переменной PRIOR.

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

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

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

Обращение к переменной с плавающей точкой PRIOR1 – FV$PRIO1 или, если в описании имени переменной задан номер 15, а не имя, то FV15.

Булевские переменные описываются блоком BVARIABLE: “Описать булевскую переменную” Имя_переменной_или_номер BVARIABLE

Логическое_выражение

Пример: BOOL1 BVARIABLE SE3 + LR7

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

46

которые состоят из:

-булевских переменных;

-арифметических переменных;

-числовых констант;

-условных операторов;

-логических операторов;

-стандартных логических атрибутов;

-стандартных числовых атрибутов.

Булевская переменная может принимать только два значения – "истина" и "ложь".

Логические операции "И" и "ИЛИ" обозначаются знаками "*" и "+" соответственно.

Условные операторы выполняют алгебраическое сравнение операндов, в качестве которых могут быть числовые константы, арифметические переменные, арифметические операции и стандартные числовые атрибуты. Условные операторы пишутся в кавычках и обозначаются следующим образом:

-'G' – “больше чем”;

-'L' – “меньше чем”;

-'E' – “равно”;

-'NE' – “неравно”;

-'LE' – “меньше или равно”;

-'GE' – “больше или равно”.

Условный оператор и два операнда образуют операцию

сравнения.

Значением

операции сравнения

может быть

"истина"

или "ложь".

Значение

операции

сравнения

"истина"

устанавливается, когда

между

операндами

выполняется соотношение, указанное условным оператором.

Пример:

 

 

 

Метка

Операция

A, B, C, D, E, F, G

BOOL1

BVARIABLE

SE3

 

4

BVARIABLE

FI7

 

17

BVARIABLE

V$PRIO 'E' 11

7

BVARIABLE

SE5 * LR9

Первая переменная BOOL1 принимает значение "истина",

если память

с номером

3 на

момент обращения к

переменной пуста (используется СЧА SE3).

Вторая переменная с

номером

4 принимает значение

47

"истина", если устройство с номером 7 на момент обращения к переменной было прервано, т.е. с ним работает блок PREEMPT (используется СЧА FI7).

Третья булевская переменная с номером 17 принимает значение "истина", если значение целочисленной арифметической переменной PRIO на момент обращения к переменной равно 11.

Четвертая переменная с номером 7 принимает значение "истина", если одновременно на момент обращения к переменной выполняются два условия (указана логическая операция "И"): накопитель с номером 5 пуст и логический ключ с номером 9 выключен (используются СЧА SE5 и СЛА

LR9).

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

Обращение к булевской переменной BOOL1 – B$BOOL1 или, если в описании имени переменной задан номер 17, а не идентификатор, то B17.

3.5.Хранимые значения

ВGPSS имеется возможность запоминать константы или

вычисляемые в процессе моделирования значения с помощью хранимых значений.

В моделях на GPSS они играют роль переменных в обычных языках программирования. Для обращения к хранимому значению используется стандартный числовой атрибут X для хранимых значений длиной в слово и XH для хранимых значений длиной в полуслово. Далее следует имя переменной через символ $ или номер.

Пример: X3, X20, X$RATE, X$PRIOR.

Описаний хранимых значений не требуется.

Для операции с хранимым значением используется блок

SAVEVALUE: “Сохранить значение”

[Метка] SAVEVALUE

Номер_хранимого_значения_или_имя[+|-],Значение

48

Пример: SAVEVALUE 3+,P2

В поле А указывается номер хранимого значения и возможная операция с этим значением – только сложение или вычитание. В поле В указывается величина, которая присваивается или участвует в арифметической операции. Операция с хранимым значением выполняется при прохождении транзакта через блок SAVEVALUE. Результат записывается в указанное хранимое значение.

Пример:

 

Метка Операция

A, B, C, D, E, F, G

SAVEVALUE

20+,7 X20:=X20+7

SAVEVALUE

3-,V$PRIO X3:=X3-V$PRIO

SAVEVALUE

X$PRIOR,37 X$PRIOR:=37

SAVEVALUE

X$RA,V$LNG X$RA:=V$LNG

В первом примере к хранимому значению с номером 20

(X20) прибавляется 7.

Результат записывается в хранимое

значение с номером 20.

 

Во втором – из

хранимого значения с номером 3

вычитается значение переменной PRIO. Результат записывается в хранимое значение с номером 3. Значение переменной PRIO будет вычисляться при вхождении транзакта в блок SAVEVALUE при обращении к переменной.

Втретьем примере хранимому значению PRIOR присваивается новое значение – 37. Прежнее значение теряется.

Вчетвертом примере хранимому значению с именем RATE присваивается значение переменной LNGTH.

По умолчанию все начальные значения хранимых величин равны нулю.

С помощью описательного блока INITIAL “Присвоить начальное значение” могут быть заданы любые начальные значения.

INITIAL XНомер_хранимого_значения, Значение_константа

INITIAL XHНомер_хранимого_значения, Значение_константа

INITIAL X$Имя_хранимого_значения, Значение_константа

INITIAL XH$Имя_хранимого_значения,

49

Значение_константа

Пример: INITIAL X4,17 X4:=17

INITIAL X$RATE,19 X$RATE:=19

В первом случае хранимой величине X4 присваивается в качестве начального значения 17. Во втором случае хранимой величине RATE – 19.

3.6. Функции

Для реализации различных функциональных зависимостей наряду с формулами, которые записываются в выражении для переменных, используются функции. Функции часто используются для генерации случайных величин со сложным законом распределения. В поле метки пишется номер или имя функции. В поле операции –

FUNCTION.

“Описать функцию” Имя_функции_или_номер FUNCTION

Аргумент,Тип_функции_и_количество_пар Значение_аргумента1,Значение_функции1/…

Значение_аргументаN, Значение_функцииN

Тип_функции -> C|D

ВGPSS имеются два типа функций – непрерывные и дискретные. Непрерывная функция кодируется буквой С, дискретная – буквой D.

Вполе А записывается правило для образования значения аргумента функции. Аргументом функции могут быть любые стандартные числовые атрибуты, а также другие функции. В поле В – тип функции и количество пар координат: "аргумент – значение функции".

Вкаждой паре “аргумент – значение функции” аргумент отделяется запятой от значения функции. Каждая пара отделяется друг от друга косой чертой (/). Значение аргумента – правая граница интервала.

При задании дискретной функции аппроксимация между двумя точками – значениями функции выполняется горизонтальной линией ("ступенькой"). При попадании случайного значения аргумента в интервал значение

50