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

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

< Лекция 6 || Лекция 7: 12345 || Лекция 8 >

Модель функционирования предприятия в 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 - минимальная стоимость одного изделия;
  • минСтоимГотИзд - минимальная стоимость готовых изделий;
  • колГотИзд - количество готовых изделий, отправленных на склад.

На текущее модельное время собирается статистика по следующим стоимостным показателям функционирования предприятия:

  • 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 - стоимости сборки, проверки и приемки изделий;
  • стоимБракБл - суммарные затраты на все забракованные блоки;
  • стоимГотИзд - затраты на выпуск готовых изделий;
  • costBlockIzd - стоимость блоков одного изделия;
  • costIzd - стоимость одного изделия;
  • времяИзгИзд - среднее время изготовления одного изделия;
  • коэфУвелСтоимИзд - коэффициент увеличения себестоимости изделия.

Минимальная стоимость изделий будет тогда, когда не будет бракованных блоков и изделий. В терминах постановки задачи это условие имеет вид:

C_{min}=C_{minизд} \cdot N_{изд},

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

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

C_{изд}=\sum_{i=1}^{n1}(C_{кi}+C_{изгi}+C_{прi})+C_{сб}+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 колГотИзд; C_{max}= стоимГотИзд + стоимБракБл.
K_c = коэфУвелСтоимИзд = \frac{C_{max}}{C_{min}}.
Замечание. В приведеных для расчета результатов моделирования выражениях мы не учитывали те блоки, которые были произведены, не забракованы, но не были использованы для сборки изделий.

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

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

  1. Выполните команду Файл/Создать/Модель на панели инструментов.
  2. В поле Имя модели диалогового окна Новая модель введите Предприятие.
  3. Выберите каталог, в котором будут сохранены файлы модели. Щёлкните кнопку Готово.
  4. В Палитре выделите Презентация. Создайте область просмотра Данные для размещения элементов исходных данных.
  5. Перетащите элемент Область просмотра. В поле Имя: введите Данные.
  6. На странице Местоположение и размер панели Свойства введите в поля X: 0, Y: 1700, Ширина: 760, Высота: 330.
  7. Перетащите элемент Прямоугольник. Оставьте имя, предложенное системой.
  8. На странице Местоположение и размер панели Свойства введите в поля X: 10, Y: 1750, Ширина: 740, Высота: 270.
  9. Перетащите элемент text и на странице Основные панели Свойства в поле Текст: вместо слова text введите Исходные данные.
  10. В Палитре выделите Основная. Перетащите элементы Параметр на элемент с именем Исходные данные. Разместите их так, как показано на Рис. 6.2. Значения свойств установите согласно Табл. 6.1.
Таблица 6.1.
Элементы и их свойства
Параметр Параметр
Имя Тип Значение по умолчанию Имя Тип Значение по умолчанию
aveTimeShop1 double 19 stKomplBlock1 double 35
aveTimeShop2 double 11 stKomplBlock2 double 32
aveTimeShop3 double 15 stKomplBlock3 double 43
aveTimeShop4 double 18 stKomplBlock4 double 48
stIzgBlock1 double 35 timeTestBlock1 double 12
stIzgBlock2 double 27 timeTestBlock2 double 16
stIzgBlock3 double 36 timeTestBlock3 double 21
stIzgBlock4 double 37 timeTestBlock4 double 17
postKontr1 int 2 procBrakBlock1 double 0,02
postKontr2 int 2 procBrakBlock2 double 0,03
postKontr3 int 2 procBrakBlock3 double 0,04
postKontr4 int 2 procBrakBlock4 double 0,06
stTestBlock1 double 12 kolStendKontrIzd int 2
stTestBlock2 double 23 timeKontrIzd double 26
stTestBlock3 double 32 procBrakIzd double 0,05
stTestBlock4 double 28 stKontrIzd double 74
kolPunSborki int 2 verBlock1 double 0,9999
timeSborki double 22 verBlock2 double 0,999999
stSborki double 67
verBlockNum1 double 0,25 timeZamBlock1 double 12
verBlockNum2 double 0,25 timeZamBlock2 double 15
verBlockNum3 double 0,25 timeZamBlock3 double 12
verBlockNum4 double 0,25 timeZamBlock4 double 21
stZamBlock1 double 34 kolPunPriem int 2
stZamBlock2 double 46 timePriemIzd double 18
stZamBlock3 double 38 procBrakPriem double 0,15
stZamBlock4 double 54 stPriemIzd double 53
Размещение элементов Параметр для ввода исходных данных

