Концептуальное проектирование систем в AnyLogic и GPSS World

Модель функционирования предприятия

Разбить на страницы
Показывать лекцию целиком

Модель в GPSS World

Постановка задачи

Предприятие имеет $$n_1$$ цехов, производящих $$n_1$$ типов блоков, т. е. каждый цех производит блоки одного типа. Себестоимости комплектующих блоков $$С_{к1}, С_{к2}, …, С_{кn1}$$. Стоимости изготовления блоков $$С_{изг1}, С_{изг2}, …, С_{изгn1}$$. Интервалы выпуска блоков $$Т_{1}, Т_{2}, …, Т_{n1}$$ - случайные. Из $$n_1$$ блоков собирается одно изделие.

Перед сборкой каждый тип блоков проверяется на $$n_{11}, n_{12}, …, n_{1n}$$ соответствующих постах контроля. Длительности контроля одного блока $$Т_{11}, Т_{12}, …, Т_{1n}$$ случайные. Стоимости проверки блоков $$С_{пр1}, С_{пр2}, …, С_{прn1}$$. На каждом посту бракуется $$q_{11}, q_{12}, …, q_{1n} \;\%$$ блоков соответственно. Забракованные блоки в дальнейшем процессе сборки не участвуют, и удаляются с постов контроля в брак.

Прошедшие контроль, т. е. не забракованные блоки поступают на один из $$n_2$$ пунктов сборки. На пункте сборки одновременно собирается только одно изделие. Сборка начинается только тогда, когда имеются все необходимые $$n_1$$ блоков различных типов. Время сборки $$T_c$$ случайное. Стоимость сборки одного изделия $$C_сб$$.

После сборки изделие поступает на один из $$n_3$$ стендов выходного контроля. На одном стенде одновременно проверяется только одно изделие. Время проверки $$Т_п$$ случайное. Стоимость проверки одного изделия $$С_к$$. По результатам проверки бракуется $$q_2 \;\%$$ изделий. В таком изделии с вероятностью $$q_3 \;\%$$ могут быть забракованы m блоков. Вероятности порядковых номеров из $$1 … n_1$$ $$P_{бл1} … P_{блn_1}$$ соответственно.

Забракованное изделие направляется в цех сборки, где неработоспособные блоки заменяются новыми. Время замены $$T_{замi}$$ случайное. Стоимость замены i-го блока $$C_{замi}$$. После замены блоков изделие вновь поступает на один из стендов выходного контроля.

Прошедшее стенд выходного контроля изделие поступает в отдел приёмки. Время приемки $$T_{пр}$$ одного изделия случайное. Стоимость приемки одного изделия $$C_{п}$$. По результатам приёмки бракуется $$q_4 \;\%$$ изделий, которые направляются вновь на стенд выходного контроля. Принятые приёмкой изделия направляются на склад предприятия.

Исходные данные

$$n_1=4; Т_1=19; Т_2=11; Т_3=15; Т_4=18;$$ $$C_{k1}=35; C_{k2}=32; C_{k3}=43; C_{k4}=48;$$ $$C_{изг1}=35; C_{изг2}=27; C_{изг3}=36; C_{изг4}=37;$$ $$n_{11}=2; n_{12}=2; n_{13}=2; n_{14}=2; Т_{11}=12; Т_{12}=16; Т_{13}=21; Т_{14}=17;$$ $$C_{пр1}=12; C_{пр2}=23; C_{пр3}=32; C_{пр4}=28;$$ $$q_{11}=0,02; q_{12}=0,03; q_{13}=0,04; q_{14}=0,06;$$ $$n_{2}=2; T_{c}=22; C_{сб}=67; n_{3}=2; Т_{п}=26; C_{k}=74; q_{2}=0,05;$$ $$n_{2}=2; T_{c}=22; C_{сб}=67; n_{3}=2; Т_{п}=26; C_{k}=74; q_{2}=0,05;$$ $$m=1; p_{k1}=1,0; P_{бл1}=0,25; P_{бл2}=0,25; P_{бл3}=0,25; P_{бл4}=0,25;$$ $$Т_{зам1}=12; Т_{зам2}=15; Т_{зам3}=12; Т_{зам4}=21;$$ $$С_{зам1}=34; С_{зам2}=46; С_{зам3}=38; С_{зам4}=54;$$ $$n_{4}=2; T_{пр}=18; С_{п}=53; q_{4}=0,15.$$

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

Задание на исследование

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

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

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

Уяснение задачи на исследование

