Моделирование агрегатов
Предположим, что значения и состав элементарных данных могут меняться лишь в особые моменты времени, а между ними остаются постоянными. Разобьем множество на два подмножества, гдесостоит из положительных величин, а- -из неположительных. Будем считать, что данные из подмножества — остаются неизменными между особыми моментами времени и что моменты наступления внутренних событий определяются лишь… Читать ещё >
Моделирование агрегатов (реферат, курсовая, диплом, контрольная)
Теория агрегативных моделей
Агрегаты относятся к классу объектов, которые принято изображать в виде преобразователя (рис. 1.), функционирующего во времени tT=[0,] и способного воспринимать входные сигналы x со значениями из некоторого множества X, выдавать выходные сигналы y со значениями из множества Y и находиться в каждый момент времени в некотором состоянии z из множества Z. Класс агрегатов отличает специфика множеств X,Y,Z, допустимые формы входных и выходных сообщений (т.е. функций x (t), y (t), tT), траекторий z (t), tT, а также способ преобразования входного сообщения в выходное.
Приступим к указанной конкретизации.
Прежде всего, отметим, что динамика агрегата носит «событийный «характер (в случае, когда динамика модели фактически повторяет динамику системы, т. е. переход от одного события к другому, говорят, что соответствующая алгоритмическая модель носит событийный характер). В агрегатах могут происходить события двух видов: внешние и внутренние.
Внутренние заключаются в достижении траекторией некоторого подмножества Z*Z состояний; внешние — в поступлении входного сигнала.
Предполагается, что в момент поступления входных сигналов в КЛА образуют неубывающую последовательность, т. е. по определению, исключается случай поступления непрерывных сигналов, характерных, скажем, для систем, описываемых дифференциальными уравнениями.
Точно также предполагается, что последовательные моменты достижения траекторий z (t) подмножества Z* изолированы друг от друга. Траектории {z (t)} считаются непрерывными справа и имеющими пределы слева в каждый момент времени.
Между событиями состояние агрегата изменяется детерминированным образом. Если в некоторый момент t состояние z (t)=z, то в момент времени t`=t+, >0 (если на промежутке (t, t`) не наступает никакого события), где — полугрупповой оператор:. Для агрегатов оператор имеет очень простой вид.
X Z Y
Рис. 1. Общий вид преобразователя Каждому состоянию z ставится в соответствие величина =(z), трактуемая как потенциальное время до наступления очередного внутреннего события:
. (1.)
На основании определения (1.) и с учетом полугруппового свойства оператора Tq для любого q и z таких, что <(z), можно записать (=(z).
Если t* - момент наступления внутреннего события и, то состояние агрегата в момент t* является случайным, зависящим лишь от z* и не принадлежащим Z*. Последнее условие гарантирует изолированность моментов наступления внутренних событий. В момент t* выдается выходной сигнал y*, содержание которого зависит лишь от z*. В частности, выходной сигнал может быть и пустым, т. е. не выдаваться. После случайного скачка вновь определяется время до наступления внутреннего события.
Рассмотрим теперь момент t** поступления входного сигнала x. Пусть. Тогда состояние агрегата в момент t** является случайным, зависящим лишь от x и z** и не принадлежащим Z*. В момент t**, вообще говоря, выдается выходной сигнал y**, содержание которого определяется x и z**.
Условимся считать, что если моменты наступления внешнего и внутреннего событий совпадают, то изменение состояния осуществляется в соответствии с правилом наступления внешнего события, т. е. входные сигналы имеют приоритет над внутренними событиями.
Таким образом, процесс функционирования агрегата полностью определяется изменениями, происходящими в особые моменты времени — моменты наступления событий (внешних или внутренних). Между особыми моментами состояние агрегата меняется детерминировано в соответствии с оператором .
Динамику состояний агрегата можно представить в следующем виде. Пусть в некоторый момент времени t его состояние равно z. Тогда определяется время (z) достижения траекторией z () особого подмножества Z*. Если в течение времени (z) на агрегат не поступает входных сигналов, то, если t+
Начиная с момента наступления события (внешнего или внутреннего), ситуация повторяется, и динамика КЛА определяется точно так же, как и ранее.
Если 1,2,… — моменты наступления событий в агрегате справедливо в промежутке времени [0,), где. Если не существует конечной точки накопления событий, т. е. =, то траектория агрегата определена на [0,). В противном случае (назовем его нерегулярным) траектория определена лишь до конечного (хотя и случайного) момента .
Опишем теперь агрегат более подробно. Будем считать, что множество входных сигналов X представляется в виде произведения X=X1*X2*…*Xm, а множество выходных сигналов Y — в виде n-кратного произведения Y=Y1*Y2*…*Yn. Содержательно это означает, что агрегат внешне имеет вид многополюсника с m входными клеммами и n выходными клеммами (рис. 2.). Отметим, что в общем случае mn.
Предположим, что в состав множеств Xi и Yj включены и фиктивные элементы, наличие которых на входе или выходе агрегата означает отсутствие сигнала на соответствующей входной или (соответственно) выходной клемме.
Следовательно, входной сигнал на имеет вид
x=(x1,x2,…, xm),
а выходной
y = (y1,y2,…, yn).
X1 1 1 Y1
.. Z…
Xm m n Yn
Рис. 2. Кусочно-линейный агрегат (КЛА) Не фиктивными входными xi или выходными yj сигналами, а также состояниями z КЛА являются данные.
Понятие данного определим рекуррентно.
Элементарными данными считаются: целые числа; действительные числа; символьные переменные (литералы).
Данными считаются: элементарные данные; списки данных; массивы данных; структуры данных.
Здесь термины «список», «массив» употребляются в их обычном смысле. Понятие структуры данных соответствует дереву, на корнях которого размещены данные. Каждое данное имеет свое имя.
Рассматриваемые данные хорошо отображают содержательные представления, существующие у исследователя относительно реальных объектов, и существенно облегчают процесс построения модели. Эти данные удобны как с математической, так и с программной точек зрения.
Итак, пусть состояние z КЛА определено как некоторая структура. Тем самым фиксирован вид дерева, представляющего эту структуру.
Дерево базируется, в конечном счете, на элементарных данных. Обозначим через элементарные данные, входящие в состояние z и имеющие тип целых чисел и символов, а черезэлементарные данные, имеющие действительный тип. При изменении состояния может меняться и количество элементарных данных, составляющих состояние, так как, например, при этом могут изменяться длины некоторых списков.
Предположим, что значения и состав элементарных данных могут меняться лишь в особые моменты времени, а между ними остаются постоянными. Разобьем множество на два подмножества, гдесостоит из положительных величин, а- -из неположительных. Будем считать, что данные из подмножества - остаются неизменными между особыми моментами времени и что моменты наступления внутренних событий определяются лишь данными из. Это отвечает обычно используемой «энергетической интерпретации» причин наступления внутренних событий в моменты, когда исчерпывается некоторый ресурс, оканчивается операция и т. д. Обозначим через i-й элемент множества и положим — множество, участвующее в определении внутренних событий. Таким образом, внутреннее событие происходит, когда хотя бы один из положительных элементов множества обращается в нуль.
Предположим, что каждое элементарное данное из множества изменяется с постоянной скоростью. Обозначим через набор этих скоростей (число элементов множества равно числу элементов множества). В частности, указанные скорости могут равняться нулю, что соответствует постоянству соответствующих данных. Обозначим через i-й элемент множества. Тогда, если >0, то соответствующая координата будет возрастать (например, увеличиваться ресурс) и, следовательно, она не может обратиться в нуль. Такая же ситуация справедлива и для =0. Если <0, то координата обратится в нуль через время. Поэтому время наступления внутреннего события (равное времени достижения траекторией КЛА подмножества Z*)
.
Следовательно, оператор имеет вид
;; .
Если, то это означает, что в момент t* по меньшей мере один из элементов обращается в нуль. При таком условии состояние zt* зависит вероятностным образом только от z*. Состояние zt* описывается той же структурой, что и z*, но в общем случае могут изменяться значения элементарных данных, длины списков и т. д. В момент t* определяется выходной сигнал y=(y1,y2,…, yn), т. е. для каждого i=1,2,…, n проверяется, имеет ли место равенство yj= или нет (иначе говоря, выдается ли выходной сигнал с клеммы j). Кроме того, для каждого j такого, что yj определяется «содержимое» соответствующей структуры.
Аналогично задается реакция КЛА на входной сигнал x=(x1,x2,…, xm). Пусть этот сигнал поступает в момент t** и. В зависимости от входного сигнала (от того, на какие клеммы поступили входные сигналы, и их содержания), а также от z** вероятностным образом определяется состояние zt** и выходной сигнал y=(y1,y2,…, yn).
При описании производственных, вычислительных, транспортных и других систем широко используются модели массового обслуживания. Формального определения этих моделей не существует. Поэтому ограничимся описанием ряда элементов, являющихся типичными составляющими моделей обслуживания, не претендуя ни в коей мере на исчерпывающую полноту. Следует также отметить, что приводимые формализации не являются единственно возможными.
Очередь. Одним из основных элементов моделей обслуживания является очередь, или накопитель, работающий следующим образом. Приходящие заявки, характеризуемые каким-либо набором параметров, выстраиваются в порядке их поступления. По сигналу, получаемому от других элементов (например, приборов), накопитель выдает очередную заявку во вне. Если в момент получения такого сигнала очередь пуста, то сигнал запоминается очередью и заявка во вне выдается в момент ее поступления в очередь. Если в пустую очередь поступают несколько сигналов о выдаче заявок, то они удовлетворяются по мере их поступления. Дополнительно предположим, что в момент поступления заявки в очередь формируется случайное время, имеющее функцию распределения F и являющееся предельно допустимым временем пребывания заявки в очереди, по истечении которого заявка теряется.
Опишем данную очередь как КЛА с именем НАКОПИТЕЛЬ (рис. 3.). Будем считать, что он имеет две входные клеммы 1,2. На клемму 1 поступают сигналы о пришедших заявках, а на клемму 2 — о требованиях на заявки соответственно. Агрегат имеет также две выходные клеммы. С выходной клеммы 2 снимаются сигналы о заявках, ушедших на обслуживание, а с клеммы 1 — сигналы о потерянных заявках. Поскольку здесь информация о заявке нас не интересует, то скажем лишь, что она будет представлена как произвольное данное, имеющее имя ЗАЯВКА (неважно, какой структуры). В соответствии с этим и входной сигнал, поступающий на входную клемму 1, будет иметь вид данного ЗАЯВКА. Будем считать, что сигнал, поступающий на клемму 2, является литералом и имеет имя ТРЕБОВАНИЕ. С обеих выходных клемм снимаются сигналы, имеющие структуру данных ЗАЯВКА и содержащие полную информацию об ушедших или потерянных заявках.
Накопитель узел
1 1 1
2 2 1 2
Рис. 3. Многолинейная модель обслуживания как агрегативная система Назовем внутреннее состояние КЛА НАКОПИТЕЛЬ именем ОЧЕРЕДЬ и определим его как данное следующей структуры: ОЧЕРЕДЬ =(ОЧТРЕБ, ОЧЗАЯВ), где ОЧТРЕБ — целочисленная переменная, принимающая значения 0,1,2,… и имеющая смысл накопленного числа требований на заявки; ОЧЗАЯВ — список. Элементами списка ОЧЗАЯВ являются пары вида (ВРЕМЯ, ЗАЯВКА), где ВРЕМЯ — неотрицательная величина, имеющая смысл времени, оставшегося до потери данного ЗАЯВКА, т. е. ОЧЗАЯВ хранит всю информацию о содержащихся в очереди заявках и времени их жизни. Длина списка ОЧЗАЯВ равна, очевидно, числу заявок в очереди. Множество действительных величин из списка ОЧЗАЯВ, имеющих имя ВРЕМЯ, составляют множество .
Опишем динамику КЛА НАКОПИТЕЛЬ. Штрихами будем отмечать состояние КЛА после наступления какого-либо события. Внешними событиями являются поступления сигналов на входные клеммы, а внутренними — обнуления координат из множества .
Если КЛА находится в состоянии ОЧЕРЕДЬ в момент t, то все элементарные данные из этого состояния сохраняют свое значение и далее, кроме координат из множества, которые убывают с единичной скоростью. Указанное изменение происходит до ближайшего (после t) момента наступления события.
Если КЛА находится в состоянии ОЧЕРЕДЬ, поступает сигнал ЗАЯВКА (на входную клемму 1), то происходят следующие изменения:
в случае ОЧТРЕБ =0 (требований заявки нет) список ОЧЗАЯВ пополняется новой парой (ВРЕМЯ, ЗАЯВКА), где ВРЕМЯ — случайная величина с функцией распределения F, а ЗАЯВКА — содержимое поступившего входного сигнала; остальные координаты не меняются и выходной сигнал не выдается;
в случае ОЧТРЕБ 0 получаем ОЧТРЕБ = ОЧТРЕБ — 1 (одно требование удовлетворяется), остальные координаты не меняются, т. е. ОЧЗАЯВ =; с выходной клеммы 1 выдается выходной сигнал ЗАЯВКА, содержание которого совпадает с содержанием поступившего входного сигнала.
Если поступил сигнал ТРЕБОВАНИЕ (на входную клемму 2), то происходят следующие изменения:
в случае ОЧЗАЯВ (список заявок не пуст) новый список ОЧЗАЯВ образуется из старого удалением первой пары (ВРЕМЯ, ЗАЯВКА), при этом второй элемент этой пары ЗАЯВКА выдается в качестве выходного сигнала с выходной клеммы 2; остальные координаты не меняются;
в случае ОЧЗАЯВ = полагаем ОЧТРЕБ` =ОЧТРЕБ + 1, ОЧЗАЯВ` =. Если произошло внутреннее событие и обнулилась координата ВРЕМЯ у i-й пары списка ОЧЗАЯВ, то новый список ОЧЗАЯВ получается из старого удалением i-й пары списка (ВРЕМЯ, ЗАЯВКА), второй элемент этой пары выдается в качестве сигнала с выходной клеммы 1, остальные координаты остаются без изменения.
Динамика КЛА НАКОПИТЕЛЬ описана полностью.
Аналогичным образом можно получать КЛА, описывающие очереди с другими дисциплинами. Например, для реализации дисциплины «первым пришел — последним обслужен» достаточно в реакции КЛА на поступление входного сигнала ТРЕБОВАНИЕ в п. 1) вычеркнуть из списка ОЧЗАЯВ не первую, а последнюю пару.
Обслуживающий узел. Назовем обслуживающим узлом совокупность из N< приборов обслуживания, из которых i-й прибор характеризуется случайным временем обслуживания с функцией распределения Gi (x). Заявка, поступающая на узел, занимает прибор, освободившийся от обслуживания раньше всех.
Опишем работу узла с помощью КЛА с именем УЗЕЛ. Положим, что одну входную клемму (на которую поступают сигналы об обслуживаемых заявках) и две выходные клеммы, с которых снимаются сигналы об обслуживаемых заявках (клемма 1) и о требовании новой заявки на обслуживание (клемма 2). В соответствии с этим будем считать, что на входную клемму поступает сигнал, имеющий вид данного ЗАЯВКА, и аналогичный сигнал снимается с выходной клеммы 1. С выходной клеммы 2 снимается сигнал вида ТРЕБОВАНИЕ.
Назовем внутреннее состояние КЛА УЗЕЛ именем УЗ и положим, что данное УЗ представляет собой следующую структуру:
УЗ = (ОБСЛУЖ, СВОБОДЕН).
Данное ОБСЛУЖ является массивом (размерности N) данных типа (ОСТ_ВРЕМЯ, ЗАЯВКА), при этом i-й элемент массива отвечает i-му обслуживающему прибору. Величина ОСТ_ВРЕМЯ является действительной и имеет смысл остаточного времени обслуживания. Данное ЗАЯВКА хранит всю информацию об обслуживаемой на i-м приборе заявке. В случае, если i-й прибор свободен, соответствующий элемент массива полагается пустым.
Данное СВОБОДЕН является списком целых чисел. В нем записаны номера свободных приборов в порядке их освобождения. Если свободных приборов нет, то список пуст.
Множество переменных, определяющих наступление внутренних событий, состоит из всех данных с именем ОСТ_ВРЕМЯ, входящих в массив ОБСЛУЖ. В промежутках между событиями эти переменные убывают с единичной скоростью, а остальные данные остаются неизменными.
Опишем реакцию КЛА УЗЕЛ на события.
Если на входную клемму поступил сигнал ЗАЯВКА, а КЛА находиться в состоянии УЗ, то: очередь прибор модель агрегат в случае, если список СВОБОДЕН пуст (нет свободных приборов), то УЗ`=УЗ (узел не реагирует на поступившую заявку);
в случае, если СВОБОДЕН, то новый список СВОБОДЕН` получается из старого удалением первого элемента (пусть этот элемент имеет значение 1 i N, т. е. поступающую заявку следует посылать на i-й прибор); i-й элемент массива ОБСЛУЖ принимает значение (ОСТ_ВРЕМЯ, З АЯВКА), где ОСТ_ВРЕМЯ равно случайной величине с распределением Gi, а заявка является данным, совпадающим с входным сигналом; остальные координаты не изменяются.
Если в i-м элементе массива ОБСЛУЖ обнулилась координата ОСТ_ВРЕМЯ (окончилось обслуживание заявки на i-м приборе), то новый массив ОБСЛУЖ` получается из массива ОБСЛУЖ занесением в его i-й элемент пустого символа. Список СВОБОДЕН` получается из СВОБОДЕН добавлением элемента, имеющего значение i, в конце списка (если СВОБОДЕН =, то список СВОБОДЕН состоит из единственного элемента i). Остальные координаты не меняются. С выходной клеммы снимается сигнал, значение которого равно значению i-го элемента ЗАЯВКА массива ОБСЛУЖ. С выходной клеммы 2 КЛА УЗЕЛ снимается сигнал на ТРЕБОВАНИЕ.
КЛА УЗЕЛ описан полностью.
Описанные модели могут служить элементами сетей массового обслуживания.
2. Постановка задачи
Написать в среде MatLab библиотеку элементов, моделирующую работу Агрегата (рис. 4.).
1 1 1 1
Рис. 4. Модель агрегата.
Генератор
Генерирует заявки, поступающие на обработку в агрегат:
ЗАЯВКА — тройка чисел (Tп, Tож, Tоб),
где Tп — время появления заявки в системе (системное время).
Tож — время ожидания заявки в очереди, по окончании этого времени заявка в очереди уничтожается.
Tоб — время обслуживания заявки в обслуживающем узле.
Tож и Tоб — случайные числа, сгенерированные ганератором случайных чисел.
Накопитель
На клемму 1 поступают сигналы о пришедших заявках, которые порождает генератор заявок, а на клемму 2 — о требованиях на заявки (свободное состояние обслуживающего узла) соответственно. С выходной клеммы 1 агрегата снимаются сигналы о заявках, ушедших на обслуживание. Поскольку здесь информация о заявке нас не интересует, то скажем лишь, что она будет представлена как произвольное данное, имеющее имя ЗАЯВКА. В соответствии с этим и входной сигнал, поступающий на входную клемму 1 накопителя, будет иметь вид данного ЗАЯВКА.
Если КЛА находится в состоянии ОЧЕРЕДЬ, поступает сигнал ЗАЯВКА (на входную клемму 1, то происходят следующие изменения:
в случае, когда требования на заявку нет список (очередь) пополняется новой заявкой.
в случае, когда требование на заявку поступило, из очереди на обслуживающий узел подается заявка, которая дольше всех находилась в очереди.
в случае, когда требование на заявку поступило, а очередь пуста (в ней нет ни одной заявки), тогда накопитель ждет первую пришедшую заявку с генератора и отправляет ее на обслуживающий узел.
Если у заявки истекает параметр ожидания в очереди (Тож), то данная заявка удаляется из очереди.
Обслуживающий узел
УЗЕЛ имеет одну входную клемму (на которую поступают сигналы об обслуживаемых заявках) и выходную клемму, с которой снимается сигнал о требовании новой заявки на обслуживание. В соответствии с этим будем считать, что на входную клемму поступает сигнал, имеющий вид данного ЗАЯВКА, с выходной клеммы 1 снимается сигнал вида ТРЕБОВАНИЕ.
Опишем реакцию КЛА УЗЕЛ на события.
Если узел свободен (не обслуживает заявку) то он посылает накопителю требование на заявку (ТРЕБОВАНИЕ).
Если узел занят (обрабатывается заявка) то он ничего не посылает накопителю заявок.
Во время обработки узел следит за временем.
3. Реализация поставленной задачи средствами MatLab версии 5.3
Для описания модели также был использован MatLab Editor/Debugger, который позволил описать собственные продедуры обработки данных, написанные на языке MatLab.
В результате решения поставленной задачи было разработано три файла, которые необходимы для работы с библиотекой агрегатов: Lib. mdl, Process. m, Accum. m, F1. m
Файл Lib.mdl — библиотека элементов (Рис. 5.)
Рис. 5. Библиотека элементов агрегата Lib. mdl
Random Number — генератор случайных чисел.
Subsystem — счетчик системного времени.
Generator — генератор заявок.
Accumulator — накопитель заявок (организация очереди и работа с обрабатывающим узлом).
Processor — обрабатывающий узел.
3.1 Random Number
Элемент генерирует случайные числа, с каждым тактом системного времени выдает новое положительное случайное число, которое показывает через какой промежуток времени новая заявка должна поступить на обработку в агрегат.
3.2 Subsystem
Даная подсистема позволяет снимать показания текущего системного времени. Это необходимо для определения Тпвремени появления заявки в системе и для определения количества времени которое заявка может находиться в очереди на обработку и в обслуживающем узле.
Данная подсистема имеет следующую структуру:
Рис. 6. Подсистема определения системного времени
3.3 Generator
Генерирует заявку — троику чисел (Тп, Тож, Тоб), где Тп — системное время от начала моделирования процесса в системе, а Тож и Тоб — два неотрицательных, подобранных случайным образом числа.
Пользователь может сам выбирать закон распределения:
В данном запросе поддерживается выбор одного из двух законов распределения. Пользователю необходимо указать в поле запроса 1 либо 2.
Это встроенные функции системы MatLab 1-randn, 2 — rand
RANDN закон нормального распределения случайных чисел (Normally distributed random numbers.)
RAND закон порождения псевдо-учайных чисел (roduces pseudo-random numbers).
Рис. 7. Редактор маскирования Существует возможность добавления других законов распределения в даннную библиотеку. Это было осуществлено путем добавления в редактор маскирования в закладку инициализации элементов переменной отвечающей за выбор закона распределения (Рис. 7.), также в строку инициализации добавлены строчки обнуления параметров IsBusi, Delay, и OldTime, которые необходимы для работы THandle.
Структура генератора:
Рис. 8. Модуль Genrator
In1 — вход генератора куда он получает значение из генератора случайных чисел. Это значение указывает количество времени до появления следующей заявки в системе.
Out1 — выход генератора на который подается сформированная заявка.
From — вход генератора на который подается системное время моделирования.
Thandle — обработчик, который позволяет работать с константами IsBusy, Delay,
OldTime, причем он позволяет изменять значение констант во время моделирования.
IsBusy — константа, которая определяет прошло ли системное время до необходимости образования новой заявки; допустимые значения 0-время наступило и 1-время еще не пришло.
Delay — константа, которая определяет величину задержки до появления следующей заякки (измеряется в величинах системного времени).
OldTime — константа, которая определяет величину системного времени, равную времени прихода костанты Delay.
MatLabFcn — функция F1, которая выполняет компоновку заявки, в зависимости от вышеописанных констант и переменных.
Файл F1.m
function M=f1(u)
mainblock=strcat (getfullname (u (3)),'/THandle'); %
delayblock=strcat (getfullname (u (3)),'/Delay'); % Организация связей
flagblock=strcat (getfullname (u (3)),'/IsBusy'); % со всеми переменными и
oldtimeblock=strcat (getfullname (u (3)),'/OldTime'); % константами через
% THandle
delayvalue=str2num (get_param (delayblock,'Value'));
flagvalue=str2num (get_param (flagblock,'Value'));
oldtimevalue=str2num (get_param (oldtimeblock,'Value'));
rtype=str2num (get_param (getfullname (u (3)),'rt'));
if rtype==1
a1=randn;
a2=randn; % Проверка выбора пользователем
elseif rtype==2% типа распределения Тоб и Тож
a1=rand;
a2=rand;
end
if u (2)-oldtimevalue>delayvalue % Проверка истекло ли время до
появления set_param (flagblock,'Value','0'); % следующей заявки
end
if flagvalue==0% Если время истекло то записываем
set_param (flagblock,'Value','1'); % в константы новые значения
set_param (delayblock,'Value', num2str (u (1))); % системного времени и
задержки
set_param (oldtimeblock,'Value', num2str (u (2))); % до следующей заявки
M=[u (2) abs (a1) abs (a2)]; % Формирование заявки
else
M=[-1 -1 -1]; % Если заявка не сформирована, то отправляем три числа
тк MatLab
End % на каждом шаге требует передачу данных
return
Алгоритм работы процедуры:
При инициализации программы обнуляются значения переменных: IsBusy, Delay, OldTime и устанавливается связь с обработчиком событий Thandle для того, чтобы мы могли записывать результаты промежуточных значений в константы и имели к ним доступ.
set_param (gcb,'ReferenceBlock','')
set_param (strcat (gcb,'/THandle'),'Value', num2str (gcbh, 16))
set_param (strcat (gcb,'/IsBusy'),'Value','0')
set_param (strcat (gcb,'/Delay'),'Value','0')
set_param (strcat (gcb,'/OldTime'),'Value','0')
Далее проверяется метод вычисления (закон распределения) параметров заявки Тож, Тоб. Затем проверяется условие истечения времени до появления следующей заявки — если текущее время-старое время > задержки времени до появления следующей заявки, то обнуляем значение флага flagvalue=0 это говорит о том, что пора формировать новую заявку. Далее следует цикл, который формирует заявку, если flagvalue=0 или выдает [-1 -1 -1], если flagvalue=1, тк в системе MatLab на каждом шаге работы обязательно нужно передавать данные по модели.
3.4 Accumulator
Осуществляет обработку заявок и обслуживание очереди: постановку заявки в очередь и удаление заявки из очереди в случае истечения у нее Тож — времени ожидания в очереди.
Ограничение на количество заявок в очереди 0−100.
Структура накопителя (Accumulator):
Рис. 9. Модуль Accumulator/
In1 — вход накопителя на который поступает заявка с выхода генератора.
In2 — вход накопителя на который поступает переменная с обслуживающего узла, говорящая о том, свободен ли узел (готов ли узел принять очередную заявку).
Out1 — выход накопителя на обслуживающий узел
From — вход накопителя на который подается системное время моделирования.
Memory — функция MatLab позволяющая избежать зацикливания и алгебраических циклов.
MatLabFcn — функция Accum, которая осуществляет обработку очереди и отправку заявок на обслуживающий узел.
Файл Accum.m
function MM=accum (u)
global mem % глобальные переменные: mem-очередь (ячейка из трех
global count % элементов), count — счетчик элементов очереди
if (u (1)≅-1)&(u (2)≅-1)&(u (3)≅-1) % Если пришла заявка, то
добавляем ее в
mem{count}=[u (1) u (2) u (3) u (5)]; % очередь
count=count+1;
end
t=[];
if count>1
for i=1:count-1% Ищем заявки, подлежащие
if mem{i}(4)+mem{i}(2)
mem{i}=[-1 -1 -1 -1]; %
t=[t i]; % Запоминаем индексы заявок, подлежащих удалению
end
end
end
%%%% Compression
if length (t)>1
for i=length (t):1
for j=t[i]+1:count-1% Удаляем заявку из
mem{j-1}=mem{j}; % очереди
end
count=count-1;
end
end
if (u (4)==1)&(count>1)
MM=[mem{1}(1) mem{1}(2) mem{1}(3)]; % Отправляем заявку на
for i=2:count-1% обслуживание
mem{i-1}=mem{i};
end
mem{count}=[];
count=count-1;
else
MM=[-1 -1 -1]; % Если заявка не требуется, то отправляем три числа тк
MatLab
% на каждом шаге требует передачу данных
end
count
return
Алгоритм работы процедуры:
Заводим две глобальные переменные memмассив ячеек и countсчетчик количества элементов в очереди. Если пришла новая заявка, то записываем ее в очередь. Далее ищем заявки подлежащие удалению — если время прихода заявки+время обработки<�текущего системного времени, то заявка остается в очереди, иначе помечаем заявку как [ -1 -1 -1 -1] и запоминаем индекс у этой заявки. Затем начинаем удалять все найденые «мертвые заявки» — находим нижную заявку и уменьшаем индексы всех нижележащих заявок на -1. Потом смотрим готов ли обработчик принять заявку, если да, то выдаем обработчику заявку с индексом =1, затем «поднимаем очередь», уменьшая индексы всех нижележащих заявок на -1.
3.5 Processor
Данный модуль выполняет обработку заявки путем задержания заявки на время, указанное в переменной Тоб и выдает сигнал накопителю, если заявка обработана.
Также добавлено в редактор маскирования в закладку инициализации элементов переменной отвечающей за выбор закона распределения (Рис. 7.)следующие строки: set_param (gcb,'ReferenceBlock','')
set_param (strcat (gcb,'/Delay'),'Value','0')
set_param (strcat (gcb,'/SysTime'),'Value','0')
set_param (strcat (gcb,'/IsEmpty'),'Value','1')
set_param (strcat (gcb,'/THandle'),'Value', num2str (gcbh, 16))
для задания начальных параметров рабочих переменных.
Структура обработчика заявок:
Рис. 10. Модуль Processor.
In1 — вход обработчика на который подаются заявки из накопителя.
Out1 — выход обработчика с которого идет требование на заявку в накопитель.
THandle — обработчик, который позволяет работать с константами SysTime, Delay, IsEmpty и изменять их в зависимости от состояния системы.
From — вход обработчика на который подается системное время моделирования.
SysTime — переменная, куда записывается системное время прихода заявки на обработку.
Delay — время на обработку заявки Тоб.
IsEmpty — переменная, которая указывает на то, закончил ли узел обработку заявки.
MatLabFcnфункция Processor, которая осуществляет обработку заявок.
Файл Processor.m
function Out=Process (u)
IsEmpty=str2num (get_param (strcat (getfullname (u (4)),'/IsEmpty'),'Value'));
Out=IsEmpty;
time=u (5);
if IsEmpty==1
if (u (1)≅-1)&(u (2)≅-1)&(u (3)≅-1)
set_param (strcat (getfullname (u (4)),'/Delay'),'Value', num2str (u (3)));
set_param (strcat (getfullname (u (4)),'/SysTime'),'Value', num2str (time));
set_param (strcat (getfullname (u (4)),'/IsEmpty'),'Value','0');
end
% считываются параметры обработки
else
OldTime=str2num (get_param (strcat (getfullname (u (4)),'/SysTime'),'Value'));
Delay=str2num (get_param (strcat (getfullname (u (4)),'/Delay'),'Value'));
if time-OldTime>Delay
set_param (strcat (getfullname (u (4)),'/IsEmpty'),'Value','1');
end
end % Проверяется условия окончания обработки заявки
return
Алгоритм работы процедуры:
При инициализации программы обнуляются значения переменных: IsEmpty, Delay, SysTime и устанавливается связь с обработчиком событий Thandle для того, чтобы мы могли записывать результаты промежуточных значений в константы и имели к ним доступ.
set_param (gcb,'ReferenceBlock','')
set_param (strcat (gcb,'/Delay'),'Value','0')
set_param (strcat (gcb,'/SysTime'),'Value','0')
set_param (strcat (gcb,'/IsEmpty'),'Value','1')
set_param (strcat (gcb,'/THandle'),'Value', num2str (gcbh, 16))
Далее считывается значение переменной IsEmpty и записывается в переменную Out, в переменную time записывается системное время. Затем смотрим, если обработчик свободен и пришла не «нефиктивная заявка», то записываем ее параметры в рабочие переменные (IsEmpty, Delay, SysTime) и устанавливаем значение флага IsEmpty в состояние «обработчик занят». Потом проверяем не вышло ли время обработки, если вышло, то ставим флаг в состояние «обработчик свободен».
4. Пример использования
Пример использования может быть представлен следующей моделью: