интересно
Предыдущая | Содержание | Следующая

Сигнальные управляющие функции

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

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

Прерывания осуществляются двумя способами:

в процессе диалога с моделью во время ее выполнения (клавиша Esc);

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

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

предназначена для изменения параметров генератора ag, кроме первых двух. Номер перенастраиваемого генератора содержится в параметре рг. -Такая перенастройка произойдет за нулевое модельное время.Смысл аргументов рз — Ре — тот же самый, какой имеют параметры генератора с номером рг.

Функции rels и hold для управления клапаном key. Узел типа клапан управляется из других узлов. Функции rels(i) и hold(i) предназначены для управления клапаном с номером i из любых других узлов.

После выполнения rels клапан принимает состояние открыт, если до этого он был закрыт. Соответственно после hold клапан перейдет в состояние закрыт, если до этого он был в открытом состоянии. Обычно клапаны помещают на выходах каких-либо очередей (но могут быть и другие варианты их использования).

Функции activ и passiv для управление активностью процесса ргос. Функция activ(i) переводит процесс (узел типа ргос) с номером i в активное состояние, если он был пассивен. При этом возобновляются обслуживание транзакта (т.е. отсчет активного времени) и выполнение ^модели процесса (программы float ер). Если процесс уже был активен либо вообще узел i был пустым (нет ни транзакта, ни выполнения модели процесса), то никаких действий не осуществляется. Функция activ в общем случае выполняется в другом узле, номер которого не равен i.

Функция passiv(i) переводит процесс (узел типа ргос) в пассивное состояние, если он был активен. При этом транзакт и соответствующее событие исключаются из списка планируемых событий и переводятся в стек прерванных транзактов. Прекращается и выполнение модели процесса (программы float ер). Если процесс уже был пассивен либо узел i был пустым, то никаких действий не осуществляется.

Функция supply для обеспечефм начальной мощности ресурса. При работе со складом ресурсов attach в какой-то момент необходимо принудительно либо установить начальное значение, либо его изменить на заданную величину. Это делается с помощью функции supply:

Функция имеет следующие параметры. Параметр р! - номер узла attach (int).

Параметр рг - признак add (добавить) или попе (безусловно установить).

Параметр рз - количество единиц ресурса (long).

Функция assign для ассигнования на счет денежной суммы. При работе со счетами send в какой-то момент необходимо принудительно либо установить начальное значение остатка денежных средств, либо его изменить на заданную величину. Это делается с помощью функции assign:

Функция имеет следующие параметры.

- номер счета - узла send (int).

Параметр рг - признак add (добавить) или попе (безусловно установить).

Параметр р3 - значение денежной суммы (double).

Если в такой узел не

поступят р5 транзактов, то уничтожающий транзакт будет все время находиться в нем, блокируя его для поступления других уничтожающих транзактов. Поэтому существует задача изгнания уничтожающего транзакта из узла delet. Для изгнания используется оператор freed(i), который работает в соответствии со следующей логикой. Допустим, что в узле delet с номером i застрял транзакт. Текущий транзакт, который проходит через функцию freed(i) в каком-то другом узле, с ее помощью генерирует вспомогательный транзакт и мгновенно направляет его в узел i. Этот вспомогательный транзакт выталкивает застрявший, приводит delet в нормальное состояние, а сам погибает. Застрявший транзакт будет направлен в узел Рб, определенный в узловом операторе delet.

Факт посещения вспомогательным транзактом фиксируется в узле delet и отражается на статистических результатах, но время его жизни равно нулю.

Функции sewt и sewk для привязки транзактов и узлов к точкам . пространства. Функция sewt(x) помещает текущий транзакт в точку пространства, имеющую номер х (т.е. приписывает ему координаты этой точки путем занесения значения х в параметр транзакта t-*tx). Функция sewk(x,i) помещает узел с номером i в точку пространства, имеющую номер х (т.е. приписывает узлу координаты этой точки, записывая значение х в параметр узла к-Исх).

Функции geoway и dekart для определения расстояния между точками пространства.

Функция geoway(latA,lonA,latB,lonB) служит для определения расстояния между точками А и В по их географическим координатам, измеряемым в радианах, причем

latA, lonA - широта и долгота точки А;

latB, lonB - координаты точки В.

Функция geoway используется имитатором автоматически внутри узла dynam, однако ее можно вызывать из любой программы пользователя. Метод расчета расстояний, используемый в ней, описан в главе 6. Расстояние между двумя пунктами определяется по основным формулам сферической тригонометрии. Радиусы Земли для разных широт вычисляются по эллипсоиду Красовского.

Функция change для замены узла обслуживания очереди. Данная сигнальная функция чаще всего используется при моделировании клиринговых процессов. Она имеет вид

. Этот узел относится к одному из трех типов: 1) send - счет; 2) attach - склад ресурсов; 3) queue - очередь. Очередь обслуживается каким-либо узлом. Если состав или количество транзактов в очереди перестают удовлетворять каким-то требованиям, то все транзакты из очереди необходимо направить в узел с номером рг и разгрузить эту очередь.

- номер узла-очереди (int).

Параметр рг - номер узла, в который необходимо перенаправить транзакты (int).

Функция clcode для включения блока операторов языка C++. В блоке описания узлов иногда разработчик модели может помещать свою программу (хотя чаще всего достаточно собственных средств имитатора): программные блоки на языке C++, обращения к функциям, написанным на языке C++ или Паскаль, обращения к системным вызовам. Однако это нужно делать при соблюдении определенных правил.

Во-первых, если необходимо производить сложные или длительные по времени ресурсоемкие вычисления, использовать рекурсии с некоторыми переменными (например, x=j{x) или *++ ), работать с системными вызовами, обращаться к ресурсоемким вычислительным функциям, то это делается между функцией определения типа узла и соответствующим оператором place с помощью специального средства clcode.

Во-вторых, нельзя использовать операцию языка C++ типа goto не только внутри одного узла (между меткой-функцией top и соответствующим оператором place), но и для перехода в другой узел. Для принудительного завершения моделирования вместо goto можно использовать только операцию interrupt. После такой операции управление будет отобрано у координатора и передано оператору, следующему за блоком описания графа (например, функции modend).

После узлового оператора можно записать блок любых операторов языка C++, оформленный в виде

Если необходимо использовать блок из одного оператора, то это записывается так:

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

Выводы

Рассмотрен набор языковых средств описания структуры имитационной модели, логики ее работы и функциональных особенностей моделируемых процессов. Эти средства представляют собой специализированный язык. Имеется возможность подключения пользовательских программ на C++ в любой узел, если такая необходимость возникнет.

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

структурную декомпозицию в модели, переходы с одного структурного слоя на другой;

запуск и координацию процессов управления транзактами, событиями и узлами модели;

управление материальными, информационными и денежными ресурсами;

имитацию получения, использования и возврата материальных, информационных и денежных ресурсов.

При этом учитывается, что пути перемещения транзактов по графу модели и пути перемещения денежных ресурсов (между узлами типа счет) - это разные маршруты.

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

посылать сигналы, передавать и получать информацию из одних узлов в другие непосредственно, а не с помощью транзактов;

управлять из одних узлов другими узлами и транзактами;

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