увеличить изображение
Рис. 6.2. Размещение элементов Параметр для ввода исходных данных

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

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

  1. Создайте область просмотра Результаты для размещения элементов Переменная.
  2. Перетащите элемент Область просмотра. В поле Имя: введите Результаты.
  3. На странице Местоположение и размер панели Свойства введите в поля X: 0, Y: 700, Ширина: 700, Высота: 520.
  4. Перетащите элемент Скруглённый прямоугольник. Оставьте имя, предложенное системой.
  5. На странице Местоположение и размер панели Свойства введите в поля X: 10, Y: 750, Ширина: 690, Высота: 450.
  6. Перетащите элемент text и на панели Свойства в поле Текст: введите Данные о количестве подготовленных и забракованных блоков и изделий.
  7. Перетащите ещё элемент text и введите Стоимостные показатели функционирования предприятия.
  8. Перетащите третий элемент text и в поле Текст: введите Показатели использования пунктов предприятия.
  9. В Палитре выделите Основная. Перетащите элементы Переменная. Используйте копирование. Разместите их и дайте им имена так, как показано на Рис. 6.3. Тип всех переменных, используемых для вывода количества подготовленных и забракованных блоков и изделий на текущее модельное время - int. Тип переменных для вывода стоимостных показателей работы предприятия и показателей использования его пунктов - double.
  10. Выровняйте элементы. Для этого нужно вначале выделить те элементы, которые вы хотите выровнять, а затем открыть правым щелчком мыши по выделенным фигурам контекстное меню и выбрать нужную команду выравнивания из подменю Выравнивание. Не поддерживается выравнивание элементов диаграмм состояний и диаграмм действий, потому что при выравнивании таких элементов может нарушиться логика модели.
Размещение элементов Переменная для вывода результатов моделирования

увеличить изображение
Рис. 6.3. Размещение элементов Переменная для вывода результатов моделирования

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

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

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

Создайте область просмотра для размещения сегментов событийной части модели на диаграмме класса Main.

  1. В Палитре выделите Презентация. Перетащите элемент Область просмотра.
  2. Перейдите на страницу Основные панели Свойства.
  3. В поле Имя: введите Mainview.
  4. На странице Местоположение и размер панели Свойства введите в поля X: 0, Y: 0, Ширина: 990, Высота: 390.
  5. Перетащите элемент Скруглённый прямоугольник. В нём мы разместим все сегменты модели. Оставьте имя, предложенное системой.
  6. На странице Местоположение и размер панели Свойства введите в поля X: 10, Y: 60, Ширина: 970, Высота: 320.
  7. Перетащите элементы Скруглённый прямоугольник, укажите имена сегментов и свойства согласно Табл. 6.2. Шрифт, цвет и т.д. выберите по своему усмотрению.
Таблица 6.2.
Сегмент Свойства
Х: Y: Ширина: Высота:
Цеха 20 80 140 270
Посты контроля блоков 170 80 160 270
Пункты сборки изделий 340 80 120 270
Стенды контроля изделий 470 80 150 270
Пункты приёма изделий 630 80 170 270
Склад готовых изделий 810 80 160 130
Склад бракованных изделий 810 220 160 130
Размещение сегментов модели