Предприятие при изготовлении блоков и сборки из них изделий может быть представлено как многофазная многоканальная разомкнутая система массового обслуживания с ожиданием, так как оно имеет все ее элементы (Рис. 6.1):

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

    Для имитации МКУ следует использовать блоки ENTER и LEAVE.

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

    Например, q11_, n1_. Сделаем это для отличия от зарезервированных символов GPSS World: q - системный числовой атрибут, означающий очередь, n - используется в качестве ссылки при определении количества транзактов, вошедших в какой-либо блок программы. Добавление символа подчеркивания предотвратит ошибку, которая в противном случае будет выявлена на этапе создания объекта "Процесс моделирования". Другие идентификаторы будем вводить по мере уяснения задачи, а также в ходе разработки программы модели.

    Для моделирования необходимо привести в соответствие время протекания реального процесса изготовления блоков и сборки изделий на предприятии и в модели. Это осуществляется введением масштабного коэффициента, например, если для условий рассматриваемой задачи его взять равным 1, а в реальном процессе измерять время в минутах, то 1 мин будет соответствовать 1 ед. мод. вр. Тогда время моделирования VrMod = 60 # 40 = 2400 ед. мод. вр. Временные параметры изготовления и контроля блоков, сборки, контроля и приёмки изделий даны в минутах, поэтому при выбранном масштабном коэффициенте 1 они не изменятся.

    В модели, как процесса, протекающего в СМО (см. рис. 6.1), необходимо иметь:

  • задание исходных данных;
  • сегмент имитации работы цехов без постов контроля;
  • сегмент имитации работы постов контроля блоков;
  • сегмент имитации сборки изделий;
  • сегмент имитации работы стендов выходного контроля;
  • сегмент имитации работы приемки;
  • сегмент задания времени моделирования и расчета результатов моделирования.
  • Для ввода исходных данных целесообразно использовать команды EQU и FUNCTION. Вторая команда позволит сократить число строк в программе за счёт ввода одномерного массива данных двумя строками.

    Программа модели

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

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

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

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

    Объединение сделано также в интересах универсальности модели. Предположим, количество цехов увеличилось. Нужно было бы добавлять сегменты имитации работы цехов и постов контроля, т. е. количество блоков в модели увеличилось бы. В предлагаемом варианте сегмент имитации функционирования постов контроля блоков остаётся неизменным. Необходимо только командами STORAGE задать ёмкости добавляемых пунктов контроля, заменить их имена номерами и добавить данные: среднее время контроля блоков, доля браков и стоимость контроля блоков в функции TKontr, BrBl и CProv соответственно.

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

    Для розыгрыша выхода в брак блоков и изделий используется блок TRANSFER в статистическом режиме.

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

    Замечание. Не путайте блоки изделий с блоками GPSS World в программе модели.

    В программе использование МКУ и списков пользователя демонстрируется применением номеров МКУ вместо их имен. Этот метод дает возможность иметь в модели один сегмент имитации работы постов контроля блоков вместо подобного сегмента для каждого цеха, т. е. сократить число блоков в модели.

    Обратите внимание, что в программе присвоение номеров именам МКУ указывается в самом начале и только потом, не обязательно следом, определение МКУ командой STORAGE. Если вы построите программу так, что поменяете порядок: вначале определение МКУ командой STORAGE, а потом - присвоение командой EQU номеров именам МКУ, то на этапе выполнения программы модели возникнет ошибка: "Обращение к несуществующей памяти". На этапе создания объекта "Процесс моделирования" ошибка изменения этого порядка не обнаруживается.

    Ниже приводится программа модели.

    ; Модель функционирования предприятия
    ; Замена имен МКУ номерами
    Kontr1  EQU  1
    Kontr2  EQU  2
    Kontr3  EQU  3
    Kontr4  EQU  4
    ; Задание исходных данных
    TShop  FUNCTION  P1,D4  ; Средние интервалы времени изготовления блоков
    1,19/2,11/3,15/4,18
    CKom  FUNCTION  P1,D4  ; Стоимости комплектующих блоков
    1,35/2,32/3,43/4,48
    CIzg  FUNCTION  P1,D4  ; Стоимости изготовления блоков
    1,35/2,27/3,36/4,37
    TKont  FUNCTION  P1,D4  ; Среднее время контроля на постах
    1,12/2,16/3,21/4,17
    BrBl  FUNCTION  P1,D4  ; Доли брака блоков на постах контроля
    1,.02/2,.03/3,.04/4,.06
    CProv  FUNCTION  P1,D4  ; Стоимости контроля блоков
    1,12/2,23/3,32/4,28
    TZam  FUNCTION  P1,D4  ; Среднее время замены блоков
    1,12/2,15/3,12/4,21
    CZam  FUNCTION  P1,D4  ; Стоимости замены блоков
    1,34/2,46/3,38/4,54
    VerBl  FUNCTION  RN339,D2 ; Вероятности брака одного или двух блоков в собранном изделии
    .0,2/1,1
    VerBlNum  FUNCTION  RN339,D4; Вероятность брака блока номер ...
    .25,1/.5,2/.75,3/1,4
    CCb  EQU  67  ; Стоимость сборки изделия 
    q2_  EQU  0.05  ; Доля забракованных изделий на пункте выходного контроля
    q4_  EQU  0.15  ; Доля забракованных изделий приемкой
    TipBl  EQU  4  ; Мах количество типов блоков
    VrMod   EQU  2400  ; Время моделирования, 1 ед. мод. вр. = 1 мин
    Tc_  EQU  22  ; Среднее время сборки изделия
    Tp  EQU  26  ; Среднее время проверки изделия
    Tpr  EQU  18  ; Среднее время приема изделия
    CPr  EQU  53  ; Стоимость приёмки изделия
    CK  EQU  74  ; Стоимость контроля изделия
    ;Задание количества пунктов сборки и постов контроля
    Sb  STORAGE  2  ; Количество пунктов сборки
    Kontr1  STORAGE  2  ; Количество постов n11
    Kontr2  STORAGE  2  ; Количество постов n12
    Kontr3  STORAGE  2  ; Количество постов n13
    Kontr4  STORAGE  2  ; Количество постов n14
    KSb  STORAGE  3  ; Количество стендов выходного контроля
    KPr  STORAGE  2  ; Количество пунктов приёмки
    
    ; Описание арифметических выражений
    KolIzd  VARIABLE  (N$Term7/X$prog)  ; Количество готовых изделий
    KolGotBl  VARIABLE  ((CH*1/X$Prog))  ; Количество готовых блоков всех типов, оставшихся на складах
    KolBrBl  VARIABLE  ((X*1/X$Prog))  ; Количество забракованных блоков всех типов
    TIzd  VARIABLE  (AC1/X$Prog)/X$KolIzd; Среднее время подготовки одного изделия
    ;Сегмент имитации работы цехов без постов контроля
      GENERATE  ,,,TipBl ; Число транзактов по числу типов блоков
      SAVEVALUE  Tip+,1  ; Пронумеровать типы блоков
      ASSIGN  1,X$Tip  ; Код в параметре транзакта - тип блока
    Met20  ADVANCE  (Exponential(27,0,FN$TShop)); Розыгрыш интервала поступления блока
      SPLIT  1,Met20  ; Расщепление на два 
      ASSIGN  2,(Exponential(339,0,FN$TKont))  
    ; Розыгрыш времени контроля и запись в Р2
      ASSIGN  9,FN$BrBl ; Запись в Р9 доли брака блоков после постов контроля
      ASSIGN  Sbor,(Exponential(339,0,Tc_)); Запись времени сборки изделия
      ASSIGN  Cost,(FN$CKom+FN$CIzg); Стоимость комплектующих+стоимость изготовления в P$Cost
    ; Сегмент имитации работы постов контроля блоков
    Met1  QUEUE  P1 ; Встать в очередь с номером в Р1
      ENTER  P1  ; Занять МКУ с номером в Р1
      DEPART  P1 ; Покинуть очередь с номером в Р1
      ADVANCE   P2;Имитация контроля с временем в Р2
      LEAVE  P1  ; Освободить МКУ с номером в Р1
      ASSIGN  Cost+,FN$CProv ; Добавить стоимость проверки
      TRANSFER  P9,,Met14 ; Отправить брак блоков к Met14
      LINK   P1,FIFO ; Готовые блоки на склад с номером в Р1
    ; Сегмент имитации сборки изделий
      GENERATE  ,,,1
    Met3   ASSIGN  1,TipBl  ; Подготовка к циклу
      SAVEVALUE  Cost,0  ; Обнуление ячейки Cost
    Met13   TEST NE  CH*1,0  ; Есть ли на складе готовые блоки?
      TEST NE  P1,1,Met4  ; Если последний блок, то на Met4
      UNLINK  P1,Met32,1 ; Нет
      TRANSFER  ,Met31
    Met4   UNLINK  P1,Met22,1 ; Отправить блоки на сборку
    Met31  LOOP  1,Met13
      TRANSFER  ,Met3  ; Вернуться для проверки наличия всех типов блоков для следующего изделия
    Met32  SAVEVALUE  Cost+,P$Cost  ; Суммарная стоимость 2-го, 3-го и 4-го блоков
      SAVEVALUE  Cost1,X$Cost  ; Суммарная стоимость 2-го, 3-го и 4-го блоков
      TRANSFER  ,Term5  ; Отправить 
    Met22  ASSIGN  Cost+,X$Cost1  ; Суммарная стоимость 1-го...4-го блоков
      SAVEVALUE  Cost2,P$Cost  ; Суммарная стоимость 1-го...4-го блоков
      ASSIGN  Zam,0
    Met5   QUEUE  Sbor  ; Занять очередь на пункты сборки
      ENTER  Sb  ; Занять пункт сборки
      DEPART  Sbor  ; Освободить очередь на пункт сборки
      ADVANCE  P$Sbor  ; Имитация сборки
      LEAVE  Sb  ; Освободить пункт сборки
      TEST E  P$Zam,0,Met9
      ASSIGN  Cost+,CCb  ; Добавить стоимость сборки изделия  
    ; Сегмент имитации работы стендов выходного контроля
    Met9   QUEUE   KSbor  ; Занять очередь на стенд выходного контроля
      ENTER  KSb    ; Занять стенд выходного контроля
      DEPART  KSbor  ; Освободить очередь на стенд выходного контроля
      ADVANCE  (Exponential(339,0,Tp)); Имитация работы стенда выходного контроля
      LEAVE  KSb  ; Освободить стенд выходного контроля
      ASSIGN  Cost+,CK  ; Добавить стоимость контроля изделия
      TRANSFER  q2_,Met34,Met33  ; Направить в приёмку, а брак-на подготовку к замене
    ; Подготовка к замене блоков
    Met33  ASSIGN  KolBl,FN$VerBl  ; Розыгрыш количества забракованных в изделии блоков
      ASSIGN  Sbor,0  ; Обнуление параметра Sbor
    Met21  ASSIGN  1,FN$VerBlNum  ; Розыгрыш номера блока
      TEST NE  CH*1,0  ; Есть на складе готовые блоки?
      UNLINK  P1,Met14,1  ; Да. Тогда блок на замену
      ASSIGN  Sbor,(Exponential(339,0,FN$TZam)); Розыгрыш времени замены блоков
      ASSIGN  Zam,1
      ASSIGN  Cost+,FN$CZam  ; Добавить стоимость замены блока
      TRANSFER  ,Met5  ; Отправить на пункты сборки
    ; Сегмент имитации работы приёмки
    Met34  QUEUE  Opr  ; Занять очередь в приёмку
      ENTER  KPr  ; Занять приемку
      DEPART  Opr  ; Освободить очередь в приёмку
      ADVANCE  (Exponential(339,0,Tpr)) ; Имитация работы приемки
      LEAVE  KPr  ; Освободить приемку
      ASSIGN  Cost+,CPr  ; Добавить стоимость приёмки изделия
      TRANSFER  q4_,,Met9 ; Готовые изделия - на склад
    ; Сегмент счёта блоков и изделий
      SAVEVALUE  CostIzd+,P$Cost
    Term7  TERMINATE   ; Количество готовых изделий за все прогоны модели
    Met14   SAVEVALUE P1+,1  ; Количество забракованных блоков по типам за все прогоны модели
      ASSIGN  5,(TipBl+P1)
      SAVEVALUE  *5+,P$Cost; Стоимости забракованных блоков по типам за все прогоны модели
      SAVEVALUE  CostBr+,P$Cost  ; Стоимость забракованных блоков за все прогоны модели
      TERMINATE
    Term5  TERMINATE    
    ; Задание времени моделирования и расчет результатов
      GENERATE  VrMod ; Задание времени моделирования
      TEST L  X$prog,TG1,Met10  ; Если X$Prog< содержимого счетчика завершений, то
      SAVEVALUE Prog,TG1 ; записать в X$Prog содержимое счетчика завершений
    Met10  TEST E  TG1,1,Met12 ; Если содержимое счетчика завершений равно 1, то расчет результатов
      SAVEVALUE KolIzd,V$KolIzd  ; Количество готовых изделий
      ASSIGN  1,0   ; Подготовка к циклу
    Met15  ASSIGN  1+,1  ; Начало цикла по числу типов блоков
      SAVEVALUE (10+P1),V$KolGotBl  ; Количество готовых блоков всех типов, оставшихся на складах
      SAVEVALUE P1,V$KolBrBl  ; Количество забракованных блоков всех типов
      ASSIGN  2,(TipBl+P1)
      SAVEVALUE  P2,((X*2)/X$Prog); Стоимости забракованных блоков по типам
      SAVEVALUE  StBl+,(FN$CKom+FN$CIzg+FN$CProv); Стоимость блоков в собранном изделии
      TEST GE  P1,TipBl,Met15  ; Все ли типы блоков?
      SAVEVALUE  Cmin,(X$StBl+CCb+CK+CPr) ; Минимальная стоимость одного изделия
      SAVEVALUE  MinCGotIzd,(X$Cmin#X$KolIzd) ; Минимальная стоимость всех готовых изделий
      SAVEVALUE  CostIzd,(X$CostIzd/X$Prog)  ; Стоимость готовых изделий
      SAVEVALUE TIzd,V$TIzd  ; Среднее время подготовки одного изделия
      SAVEVALUE  CostBr,(X$CostBr/X$Prog)  ; Стоимость забракованных блоков
      SAVEVALUE  Koef,((X$CostIzd+X$CostBr)/X$MinCGotIzd); Коэффициент увеличения стоимости одного изделия
    Met12  TERMINATE 1
      START   1000

    Отладьте модель. Выполните моделирование. В отчете, фрагмент которого приведен ниже,

    SAVEVALUE    RETRY       VALUE
     KOLIZD        0        121.628
     TIZD          0         19.732
     COSTBR        0       3091.787
     COSTIZD       0      74410.065
     CMIN          0        582.000
     MINCGOTIZD    0      70787.496
     KOEF          0          1.095

    найдите, что за 40 часов подготовлено 121,628 изделия, а среднее время подготовки одного изделия $$\approx 20$$ мин (19,732 мин). Минимальная стоимость готовых изделий 70787,496, стоимость брака 3091,787, стоимость готовых изделий 74410,065. Минимальная стоимость одного изделия - 582. Коэффициент увеличения стоимости одного изделия составил 1,095.

    Другие эксперименты будут проведены в п. 6.3. Данные этого же эксперимента внесены в табл. 6.10.

    Модель функционирования предприятия в AnyLogic

    Формализованное описание

    Модель, исходя из структуры предприятия (см. рис. 6.1), должна состоять из следующих сегментов:

  • ввода исходных данных;
  • имитации работы цехов по изготовлению блоков;
  • имитации работы постов контроля блоков;
  • имитации работы пунктов сборки изделий;
  • имитации работы стендов контроля собранных изделий;
  • имитации работы пунктов приема изделий;
  • имитации склада готовых изделий;
  • имитации склада бракованных блоков;
  • вывода результатов моделирования.
  • Блоки и изделия в модели следует имитировать заявками со следующими полями (параметрами):

  • block - номер цеха (коды 1…4 соответственно), выпустившего блок;
  • sign1 - признак брака на постах контроля блоков, стендах контроля изделий и на пунктах приема изделий;
  • numBlBrak1 … numBlBrak4 - признаки забракованных блоков 1…4 соответственно;
  • timeSbor - время сборки изделия (замены блоков);
  • cost - стоимость готового изделия.
  • Указанные поля предназначены для отслеживания технического состояния блоков и изделий и в зависимости от этого прохождения их по фазам изготовления изделия.

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

    Стоимость изготовления изделия может возрасти по сравнению с минимальной стоимостью (CMIN) за счёт выявления брака и замены блоков. Для фиксации этой стоимости введено поле cost.

    Для обеспечения работы модели вводятся следующие параметры процесса изготовления изделий из блоков:

  • aveTimeShop1…aveTimeShop4 - средние интервалы времени выпуска блоков 1…4 цехами 1…4;
  • stKomplBlock1…stKomplBlock4 - стоимости комплектующих блоков 1…4;
  • stIzgBlock1…stIzgBlock4 - стоимость изготовления блоков 1…4;
  • postKontr1…postKontr4 - количество постов контроля блоков 1…4;
  • procBrakBlock1…procBrakBlock4 - проценты брака блоков 1…4 на постах контроля блоков;
  • stTestBlock1…stTestBlock4 - стоимости тестирования (одного блока) блоков 1…4;
  • kolPunSborki - количество пунктов сборки изделий;
  • timeSborki - среднее время сборки одного изделия;
  • stSborki - стоимость сборки одного изделия;
  • kolStendKontr - количество стендов контроля собранных изделий;
  • timeKontrIzd - среднее время контроля на стенде одного собранного изделия;
  • procBrakIzd - процент брака собранных изделий на стендах контроля;
  • stKontrIzd - стоимость контроля на стенде одного собранного изделия;
  • verBlock1 - вероятность того, что забракованным в уже собранном изделии окажется один блок;
  • verBlock2 - вероятность того, что забракованными в уже собранном изделии окажутся два блока;
  • verBlNum1…verBlNum4 - вероятности брака на стенде контроля блоков 1…4;
  • timeZamBlock1…timeZamBlock4 - среднее время замены (одного блока) блоков 1…4;
  • stZamBlock1…stZamBlock4 - стоимость замены (одного блока) блоков 1…4;
  • kolPunPriem - количество пунктов приема изделий, прошедших пункты контроля;
  • timePriemIzd - среднее время приема одного изделия;
  • procBrakPriem - процент брака изделий на пунктах приема изделий;
  • stPriemIzd - стоимость приема одного изделия.
  • В ходе моделирования на основе приведенных исходных данных формируется и выводится на текущее модельное время следующая информация:

  • kolIzBlock1…kolIzBlock4 - количество изготовленных блоков 1…4;
  • kolTestBlock1…kolTestBlock4 - количество протестированных блоков 1…4 (как исправных, так и забракованных);
  • brakBlock1…brakBlock4 - количество забракованных на постах контроля блоков 1…4;
  • gotBlock1…gotBlock4 - количество изготовленных всего готовых блоков 1…4;
  • ostGotBlock1…ostGotBlock4 - количество оставшихся готовых блоков 1…4;
  • kolSobrIzd, testSobrIzd, brakSobrIzd - количество собранных на пунктах сборки изделий, проверенных и забракованных на стендах контроля;
  • kolPriemIzd, brakPriemIzd - количество принятых и забракованных приемкой изделий соответственно;
  • zamBlock1…zamBlock4 - количество замененных блоков 1…4, забракованных на стендах контроля и пунктах приема изделий;
  • allBrakBlock1…allBrakBlock4 - всего забракованных блоков 1…4;
  • minCostIzd - минимальная стоимость одного изделия;
  • minCostGotIzd - минимальная стоимость готовых изделий;
  • kolGotIzd - количество готовых изделий, отправленных на склад.
  • На текущее модельное время собирается статистика по следующим стоимостным показателям функционирования предприятия:

  • costKomplBlock1…costKomplBlock4,costKomplBlock - стоимости комплектующих блоков 1…4 и суммарная стоимость комплектующих всех блоков;
  • costIzgBlock1…costIzgBlock4,costIzgBlock - стоимости изготовления блоков 1…4 и суммарная стоимость изготовления всех блоков (без учета стоимости тестирования блоков);
  • CostBlock1…CostBlock4 - стоимости изготовления блоков 1…4 с учётом тестирования;
  • sumCostBlock1…sumCostBlock4, sumCostBlock - суммарные стоимости изготовления блоков 1…4 с учётом тестирования и суммарная стоимость изготовления всех блоков;
  • costTestBlock1…costTestBlock4,costTestBlock - стоимости тестирования блоков 1…4 на постах контроля и суммарная стоимость тестирования всех блоков;
  • costSborIzd, costTestIzd, costPriemIzd - стоимости сборки, проверки и приемки изделий;
  • costBrakBlock - суммарные затраты на все забракованные блоки;
  • costGotIzd - затраты на выпуск готовых изделий;
  • costBlockIzd - стоимость блоков одного изделия;
  • costIzd - стоимость одного изделия;
  • timeIzd - среднее время изготовления одного изделия;
  • koefIncrCostIzd - коэффициент увеличения себестоимости изделия.
  • Минимальная стоимость изделий будет тогда, когда не будет бракованных блоков и изделий. В терминах постановки задачи это условие имеет вид:

    $$С_{min}=С_{minизд} \cdot N_{изд},$$

    где $$N_{изд}$$ - количество готовых изделий (поступивших на склад);

    $$С_{minизд}$$ - минимальная себестоимость производства одного изделия, вычисляется по формуле:

    $$С_{изд}=\sum\limits_{i=1}^{nl}(C_{кi}+C_{изгi}+C_{прi})+C_{сб}+C_{к}+C_{п}$$

    В случае наличия брака себестоимость производимой продукции увеличится и составит $$С_{max}$$. То есть коэффициент увеличения себестоимости будет равен

    $$K_c=C_{max}/C_{min}$$

    Запишем в идентификаторах исходных данных и результатов моделирования то же самое:

    $$costBlock1=stKomplBlock1+stIzqBlock1+stTestBlock1;$$ $$costBlock2=stKomplBlock2+stIzqBlock2+stTestBlock2;$$ $$costBlock3=stKomplBlock3+stIzqBlock3+stTestBlock3;$$ $$costBlock4=stKomplBlock4+stIzqBlock4+stTestBlock4;$$ $$costBlockIzd=costBlock1+costBlock2+costBlock3+costBlock4;$$ $$C_{minизд}=costBlockIzd+stSborki+stKontrIzd+stPriemIzd;$$ $$C_{min=}C_{minизд} \cdot colGotIzd; C_{max}= costGotIzd+costBrakBlock.$$ $$K_c=koefIncrCostIzd=\frac{C_{max}}{C_{min}}$$ Замечание. В приведенных для расчета результатов моделирования выражениях мы не учитывали те блоки, которые были произведены, но не были использованы для сборки изделий.

    Ввод исходных данных

    Для ввода исходных данных используем элемент Параметр.

  • Выполните команду Файл/Создать/Модель на панели инструментов.
  • В поле Имя модели диалогового окна Новая модель введите Enterprise. Выберите каталог, в котором будут сохранены файлы модели. Щелкните кнопку Далее.
  • На открывшейся второй странице Мастера создания модели выберите Начать создание модели "с нуля". Щелкните кнопку Далее.
  • В Палитре выделите Презентация. Создайте область просмотра Данные для размещения элементов исходных данных.
  • Перетащите элемент Область просмотра. В поле Имя: введите Данные.
  • Перейдите на страницу Дополнительные панели Свойства. Введите в поля X: 0, Y: 1700, Ширина: 760, Высота: 330.
  • Перетащите элемент Прямоугольник. Оставьте имя, предложенное системой.
  • Перейдите на страницу Дополнительные панели Свойства. Введите в поля X: 10, Y: 1750, Ширина: 740, Высота: 270.
  • Перетащите элемент text и на странице Основные панели Свойства в поле Текст: введите Исходные данные.
  • В Палитре выделите Основная. Перетащите элементы Параметр на элемент с именем Исходные данные. Разместите их так, как показано на рис. 6.2. Значения свойств установите согласно табл. 6.1.
  • Элементы и их свойства
    ПараметрПараметр
    ИмяТипЗначение по умолчаниюИмяТипЗначение по умолчанию
    aveTimeShop1double19stKomplBlock1double35
    aveTimeShop2double11stKomplBlock2double32
    aveTimeShop3double15stKomplBlock3double43
    aveTimeShop4double18stKomplBlock4double48
    stIzgBlock1double35timeTestBlock1double12
    stIzgBlock2double27timeTestBlock2double16
    stIzgBlock3double36timeTestBlock3double21
    stIzgBlock4double37timeTestBlock4double17
    postKontr1int2procBrakBlock1double0,02
    postKontr2int2procBrakBlock2double0,03
    postKontr3int2procBrakBlock3double0,04
    postKontr4int2procBrakBlock4double0,06
    stTestBlock1double12kolStendKontrIzdint2
    stTestBlock2double23timeKontrIzddouble26
    stTestBlock3double32procBrakIzddouble0,05
    stTestBlock4double28stKontrIzddouble74
    kolPunSborkiint2verBlock1double0,9999
    timeSborkidouble22verBlock2double0,999999
    verBlockNum1double0,25timeZamBlock1double12
    verBlockNum2double0,25timeZamBlock2double15
    verBlockNum3double0,25timeZamBlock3double12
    verBlockNum4double0,25timeZamBlock4double21
    stZamBlock1double34kolPunPriemint2
    stZamBlock2double46timePriemIzddouble18
    stZamBlock3double38procBrakPriemdouble0,15
    stZamBlock4double54stPriemIzddouble53
    (рис 6.2) Размещение элементов Параметр для ввода исходных данных

    Вывод результатов моделирования

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

  • В Палитре выделите Презентация. Создайте область просмотра Результаты для размещения элементов Простая переменная.
  • Перетащите элемент Область просмотра. В поле Имя: введите Результаты.
  • Перейдите на страницу Дополнительные панели Свойства. Введите в поля X: 0, Y: 700, Ширина: 700, Высота: 460.
  • Перетащите элемент Скруглённый прямоугольник. Оставьте имя, предложенное системой.
  • Перейдите на страницу Дополнительные панели Свойства. Введите в поля X: 10, Y: 750, Ширина: 680, Высота: 400.
  • Перетащите элемент text и на странице Основные панели Свойства в поле Текст: введите Данные о количестве подготовленных и забракованных блоков и изделий.
  • Перетащите второй элемент text и на странице Основные панели Свойства в поле Текст: введите Стоимостные показатели функционирования предприятия.
  • В Палитре выделите Основная. Перетащите элементы Простая переменная. Разместите их и дайте им имена так, как показано на рис. 6.3. Тип всех переменных, используемых для вывода количества подготовленных и забракованных блоков и изделий на текущее модельное время - int. Тип переменных для вывода стоимостных показателей работы предприятия - double. Значение по умолчанию равно 0.
  • Выровняйте элементы. Для этого нужно вначале выделить те элементы, которые вы хотите выровнять, а затем открыть правым щелчком мыши по выделенным фигурам контекстное меню и выбрать нужную команду выравнивания из подменю Выравнивание. Не поддерживается выравнивание элементов диаграмм состояний и диаграмм действий, потому что при выравнивании таких элементов может нарушиться логика модели.
  • (рис 6.3) Размещение элементов Простая переменная для вывода результатов моделирования

    Построение событийной части модели

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

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

  • В Палитре выделите Презентация. Перетащите элемент Область просмотра.
  • Перейдите на страницу Основные панели Свойства.
  • В поле Имя: введите Mainview.
  • Перейдите на страницу Дополнительные панели Свойства. Введите в поля X: 0, Y: 0, Ширина: 990, Высота: 390.
  • Перетащите элемент Скруглённый прямоугольник. В нём мы разместим все сегменты модели. Оставьте имя, предложенное системой.
  • Перейдите на страницу Дополнительные панели Свойства. Введите в поля X: 10, Y: 60, Ширина: 970, Высота: 320.
  • Перетащите элементы Скруглённый прямоугольник, укажите имена сегментов и свойства согласно табл. 6.2. Шрифт, цвет и т.д. выберите по своему усмотрению.
  • СегментСвойства
    Х:Y:Ширина:Высота:
    Цеха2080140270
    Посты контроля блоков17080160270
    Пункты сборки изделий34080120270
    Стенды контроля изделий47080150270
    Пункты приёма изделий63080170270
    Склад готовых изделий 81080160130
    Склад бракованных изделий810220160130
    (рис 6.4) Размещение сегментов модели

    Имитация работы цехов предприятия

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

  • В Палитре выделите Enterprise Library.
  • Перетащите объект sourсe на диаграмму класса Main и разместите в скругленном прямоугольнике с именем Цеха.
  • Для записи и хранения параметров блоков и изделий в дополнительные поля заявок нужно создать нестандартный класс заявки. Создайте класс заявки Product.
  • В панели Проект щелкните правой кнопкой мыши элемент модели верхнего уровня дерева и выберите в меню Создать Java класс.
  • Появится диалоговое окно Новый Java класс. В поле Имя: введите имя нового класса Product.
  • В поле Базовый класс: выберите из выпадающего списка Entity в качестве базового класса. Щелкните кнопку Далее.
  • Появится вторая страница Мастера создания Java класса. Добавьте следующие поля Java класса, которые потребуются в дальнейшем при разработке модели:
    int numBlock;
    int sign1;
    int numBlBrak1;
    int numBlBrak2;
    int numBlBrak3;
    int numBlBrak4;
    double timeSbor;
    double cost;
  • Оставьте выбранными флажки Создать конструктор и Создать метод toString().
  • Щелкните кнопку Готово. Появится редактор кода и автоматически созданный код вашего Java класса. Закройте код.
  • Выделите объект source. На странице Основные панели Свойства установите свойства согласно табл. 6.3.
    Свойства объектов source
    ИмяСвойстваЗначения
    Цех1Отображать имяУстановите флажок
    Класс заявкиProduct
    Заявки прибывают согласноВремени между прибытиями
    Время между прибытиямиExponential(1/aveTimeShop1)
    Количество заявок, прибывающих за один раз1
    Новая заявкаnew Product()
    Действие при выходе if (a==0){
    costBlock1=stKomplBlock1+
    stIzgBlock1+stTestBlock1;
    costBlock2=stKomplBlock2+
    stIzgBlock2+stTestBlock2;
    costBlock3=stKomplBlock3+
    stIzgBlock3+stTestBlock3;
    costBlock4=stKomplBlock4+
    stIzgBlock4+stTestBlock4;
    costBlockIzd=costBlock1+
    costBlock2+costBlock3+
    costBlock4;
    minCostIzd=costBlockIzd+
    stSborki+
    stKontrIzd+stPriemIzd;
    a=1;}
    kolIzgBlock1++;
    entity.numBlock = 1;
    entity.timeSbor =
    exponential(1/timeSborki);
    costKomplBlock1 += stKomplBlock1;
    costKomplBlock += stKomplBlock1;
    costIzgBlock1 += stIzgBlock1;
    sumCostBlock1 += (stKomplBlock1+stIzgBlock1);
    costIzgBlock += stIzgBlock1;
    sumCostBlock += (stKomplBlock1+stIzgBlock1);
    цех2Отображать имяУстановите флажок
    Класс заявкиProduct
    Заявки прибывают согласноВремени между прибытиями
    Время между прибытиямиExponential(1/aveTimeShop2)
    Количество заявок, прибывающих за один раз1
    Новая заявкаnew Product()
    Действие при выходе kolIzgBlock2++;
    entity.numBlock = 2;
    costKomplBlock2 += stKomplBlock2;
    costKomplBlock += stKomplBlock2;
    costIzgBlock2 += stIzgBlock2;
    sumCostBlock2 += (stKomplBlock2+stIzgBlock2);
    costIzgBlock += stIzgBlock2;
    sumCostBlock += (stKomplBlock2+stIzgBlock2);
    цех3Отображать имяУстановите флажок
    Класс заявкиProduct
    Заявки прибывают согласноВремени между прибытиями
    Время между прибытиямиExponential(1/aveTimeShop3)
    Количество заявок, прибывающих за один раз1
    Новая заявкаnew Product()
    Действие при выходеkolIzgBlock3++;
    entity.numBlock = 3;
    costKomplBlock3 += stKomplBlock3;
    costKomplBlock += stKomplBlock3;
    costIzgBlock3 += stIzgBlock3;
    sumCostBlock3 += (stKomplBlock3+stIzgBlock3);
    costIzgBlock += stIzgBlock3;
    sumCostBlock += (stKomplBlock3+stIzgBlock3);
    цех4Отображать имяУстановите флажок
    Класс заявкиProduct
    Заявки прибывают согласноВремени между прибытиями
    Время между прибытиямиExponential(1/aveTimeShop4)
    Количество заявок, прибывающих за один раз1
    Новая заявкаnew Product()
    Действие при выходеkolIzgBlock4++;
    entity.numBlock = 4;
    costKomplBlock4 += stKomplBlock4;
    costKomplBlock += stKomplBlock4;
    costIzgBlock4 += stIzgBlock4;
    sumCostBlock4 += (stKomplBlock4+stIzgBlock4);
    costIzgBlock += stIzgBlock4;
    sumCostBlock += (stKomplBlock4+stIzgBlock4);
  • Щелкните выделенный source правой кнопкой мыши и в контекстном меню выберите Копировать.
  • Вставьте в скругленный прямоугольник с именем Цеха еще три объекта source. Разместите их вертикально один под другим. Во время вставки имена объектов будут изменяться: цех2, цех3, цех4. Однако остальные свойства останутся такими же, как и у объекта цех1. Поэтому, последовательно выделяя второй, третий и четвертый объекты source, скорректируйте их свойства также согласно табл. 6.3.
  • Имитация работы постов контроля блоков

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

    Для размещения объектов, имитирующих работу постов контроля блоков, создайте новый класс активного объекта Test.

  • На панели Проект щелкните Main правой кнопкой мыши и выберите из контекстного меню Создать/Класс активного объекта. Откроется окно Новый класс активного объекта.
  • В поле Имя: задайте имя нового класса Test.
  • Если нужно, в поле Описание: введите описание сущности, моделируемой этим классом. Щелкните кнопку Готово.
  • Создайте область просмотра на диаграмме класса Test для размещения объектов сегмента Посты контроля блоков.

  • В Палитре выделите Презентация. Перетащите элемент Область просмотра.
  • Перейдите на страницу Основные панели Свойства.
  • В поле Имя: введите Kontr1.
  • Перейдите на страницу Дополнительные панели Свойства. Введите в поля X: 0, Y: 0, Ширина: 590, Высота: 390.
  • Согласно указанному ранее назначению постов контроля блоков нужно сделать так, чтобы четыре типа блоков передавались из цехов на свои посты контроля, четыре типа тестированных и исправных блоков поступали на пункты сборки изделий, а четыре типа забракованных блоков - на склад забракованных блоков.

    Создайте элемент нового класса активного объекта Test.

  • Из Палитры Основная перетащите элемент Порт и разместите сверху в крайнем левом ряду (рис. 6.5). (рис 6.5) Размещение элементов Порт на объекте Test
  • На странице Основные панели Свойства имя port замените именем Блок1.
  • Скопируйте элемент Порт с именем Блок1.
  • Вставьте три элемента Порт (см. рис. 6.5). При вставке последовательно будут изменяться их имена: Блок2, Блок3, Блок4.
  • Из Палитры Основная перетащите элемент Порт и разместите сверху в среднем ряду (см. рис. 6.5).
  • На странице Основные панели Свойства имя port замените именем БракБл1.
  • Скопируйте элемент Порт с именем БракБл1.
  • Вставьте три элемента Порт (см. рис. 6.5). При вставке последовательно будут изменяться их имена: БракБл2, БракБл3, БракБл4.
  • Из Палитры Основная перетащите элемент Порт и разместите сверху в крайнем правом ряду (см. рис. 6.5).
  • На странице Основные панели Свойства имя port замените именем ГотБл1.
  • Скопируйте элемент Порт с именем ГотБл1.
  • Вставьте три элемента Порт (см. рис. 6.5). При вставке последовательно будут изменяться их имена: ГотБл2, ГотБл3, ГотБл4.
  • По мере размещения элементов Порт они автоматически будут объединяться прямоугольником (с пунктирными линиями) и появится надпись Значок.
  • Возвратитесь на диаграмму класса Main.
  • На панели Проект выделите Test, перетащите на диаграмму класса Main элемент класса Test, разместите и соедините так, как на рис. 6.6. Порты БракБл1…БракБл4 соедините с объектом sink сегмента Склад бракованных блоков, предварительно разместив его там.
  • Элемент диаграммы активного класса Test создан. Возвратитесь на диаграмму класса Test.
  • Для имитации работы постов контроля блоков одного типа (одного цеха) нам потребуются объекты:

  • queue - имитация склада изготовленных цехом блоков;
  • delay - имитация времени тестирования блока;
  • selectOutPut - имитация процесса браковки блоков.
  • (рис 6.6) Добавлен элемент диаграммы класса Test
  • Перетащите элемент Скруглённый прямоугольник. В нём мы разместим все объекты сегмента имитации работы постов контроля блоков. Оставьте имя, предложенное системой.
  • Перейдите на страницу Дополнительные панели Свойства. Введите в поля X: 10, Y: 50, Ширина: 570, Высота: 330.
  • Добавьте на диаграмму класса Test объекты класса Queue.

  • Из библиотеки Enterprise Library перетащите объект queue и разместите слева сверху, как на рис. 6.7.
  • На странице Основные панели Свойства замените имя queue именем склИзгБл1 (склад изготовленных блоков цеха 1).
  • В поле Класс заявки: Entity замените Product.
  • Установите Вместимость: Максимальная.
  • Скопируйте объект с именем склИзгБл1.
  • Вставьте и поместите три объекта класса Queue (см. рис. 6.7).
  • Добавьте на диаграмму класса Test объекты класса Delay.

  • Из библиотеки Enterprise Library перетащите один объект delay и поместите справа рядом с объектом склИзгБл1, как на рис. 6.7. (рис 6.7) Размещение элементов на диаграмме активного класса Test
  • На странице Основные панели Свойства замените имя delay именем постКонтрБлок1 (посты контроля блоков цеха 1).
  • В поле Класс заявки: Entity замените Product.
  • Введите в поле Время задержки: exponential (1/get_Main().timeTestBlock1).
  • Введите get_Main().postKontr1 в поле Вместимость:.
  • Действие при выходе
    get_Main().kolTestBlock1++;
    get_Main().sumCostBlock1 += get_Main().stTestBlock1;
    get_Main().costTestBlock1+=get_Main().stTestBlock1;
    get_Main().costTestBlock += get_Main().stTestBlock1;
    get_Main().sumCostBlock += get_Main().stTestBlock1;
  • Скопируйте объект с именем постКонтрБлок1.
  • Вставьте и разместите три объекта delay (см. рис. 6.7).
  • Последовательно выделите и внесите правки в их свойства (табл. 6.4). Внесите правки и в свойство Действие при выходе.
  • ИмяВремя задержкиВместимость
    постКонтрБлок2exponentialget_Main().
    (1/get_Main().timeTestBlock2)postKontr2
    постКонтрБлок3exponentialget_Main().
    (1/get_Main().timeTestBlock3)postKontr3
    постКонтрБлок4exponentialget_Main().
    (1/get_Main().timeTestBlock4)postKontr4

    Добавьте на диаграмму Test объекты класса SelectOutput.

  • Перетащите объект selectOutput и разместите справа рядом с объектом постКонтрБлок1, как на рис. 6.7.
  • На странице Основные панели Свойства замените имя selectOutPut именем ОтбракБлок1 (отбраковка блоков цеха 1).
  • Установите свойства объекта согласно табл. 6.5.
  • Скопируйте объект с именем ОтбракБлок1.
  • Вставьте три объекта класса SelectOutput (см. рис. 6.7).
  • Последовательно выделите вставленные объекты и скорректируйте значения их свойств согласно табл. 6.5.
  • Соедините входы и выходы объектов диаграммы класса Test согласно рис. 6.7.
  • Код в свойство Действие при выходе (true) введен для учёта, например, для цеха 1:

  • gotBlock1 - количества готовых блоков цеха 1.
  • Код в свойстве Действие при выходе (false) обеспечивает счёт количества brakBlock1 забракованных блоков цеха 1.

    СвойстваЗначение
    ИмяОтбракБлок1
    Класс заявкиProduct
    Выход true выбираетсяС заданной вероятностью
    Вероятность [0…1]1-get_Main().procBrakBlock1
    Действие при выходе (true)get_Main().gotBlock1++;
    Действие при выходе (false)get_Main().brakBlock1++;
    entity.sign1 = 1;
    entity.numBlBrak1 = 1;
    ИмяОтбракБлок2
    Класс заявкиProduct
    Выход true выбираетсяС заданной вероятностью
    Вероятность [0…1]1-get_Main().procBrakBlock2
    Действие при выходе (true)get_Main().gotBlock2++;
    Действие при выходе (false)get_Main().brakBlock2++;
    entity.sign1 = 1;
    entity.numBlBrak2 = 1;
    ИмяОтбракБлок3
    Класс заявкиProduct
    Выход true выбираетсяС заданной вероятностью
    Вероятность [0…1]1-get_Main().procBrakBlock3
    Действие при выходе (true)get_Main().gotBlock3++;
    Действие при выходе (false)get_Main().brakBlock3++;
    entity.sign1 = 1;
    entity.numBlBrak3 = 1;
    ИмяОтбракБлок4
    Класс заявкиProduct
    Выход true выбираетсяС заданной вероятностью
    Вероятность [0…1]1-get_Main().procBrakBlock4
    Действие при выходе (true)get_Main().gotBlock4++;
    Действие при выходе (false)get_Main().brakBlock4++;
    entity.sign1 = 1;
    entity.numBlBrak4 = 1;

    В поле entity.sign1 записывается 1 - признак брака на постах контроля, а также единица записывается в поле entity.numBlock1 … entity.numBlock4. Это нужно для раздельного счёта забракованных блоков.

    Перейдите на диаграмму класса Main.

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

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

    Для размещения объектов имитации работы пунктов сборки изделий создайте новый класс активного объекта Sborka.

  • На панели Проект щелкните Main правой кнопкой мыши и выберите из контекстного меню Создать/Класс активного объекта.
  • Откроется окно Новый класс активного объекта.
  • В поле Имя: задайте имя нового класса Sborka.
  • Если нужно, в поле Описание: введите описание сущности, моделируемой этим классом.
  • Щелкните кнопку Готово.
  • Создайте область просмотра на диаграмме класса Sborka для размещения объектов сегмента Пункты сборки изделий.

  • В Палитре выделите Презентация. Перетащите элемент Область просмотра.
  • Перейдите на страницу Основные панели Свойства.
  • В поле Имя: введите Sbor.
  • Перейдите на страницу Дополнительные панели Свойства. Введите в поля X: 0, Y: 0, Ширина: 820, Высота: 550.
  • Перетащите элемент Скруглённый прямоугольник. В нём мы разместим все элементы сегмента. Оставьте имя, предложенное системой.
  • Перейдите на страницу Дополнительные панели Свойства. Введите в поля X: 10, Y: 60, Ширина: 800, Высота: 480.
  • Согласно назначению пунктов сборки изделий для связи их с другими сегментами модели необходимо иметь: четыре порта для приема готовых блоков с постов контроля и один порт - для отправки собранных изделий на стенды контроля. Также нужен порт для приема бракованных изделий с целью определения и замены в них забракованных блоков и один порт - для отправки забракованных блоков после их замены на склад забракованных блоков.

  • Из Палитры Основная перетащите элемент Порт и разместите сверху в крайнем левом ряду (рис. 6.8).
  • На странице Основные панели Свойства имя port замените именем ГотБлок1. Скопируйте элемент Порт с именем ГотБлок1.
  • Вставьте три элемента Порт (см. рис. 6.8). При вставке последовательно будут изменяться их имена: ГотБлок2, ГотБлок3, ГотБлок4.
  • Из Палитры Основная перетащите еще три элемента Порт, разместите их и дайте имена как на рис. 6.8.
  • Вернитесь на диаграмму класса Main.
  • На панели Проект выделите Sborka, перетащите на диаграмму класса Main элемент sborka, разместите и соедините так, как на рис. 6.9. Порт БракБл соедините с объектом sink сегмента Склад бракованных блоков.
  • Элемент диаграммы активного класса Sborka создан. Возвратитесь на диаграмму класса Sborka.
  • Для реализации сегмента имитации работы пунктов сборки изделий нам потребуются объекты, но прежде мы рассмотрим вариант построения этого сегмента.

    (рис 6.8) Размещение элементов Порт на объекте Sborka (рис 6.9) Добавлен элемент диаграммы класса Sborka

    Сборка изделия начинается тогда, когда будут готовы четыре блока (по одному каждого из четырех типов). Полагаем, что время готовности блоков различное. Значит, нужно использовать такие объекты AnyLogic, которые предназначены для синхронизации движения заявок (блоков). Объекты класса Match предназначены именно для синхронизации движения двух заявок.

    После готовности четырех блоков для дальнейщей имитации процесса сборки нужно эти четыре заявки объединить в одну, и интерпретировать её как изделие. В AnyLogic имеются объекты некоторых классов, которые позволяют осуществить нужное нам объединение. Применим объекты класса Combine, позволяющие из двух заявок получить одну.

    Процесс объединения будет происходить по мере готовности блоков, значит, на пункте сборки будет создаваться очередь, для имитации которой нужно использовать объект queue.

    Для имитации непосредственно процесса сборки следует взять объект delay, а для разделения потока изделий на собранные первично и на изделия с заменными блоками после браковки - объект selectOutPut.

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

  • Перетащите элемент Прямоугольник. Оставьте имя, предложенное системой.
  • Перейдите на страницу Дополнительные панели Свойства. Введите в поля X: 320, Y: 80, Ширина: 340, Высота: 230.
  • Из библиотеки Enterprise Library перетащите четыре объекта match и три объекта combine. Расположите и соедините их так, как на рис. 6.10.
  • Перетащите объекты queue, delay, selectOutPut, разместите, соедините и дайте им имена также согласно рис. 6.10.
  • Поочередно выделите каждый из этих объектов и на страницах Основные панели Свойства установите для:

  • match…match3:
  • Классы заявок: Вход1, Вход2: Product, Product
  • Условия соответствия true
  • Максимальная вместимость 1
  • Максимальная вместимость 2
  • combine…combine2:
  • Классы заявок: Вход1, Вход2, Выход: Product, Product, Product
  • Объединенная заявка entity1
  • queue:
  • Класс заявки: Product
  • Максимальная вместимость
  • selectOutPut:
  • Класс заявки: Product
  • Выход true выбирается При выполнении условия
  • Условие entity.sign1 == 0
  • объекты match и match1 обеспечивают синхронизацию движения блоков 1 и 2, 3 и 4 соответственно. А объекты match2 и match3 - блоков 1 и 3, 2 и 4 соответственно. Таким образом, обеспечивается синхронизация движения четырех блоков.

    Указание свойства entity1 в объектах combine…combine2 позволяет получить на выходе сначала combine, а потом combine2 заявку, имитирующую изначально блок 1. Но теперь эта заявка будет имитировать изделие. Поэтому только для нее ранее было определено значение поля entity.timeSbor (см. табл. 6.3).

    Изделия после элемента пунктСборки разделяются на два потока: собранные изделия первично (entity.sign1=0) и изделия с замененными блоками (entity.sign1=2).

    (рис 6.10) Фрагмент сегмента имитации работы пунктов сборки

    Разделение, осуществляемое объектом selectOutPut по условию entity.sign1==0, нужно для учёта количества изделий с заменёнными блоками и количества заменённых блоков.

    Свойства объекта delay установите согласно табл. 6.6.

    ИмяСвойстваЗначения
    пунктборкиОтображать имяУстановите флажок
    Класс заявкиProduct
    Задержка задаётсяЯвно
    Время задержкиentity.timeSbor
    Вместимостьget_Main().kolPunSborki
    Действие при выходеif (entity.sign1 == 0)
    {get_Main().kolSobrIzd++;
    get_Main().costSborIzd += get_Main().stSborki;
    entity.cost += get_Main().stSborki;}
    if (entity.sign1 == 2)
    {if (entity.numBlBrak1== 1)
    {get_Main().zamBlock1++;
    entity.cost += get_Main().stZamBlock1;
    get_Main().costSborIzd += get_Main().stZamBlock1;}
    if (entity.numBlBrak2 == 1)
    {get_Main().zamBlock2++;
    entity.cost += get_Main().stZamBlock2;
    get_Main().costSborIzd += get_Main().stZamBlock2;}
    if (entity.numBlBrak3 == 1)
    {get_Main().zamBlock3++;
    entity.cost += get_Main().stZamBlock3;
    get_Main().costSborIzd += get_Main().stZamBlock3;}
    if (entity.numBlBrak4 == 1)
    {get_Main().zamBlock4++;
    entity.cost += get_Main().stZamBlock4;
    get_Main().costSborIzd += get_Main().stZamBlock4;}
    get_Main().kolZamIzd++;}

    Продолжим построение сегмента имитации работы пунктов сборки изделий (рис. 6.11).

    (рис 6.11) Сегмент имитации пунктов сборки изделий

    Бракованные изделия поступают через порт БракИзд. В заявке, имитирующей такое изделие, поле etity.sign1 = 2. В одном из полей etity.numBlBrak1 … etity.numBlBrak4 этой же заявки также записана единица. Запись произведена при отбраковке на стендах контроля или пунктах приёма изделий. Это мы сделаем (запишем) позже при построении этих сегментов. Для определения, какой из блоков 1 … 4 забракован в изделии, нужно использовать объект selectOutput5. Этот объект в отличие от объекта selectOutput позволяет проверять пять условий и в зависимости от результата проверки направляет заявку на один из пяти выходов (можно создать объект selectOutput(N) на один вход и N выходов, использовав один объект exit и N объектов enter).

    Готовые блоки поступают через порты ГотБл1 … ГотБл4. Поэтому их надо было бы соединить с соответствующими входами объектов match … match1. Но в забракованном изделии нужно заменить какой-то из блоков. Значит, в случае наличия забракованного изделия надо направить из поступающих блоков соответствующий блок на замену. Сделать это можно с использованием объектов selectOutPut. Каждый порт ГотБл1 … ГотБл4 соединить с входом соответствующего объекта selectOutPut. Выходы true этих объектов соединить с соответсвующими входами объектов match … match1. Таким образом, с выходов true готовые блоки будут направляться для первичной сборки изделий, а с выходов false - для замены бракованных блоков. В качестве условия разделения потоков можно использовать простые переменные БрИздБл1 … БрИздБл4. Например, если БрИздБл2 ? 0, то имеется забракованное изделие с блоком 2.

    Для дальнейшей реализации процесса замены блока нужно объединить две заявки - имитирующую забракованное изделие и имитирующую блок для замены - в одну заявку. Для объединения двух заявок в одну воспользуйтесь уже известными вам объектами combine. Выходы объекта selectOutput5 соединить с входами delay, а выход каждого из них - с первыми входами объектов combine.

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

    Как уже отмечалось ранее, изделия после пунктов сборки разделяются на два потока.

    Собранные первично изделия с выхода true объекта selectOutPut направляются на стенды контроля, поэтому этот выход нужно соединить с портом СобрИзд. Изделие с заменённым блоком нужно вновь направить на стенды контроля. В тоже время его нужно учесть, как забракованный блок и отправить на склад забракованных блоков. Значит, необходимо из одной заявки сделать две. Для этого используйте объект split. Один выход этого объекта соедините с портом БракБл, а другой - с портом СобрИзд.

    Выполните изложенные рекомендации практически. Перетащите четыре объекта класса SelectOutPut (или перетащите один объект, а остальные три скопируйте), один объект класса SelectOutPut5, четыре объекта классов Queue и Combine, один объект класса Split и четыре простых переменных. Разместите, дайте им имена и соедините так, как на рис. 6.11.

    Поочередно выделите новые объекты и установите их свойства согласно табл. 6.7.

    СвойстваЗначение
    selectOutPut … selectOutPut3
    ИмяГотБлок1
    Выход true выбираетсяПри выполнении условия
    УсловиеБракИздБл1 == 0
    ИмяГотБлок2
    Выход true выбираетсяПри выполнении условия
    УсловиеБракИздБл2 == 0
    ИмяГотБлок3
    Выход true выбираетсяПри выполнении условия
    УсловиеБракИздБл3 == 0
    ИмяГотБлок4
    Выход true выбираетсяПри выполнении условия
    УсловиеБракИздБл4 == 0
    selectOutput5
    ИмяБракИзделия
    ИспользоватьУсловия
    Условие 0entity.numBlBrak1 == 1
    Условие 1entity.numBlBrak2 == 1
    Условие 2entity.numBlBrak3 == 1
    Условие 3entity.numBlBrak4 == 1
    match
    ИмясинхрБлок_1_2
    Классы заявок: Вход1, Вход2:Product, Product
    Условие соответствияtrue
    Максимальная вместимость 1Установить флажок
    Максимальная вместимость 2Установить флажок
    ИмясинхрБлок_3_4
    Классы заявок: Вход1, Вход2:Product, Product
    Условие соответствияtrue
    Максимальная вместимость 1Установить флажок
    Максимальная вместимость 2Установить флажок
    ИмясинхрБлок_1_3
    Классы заявок: Вход1, Вход2:Product, Product
    Условие соответствияtrue
    Максимальная вместимость 1Установить флажок
    Максимальная вместимость 2Установить флажок
    ИмясинхрБлок_2_4
    Классы заявок: Вход1, Вход2:Product, Product
    Условие соответствияtrue
    Максимальная вместимость 1Установить флажок
    Максимальная вместимость 2Установить флажок
    combine
    ИмяиздБлок1
    Классы заявок: Вход1, Вход2, ВыходProduct, Product, Product
    Действие при входе 1if (entity.numBlBrak1 == 1)
    БрИздБл1 ++;
    Объединенная заявкаentity1
    Действие при выходеif (entity.numBlBrak1 == 1)
    БрИздБл1 --;
    entity.cost += get_Main().stZamBlock1;
    entity.timeSbor =
    exponential(1/get_Main().
    timeZamBlock1);
    ИмяиздБлок2
    Классы заявок: Вход1, Вход2, ВыходProduct, Product, Product
    Действие при входе 1if (entity.numBlBrak2 == 1)
    БрИздБл2 ++;
    Объединенная заявкаentity1
    Действие при выходеif (entity.numBlBrak2 == 1)
    БрИздБл2 --;
    entity.cost += get_Main().stZamBlock2;
    entity.timeSbor =
    exponential(1/get_Main().
    timeZamBlock2);
    ИмяиздБлок3
    Классы заявок: Вход1, Вход2, ВыходProduct, Product, Product
    Действие при входе 1if (entity.numBlBrak1 == 1)
    БрИздБл3 ++;
    Объединенная заявкаentity1
    Действие при выходеif (entity.numBlBrak3 == 1)
    БрИздБл3 --;
    entity.cost += get_Main().stZamBlock3;
    entity.timeSbor =
    exponential(1/get_Main().
    timeZamBlock3);
    ИмяиздБлок4
    Классы заявок: Вход1, Вход2, ВыходProduct, Product, Product
    Действие при входе 1if (entity.numBlBrak4 == 1)
    БрИздБл1 ++;
    Объединенная заявкаentity1
    Действие при выходеif (entity.numBlBrak4 == 1)
    БрИздБл4 --;
    entity.cost += get_Main().stZamBlock4;
    entity.timeSbor =
    exponential(1/get_Main().
    timeZamBlock4);
    split
    Классы заявок: Product, Product
    Количество копий1
    Новая заявка (копия)new Product()
    Действие при выходе копииentity.sign1 = 0;
    entity.cost = original.cost;

    Имитация работы стендов контроля изделий

    Стенды контроля изделий предназначены для приёма первично собранных изделий и изделий после замены забракованных блоков, непосредственно процесса контроля изделий, отправки прошедших контроль изделий на пункты приёма, забракованных изделий - на пункты сборки, а также для приёма забракованных изделий с пунктов приёма изделий.

    На стендах контроля изделий, вследствие недостатка ресурсов, будет создаваться очередь, для имитации которой используйте объект queue.

    Для имитации непосредственно процесса контроля изделий используйте объект delay.

    По результатам контроля некоторые изделия будут признаны браком. Для отбраковки изделий нужно применить объект selectOutput.

  • Перетащите объекты queue, delay и selectOutput на прямоугольник с именем Стенды контроля изделий диаграммы класса Main.
  • Разместите и соедините их согласно рис. 6.12.
  • Выделите объект queue и установите на странице Основные панели Свойства:
  • Имя: очерСтенКонтр
  • Класс заявки: Product
  • Максимальная вместимость Установите флажок
  • Выделите объект delay и установите его свойства:
  • Класс заявки: Product
  • Задержка задается Явно
  • Время задержки exponential( 1/timeKontrIzd )
  • Вместимость kolStendKontr
  • Действие при выходе
    testSobrIzd++;
    entity.cost += stKontrIzd;
    entity.numBlBrak1 = 0;
    entity.numBlBrak2 = 0;
    entity.numBlBrak3 = 0;
    entity.numBlBrak4 = 0;
  • (рис 6.12) Диаграмма класса Main с элементами всех сегментов
  • Выделите объект selectOutput и установите его свойства:
  • Имя: БрСтендКон
  • Класс заявки: Product
  • Выход true выбирается С заданной вероятностью
  • Вероятность[0..1] 1-procBrakIzd
  • Действие при выходе (true) costTestIzd += stKontrIzd;
  • Действие при выходе (false)
    double a = 0;
    int numBlock = 0;
    entity.sign1 = 2;
    a = uniform();
    if (a < 1) numBlock = 4;
    if (a <= (verBlNum1 + verBlNum2 + verBlNum3)) numBlock=3;
    if (a <= (verBlNum1 + verBlNum2)) numBlock = 2;
    if (a <= verBlNum1) numBlock = 1;
    if (numBlock == 1) {entity.numBlBrak1 = 1;
    entity.timeSbor = exponential(1/timeZamBlock1);}
    if (numBlock == 2) {entity.numBlBrak2 = 1;
    entity.timeSbor = exponential(1/timeZamBlock2);}
    if (numBlock == 3) {entity.numBlBrak3 = 1;
    entity.timeSbor = exponential(1/timeZamBlock3);}
    if (numBlock == 4) {entity.numBlBrak4 = 1; 
    entity.timeSbor = exponential(1/timeZamBlock4);}
    brakSobrIzd ++;
  • Код в свойство Действие при выходе (false) объекта selectOutput введен для розыгрыша номера забракованного в изделии блока. В результате розыгрыша в одно из полей entity.numBlBrak1… entity.numBlBrak4 заносится 1 - признак брака. В поле entity.timeSbor - время замены соответствующего блока на пункте сборки. Полю entity.sign1 присваивается значение 2 - признак брака в изделии.

    Имитация работы пунктов приёма изделий

    Пункты приёма изделий предназначены для приёма прошедших стенды контроля изделий, непосредственно приёма изделий, отправки прошедших приём изделий на склад готовых изделий, а забракованных изделий - на стенды контроля.

    На пунктах приёма будет создаваться очередь, для имитации которой используйте объект queue.

    Для имитации непосредственно процесса приёма изделий используйте элемент delay.

    По результатам контроля некоторые изделия будут признаны браком. Для отбраковки воспользуйтесь объектом selectOutput.

  • Перетащите объекты queue, delay и selectOutput на прямоугольник с Пункты приема изделий диаграммы класса Main.
  • Разместите и соедините их согласно рис. 6.12.
  • Выделите объект queue и установите на странице Основные панели Свойства:
  • Имя: очерПрием
  • Класс заявки: Product
  • Максимальная вместимость Установите флажок
  • Выделите объект delay и установите его свойства:
  • Класс заявки: Product
  • Задержка задается Явно
  • Время задержки exponential( 1/timePriemIzd )
  • Вместимость kolPunPriem
  • Действие при выходе
    kolPriemIzd++;
    costPriemkiIzd += stPriemIzd;
    entity.cost += stPriemIzd;
  • Выделите объект selectOutput и установите его свойства:
  • Класс заявки: Product
  • Выход true выбирается С заданной вероятностью
  • Вероятность[0..1] 1-procBrakPriem
  • Действие при выходе (false)
    entity.sign1 = 2;
    brakPriemIzd++;
  • Код свойства Действие при выходе объекта delay введен для счета количества kolPriemIzd принятых всего изделий.

    Код свойства Действие при выходе (false) объекта selectOutput считает количество brakPriemIzd забракованных изделий и полю entity.sign1 присваивает 2 - признак брака в изделии.

    Имитация склада готовых изделий

    Для имитации склада готовых изделий используйте объект sink со следующими свойствами:

  • Имя: ГотИзделия
  • Класс заявки: Product
  • Действие при выходе
    kolGotIzd++;
    timeIzd = time()/kolGotIzd;
    costGotIzd += entity.cost;
    minCostGotIzd+=minCostIzd;
    koefIncrCostIzd = 
    (costGotIzd+costBrakBlock)/minCostGotIzd;
    ostGotBlock1 = gotBlock1 - kolGotIzd - zamBlock1;
    ostGotBlock2 = gotBlock2 - kolGotIzd - zamBlock2;
    ostGotBlock3 = gotBlock3 - kolGotIzd - zamBlock3;
    ostGotBlock4 = gotBlock4 - kolGotIzd - zamBlock4;
  • Код свойства Действие при выходе введен для счёта количества kolGotIzd готовых изделий, их стоимости costGotIzd и коэффициента koefIncrCostIzd увеличения себестоимости изделия вследствие наличия брака.

    Кроме того, ведется счёт готовых для сборки блоков, то есть изготовленных цехами и проверенных на постах контроля, но не использованных для сборки изделий блоков по типам ostGotBlock1… ostGotBlock4 на текущее модельное время.

    Имитация склада бракованных блоков

    Ранее (см. п. 6.2.4.2) для имитации склада бракованных блоков было рекомендовано использовать один объект sink.

    Предположим, что требуется вести раздельный учёт забракованных блоков на постах контроля цехов и забракованных на стендах контроля и пунктах приёма изделий. Для разделения потока брака дополнительному полю entity.sign1 присваивались признаки 1 или 2.

  • Перетащите объекты selectOutput и sink на прямоугольник с именем Склад бракованных блоков диаграммы класса Main.
  • Разместите и соедините их согласно рис. 6.12.
  • Поочередно выделите объекты имитации склада бракованных блоков, начиная с объекта selectOutput, и установите свойства согласно табл. 6.8.

    Коды в свойстве Действие при выходе обоих объектов sink одинаковые. Они предназначены для счёта:

  • стоимости costzbrakBlock забракованных блоков не по типам, а в целом всех блоков;
  • количества забракованных блоков по типам allBrakBlock1… allBrakBlock4.
  • Из палитры Картинки перетащите на сегменты имитации складов готовых изделий и бракованных блоков картинки Склад.
  • СвойстваЗначение
    selectOutput
    Класс заявки:Product
    Выход true выбираетсяПри выполнении условия
    Условиеentity.sign1 == 1
    sink
    ИмяБрПостКонтр
    Класс заявки:Product
    Действие при выходеif (entity.numBlBrak1 == 1)
    {costBrakBlock += costBlock1;
    allBrakBlock1++;}
    if (entity.numBlBrak2 == 1)
    {costBrakBlock += costBlock2 ;
    allBrakBlock2++;}
    if (entity.numBlBrak3 == 1)
    {costBrakBlock += costBlock3;
    allBrakBlock3++;}
    if (entity.numBlBrak4 == 1)
    {costBrakBlock += costBlock4;
    allBrakBlock4++;}
    ИмяБрБлЗам
    Класс заявки:Product
    Действие при выходеif (entity.numBlBrak1 == 1)
    {costBrakBlock += costBlock1;
    allBrakBlock1++;}
    if (entity.numBlBrak2 == 1)
    {costBrakBlock += costBlock2;
    allBrakBlock2++;}
    if (entity.numBlBrak3 == 1)
    {costBrakBlock += costBlock3;
    allBrakBlock3++;}
    if (entity.numBlBrak4 == 1)
    {costBrakBlock += costBlock4;
    allBrakBlock4++;}
    Замечание. Можно обойтись и одним объектом sink для имитации склада бракованных блоков. Для этого нужно оба кода (см. табл. 6.8) занести в его свойство Действие при выходе.

    В начало первого кода добавить:

    if (entity.sign1 == 1)
    {  код для БрПостКонтр  }
    а во второго
    if (entity.sign1 == 2)
    {  код для БрБлЗам      }

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

    Организация переключения между областями просмотра

    Добавьте свои собственные элементы презентации на ранее созданные области просмотра Mainview, Data, Result, Kont1 и Sbor, щелчком на которых будет производиться переход к той или иной области просмотра. Сделайте так, чтобы из любой области можно было переходить в любую другую область.

    Для этого разместите на каждой области просмотра элементы презентации, показанные на рис. 6.13.

    (рис 6.13) Элементы презентации для переключения

    Начните с области просмотра Mainview.

  • В Палитре выделите Презентация. Перетащите элемент text на область просмотра Mainview, разместите и введите в поле Текст: Предприятие (рис. 6.13). На странице Основные панели Свойства установите в поле Цвет: black, а также выберите выравнивание текста и шрифт.
  • Перетащите второй элемент text, разместите и введите в поле Текст: Посты контроля блоков. На странице Основные панели Свойства установите в поле Цвет: blue, а также выберите выравнивание текста и шрифт. На панели Свойства выделите Динамические и в поле Действие по щелчку: введите код: test.Kontr1.navigateTo(); Замечание. Можете выбрать и другие цвета элементов презентации. При этом нужно исходить из того, чтобы различались по цвету текст открытой области просмотра и тексты закрытых областей просмотра.
  • Перетащите третий элемент text, разместите и введите в поле Текст: Пункты сборки изделий. На панели Свойства выделите Динамические и в поле Действие по щелчку: введите: sborka.Sbor.navigateTo();
  • Перетащите четвертый элемент text, разместите и введите в поле Текст: Исходные данные. На панели Свойства выделите Динамические и в поле Действие по щелчку: введите: Data.navigateTo();
  • Перетащите пятый элемент text, разместите и введите в поле Текст: Результаты моделирования. На панели Свойства выделите Динамические и в поле Действие по щелчку: введите: Result.navigateTo();
  • Таким образом, с области просмотра Mainview можно будет переходить на любую из четырех областей просмотра. При этом элемент презентации открытой области высвечивается черным цветом, а остальные элементы презентации - голубым цветом.

  • Скопируйте элементы презентации так, как они показаны на рис. 6.13.
  • Последовательно переходите на остальные области просмотра, вставьте скопированные элементы презентации и внесите правки в их свойства согласно табл. 6.9.
  • Построение модели для проведения простого эксперимента завершено. Теперь отладьте модель и проведите эксперимент.

    Замечание. При каждом запуске модели результаты будут повторяться, если в модели используются только распределения и случайные функции из AnyLogic. Например, если вместо функции uniform(1) использовать функцию random(), которая является функцией Java, результаты моделирования воспроизводиться не будут.
    Элемент презентацииДействие по щелчку
    Data
    ПредприятиеMainview.navigateTo();
    Посты контроля блоковtest.Kontr1.navigateTo();
    Пункты сборки изделийsborka.Sbor.navigateTo();
    Исходные данные
    Результаты моделированияResult.navigateTo();
    Result
    ПредприятиеMainview.navigateTo();
    Посты контроля блоковtest.Kontr1.navigateTo();
    Пункты сборки изделийsborka.Sbor.navigateTo();
    Исходные данныеData.navigateTo();
    Результаты моделирования
    Kontrol
    Предприятиеget_Main().Mainview.navigateTo();
    Посты контроля блоков
    Пункты сборки изделийget_Main().sborka.Sbor.navigateTo();
    Исходные данныеget_Main().Data.navigateTo();
    Результаты моделированияget_Main().Result.navigateTo();
    Sbor
    Предприятиеget_Main().Mainview.navigateTo();
    Посты контроля блоковget_Main().test.Kontr1.navigateTo();
    Пункты сборки изделий
    Исходные данныеget_Main().Data.navigateTo();
    Результаты моделированияget_Main().Result.navigateTo();

    Интерпретация результатов моделирования

    Мы провели эксперименты с моделями, выполнив в GPSS World 1 000 прогонов, а в AnyLogic увеличив модельное время в 1 000 раз. При этом начальное значение генераторов случайных чисел установили 339.

    Эксперименты проводились при времени работы предприятия 40 часов (2400 единиц модельного времени).

    Результаты экспериментов приведены в виде различных показателей функционирования предприятия в табл. 6.10. В табл. 6.10 приняты обозначения: ПК1…ПК4 - пункты контроля блоков 1…4 соответственно; ПС - пункты сборки изделий; СВК - стенды выходного контроля изделий; ПП - пункт приёмки изделий.

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

    Различие незначительно, например, для коэффициента увеличения стоимости изделия оно составляет 0,003…0,004.

    Коэффициенты использования различных подразделений предприятия также отличаются на тысячные доли.

    Показатели функционирования предприятия
    ПоказателиСистемы моделирования
    GPSS WorldAnyLogic
    Согласно постановке задачи
    Количество готовых изделий121,628122,337
    $$\Delta_{11}=\mid 121,628-122,337\mid=0,709$$
    Стоимость готовых изделий7441075151
    Минимальная стоимость изделий7078771200
    $$\Delta_{12}=\mid 70787-71200\mid=413$$
    Стоимость забракованных блоков30993122
    Коэффициент увеличения стоимости1,0951,099
    $$\Delta_{13}=\mid 1,095-1,099\mid=0,004$$
    Время изготовления изделия, мин19,73219,618
    Коэффициент использования ПК10,3150,316
    Коэффициент использования ПК20,7260,728
    Коэффициент использования ПК30,6960,699
    Коэффициент использования ПК40,4720,474
    Коэффициент использования ПС0,5810,586
    Коэффициент использования СВК0,5450,548
    Коэффициент использования ПП0,5390,539
    aveTimeShop1=15, aveTimeShop2=10, aveTimeShop3=10, aveTimeShop4=15
    Количество готовых изделий147,909147,954
    $$\Delta_{21}=\mid 147,909-147,954\mid=0,045$$
    Стоимость готовых изделий9048790902
    Минимальная стоимость изделий8608386109
    $$\Delta_{22}=\mid 86083-86109\mid=26$$
    Стоимость забракованных блоков38483824
    Коэффициент увеличения стоимости1,0961,1
    $$\Delta_{23}=\mid 1,096-1,100\mid=0,004$$
    Время изготовления изделия, мин16,22616,221
    Коэффициент использования ПК10,3980,4
    Коэффициент использования ПК20,80,804
    Коэффициент использования ПК311
    Коэффициент использования ПК40,5660,563
    Коэффициент использования ПС0,7050,705
    Коэффициент использования СВК0,660,662
    Коэффициент использования ПП0,6540,654
    aveTimeShop4=10
    Количество готовых изделий153,743154,327
    $$\Delta_{31}=\mid 153,743-154,327\mid=0,584$$
    Стоимость готовых изделий9405094815
    Минимальная стоимость изделий8947889818
    $$\Delta_{32}=\mid 89478-89818\mid=340$$
    Стоимость забракованных блоков44124450
    Коэффициент увеличения стоимости1,11,105
    $$\Delta_{33}=\mid 1,100-1,105\mid=0,005$$
    Время изготовления изделия, мин15,6115,551
    Коэффициент использования ПК10,3980,399
    Коэффициент использования ПК20,80,797
    Коэффициент использования ПК311
    Коэффициент использования ПК40,850,852
    Коэффициент использования ПС0,7330,737
    Коэффициент использования СВК0,6910,691
    Коэффициент использования ПП0,6780,681
    aveTimeShop1=10, postKontr3=3
    Количество готовых изделий209,234209,086
    $$\Delta_{41}=\mid 209,234-209,086\mid=0,148$$
    Стоимость готовых изделий127880128328
    Минимальная стоимость изделий121774121688
    $$\Delta_{42}=\mid 121744-121688\mid=56$$
    Стоимость забракованных блоков49524848
    Коэффициент увеличения стоимости1,0911,094
    $$\Delta_{43}=\mid 1,091-1,094\mid=0,003$$
    Время изготовления изделия, мин11,4711,478
    Коэффициент использования ПК10,60,599
    Коэффициент использования ПК20,7990,801
    Коэффициент использования ПК30,7010,7
    Коэффициент использования ПК40,8450,853
    Коэффициент использования ПС11
    Коэффициент использования СВК0,9360,936
    Коэффициент использования ПП0,9230,923
    Страницы:

    Модель в GPSS World

    Постановка задачи

    Предприятие имеет $$n_1$$ цехов, производящих $$n_1$$ типов блоков, т. е. каждый цех производит блоки одного типа. Себестоимости комплектующих блоков $$С_{к1}, С_{к2}, …, С_{кn1}$$. Стоимости изготовления блоков $$С_{изг1}, С_{изг2}, …, С_{изгn1}$$. Интервалы выпуска блоков $$Т_{1}, Т_{2}, …, Т_{n1}$$ - случайные. Из $$n_1$$ блоков собирается одно изделие.

    Перед сборкой каждый тип блоков проверяется на $$n_{11}, n_{12}, …, n_{1n}$$ соответствующих постах контроля. Длительности контроля одного блока $$Т_{11}, Т_{12}, …, Т_{1n}$$ случайные. Стоимости проверки блоков $$С_{пр1}, С_{пр2}, …, С_{прn1}$$. На каждом посту бракуется $$q_{11}, q_{12}, …, q_{1n} \;\%$$ блоков соответственно. Забракованные блоки в дальнейшем процессе сборки не участвуют, и удаляются с постов контроля в брак.

    Прошедшие контроль, т. е. не забракованные блоки поступают на один из $$n_2$$ пунктов сборки. На пункте сборки одновременно собирается только одно изделие. Сборка начинается только тогда, когда имеются все необходимые $$n_1$$ блоков различных типов. Время сборки $$T_c$$ случайное. Стоимость сборки одного изделия $$C_сб$$.

    После сборки изделие поступает на один из $$n_3$$ стендов выходного контроля. На одном стенде одновременно проверяется только одно изделие. Время проверки $$Т_п$$ случайное. Стоимость проверки одного изделия $$С_к$$. По результатам проверки бракуется $$q_2 \;\%$$ изделий. В таком изделии с вероятностью $$q_3 \;\%$$ могут быть забракованы m блоков. Вероятности порядковых номеров из $$1 … n_1$$ $$P_{бл1} … P_{блn_1}$$ соответственно.

    Забракованное изделие направляется в цех сборки, где неработоспособные блоки заменяются новыми. Время замены $$T_{замi}$$ случайное. Стоимость замены i-го блока $$C_{замi}$$. После замены блоков изделие вновь поступает на один из стендов выходного контроля.

    Прошедшее стенд выходного контроля изделие поступает в отдел приёмки. Время приемки $$T_{пр}$$ одного изделия случайное. Стоимость приемки одного изделия $$C_{п}$$. По результатам приёмки бракуется $$q_4 \;\%$$ изделий, которые направляются вновь на стенд выходного контроля. Принятые приёмкой изделия направляются на склад предприятия.

    Исходные данные

    $$n_1=4; Т_1=19; Т_2=11; Т_3=15; Т_4=18;$$ $$C_{k1}=35; C_{k2}=32; C_{k3}=43; C_{k4}=48;$$ $$C_{изг1}=35; C_{изг2}=27; C_{изг3}=36; C_{изг4}=37;$$ $$n_{11}=2; n_{12}=2; n_{13}=2; n_{14}=2; Т_{11}=12; Т_{12}=16; Т_{13}=21; Т_{14}=17;$$ $$C_{пр1}=12; C_{пр2}=23; C_{пр3}=32; C_{пр4}=28;$$ $$q_{11}=0,02; q_{12}=0,03; q_{13}=0,04; q_{14}=0,06;$$ $$n_{2}=2; T_{c}=22; C_{сб}=67; n_{3}=2; Т_{п}=26; C_{k}=74; q_{2}=0,05;$$ $$n_{2}=2; T_{c}=22; C_{сб}=67; n_{3}=2; Т_{п}=26; C_{k}=74; q_{2}=0,05;$$ $$m=1; p_{k1}=1,0; P_{бл1}=0,25; P_{бл2}=0,25; P_{бл3}=0,25; P_{бл4}=0,25;$$ $$Т_{зам1}=12; Т_{зам2}=15; Т_{зам3}=12; Т_{зам4}=21;$$ $$С_{зам1}=34; С_{зам2}=46; С_{зам3}=38; С_{зам4}=54;$$ $$n_{4}=2; T_{пр}=18; С_{п}=53; q_{4}=0,15.$$

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

    Задание на исследование

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

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

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

    Уяснение задачи на исследование

    Предприятие при изготовлении блоков и сборки из них изделий может быть представлено как многофазная многоканальная разомкнутая система массового обслуживания с ожиданием, так как оно имеет все ее элементы (Рис. 6.1):

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

    Для имитации МКУ следует использовать блоки ENTER и LEAVE.

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

    Например, q11_, n1_. Сделаем это для отличия от зарезервированных символов GPSS World: q - системный числовой атрибут, означающий очередь, n - используется в качестве ссылки при определении количества транзактов, вошедших в какой-либо блок программы. Добавление символа подчеркивания предотвратит ошибку, которая в противном случае будет выявлена на этапе создания объекта "Процесс моделирования". Другие идентификаторы будем вводить по мере уяснения задачи, а также в ходе разработки программы модели.

    Для моделирования необходимо привести в соответствие время протекания реального процесса изготовления блоков и сборки изделий на предприятии и в модели. Это осуществляется введением масштабного коэффициента, например, если для условий рассматриваемой задачи его взять равным 1, а в реальном процессе измерять время в минутах, то 1 мин будет соответствовать 1 ед. мод. вр. Тогда время моделирования VrMod = 60 # 40 = 2400 ед. мод. вр. Временные параметры изготовления и контроля блоков, сборки, контроля и приёмки изделий даны в минутах, поэтому при выбранном масштабном коэффициенте 1 они не изменятся.

    В модели, как процесса, протекающего в СМО (см. рис. 6.1), необходимо иметь:

  • задание исходных данных;
  • сегмент имитации работы цехов без постов контроля;
  • сегмент имитации работы постов контроля блоков;
  • сегмент имитации сборки изделий;
  • сегмент имитации работы стендов выходного контроля;
  • сегмент имитации работы приемки;
  • сегмент задания времени моделирования и расчета результатов моделирования.
  • Для ввода исходных данных целесообразно использовать команды EQU и FUNCTION. Вторая команда позволит сократить число строк в программе за счёт ввода одномерного массива данных двумя строками.

    Программа модели

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

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

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

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

    Объединение сделано также в интересах универсальности модели. Предположим, количество цехов увеличилось. Нужно было бы добавлять сегменты имитации работы цехов и постов контроля, т. е. количество блоков в модели увеличилось бы. В предлагаемом варианте сегмент имитации функционирования постов контроля блоков остаётся неизменным. Необходимо только командами STORAGE задать ёмкости добавляемых пунктов контроля, заменить их имена номерами и добавить данные: среднее время контроля блоков, доля браков и стоимость контроля блоков в функции TKontr, BrBl и CProv соответственно.

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

    Для розыгрыша выхода в брак блоков и изделий используется блок TRANSFER в статистическом режиме.

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

    Замечание. Не путайте блоки изделий с блоками GPSS World в программе модели.

    В программе использование МКУ и списков пользователя демонстрируется применением номеров МКУ вместо их имен. Этот метод дает возможность иметь в модели один сегмент имитации работы постов контроля блоков вместо подобного сегмента для каждого цеха, т. е. сократить число блоков в модели.

    Обратите внимание, что в программе присвоение номеров именам МКУ указывается в самом начале и только потом, не обязательно следом, определение МКУ командой STORAGE. Если вы построите программу так, что поменяете порядок: вначале определение МКУ командой STORAGE, а потом - присвоение командой EQU номеров именам МКУ, то на этапе выполнения программы модели возникнет ошибка: "Обращение к несуществующей памяти". На этапе создания объекта "Процесс моделирования" ошибка изменения этого порядка не обнаруживается.

    Ниже приводится программа модели.

    ; Модель функционирования предприятия
    ; Замена имен МКУ номерами
    Kontr1  EQU  1
    Kontr2  EQU  2
    Kontr3  EQU  3
    Kontr4  EQU  4
    ; Задание исходных данных
    TShop  FUNCTION  P1,D4  ; Средние интервалы времени изготовления блоков
    1,19/2,11/3,15/4,18
    CKom  FUNCTION  P1,D4  ; Стоимости комплектующих блоков
    1,35/2,32/3,43/4,48
    CIzg  FUNCTION  P1,D4  ; Стоимости изготовления блоков
    1,35/2,27/3,36/4,37
    TKont  FUNCTION  P1,D4  ; Среднее время контроля на постах
    1,12/2,16/3,21/4,17
    BrBl  FUNCTION  P1,D4  ; Доли брака блоков на постах контроля
    1,.02/2,.03/3,.04/4,.06
    CProv  FUNCTION  P1,D4  ; Стоимости контроля блоков
    1,12/2,23/3,32/4,28
    TZam  FUNCTION  P1,D4  ; Среднее время замены блоков
    1,12/2,15/3,12/4,21
    CZam  FUNCTION  P1,D4  ; Стоимости замены блоков
    1,34/2,46/3,38/4,54
    VerBl  FUNCTION  RN339,D2 ; Вероятности брака одного или двух блоков в собранном изделии
    .0,2/1,1
    VerBlNum  FUNCTION  RN339,D4; Вероятность брака блока номер ...
    .25,1/.5,2/.75,3/1,4
    CCb  EQU  67  ; Стоимость сборки изделия 
    q2_  EQU  0.05  ; Доля забракованных изделий на пункте выходного контроля
    q4_  EQU  0.15  ; Доля забракованных изделий приемкой
    TipBl  EQU  4  ; Мах количество типов блоков
    VrMod   EQU  2400  ; Время моделирования, 1 ед. мод. вр. = 1 мин
    Tc_  EQU  22  ; Среднее время сборки изделия
    Tp  EQU  26  ; Среднее время проверки изделия
    Tpr  EQU  18  ; Среднее время приема изделия
    CPr  EQU  53  ; Стоимость приёмки изделия
    CK  EQU  74  ; Стоимость контроля изделия
    ;Задание количества пунктов сборки и постов контроля
    Sb  STORAGE  2  ; Количество пунктов сборки
    Kontr1  STORAGE  2  ; Количество постов n11
    Kontr2  STORAGE  2  ; Количество постов n12
    Kontr3  STORAGE  2  ; Количество постов n13
    Kontr4  STORAGE  2  ; Количество постов n14
    KSb  STORAGE  3  ; Количество стендов выходного контроля
    KPr  STORAGE  2  ; Количество пунктов приёмки
    
    ; Описание арифметических выражений
    KolIzd  VARIABLE  (N$Term7/X$prog)  ; Количество готовых изделий
    KolGotBl  VARIABLE  ((CH*1/X$Prog))  ; Количество готовых блоков всех типов, оставшихся на складах
    KolBrBl  VARIABLE  ((X*1/X$Prog))  ; Количество забракованных блоков всех типов
    TIzd  VARIABLE  (AC1/X$Prog)/X$KolIzd; Среднее время подготовки одного изделия
    ;Сегмент имитации работы цехов без постов контроля
      GENERATE  ,,,TipBl ; Число транзактов по числу типов блоков
      SAVEVALUE  Tip+,1  ; Пронумеровать типы блоков
      ASSIGN  1,X$Tip  ; Код в параметре транзакта - тип блока
    Met20  ADVANCE  (Exponential(27,0,FN$TShop)); Розыгрыш интервала поступления блока
      SPLIT  1,Met20  ; Расщепление на два 
      ASSIGN  2,(Exponential(339,0,FN$TKont))  
    ; Розыгрыш времени контроля и запись в Р2
      ASSIGN  9,FN$BrBl ; Запись в Р9 доли брака блоков после постов контроля
      ASSIGN  Sbor,(Exponential(339,0,Tc_)); Запись времени сборки изделия
      ASSIGN  Cost,(FN$CKom+FN$CIzg); Стоимость комплектующих+стоимость изготовления в P$Cost
    ; Сегмент имитации работы постов контроля блоков
    Met1  QUEUE  P1 ; Встать в очередь с номером в Р1
      ENTER  P1  ; Занять МКУ с номером в Р1
      DEPART  P1 ; Покинуть очередь с номером в Р1
      ADVANCE   P2;Имитация контроля с временем в Р2
      LEAVE  P1  ; Освободить МКУ с номером в Р1
      ASSIGN  Cost+,FN$CProv ; Добавить стоимость проверки
      TRANSFER  P9,,Met14 ; Отправить брак блоков к Met14
      LINK   P1,FIFO ; Готовые блоки на склад с номером в Р1
    ; Сегмент имитации сборки изделий
      GENERATE  ,,,1
    Met3   ASSIGN  1,TipBl  ; Подготовка к циклу
      SAVEVALUE  Cost,0  ; Обнуление ячейки Cost
    Met13   TEST NE  CH*1,0  ; Есть ли на складе готовые блоки?
      TEST NE  P1,1,Met4  ; Если последний блок, то на Met4
      UNLINK  P1,Met32,1 ; Нет
      TRANSFER  ,Met31
    Met4   UNLINK  P1,Met22,1 ; Отправить блоки на сборку
    Met31  LOOP  1,Met13
      TRANSFER  ,Met3  ; Вернуться для проверки наличия всех типов блоков для следующего изделия
    Met32  SAVEVALUE  Cost+,P$Cost  ; Суммарная стоимость 2-го, 3-го и 4-го блоков
      SAVEVALUE  Cost1,X$Cost  ; Суммарная стоимость 2-го, 3-го и 4-го блоков
      TRANSFER  ,Term5  ; Отправить 
    Met22  ASSIGN  Cost+,X$Cost1  ; Суммарная стоимость 1-го...4-го блоков
      SAVEVALUE  Cost2,P$Cost  ; Суммарная стоимость 1-го...4-го блоков
      ASSIGN  Zam,0
    Met5   QUEUE  Sbor  ; Занять очередь на пункты сборки
      ENTER  Sb  ; Занять пункт сборки
      DEPART  Sbor  ; Освободить очередь на пункт сборки
      ADVANCE  P$Sbor  ; Имитация сборки
      LEAVE  Sb  ; Освободить пункт сборки
      TEST E  P$Zam,0,Met9
      ASSIGN  Cost+,CCb  ; Добавить стоимость сборки изделия  
    ; Сегмент имитации работы стендов выходного контроля
    Met9   QUEUE   KSbor  ; Занять очередь на стенд выходного контроля
      ENTER  KSb    ; Занять стенд выходного контроля
      DEPART  KSbor  ; Освободить очередь на стенд выходного контроля
      ADVANCE  (Exponential(339,0,Tp)); Имитация работы стенда выходного контроля
      LEAVE  KSb  ; Освободить стенд выходного контроля
      ASSIGN  Cost+,CK  ; Добавить стоимость контроля изделия
      TRANSFER  q2_,Met34,Met33  ; Направить в приёмку, а брак-на подготовку к замене
    ; Подготовка к замене блоков
    Met33  ASSIGN  KolBl,FN$VerBl  ; Розыгрыш количества забракованных в изделии блоков
      ASSIGN  Sbor,0  ; Обнуление параметра Sbor
    Met21  ASSIGN  1,FN$VerBlNum  ; Розыгрыш номера блока
      TEST NE  CH*1,0  ; Есть на складе готовые блоки?
      UNLINK  P1,Met14,1  ; Да. Тогда блок на замену
      ASSIGN  Sbor,(Exponential(339,0,FN$TZam)); Розыгрыш времени замены блоков
      ASSIGN  Zam,1
      ASSIGN  Cost+,FN$CZam  ; Добавить стоимость замены блока
      TRANSFER  ,Met5  ; Отправить на пункты сборки
    ; Сегмент имитации работы приёмки
    Met34  QUEUE  Opr  ; Занять очередь в приёмку
      ENTER  KPr  ; Занять приемку
      DEPART  Opr  ; Освободить очередь в приёмку
      ADVANCE  (Exponential(339,0,Tpr)) ; Имитация работы приемки
      LEAVE  KPr  ; Освободить приемку
      ASSIGN  Cost+,CPr  ; Добавить стоимость приёмки изделия
      TRANSFER  q4_,,Met9 ; Готовые изделия - на склад
    ; Сегмент счёта блоков и изделий
      SAVEVALUE  CostIzd+,P$Cost
    Term7  TERMINATE   ; Количество готовых изделий за все прогоны модели
    Met14   SAVEVALUE P1+,1  ; Количество забракованных блоков по типам за все прогоны модели
      ASSIGN  5,(TipBl+P1)
      SAVEVALUE  *5+,P$Cost; Стоимости забракованных блоков по типам за все прогоны модели
      SAVEVALUE  CostBr+,P$Cost  ; Стоимость забракованных блоков за все прогоны модели
      TERMINATE
    Term5  TERMINATE    
    ; Задание времени моделирования и расчет результатов
      GENERATE  VrMod ; Задание времени моделирования
      TEST L  X$prog,TG1,Met10  ; Если X$Prog< содержимого счетчика завершений, то
      SAVEVALUE Prog,TG1 ; записать в X$Prog содержимое счетчика завершений
    Met10  TEST E  TG1,1,Met12 ; Если содержимое счетчика завершений равно 1, то расчет результатов
      SAVEVALUE KolIzd,V$KolIzd  ; Количество готовых изделий
      ASSIGN  1,0   ; Подготовка к циклу
    Met15  ASSIGN  1+,1  ; Начало цикла по числу типов блоков
      SAVEVALUE (10+P1),V$KolGotBl  ; Количество готовых блоков всех типов, оставшихся на складах
      SAVEVALUE P1,V$KolBrBl  ; Количество забракованных блоков всех типов
      ASSIGN  2,(TipBl+P1)
      SAVEVALUE  P2,((X*2)/X$Prog); Стоимости забракованных блоков по типам
      SAVEVALUE  StBl+,(FN$CKom+FN$CIzg+FN$CProv); Стоимость блоков в собранном изделии
      TEST GE  P1,TipBl,Met15  ; Все ли типы блоков?
      SAVEVALUE  Cmin,(X$StBl+CCb+CK+CPr) ; Минимальная стоимость одного изделия
      SAVEVALUE  MinCGotIzd,(X$Cmin#X$KolIzd) ; Минимальная стоимость всех готовых изделий
      SAVEVALUE  CostIzd,(X$CostIzd/X$Prog)  ; Стоимость готовых изделий
      SAVEVALUE TIzd,V$TIzd  ; Среднее время подготовки одного изделия
      SAVEVALUE  CostBr,(X$CostBr/X$Prog)  ; Стоимость забракованных блоков
      SAVEVALUE  Koef,((X$CostIzd+X$CostBr)/X$MinCGotIzd); Коэффициент увеличения стоимости одного изделия
    Met12  TERMINATE 1
      START   1000

    Отладьте модель. Выполните моделирование. В отчете, фрагмент которого приведен ниже,

    SAVEVALUE    RETRY       VALUE
     KOLIZD        0        121.628
     TIZD          0         19.732
     COSTBR        0       3091.787
     COSTIZD       0      74410.065
     CMIN          0        582.000
     MINCGOTIZD    0      70787.496
     KOEF          0          1.095

    найдите, что за 40 часов подготовлено 121,628 изделия, а среднее время подготовки одного изделия $$\approx 20$$ мин (19,732 мин). Минимальная стоимость готовых изделий 70787,496, стоимость брака 3091,787, стоимость готовых изделий 74410,065. Минимальная стоимость одного изделия - 582. Коэффициент увеличения стоимости одного изделия составил 1,095.

    Другие эксперименты будут проведены в п. 6.3. Данные этого же эксперимента внесены в табл. 6.10.

    Модель функционирования предприятия в AnyLogic

    Формализованное описание

    Модель, исходя из структуры предприятия (см. рис. 6.1), должна состоять из следующих сегментов:

  • ввода исходных данных;
  • имитации работы цехов по изготовлению блоков;
  • имитации работы постов контроля блоков;
  • имитации работы пунктов сборки изделий;
  • имитации работы стендов контроля собранных изделий;
  • имитации работы пунктов приема изделий;
  • имитации склада готовых изделий;
  • имитации склада бракованных блоков;
  • вывода результатов моделирования.
  • Блоки и изделия в модели следует имитировать заявками со следующими полями (параметрами):

  • block - номер цеха (коды 1…4 соответственно), выпустившего блок;
  • sign1 - признак брака на постах контроля блоков, стендах контроля изделий и на пунктах приема изделий;
  • numBlBrak1 … numBlBrak4 - признаки забракованных блоков 1…4 соответственно;
  • timeSbor - время сборки изделия (замены блоков);
  • cost - стоимость готового изделия.
  • Указанные поля предназначены для отслеживания технического состояния блоков и изделий и в зависимости от этого прохождения их по фазам изготовления изделия.

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

    Стоимость изготовления изделия может возрасти по сравнению с минимальной стоимостью (CMIN) за счёт выявления брака и замены блоков. Для фиксации этой стоимости введено поле cost.

    Для обеспечения работы модели вводятся следующие параметры процесса изготовления изделий из блоков:

  • aveTimeShop1…aveTimeShop4 - средние интервалы времени выпуска блоков 1…4 цехами 1…4;
  • stKomplBlock1…stKomplBlock4 - стоимости комплектующих блоков 1…4;
  • stIzgBlock1…stIzgBlock4 - стоимость изготовления блоков 1…4;
  • postKontr1…postKontr4 - количество постов контроля блоков 1…4;
  • procBrakBlock1…procBrakBlock4 - проценты брака блоков 1…4 на постах контроля блоков;
  • stTestBlock1…stTestBlock4 - стоимости тестирования (одного блока) блоков 1…4;
  • kolPunSborki - количество пунктов сборки изделий;
  • timeSborki - среднее время сборки одного изделия;
  • stSborki - стоимость сборки одного изделия;
  • kolStendKontr - количество стендов контроля собранных изделий;
  • timeKontrIzd - среднее время контроля на стенде одного собранного изделия;
  • procBrakIzd - процент брака собранных изделий на стендах контроля;
  • stKontrIzd - стоимость контроля на стенде одного собранного изделия;
  • verBlock1 - вероятность того, что забракованным в уже собранном изделии окажется один блок;
  • verBlock2 - вероятность того, что забракованными в уже собранном изделии окажутся два блока;
  • verBlNum1…verBlNum4 - вероятности брака на стенде контроля блоков 1…4;
  • timeZamBlock1…timeZamBlock4 - среднее время замены (одного блока) блоков 1…4;
  • stZamBlock1…stZamBlock4 - стоимость замены (одного блока) блоков 1…4;
  • kolPunPriem - количество пунктов приема изделий, прошедших пункты контроля;
  • timePriemIzd - среднее время приема одного изделия;
  • procBrakPriem - процент брака изделий на пунктах приема изделий;
  • stPriemIzd - стоимость приема одного изделия.
  • В ходе моделирования на основе приведенных исходных данных формируется и выводится на текущее модельное время следующая информация:

  • kolIzBlock1…kolIzBlock4 - количество изготовленных блоков 1…4;
  • kolTestBlock1…kolTestBlock4 - количество протестированных блоков 1…4 (как исправных, так и забракованных);
  • brakBlock1…brakBlock4 - количество забракованных на постах контроля блоков 1…4;
  • gotBlock1…gotBlock4 - количество изготовленных всего готовых блоков 1…4;
  • ostGotBlock1…ostGotBlock4 - количество оставшихся готовых блоков 1…4;
  • kolSobrIzd, testSobrIzd, brakSobrIzd - количество собранных на пунктах сборки изделий, проверенных и забракованных на стендах контроля;
  • kolPriemIzd, brakPriemIzd - количество принятых и забракованных приемкой изделий соответственно;
  • zamBlock1…zamBlock4 - количество замененных блоков 1…4, забракованных на стендах контроля и пунктах приема изделий;
  • allBrakBlock1…allBrakBlock4 - всего забракованных блоков 1…4;
  • minCostIzd - минимальная стоимость одного изделия;
  • minCostGotIzd - минимальная стоимость готовых изделий;
  • kolGotIzd - количество готовых изделий, отправленных на склад.
  • На текущее модельное время собирается статистика по следующим стоимостным показателям функционирования предприятия:

  • costKomplBlock1…costKomplBlock4,costKomplBlock - стоимости комплектующих блоков 1…4 и суммарная стоимость комплектующих всех блоков;
  • costIzgBlock1…costIzgBlock4,costIzgBlock - стоимости изготовления блоков 1…4 и суммарная стоимость изготовления всех блоков (без учета стоимости тестирования блоков);
  • CostBlock1…CostBlock4 - стоимости изготовления блоков 1…4 с учётом тестирования;
  • sumCostBlock1…sumCostBlock4, sumCostBlock - суммарные стоимости изготовления блоков 1…4 с учётом тестирования и суммарная стоимость изготовления всех блоков;
  • costTestBlock1…costTestBlock4,costTestBlock - стоимости тестирования блоков 1…4 на постах контроля и суммарная стоимость тестирования всех блоков;
  • costSborIzd, costTestIzd, costPriemIzd - стоимости сборки, проверки и приемки изделий;
  • costBrakBlock - суммарные затраты на все забракованные блоки;
  • costGotIzd - затраты на выпуск готовых изделий;
  • costBlockIzd - стоимость блоков одного изделия;
  • costIzd - стоимость одного изделия;
  • timeIzd - среднее время изготовления одного изделия;
  • koefIncrCostIzd - коэффициент увеличения себестоимости изделия.
  • Минимальная стоимость изделий будет тогда, когда не будет бракованных блоков и изделий. В терминах постановки задачи это условие имеет вид:

    $$С_{min}=С_{minизд} \cdot N_{изд},$$

    где $$N_{изд}$$ - количество готовых изделий (поступивших на склад);

    $$С_{minизд}$$ - минимальная себестоимость производства одного изделия, вычисляется по формуле:

    $$С_{изд}=\sum\limits_{i=1}^{nl}(C_{кi}+C_{изгi}+C_{прi})+C_{сб}+C_{к}+C_{п}$$

    В случае наличия брака себестоимость производимой продукции увеличится и составит $$С_{max}$$. То есть коэффициент увеличения себестоимости будет равен

    $$K_c=C_{max}/C_{min}$$

    Запишем в идентификаторах исходных данных и результатов моделирования то же самое:

    $$costBlock1=stKomplBlock1+stIzqBlock1+stTestBlock1;$$ $$costBlock2=stKomplBlock2+stIzqBlock2+stTestBlock2;$$ $$costBlock3=stKomplBlock3+stIzqBlock3+stTestBlock3;$$ $$costBlock4=stKomplBlock4+stIzqBlock4+stTestBlock4;$$ $$costBlockIzd=costBlock1+costBlock2+costBlock3+costBlock4;$$ $$C_{minизд}=costBlockIzd+stSborki+stKontrIzd+stPriemIzd;$$ $$C_{min=}C_{minизд} \cdot colGotIzd; C_{max}= costGotIzd+costBrakBlock.$$ $$K_c=koefIncrCostIzd=\frac{C_{max}}{C_{min}}$$ Замечание. В приведенных для расчета результатов моделирования выражениях мы не учитывали те блоки, которые были произведены, но не были использованы для сборки изделий.

    Ввод исходных данных

    Для ввода исходных данных используем элемент Параметр.

  • Выполните команду Файл/Создать/Модель на панели инструментов.
  • В поле Имя модели диалогового окна Новая модель введите Enterprise. Выберите каталог, в котором будут сохранены файлы модели. Щелкните кнопку Далее.
  • На открывшейся второй странице Мастера создания модели выберите Начать создание модели "с нуля". Щелкните кнопку Далее.
  • В Палитре выделите Презентация. Создайте область просмотра Данные для размещения элементов исходных данных.
  • Перетащите элемент Область просмотра. В поле Имя: введите Данные.
  • Перейдите на страницу Дополнительные панели Свойства. Введите в поля X: 0, Y: 1700, Ширина: 760, Высота: 330.
  • Перетащите элемент Прямоугольник. Оставьте имя, предложенное системой.
  • Перейдите на страницу Дополнительные панели Свойства. Введите в поля X: 10, Y: 1750, Ширина: 740, Высота: 270.
  • Перетащите элемент text и на странице Основные панели Свойства в поле Текст: введите Исходные данные.
  • В Палитре выделите Основная. Перетащите элементы Параметр на элемент с именем Исходные данные. Разместите их так, как показано на рис. 6.2. Значения свойств установите согласно табл. 6.1.
  • Элементы и их свойства
    ПараметрПараметр
    ИмяТипЗначение по умолчаниюИмяТипЗначение по умолчанию
    aveTimeShop1double19stKomplBlock1double35
    aveTimeShop2double11stKomplBlock2double32
    aveTimeShop3double15stKomplBlock3double43
    aveTimeShop4double18stKomplBlock4double48
    stIzgBlock1double35timeTestBlock1double12
    stIzgBlock2double27timeTestBlock2double16
    stIzgBlock3double36timeTestBlock3double21
    stIzgBlock4double37timeTestBlock4double17
    postKontr1int2procBrakBlock1double0,02
    postKontr2int2procBrakBlock2double0,03
    postKontr3int2procBrakBlock3double0,04
    postKontr4int2procBrakBlock4double0,06
    stTestBlock1double12kolStendKontrIzdint2
    stTestBlock2double23timeKontrIzddouble26
    stTestBlock3double32procBrakIzddouble0,05
    stTestBlock4double28stKontrIzddouble74
    kolPunSborkiint2verBlock1double0,9999
    timeSborkidouble22verBlock2double0,999999
    verBlockNum1double0,25timeZamBlock1double12
    verBlockNum2double0,25timeZamBlock2double15
    verBlockNum3double0,25timeZamBlock3double12
    verBlockNum4double0,25timeZamBlock4double21
    stZamBlock1double34kolPunPriemint2
    stZamBlock2double46timePriemIzddouble18
    stZamBlock3double38procBrakPriemdouble0,15
    stZamBlock4double54stPriemIzddouble53
    (рис 6.2) Размещение элементов Параметр для ввода исходных данных

    Вывод результатов моделирования

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

  • В Палитре выделите Презентация. Создайте область просмотра Результаты для размещения элементов Простая переменная.
  • Перетащите элемент Область просмотра. В поле Имя: введите Результаты.
  • Перейдите на страницу Дополнительные панели Свойства. Введите в поля X: 0, Y: 700, Ширина: 700, Высота: 460.
  • Перетащите элемент Скруглённый прямоугольник. Оставьте имя, предложенное системой.
  • Перейдите на страницу Дополнительные панели Свойства. Введите в поля X: 10, Y: 750, Ширина: 680, Высота: 400.
  • Перетащите элемент text и на странице Основные панели Свойства в поле Текст: введите Данные о количестве подготовленных и забракованных блоков и изделий.
  • Перетащите второй элемент text и на странице Основные панели Свойства в поле Текст: введите Стоимостные показатели функционирования предприятия.
  • В Палитре выделите Основная. Перетащите элементы Простая переменная. Разместите их и дайте им имена так, как показано на рис. 6.3. Тип всех переменных, используемых для вывода количества подготовленных и забракованных блоков и изделий на текущее модельное время - int. Тип переменных для вывода стоимостных показателей работы предприятия - double. Значение по умолчанию равно 0.
  • Выровняйте элементы. Для этого нужно вначале выделить те элементы, которые вы хотите выровнять, а затем открыть правым щелчком мыши по выделенным фигурам контекстное меню и выбрать нужную команду выравнивания из подменю Выравнивание. Не поддерживается выравнивание элементов диаграмм состояний и диаграмм действий, потому что при выравнивании таких элементов может нарушиться логика модели.
  • (рис 6.3) Размещение элементов Простая переменная для вывода результатов моделирования

    Построение событийной части модели

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

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

  • В Палитре выделите Презентация. Перетащите элемент Область просмотра.
  • Перейдите на страницу Основные панели Свойства.
  • В поле Имя: введите Mainview.
  • Перейдите на страницу Дополнительные панели Свойства. Введите в поля X: 0, Y: 0, Ширина: 990, Высота: 390.
  • Перетащите элемент Скруглённый прямоугольник. В нём мы разместим все сегменты модели. Оставьте имя, предложенное системой.
  • Перейдите на страницу Дополнительные панели Свойства. Введите в поля X: 10, Y: 60, Ширина: 970, Высота: 320.
  • Перетащите элементы Скруглённый прямоугольник, укажите имена сегментов и свойства согласно табл. 6.2. Шрифт, цвет и т.д. выберите по своему усмотрению.
  • СегментСвойства
    Х:Y:Ширина:Высота:
    Цеха2080140270
    Посты контроля блоков17080160270
    Пункты сборки изделий34080120270
    Стенды контроля изделий47080150270
    Пункты приёма изделий63080170270
    Склад готовых изделий 81080160130
    Склад бракованных изделий810220160130
    (рис 6.4) Размещение сегментов модели

    Имитация работы цехов предприятия

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

  • В Палитре выделите Enterprise Library.
  • Перетащите объект sourсe на диаграмму класса Main и разместите в скругленном прямоугольнике с именем Цеха.
  • Для записи и хранения параметров блоков и изделий в дополнительные поля заявок нужно создать нестандартный класс заявки. Создайте класс заявки Product.
  • В панели Проект щелкните правой кнопкой мыши элемент модели верхнего уровня дерева и выберите в меню Создать Java класс.
  • Появится диалоговое окно Новый Java класс. В поле Имя: введите имя нового класса Product.
  • В поле Базовый класс: выберите из выпадающего списка Entity в качестве базового класса. Щелкните кнопку Далее.
  • Появится вторая страница Мастера создания Java класса. Добавьте следующие поля Java класса, которые потребуются в дальнейшем при разработке модели:
    int numBlock;
    int sign1;
    int numBlBrak1;
    int numBlBrak2;
    int numBlBrak3;
    int numBlBrak4;
    double timeSbor;
    double cost;
  • Оставьте выбранными флажки Создать конструктор и Создать метод toString().
  • Щелкните кнопку Готово. Появится редактор кода и автоматически созданный код вашего Java класса. Закройте код.
  • Выделите объект source. На странице Основные панели Свойства установите свойства согласно табл. 6.3.
    Свойства объектов source
    ИмяСвойстваЗначения
    Цех1Отображать имяУстановите флажок
    Класс заявкиProduct
    Заявки прибывают согласноВремени между прибытиями
    Время между прибытиямиExponential(1/aveTimeShop1)
    Количество заявок, прибывающих за один раз1
    Новая заявкаnew Product()
    Действие при выходе if (a==0){
    costBlock1=stKomplBlock1+
    stIzgBlock1+stTestBlock1;
    costBlock2=stKomplBlock2+
    stIzgBlock2+stTestBlock2;
    costBlock3=stKomplBlock3+
    stIzgBlock3+stTestBlock3;
    costBlock4=stKomplBlock4+
    stIzgBlock4+stTestBlock4;
    costBlockIzd=costBlock1+
    costBlock2+costBlock3+
    costBlock4;
    minCostIzd=costBlockIzd+
    stSborki+
    stKontrIzd+stPriemIzd;
    a=1;}
    kolIzgBlock1++;
    entity.numBlock = 1;
    entity.timeSbor =
    exponential(1/timeSborki);
    costKomplBlock1 += stKomplBlock1;
    costKomplBlock += stKomplBlock1;
    costIzgBlock1 += stIzgBlock1;
    sumCostBlock1 += (stKomplBlock1+stIzgBlock1);
    costIzgBlock += stIzgBlock1;
    sumCostBlock += (stKomplBlock1+stIzgBlock1);
    цех2Отображать имяУстановите флажок
    Класс заявкиProduct
    Заявки прибывают согласноВремени между прибытиями
    Время между прибытиямиExponential(1/aveTimeShop2)
    Количество заявок, прибывающих за один раз1
    Новая заявкаnew Product()
    Действие при выходе kolIzgBlock2++;
    entity.numBlock = 2;
    costKomplBlock2 += stKomplBlock2;
    costKomplBlock += stKomplBlock2;
    costIzgBlock2 += stIzgBlock2;
    sumCostBlock2 += (stKomplBlock2+stIzgBlock2);
    costIzgBlock += stIzgBlock2;
    sumCostBlock += (stKomplBlock2+stIzgBlock2);
    цех3Отображать имяУстановите флажок
    Класс заявкиProduct
    Заявки прибывают согласноВремени между прибытиями
    Время между прибытиямиExponential(1/aveTimeShop3)
    Количество заявок, прибывающих за один раз1
    Новая заявкаnew Product()
    Действие при выходеkolIzgBlock3++;
    entity.numBlock = 3;
    costKomplBlock3 += stKomplBlock3;
    costKomplBlock += stKomplBlock3;
    costIzgBlock3 += stIzgBlock3;
    sumCostBlock3 += (stKomplBlock3+stIzgBlock3);
    costIzgBlock += stIzgBlock3;
    sumCostBlock += (stKomplBlock3+stIzgBlock3);
    цех4Отображать имяУстановите флажок
    Класс заявкиProduct
    Заявки прибывают согласноВремени между прибытиями
    Время между прибытиямиExponential(1/aveTimeShop4)
    Количество заявок, прибывающих за один раз1
    Новая заявкаnew Product()
    Действие при выходеkolIzgBlock4++;
    entity.numBlock = 4;
    costKomplBlock4 += stKomplBlock4;
    costKomplBlock += stKomplBlock4;
    costIzgBlock4 += stIzgBlock4;
    sumCostBlock4 += (stKomplBlock4+stIzgBlock4);
    costIzgBlock += stIzgBlock4;
    sumCostBlock += (stKomplBlock4+stIzgBlock4);
  • Щелкните выделенный source правой кнопкой мыши и в контекстном меню выберите Копировать.
  • Вставьте в скругленный прямоугольник с именем Цеха еще три объекта source. Разместите их вертикально один под другим. Во время вставки имена объектов будут изменяться: цех2, цех3, цех4. Однако остальные свойства останутся такими же, как и у объекта цех1. Поэтому, последовательно выделяя второй, третий и четвертый объекты source, скорректируйте их свойства также согласно табл. 6.3.
  • Имитация работы постов контроля блоков

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

    Для размещения объектов, имитирующих работу постов контроля блоков, создайте новый класс активного объекта Test.

  • На панели Проект щелкните Main правой кнопкой мыши и выберите из контекстного меню Создать/Класс активного объекта. Откроется окно Новый класс активного объекта.
  • В поле Имя: задайте имя нового класса Test.
  • Если нужно, в поле Описание: введите описание сущности, моделируемой этим классом. Щелкните кнопку Готово.
  • Создайте область просмотра на диаграмме класса Test для размещения объектов сегмента Посты контроля блоков.

  • В Палитре выделите Презентация. Перетащите элемент Область просмотра.
  • Перейдите на страницу Основные панели Свойства.
  • В поле Имя: введите Kontr1.
  • Перейдите на страницу Дополнительные панели Свойства. Введите в поля X: 0, Y: 0, Ширина: 590, Высота: 390.
  • Согласно указанному ранее назначению постов контроля блоков нужно сделать так, чтобы четыре типа блоков передавались из цехов на свои посты контроля, четыре типа тестированных и исправных блоков поступали на пункты сборки изделий, а четыре типа забракованных блоков - на склад забракованных блоков.

    Создайте элемент нового класса активного объекта Test.

  • Из Палитры Основная перетащите элемент Порт и разместите сверху в крайнем левом ряду (рис. 6.5). (рис 6.5) Размещение элементов Порт на объекте Test
  • На странице Основные панели Свойства имя port замените именем Блок1.
  • Скопируйте элемент Порт с именем Блок1.
  • Вставьте три элемента Порт (см. рис. 6.5). При вставке последовательно будут изменяться их имена: Блок2, Блок3, Блок4.
  • Из Палитры Основная перетащите элемент Порт и разместите сверху в среднем ряду (см. рис. 6.5).
  • На странице Основные панели Свойства имя port замените именем БракБл1.
  • Скопируйте элемент Порт с именем БракБл1.
  • Вставьте три элемента Порт (см. рис. 6.5). При вставке последовательно будут изменяться их имена: БракБл2, БракБл3, БракБл4.
  • Из Палитры Основная перетащите элемент Порт и разместите сверху в крайнем правом ряду (см. рис. 6.5).
  • На странице Основные панели Свойства имя port замените именем ГотБл1.
  • Скопируйте элемент Порт с именем ГотБл1.
  • Вставьте три элемента Порт (см. рис. 6.5). При вставке последовательно будут изменяться их имена: ГотБл2, ГотБл3, ГотБл4.
  • По мере размещения элементов Порт они автоматически будут объединяться прямоугольником (с пунктирными линиями) и появится надпись Значок.
  • Возвратитесь на диаграмму класса Main.
  • На панели Проект выделите Test, перетащите на диаграмму класса Main элемент класса Test, разместите и соедините так, как на рис. 6.6. Порты БракБл1…БракБл4 соедините с объектом sink сегмента Склад бракованных блоков, предварительно разместив его там.
  • Элемент диаграммы активного класса Test создан. Возвратитесь на диаграмму класса Test.
  • Для имитации работы постов контроля блоков одного типа (одного цеха) нам потребуются объекты:

  • queue - имитация склада изготовленных цехом блоков;
  • delay - имитация времени тестирования блока;
  • selectOutPut - имитация процесса браковки блоков.
  • (рис 6.6) Добавлен элемент диаграммы класса Test
  • Перетащите элемент Скруглённый прямоугольник. В нём мы разместим все объекты сегмента имитации работы постов контроля блоков. Оставьте имя, предложенное системой.
  • Перейдите на страницу Дополнительные панели Свойства. Введите в поля X: 10, Y: 50, Ширина: 570, Высота: 330.
  • Добавьте на диаграмму класса Test объекты класса Queue.

  • Из библиотеки Enterprise Library перетащите объект queue и разместите слева сверху, как на рис. 6.7.
  • На странице Основные панели Свойства замените имя queue именем склИзгБл1 (склад изготовленных блоков цеха 1).
  • В поле Класс заявки: Entity замените Product.
  • Установите Вместимость: Максимальная.
  • Скопируйте объект с именем склИзгБл1.
  • Вставьте и поместите три объекта класса Queue (см. рис. 6.7).
  • Добавьте на диаграмму класса Test объекты класса Delay.

  • Из библиотеки Enterprise Library перетащите один объект delay и поместите справа рядом с объектом склИзгБл1, как на рис. 6.7. (рис 6.7) Размещение элементов на диаграмме активного класса Test
  • На странице Основные панели Свойства замените имя delay именем постКонтрБлок1 (посты контроля блоков цеха 1).
  • В поле Класс заявки: Entity замените Product.
  • Введите в поле Время задержки: exponential (1/get_Main().timeTestBlock1).
  • Введите get_Main().postKontr1 в поле Вместимость:.
  • Действие при выходе
    get_Main().kolTestBlock1++;
    get_Main().sumCostBlock1 += get_Main().stTestBlock1;
    get_Main().costTestBlock1+=get_Main().stTestBlock1;
    get_Main().costTestBlock += get_Main().stTestBlock1;
    get_Main().sumCostBlock += get_Main().stTestBlock1;
  • Скопируйте объект с именем постКонтрБлок1.
  • Вставьте и разместите три объекта delay (см. рис. 6.7).
  • Последовательно выделите и внесите правки в их свойства (табл. 6.4). Внесите правки и в свойство Действие при выходе.
  • ИмяВремя задержкиВместимость
    постКонтрБлок2exponentialget_Main().
    (1/get_Main().timeTestBlock2)postKontr2
    постКонтрБлок3exponentialget_Main().
    (1/get_Main().timeTestBlock3)postKontr3
    постКонтрБлок4exponentialget_Main().
    (1/get_Main().timeTestBlock4)postKontr4

    Добавьте на диаграмму Test объекты класса SelectOutput.

  • Перетащите объект selectOutput и разместите справа рядом с объектом постКонтрБлок1, как на рис. 6.7.
  • На странице Основные панели Свойства замените имя selectOutPut именем ОтбракБлок1 (отбраковка блоков цеха 1).
  • Установите свойства объекта согласно табл. 6.5.
  • Скопируйте объект с именем ОтбракБлок1.
  • Вставьте три объекта класса SelectOutput (см. рис. 6.7).
  • Последовательно выделите вставленные объекты и скорректируйте значения их свойств согласно табл. 6.5.
  • Соедините входы и выходы объектов диаграммы класса Test согласно рис. 6.7.
  • Код в свойство Действие при выходе (true) введен для учёта, например, для цеха 1:

  • gotBlock1 - количества готовых блоков цеха 1.
  • Код в свойстве Действие при выходе (false) обеспечивает счёт количества brakBlock1 забракованных блоков цеха 1.

    СвойстваЗначение
    ИмяОтбракБлок1
    Класс заявкиProduct
    Выход true выбираетсяС заданной вероятностью
    Вероятность [0…1]1-get_Main().procBrakBlock1
    Действие при выходе (true)get_Main().gotBlock1++;
    Действие при выходе (false)get_Main().brakBlock1++;
    entity.sign1 = 1;
    entity.numBlBrak1 = 1;
    ИмяОтбракБлок2
    Класс заявкиProduct
    Выход true выбираетсяС заданной вероятностью
    Вероятность [0…1]1-get_Main().procBrakBlock2
    Действие при выходе (true)get_Main().gotBlock2++;
    Действие при выходе (false)get_Main().brakBlock2++;
    entity.sign1 = 1;
    entity.numBlBrak2 = 1;
    ИмяОтбракБлок3
    Класс заявкиProduct
    Выход true выбираетсяС заданной вероятностью
    Вероятность [0…1]1-get_Main().procBrakBlock3
    Действие при выходе (true)get_Main().gotBlock3++;
    Действие при выходе (false)get_Main().brakBlock3++;
    entity.sign1 = 1;
    entity.numBlBrak3 = 1;
    ИмяОтбракБлок4
    Класс заявкиProduct
    Выход true выбираетсяС заданной вероятностью
    Вероятность [0…1]1-get_Main().procBrakBlock4
    Действие при выходе (true)get_Main().gotBlock4++;
    Действие при выходе (false)get_Main().brakBlock4++;
    entity.sign1 = 1;
    entity.numBlBrak4 = 1;

    В поле entity.sign1 записывается 1 - признак брака на постах контроля, а также единица записывается в поле entity.numBlock1 … entity.numBlock4. Это нужно для раздельного счёта забракованных блоков.

    Перейдите на диаграмму класса Main.

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

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

    Для размещения объектов имитации работы пунктов сборки изделий создайте новый класс активного объекта Sborka.

  • На панели Проект щелкните Main правой кнопкой мыши и выберите из контекстного меню Создать/Класс активного объекта.
  • Откроется окно Новый класс активного объекта.
  • В поле Имя: задайте имя нового класса Sborka.
  • Если нужно, в поле Описание: введите описание сущности, моделируемой этим классом.
  • Щелкните кнопку Готово.
  • Создайте область просмотра на диаграмме класса Sborka для размещения объектов сегмента Пункты сборки изделий.

  • В Палитре выделите Презентация. Перетащите элемент Область просмотра.
  • Перейдите на страницу Основные панели Свойства.
  • В поле Имя: введите Sbor.
  • Перейдите на страницу Дополнительные панели Свойства. Введите в поля X: 0, Y: 0, Ширина: 820, Высота: 550.
  • Перетащите элемент Скруглённый прямоугольник. В нём мы разместим все элементы сегмента. Оставьте имя, предложенное системой.
  • Перейдите на страницу Дополнительные панели Свойства. Введите в поля X: 10, Y: 60, Ширина: 800, Высота: 480.
  • Согласно назначению пунктов сборки изделий для связи их с другими сегментами модели необходимо иметь: четыре порта для приема готовых блоков с постов контроля и один порт - для отправки собранных изделий на стенды контроля. Также нужен порт для приема бракованных изделий с целью определения и замены в них забракованных блоков и один порт - для отправки забракованных блоков после их замены на склад забракованных блоков.

  • Из Палитры Основная перетащите элемент Порт и разместите сверху в крайнем левом ряду (рис. 6.8).
  • На странице Основные панели Свойства имя port замените именем ГотБлок1. Скопируйте элемент Порт с именем ГотБлок1.
  • Вставьте три элемента Порт (см. рис. 6.8). При вставке последовательно будут изменяться их имена: ГотБлок2, ГотБлок3, ГотБлок4.
  • Из Палитры Основная перетащите еще три элемента Порт, разместите их и дайте имена как на рис. 6.8.
  • Вернитесь на диаграмму класса Main.
  • На панели Проект выделите Sborka, перетащите на диаграмму класса Main элемент sborka, разместите и соедините так, как на рис. 6.9. Порт БракБл соедините с объектом sink сегмента Склад бракованных блоков.
  • Элемент диаграммы активного класса Sborka создан. Возвратитесь на диаграмму класса Sborka.
  • Для реализации сегмента имитации работы пунктов сборки изделий нам потребуются объекты, но прежде мы рассмотрим вариант построения этого сегмента.

    (рис 6.8) Размещение элементов Порт на объекте Sborka (рис 6.9) Добавлен элемент диаграммы класса Sborka

    Сборка изделия начинается тогда, когда будут готовы четыре блока (по одному каждого из четырех типов). Полагаем, что время готовности блоков различное. Значит, нужно использовать такие объекты AnyLogic, которые предназначены для синхронизации движения заявок (блоков). Объекты класса Match предназначены именно для синхронизации движения двух заявок.

    После готовности четырех блоков для дальнейщей имитации процесса сборки нужно эти четыре заявки объединить в одну, и интерпретировать её как изделие. В AnyLogic имеются объекты некоторых классов, которые позволяют осуществить нужное нам объединение. Применим объекты класса Combine, позволяющие из двух заявок получить одну.

    Процесс объединения будет происходить по мере готовности блоков, значит, на пункте сборки будет создаваться очередь, для имитации которой нужно использовать объект queue.

    Для имитации непосредственно процесса сборки следует взять объект delay, а для разделения потока изделий на собранные первично и на изделия с заменными блоками после браковки - объект selectOutPut.

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

  • Перетащите элемент Прямоугольник. Оставьте имя, предложенное системой.
  • Перейдите на страницу Дополнительные панели Свойства. Введите в поля X: 320, Y: 80, Ширина: 340, Высота: 230.
  • Из библиотеки Enterprise Library перетащите четыре объекта match и три объекта combine. Расположите и соедините их так, как на рис. 6.10.
  • Перетащите объекты queue, delay, selectOutPut, разместите, соедините и дайте им имена также согласно рис. 6.10.
  • Поочередно выделите каждый из этих объектов и на страницах Основные панели Свойства установите для:

  • match…match3:
  • Классы заявок: Вход1, Вход2: Product, Product
  • Условия соответствия true
  • Максимальная вместимость 1
  • Максимальная вместимость 2
  • combine…combine2:
  • Классы заявок: Вход1, Вход2, Выход: Product, Product, Product
  • Объединенная заявка entity1
  • queue:
  • Класс заявки: Product
  • Максимальная вместимость
  • selectOutPut:
  • Класс заявки: Product
  • Выход true выбирается При выполнении условия
  • Условие entity.sign1 == 0
  • объекты match и match1 обеспечивают синхронизацию движения блоков 1 и 2, 3 и 4 соответственно. А объекты match2 и match3 - блоков 1 и 3, 2 и 4 соответственно. Таким образом, обеспечивается синхронизация движения четырех блоков.

    Указание свойства entity1 в объектах combine…combine2 позволяет получить на выходе сначала combine, а потом combine2 заявку, имитирующую изначально блок 1. Но теперь эта заявка будет имитировать изделие. Поэтому только для нее ранее было определено значение поля entity.timeSbor (см. табл. 6.3).

    Изделия после элемента пунктСборки разделяются на два потока: собранные изделия первично (entity.sign1=0) и изделия с замененными блоками (entity.sign1=2).

    (рис 6.10) Фрагмент сегмента имитации работы пунктов сборки

    Разделение, осуществляемое объектом selectOutPut по условию entity.sign1==0, нужно для учёта количества изделий с заменёнными блоками и количества заменённых блоков.

    Свойства объекта delay установите согласно табл. 6.6.

    ИмяСвойстваЗначения
    пунктборкиОтображать имяУстановите флажок
    Класс заявкиProduct
    Задержка задаётсяЯвно
    Время задержкиentity.timeSbor
    Вместимостьget_Main().kolPunSborki
    Действие при выходеif (entity.sign1 == 0)
    {get_Main().kolSobrIzd++;
    get_Main().costSborIzd += get_Main().stSborki;
    entity.cost += get_Main().stSborki;}
    if (entity.sign1 == 2)
    {if (entity.numBlBrak1== 1)
    {get_Main().zamBlock1++;
    entity.cost += get_Main().stZamBlock1;
    get_Main().costSborIzd += get_Main().stZamBlock1;}
    if (entity.numBlBrak2 == 1)
    {get_Main().zamBlock2++;
    entity.cost += get_Main().stZamBlock2;
    get_Main().costSborIzd += get_Main().stZamBlock2;}
    if (entity.numBlBrak3 == 1)
    {get_Main().zamBlock3++;
    entity.cost += get_Main().stZamBlock3;
    get_Main().costSborIzd += get_Main().stZamBlock3;}
    if (entity.numBlBrak4 == 1)
    {get_Main().zamBlock4++;
    entity.cost += get_Main().stZamBlock4;
    get_Main().costSborIzd += get_Main().stZamBlock4;}
    get_Main().kolZamIzd++;}

    Продолжим построение сегмента имитации работы пунктов сборки изделий (рис. 6.11).

    (рис 6.11) Сегмент имитации пунктов сборки изделий

    Бракованные изделия поступают через порт БракИзд. В заявке, имитирующей такое изделие, поле etity.sign1 = 2. В одном из полей etity.numBlBrak1 … etity.numBlBrak4 этой же заявки также записана единица. Запись произведена при отбраковке на стендах контроля или пунктах приёма изделий. Это мы сделаем (запишем) позже при построении этих сегментов. Для определения, какой из блоков 1 … 4 забракован в изделии, нужно использовать объект selectOutput5. Этот объект в отличие от объекта selectOutput позволяет проверять пять условий и в зависимости от результата проверки направляет заявку на один из пяти выходов (можно создать объект selectOutput(N) на один вход и N выходов, использовав один объект exit и N объектов enter).

    Готовые блоки поступают через порты ГотБл1 … ГотБл4. Поэтому их надо было бы соединить с соответствующими входами объектов match … match1. Но в забракованном изделии нужно заменить какой-то из блоков. Значит, в случае наличия забракованного изделия надо направить из поступающих блоков соответствующий блок на замену. Сделать это можно с использованием объектов selectOutPut. Каждый порт ГотБл1 … ГотБл4 соединить с входом соответствующего объекта selectOutPut. Выходы true этих объектов соединить с соответсвующими входами объектов match … match1. Таким образом, с выходов true готовые блоки будут направляться для первичной сборки изделий, а с выходов false - для замены бракованных блоков. В качестве условия разделения потоков можно использовать простые переменные БрИздБл1 … БрИздБл4. Например, если БрИздБл2 ? 0, то имеется забракованное изделие с блоком 2.

    Для дальнейшей реализации процесса замены блока нужно объединить две заявки - имитирующую забракованное изделие и имитирующую блок для замены - в одну заявку. Для объединения двух заявок в одну воспользуйтесь уже известными вам объектами combine. Выходы объекта selectOutput5 соединить с входами delay, а выход каждого из них - с первыми входами объектов combine.

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

    Как уже отмечалось ранее, изделия после пунктов сборки разделяются на два потока.

    Собранные первично изделия с выхода true объекта selectOutPut направляются на стенды контроля, поэтому этот выход нужно соединить с портом СобрИзд. Изделие с заменённым блоком нужно вновь направить на стенды контроля. В тоже время его нужно учесть, как забракованный блок и отправить на склад забракованных блоков. Значит, необходимо из одной заявки сделать две. Для этого используйте объект split. Один выход этого объекта соедините с портом БракБл, а другой - с портом СобрИзд.

    Выполните изложенные рекомендации практически. Перетащите четыре объекта класса SelectOutPut (или перетащите один объект, а остальные три скопируйте), один объект класса SelectOutPut5, четыре объекта классов Queue и Combine, один объект класса Split и четыре простых переменных. Разместите, дайте им имена и соедините так, как на рис. 6.11.

    Поочередно выделите новые объекты и установите их свойства согласно табл. 6.7.

    СвойстваЗначение
    selectOutPut … selectOutPut3
    ИмяГотБлок1
    Выход true выбираетсяПри выполнении условия
    УсловиеБракИздБл1 == 0
    ИмяГотБлок2
    Выход true выбираетсяПри выполнении условия
    УсловиеБракИздБл2 == 0
    ИмяГотБлок3
    Выход true выбираетсяПри выполнении условия
    УсловиеБракИздБл3 == 0
    ИмяГотБлок4
    Выход true выбираетсяПри выполнении условия
    УсловиеБракИздБл4 == 0
    selectOutput5
    ИмяБракИзделия
    ИспользоватьУсловия
    Условие 0entity.numBlBrak1 == 1
    Условие 1entity.numBlBrak2 == 1
    Условие 2entity.numBlBrak3 == 1
    Условие 3entity.numBlBrak4 == 1
    match
    ИмясинхрБлок_1_2
    Классы заявок: Вход1, Вход2:Product, Product
    Условие соответствияtrue
    Максимальная вместимость 1Установить флажок
    Максимальная вместимость 2Установить флажок
    ИмясинхрБлок_3_4
    Классы заявок: Вход1, Вход2:Product, Product
    Условие соответствияtrue
    Максимальная вместимость 1Установить флажок
    Максимальная вместимость 2Установить флажок
    ИмясинхрБлок_1_3
    Классы заявок: Вход1, Вход2:Product, Product
    Условие соответствияtrue
    Максимальная вместимость 1Установить флажок
    Максимальная вместимость 2Установить флажок
    ИмясинхрБлок_2_4
    Классы заявок: Вход1, Вход2:Product, Product
    Условие соответствияtrue
    Максимальная вместимость 1Установить флажок
    Максимальная вместимость 2Установить флажок
    combine
    ИмяиздБлок1
    Классы заявок: Вход1, Вход2, ВыходProduct, Product, Product
    Действие при входе 1if (entity.numBlBrak1 == 1)
    БрИздБл1 ++;
    Объединенная заявкаentity1
    Действие при выходеif (entity.numBlBrak1 == 1)
    БрИздБл1 --;
    entity.cost += get_Main().stZamBlock1;
    entity.timeSbor =
    exponential(1/get_Main().
    timeZamBlock1);
    ИмяиздБлок2
    Классы заявок: Вход1, Вход2, ВыходProduct, Product, Product
    Действие при входе 1if (entity.numBlBrak2 == 1)
    БрИздБл2 ++;
    Объединенная заявкаentity1
    Действие при выходеif (entity.numBlBrak2 == 1)
    БрИздБл2 --;
    entity.cost += get_Main().stZamBlock2;
    entity.timeSbor =
    exponential(1/get_Main().
    timeZamBlock2);
    ИмяиздБлок3
    Классы заявок: Вход1, Вход2, ВыходProduct, Product, Product
    Действие при входе 1if (entity.numBlBrak1 == 1)
    БрИздБл3 ++;
    Объединенная заявкаentity1
    Действие при выходеif (entity.numBlBrak3 == 1)
    БрИздБл3 --;
    entity.cost += get_Main().stZamBlock3;
    entity.timeSbor =
    exponential(1/get_Main().
    timeZamBlock3);
    ИмяиздБлок4
    Классы заявок: Вход1, Вход2, ВыходProduct, Product, Product
    Действие при входе 1if (entity.numBlBrak4 == 1)
    БрИздБл1 ++;
    Объединенная заявкаentity1
    Действие при выходеif (entity.numBlBrak4 == 1)
    БрИздБл4 --;
    entity.cost += get_Main().stZamBlock4;
    entity.timeSbor =
    exponential(1/get_Main().
    timeZamBlock4);
    split
    Классы заявок: Product, Product
    Количество копий1
    Новая заявка (копия)new Product()
    Действие при выходе копииentity.sign1 = 0;
    entity.cost = original.cost;

    Имитация работы стендов контроля изделий

    Стенды контроля изделий предназначены для приёма первично собранных изделий и изделий после замены забракованных блоков, непосредственно процесса контроля изделий, отправки прошедших контроль изделий на пункты приёма, забракованных изделий - на пункты сборки, а также для приёма забракованных изделий с пунктов приёма изделий.

    На стендах контроля изделий, вследствие недостатка ресурсов, будет создаваться очередь, для имитации которой используйте объект queue.

    Для имитации непосредственно процесса контроля изделий используйте объект delay.

    По результатам контроля некоторые изделия будут признаны браком. Для отбраковки изделий нужно применить объект selectOutput.

  • Перетащите объекты queue, delay и selectOutput на прямоугольник с именем Стенды контроля изделий диаграммы класса Main.
  • Разместите и соедините их согласно рис. 6.12.
  • Выделите объект queue и установите на странице Основные панели Свойства:
  • Имя: очерСтенКонтр
  • Класс заявки: Product
  • Максимальная вместимость Установите флажок
  • Выделите объект delay и установите его свойства:
  • Класс заявки: Product
  • Задержка задается Явно
  • Время задержки exponential( 1/timeKontrIzd )
  • Вместимость kolStendKontr
  • Действие при выходе
    testSobrIzd++;
    entity.cost += stKontrIzd;
    entity.numBlBrak1 = 0;
    entity.numBlBrak2 = 0;
    entity.numBlBrak3 = 0;
    entity.numBlBrak4 = 0;
  • (рис 6.12) Диаграмма класса Main с элементами всех сегментов
  • Выделите объект selectOutput и установите его свойства:
  • Имя: БрСтендКон
  • Класс заявки: Product
  • Выход true выбирается С заданной вероятностью
  • Вероятность[0..1] 1-procBrakIzd
  • Действие при выходе (true) costTestIzd += stKontrIzd;
  • Действие при выходе (false)
    double a = 0;
    int numBlock = 0;
    entity.sign1 = 2;
    a = uniform();
    if (a < 1) numBlock = 4;
    if (a <= (verBlNum1 + verBlNum2 + verBlNum3)) numBlock=3;
    if (a <= (verBlNum1 + verBlNum2)) numBlock = 2;
    if (a <= verBlNum1) numBlock = 1;
    if (numBlock == 1) {entity.numBlBrak1 = 1;
    entity.timeSbor = exponential(1/timeZamBlock1);}
    if (numBlock == 2) {entity.numBlBrak2 = 1;
    entity.timeSbor = exponential(1/timeZamBlock2);}
    if (numBlock == 3) {entity.numBlBrak3 = 1;
    entity.timeSbor = exponential(1/timeZamBlock3);}
    if (numBlock == 4) {entity.numBlBrak4 = 1; 
    entity.timeSbor = exponential(1/timeZamBlock4);}
    brakSobrIzd ++;
  • Код в свойство Действие при выходе (false) объекта selectOutput введен для розыгрыша номера забракованного в изделии блока. В результате розыгрыша в одно из полей entity.numBlBrak1… entity.numBlBrak4 заносится 1 - признак брака. В поле entity.timeSbor - время замены соответствующего блока на пункте сборки. Полю entity.sign1 присваивается значение 2 - признак брака в изделии.

    Имитация работы пунктов приёма изделий

    Пункты приёма изделий предназначены для приёма прошедших стенды контроля изделий, непосредственно приёма изделий, отправки прошедших приём изделий на склад готовых изделий, а забракованных изделий - на стенды контроля.

    На пунктах приёма будет создаваться очередь, для имитации которой используйте объект queue.

    Для имитации непосредственно процесса приёма изделий используйте элемент delay.

    По результатам контроля некоторые изделия будут признаны браком. Для отбраковки воспользуйтесь объектом selectOutput.

  • Перетащите объекты queue, delay и selectOutput на прямоугольник с Пункты приема изделий диаграммы класса Main.
  • Разместите и соедините их согласно рис. 6.12.
  • Выделите объект queue и установите на странице Основные панели Свойства:
  • Имя: очерПрием
  • Класс заявки: Product
  • Максимальная вместимость Установите флажок
  • Выделите объект delay и установите его свойства:
  • Класс заявки: Product
  • Задержка задается Явно
  • Время задержки exponential( 1/timePriemIzd )
  • Вместимость kolPunPriem
  • Действие при выходе
    kolPriemIzd++;
    costPriemkiIzd += stPriemIzd;
    entity.cost += stPriemIzd;
  • Выделите объект selectOutput и установите его свойства:
  • Класс заявки: Product
  • Выход true выбирается С заданной вероятностью
  • Вероятность[0..1] 1-procBrakPriem
  • Действие при выходе (false)
    entity.sign1 = 2;
    brakPriemIzd++;
  • Код свойства Действие при выходе объекта delay введен для счета количества kolPriemIzd принятых всего изделий.

    Код свойства Действие при выходе (false) объекта selectOutput считает количество brakPriemIzd забракованных изделий и полю entity.sign1 присваивает 2 - признак брака в изделии.

    Имитация склада готовых изделий

    Для имитации склада готовых изделий используйте объект sink со следующими свойствами:

  • Имя: ГотИзделия
  • Класс заявки: Product
  • Действие при выходе
    kolGotIzd++;
    timeIzd = time()/kolGotIzd;
    costGotIzd += entity.cost;
    minCostGotIzd+=minCostIzd;
    koefIncrCostIzd = 
    (costGotIzd+costBrakBlock)/minCostGotIzd;
    ostGotBlock1 = gotBlock1 - kolGotIzd - zamBlock1;
    ostGotBlock2 = gotBlock2 - kolGotIzd - zamBlock2;
    ostGotBlock3 = gotBlock3 - kolGotIzd - zamBlock3;
    ostGotBlock4 = gotBlock4 - kolGotIzd - zamBlock4;
  • Код свойства Действие при выходе введен для счёта количества kolGotIzd готовых изделий, их стоимости costGotIzd и коэффициента koefIncrCostIzd увеличения себестоимости изделия вследствие наличия брака.

    Кроме того, ведется счёт готовых для сборки блоков, то есть изготовленных цехами и проверенных на постах контроля, но не использованных для сборки изделий блоков по типам ostGotBlock1… ostGotBlock4 на текущее модельное время.

    Имитация склада бракованных блоков

    Ранее (см. п. 6.2.4.2) для имитации склада бракованных блоков было рекомендовано использовать один объект sink.

    Предположим, что требуется вести раздельный учёт забракованных блоков на постах контроля цехов и забракованных на стендах контроля и пунктах приёма изделий. Для разделения потока брака дополнительному полю entity.sign1 присваивались признаки 1 или 2.

  • Перетащите объекты selectOutput и sink на прямоугольник с именем Склад бракованных блоков диаграммы класса Main.
  • Разместите и соедините их согласно рис. 6.12.
  • Поочередно выделите объекты имитации склада бракованных блоков, начиная с объекта selectOutput, и установите свойства согласно табл. 6.8.

    Коды в свойстве Действие при выходе обоих объектов sink одинаковые. Они предназначены для счёта:

  • стоимости costzbrakBlock забракованных блоков не по типам, а в целом всех блоков;
  • количества забракованных блоков по типам allBrakBlock1… allBrakBlock4.
  • Из палитры Картинки перетащите на сегменты имитации складов готовых изделий и бракованных блоков картинки Склад.
  • СвойстваЗначение
    selectOutput
    Класс заявки:Product
    Выход true выбираетсяПри выполнении условия
    Условиеentity.sign1 == 1
    sink
    ИмяБрПостКонтр
    Класс заявки:Product
    Действие при выходеif (entity.numBlBrak1 == 1)
    {costBrakBlock += costBlock1;
    allBrakBlock1++;}
    if (entity.numBlBrak2 == 1)
    {costBrakBlock += costBlock2 ;
    allBrakBlock2++;}
    if (entity.numBlBrak3 == 1)
    {costBrakBlock += costBlock3;
    allBrakBlock3++;}
    if (entity.numBlBrak4 == 1)
    {costBrakBlock += costBlock4;
    allBrakBlock4++;}
    ИмяБрБлЗам
    Класс заявки:Product
    Действие при выходеif (entity.numBlBrak1 == 1)
    {costBrakBlock += costBlock1;
    allBrakBlock1++;}
    if (entity.numBlBrak2 == 1)
    {costBrakBlock += costBlock2;
    allBrakBlock2++;}
    if (entity.numBlBrak3 == 1)
    {costBrakBlock += costBlock3;
    allBrakBlock3++;}
    if (entity.numBlBrak4 == 1)
    {costBrakBlock += costBlock4;
    allBrakBlock4++;}
    Замечание. Можно обойтись и одним объектом sink для имитации склада бракованных блоков. Для этого нужно оба кода (см. табл. 6.8) занести в его свойство Действие при выходе.

    В начало первого кода добавить:

    if (entity.sign1 == 1)
    {  код для БрПостКонтр  }
    а во второго
    if (entity.sign1 == 2)
    {  код для БрБлЗам      }

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

    Организация переключения между областями просмотра

    Добавьте свои собственные элементы презентации на ранее созданные области просмотра Mainview, Data, Result, Kont1 и Sbor, щелчком на которых будет производиться переход к той или иной области просмотра. Сделайте так, чтобы из любой области можно было переходить в любую другую область.

    Для этого разместите на каждой области просмотра элементы презентации, показанные на рис. 6.13.

    (рис 6.13) Элементы презентации для переключения

    Начните с области просмотра Mainview.

  • В Палитре выделите Презентация. Перетащите элемент text на область просмотра Mainview, разместите и введите в поле Текст: Предприятие (рис. 6.13). На странице Основные панели Свойства установите в поле Цвет: black, а также выберите выравнивание текста и шрифт.
  • Перетащите второй элемент text, разместите и введите в поле Текст: Посты контроля блоков. На странице Основные панели Свойства установите в поле Цвет: blue, а также выберите выравнивание текста и шрифт. На панели Свойства выделите Динамические и в поле Действие по щелчку: введите код: test.Kontr1.navigateTo(); Замечание. Можете выбрать и другие цвета элементов презентации. При этом нужно исходить из того, чтобы различались по цвету текст открытой области просмотра и тексты закрытых областей просмотра.
  • Перетащите третий элемент text, разместите и введите в поле Текст: Пункты сборки изделий. На панели Свойства выделите Динамические и в поле Действие по щелчку: введите: sborka.Sbor.navigateTo();
  • Перетащите четвертый элемент text, разместите и введите в поле Текст: Исходные данные. На панели Свойства выделите Динамические и в поле Действие по щелчку: введите: Data.navigateTo();
  • Перетащите пятый элемент text, разместите и введите в поле Текст: Результаты моделирования. На панели Свойства выделите Динамические и в поле Действие по щелчку: введите: Result.navigateTo();
  • Таким образом, с области просмотра Mainview можно будет переходить на любую из четырех областей просмотра. При этом элемент презентации открытой области высвечивается черным цветом, а остальные элементы презентации - голубым цветом.

  • Скопируйте элементы презентации так, как они показаны на рис. 6.13.
  • Последовательно переходите на остальные области просмотра, вставьте скопированные элементы презентации и внесите правки в их свойства согласно табл. 6.9.
  • Построение модели для проведения простого эксперимента завершено. Теперь отладьте модель и проведите эксперимент.

    Замечание. При каждом запуске модели результаты будут повторяться, если в модели используются только распределения и случайные функции из AnyLogic. Например, если вместо функции uniform(1) использовать функцию random(), которая является функцией Java, результаты моделирования воспроизводиться не будут.
    Элемент презентацииДействие по щелчку
    Data
    ПредприятиеMainview.navigateTo();
    Посты контроля блоковtest.Kontr1.navigateTo();
    Пункты сборки изделийsborka.Sbor.navigateTo();
    Исходные данные
    Результаты моделированияResult.navigateTo();
    Result
    ПредприятиеMainview.navigateTo();
    Посты контроля блоковtest.Kontr1.navigateTo();
    Пункты сборки изделийsborka.Sbor.navigateTo();
    Исходные данныеData.navigateTo();
    Результаты моделирования
    Kontrol
    Предприятиеget_Main().Mainview.navigateTo();
    Посты контроля блоков
    Пункты сборки изделийget_Main().sborka.Sbor.navigateTo();
    Исходные данныеget_Main().Data.navigateTo();
    Результаты моделированияget_Main().Result.navigateTo();
    Sbor
    Предприятиеget_Main().Mainview.navigateTo();
    Посты контроля блоковget_Main().test.Kontr1.navigateTo();
    Пункты сборки изделий
    Исходные данныеget_Main().Data.navigateTo();
    Результаты моделированияget_Main().Result.navigateTo();

    Интерпретация результатов моделирования

    Мы провели эксперименты с моделями, выполнив в GPSS World 1 000 прогонов, а в AnyLogic увеличив модельное время в 1 000 раз. При этом начальное значение генераторов случайных чисел установили 339.

    Эксперименты проводились при времени работы предприятия 40 часов (2400 единиц модельного времени).

    Результаты экспериментов приведены в виде различных показателей функционирования предприятия в табл. 6.10. В табл. 6.10 приняты обозначения: ПК1…ПК4 - пункты контроля блоков 1…4 соответственно; ПС - пункты сборки изделий; СВК - стенды выходного контроля изделий; ПП - пункт приёмки изделий.

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

    Различие незначительно, например, для коэффициента увеличения стоимости изделия оно составляет 0,003…0,004.

    Коэффициенты использования различных подразделений предприятия также отличаются на тысячные доли.

    Показатели функционирования предприятия
    ПоказателиСистемы моделирования
    GPSS WorldAnyLogic
    Согласно постановке задачи
    Количество готовых изделий121,628122,337
    $$\Delta_{11}=\mid 121,628-122,337\mid=0,709$$
    Стоимость готовых изделий7441075151
    Минимальная стоимость изделий7078771200
    $$\Delta_{12}=\mid 70787-71200\mid=413$$
    Стоимость забракованных блоков30993122
    Коэффициент увеличения стоимости1,0951,099
    $$\Delta_{13}=\mid 1,095-1,099\mid=0,004$$
    Время изготовления изделия, мин19,73219,618
    Коэффициент использования ПК10,3150,316
    Коэффициент использования ПК20,7260,728
    Коэффициент использования ПК30,6960,699
    Коэффициент использования ПК40,4720,474
    Коэффициент использования ПС0,5810,586
    Коэффициент использования СВК0,5450,548
    Коэффициент использования ПП0,5390,539
    aveTimeShop1=15, aveTimeShop2=10, aveTimeShop3=10, aveTimeShop4=15
    Количество готовых изделий147,909147,954
    $$\Delta_{21}=\mid 147,909-147,954\mid=0,045$$
    Стоимость готовых изделий9048790902
    Минимальная стоимость изделий8608386109
    $$\Delta_{22}=\mid 86083-86109\mid=26$$
    Стоимость забракованных блоков38483824
    Коэффициент увеличения стоимости1,0961,1
    $$\Delta_{23}=\mid 1,096-1,100\mid=0,004$$
    Время изготовления изделия, мин16,22616,221
    Коэффициент использования ПК10,3980,4
    Коэффициент использования ПК20,80,804
    Коэффициент использования ПК311
    Коэффициент использования ПК40,5660,563
    Коэффициент использования ПС0,7050,705
    Коэффициент использования СВК0,660,662
    Коэффициент использования ПП0,6540,654
    aveTimeShop4=10
    Количество готовых изделий153,743154,327
    $$\Delta_{31}=\mid 153,743-154,327\mid=0,584$$
    Стоимость готовых изделий9405094815
    Минимальная стоимость изделий8947889818
    $$\Delta_{32}=\mid 89478-89818\mid=340$$
    Стоимость забракованных блоков44124450
    Коэффициент увеличения стоимости1,11,105
    $$\Delta_{33}=\mid 1,100-1,105\mid=0,005$$
    Время изготовления изделия, мин15,6115,551
    Коэффициент использования ПК10,3980,399
    Коэффициент использования ПК20,80,797
    Коэффициент использования ПК311
    Коэффициент использования ПК40,850,852
    Коэффициент использования ПС0,7330,737
    Коэффициент использования СВК0,6910,691
    Коэффициент использования ПП0,6780,681
    aveTimeShop1=10, postKontr3=3
    Количество готовых изделий209,234209,086
    $$\Delta_{41}=\mid 209,234-209,086\mid=0,148$$
    Стоимость готовых изделий127880128328
    Минимальная стоимость изделий121774121688
    $$\Delta_{42}=\mid 121744-121688\mid=56$$
    Стоимость забракованных блоков49524848
    Коэффициент увеличения стоимости1,0911,094
    $$\Delta_{43}=\mid 1,091-1,094\mid=0,003$$
    Время изготовления изделия, мин11,4711,478
    Коэффициент использования ПК10,60,599
    Коэффициент использования ПК20,7990,801
    Коэффициент использования ПК30,7010,7
    Коэффициент использования ПК40,8450,853
    Коэффициент использования ПС11
    Коэффициент использования СВК0,9360,936
    Коэффициент использования ПП0,9230,923
    Вернуться к учебному плану