Опубликован: 07.11.2014 | Доступ: свободный | Студентов: 442 / 37 | Длительность: 15:17:00
ISBN: 978-5-9556-0161-8
Тема: САПР
Лекция 7:

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

< Лекция 6 || Лекция 7: 12345 || Лекция 8 >
Имитация работы стендов контроля изделий

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

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

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

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

  1. Перетащите объекты queue, delay и selectOutput на прямоугольник с именем Стенды контроля изделий диаграммы Main.
  2. Разместите и соедините их согласно Рис. 6.12.
  3. Выделите объект queue и установите на странице Основные панели Свойства:
    • Имя: очерСтенКонтр
    • Тип заявки: Product
    • Максимальная вместимость Установите флажок
  4. Выделите объект delay и установите его свойства:
    • Тип заявки: Product
    • Тип Определённое время
    • Время задержки exponential( 1/timeKontrIzd )
    • Вместимость kolStendKontr
    • Действия При выходе:
      testSobrIzd++;
      entity.cost += stKontrIzd;
      entity.numBlBrak1 = 0;
      entity.numBlBrak2 = 0;
      entity.numBlBrak3 = 0;
      entity.numBlBrak4 = 0;
    Замечание. Объект delay2 с нулевым временем задержки. Если его не включить, объект БракИзделия на диаграмме агента Сборка работать согласно замыслу разработчика не будет.
    Диаграмма агента Main с элементами всех сегментов

    увеличить изображение
    Рис. 6.12. Диаграмма агента Main с элементами всех сегментов
  5. Выделите объект 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.

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

Код свойства Действия При выходе объекта delay введен для счета количества kolPriemIzd принятых всего изделий.

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

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

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

  • Имя: ГотИзделия
  • Тип заявки: Product
  • Действия При выходе:
    колГотИзд ++;
    времяИзгИзд = time()/колГотИзд;
    стоимГотИзд += entity.cost;
    минСтоимГотИзд +=minCostIzd;
    коэфУвелСтоимИзд = 
    (стоимГотИзд+стоимБракБл)/минСтоимГотИзд;
    ostGotBlock1 = gotBlock1 - колГотИзд - zamBlock1;
    ostGotBlock2 = gotBlock2 - колГотИзд - zamBlock2;
    ostGotBlock3 = gotBlock3 - колГотИзд - zamBlock3;
    ostGotBlock4 = gotBlock4 - колГотИзд - zamBlock4;

Код свойства Действия При выходе введен для счёта количества kolGotIzd готовых изделий, их стоимости costGotIzd и коэффициента koefIncrCostIzd увеличения себестоимости изделия вследствие наличия брака.

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

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

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

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

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

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

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

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

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

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

увеличить изображение
Рис. 6.13. Элементы презентации для переключения

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

  1. В Палитре выделите Презентация. Перетащите элемент text на область просмотра Mainview, разместите и введите в поле Текст: Предприятие (Рис. 6.13). На панели Свойства установите в поле Цвет: black, выберите выравнивание текста и шрифт.
  2. Перетащите второй элемент text, разместите и введите в поле Текст: Посты контроля блоков. На панели Свойства установите в поле Цвет: blue, выберите выравнивание текста и шрифт. Раскройте Специфические и в поле Действие по щелчку: введите код: тест.Kontr1.navigateTo();
    Замечание. При выборе цветов нужно исходить из того, чтобы различались по цвету текст открытой области просмотра и тексты закрытых областей просмотра.
  3. Перетащите третий элемент text, разместите и введите в поле Текст: Пункты сборки изделий. Раскройте Специфические. В поле Действие по щелчку: введите: сборка.Sbor.navigateTo();
  4. Перетащите четвертый элемент text. Разместите и введите в поле Текст: Исходные данные. В поле Действие по щелчку: на странице Специфические введите: Данные.navigateTo();
  5. Перетащите пятый элемент text, разместите и введите в поле Текст: Результаты моделирования. На панели Свойства выделите Специфические и в поле Действие по щелчку: введите: Результаты.navigateTo();

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

  1. Скопируйте элементы презентации согласно Рис. 6.13. Шрифт, цвет и его размеры установите по своему усмотрению.
  2. Последовательно переходите на остальные области просмотра, вставьте скопированные элементы презентации и внесите правки в их свойства согласно Табл. 6.9.
Таблица 6.9.
Элемент презентации Действие по щелчку
Data
Предприятие Mainview.navigateTo();
Посты контроля блоков тест.Kontr1.navigateTo();
Пункты сборки изделий сборка.Sbor.navigateTo();
Исходные данные
Результаты моделирования Результаты.navigateTo();
Result
Предприятие Mainview.navigateTo();
Посты контроля блоков тест.Kontr1.navigateTo();
Пункты сборки изделий сборка.Sbor.navigateTo();
Исходные данные Данные.navigateTo();
Результаты моделирования
Kontrol
Предприятие main.Mainview.navigateTo();
Посты контроля блоков
Пункты сборки изделий main.сборка.Sbor.navigateTo();
Исходные данные main.Данные.navigateTo();
Результаты моделирования main.Результаты.navigateTo();
Sbor
Предприятие main.Mainview.navigateTo();
Посты контроля блоков main.тест.Kontr1.navigateTo();
Пункты сборки изделий
Исходные данные main.Данные.navigateTo();
Результаты моделирования main.Результаты.navigateTo();

Построение модели для проведения простого эксперимента завершено. Теперь отладьте модель, используя возможности AnyLogic по обнаружению ошибок. Если вы всё выполнили корректно, то получите результаты, показанные на Рис. 6.14.

Замечание. При каждом запуске модели результаты будут повторяться, если используются только распределения и случайные функции из AnyLogic. Например, если вместо функции uniform(1) использовать функцию random(), которая является функцией Java, результаты моделирования воспроизводиться не будут.
Результаты моделирования согласно постановке задачи

увеличить изображение
Рис. 6.14. Результаты моделирования согласно постановке задачи
< Лекция 6 || Лекция 7: 12345 || Лекция 8 >
Игорь Маникин
Игорь Маникин

Коллеги, спасибо за очень информативный и полезный курс. Прошёл три лекции. Столкнулся с проблемой, что обе модели не могут закончить расчёт по причине ограничения бесплатной версии "создано максимально допустимое число динамически создаваемых агентов (50000)". По скриншотам Лекции 2 видно, что да, модель создает гораздо больше 50000 агентов. В принципе, мне то и диплом не особо нужен. Но хотелось бы выполнить практические работы. Нет ли возможности откорректировать эту проблему? Или может я чего не так делаю?

Еще раз спасибо за прекрасный курс!

Артём Нагайцев
Артём Нагайцев

Выдает ошибку "entity cannot be resolved to a variable" при попытке запуска. В чем может быть причина? Ошибка в строках

entity.time_vxod=time(); 

time_obrabotki.add(time()-entity.time_vxod);