увеличить изображение
Рис. 6.4. Размещение сегментов модели
Имитация работы цехов предприятия

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

  1. Из Библиотеки моделирования процессов перетащите объект sourсe на агент Main и разместите в скругленном прямоугольнике с именем Цеха.
  2. Для записи и хранения параметров блоков и изделий в дополнительные поля заявок нужно создать нестандартный тип заявки. Создайте тип заявки Product.
  3. В панели Проект щёлкните правой кнопкой мыши элемент модели верхнего уровня дерева и выберите в меню Создать Java класс.
  4. Появится диалоговое окно Новый Java класс. В поле Имя: введите имя нового класса Product.
  5. В поле Базовый класс: выберите из выпадающего списка Entity в качестве базового класса. Щёлкните кнопку Далее.
  6. Появится вторая страница Мастера создания Java класса. Добавьте следующие поля Java класса, которые потребуются в дальнейшем при разработке модели:
    int numBlock;
    int sign1;
    int numBlBrak1;
    int numBlBrak2;
    int numBlBrak3;
    int numBlBrak4;
    double timeSbor;
    double cost;
  7. Оставьте выбранными флажки Создать конструктор и Создать метод toString().
  8. Щёлкните кнопку Готово. Появится редактор кода и автоматически созданный код вашего Java класса. Закройте код.
  9. Щёлкните правой кнопкой мыши в панели Проект только что созданный Java класс и в контекстном меню выберите Преобразовать Java класс в тип агента.
  10. Появится окно c параметрами типа заявок Product.
  11. Выделите объект source. На странице Основные панели Свойства установите свойства согласно Табл. 6.3.
    Таблица 6.3. Свойства объектов source
    Имя Свойства Значения
    Цех1 Отображать имя Установите флажок
    Тип заявки Product
    Прибывают согласно Времени между прибытиями
    Время между прибытиями exponential(1/aveTimeShop1)
    Новая заявка 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)
    Новая заявка Product
    Действия При выходе: kolIzgBlock2++;
    entity.numBlock = 2;
    costKomplBlock2 += stKomplBlock2;
    costKomplBlock += stKomplBlock2;
    costIzgBlock2 += stIzgBlock2;
    sumCostBlock2 += (stKomplBlock2+stIzgBlock2);
    costIzgBlock += stIzgBlock2;
    sumCostBlock += (stKomplBlock2+stIzgBlock2);
    цех3 Отображать имя Установите флажок
    Тип заявки Product
    Прибывают согласно Времени между прибытиями
    Время между прибытиями exponential(1/aveTimeShop3)
    Новая заявка Product
    Действия При выходе: kolIzgBlock3++;
    entity.numBlock = 3;
    costKomplBlock3 += stKomplBlock3;
    costKomplBlock += stKomplBlock3;
    costIzgBlock3 += stIzgBlock3;
    sumCostBlock3 += (stKomplBlock3+stIzgBlock3);
    costIzgBlock += stIzgBlock3;
    sumCostBlock += (stKomplBlock3+stIzgBlock3);
    цех4 Отображать имя Установите флажок
    Тип заявки Product
    Прибывают согласно Времени между прибытиями
    Время между прибытиями exponential(1/aveTimeShop4)
    Новая заявка Product
    Действия При выходе: kolIzgBlock4++;
    entity.numBlock = 4;
    costKomplBlock4 += stKomplBlock4;
    costKomplBlock += stKomplBlock4;
    costIzgBlock4 += stIzgBlock4;
    sumCostBlock4 += (stKomplBlock4+stIzgBlock4);
    costIzgBlock += stIzgBlock4;
    sumCostBlock += (stKomplBlock4+stIzgBlock4);
  12. Щёлкните выделенный source правой кнопкой мыши и в контекстном меню выберите Копировать.
  13. Вставьте в скругленный прямоугольник с именем Цеха еще три объекта source. Разместите их вертикально один под другим. Во время вставки имена объектов будут изменяться: цех2, цех3, цех4. Однако остальные свойства останутся такими же, как и у объекта цех1.
  14. Поэтому, последовательно выделяя второй, третий и четвертый объекты source, скорректируйте их свойства также согласно Табл. 6.3.
< Лекция 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);