В этом примере показано, как моделировать завод-производитель. Завод состоит из сборочной линии, которая обрабатывает задания на основе заранее определенного графика. В этом примере рассматривается рабочий процесс для:
Анализ влияния расписания заданий на пропускную способность
Оценка количества работников
Завод-производитель обеспечивает производство 40 различных вариантов продуктов на основе предварительно определенных графиков. Для каждого варианта требуется две части, PartA и PartB, которые соответствуют этому конкретному варианту. Каждая деталь проходит последовательность этапов производства. В файле Excel, считываемом при инициализации модели, указываются следующие сведения о моделировании:
График поступления детали на завод
Время работы для вариантов на каждом пикете вдоль сборочной линии
Число работников в различных пулах работников
Коэффициент отклонения на участке контроля
Следующий сценарий считывает файл Excel и инициализирует все параметры.
% Initialization of variables used in the model excelFile = 'seEstimatingAssemblyLineThroughput.xlsx'; schedule = xlsread(excelFile, 'MfgSchedule'); optimes = xlsread(excelFile, 'OperationTimes'); parameters = xlsread(excelFile, 'Parameters'); numMfgWorkers = parameters(1); % number of workers in Manufacturing area numInspectWorkers = parameters(2); % number of workers in Inspection area discard_rate = parameters(4)/100; % quality rejection rate seed = 12345; % random number seed modelname = 'seEstimatingAssemblyLineThroughput'; open_system(modelname); scopes = find_system(modelname,'LookUnderMasks','on','BlockType','Scope'); cellfun(@(x)close_system(x), scopes);

Завод-производитель в основном состоит из двух областей:
Область «Производство»
Зона контроля
Производственная область: завод получает заказы на работу, которые должны быть выполнены. В заказе на выполнение работ указывается идентификатор варианта и требуемое количество для данного варианта. Генераторы объектов генерируют детали на основе заранее определенной последовательности, удовлетворяющей заданию. В этом примере последовательность генерируется из сценария MATLAB или считывается из таблицы Excel. Следующий сценарий считывает требования заказа на работу из файла Excel.
requirements = xlsread(excelFile, 'Requirements');
Для изготовления конкретного варианта в производственную область включаются компоненты PartA и PartB, соответствующие этому варианту. Перед выходом из производственной области детали проходят следующие шаги:
Часть A проходит операцию заглушки
Деталь B проходит операцию фрезерования
Затем обе детали закрепляют.
Затем сборка проходит операцию чистовой обработки.
Среднее время завершения операции для каждого варианта приводится в таблице Excel. Предполагается изменение времени завершения работы на 4%. Рабочие из производственного пула рабочих загружают и выгружают детали из фрезерных и крепежных станков.
open_system([modelname '/Milling Operation1']);

close_system([modelname '/Milling Operation1']);
Область контроля: конечный продукт поступает в область контроля, где продукт либо сертифицирован как исправный, либо отклонен и списан в брак. В этом примере предполагается коэффициент отклонения 5% в области контроля. Работники из пула инспекторов загружают и выгружают детали из трех инспекционных машин.
open_system([modelname '/Inspection Machines']);

close_system([modelname '/Inspection Machines']);
Для удовлетворения требований заказа-наряда с максимальной пропускной способностью могут быть созданы различные графики. В этом примере пропускная способность представляет собой общее количество хороших продуктов, произведенных заводом. На листе «MfgSchedule» показаны несколько графиков, удовлетворяющих заданию. Следующие сценарии генерируют расписания заданий на основе определенных критериев:
Приложение 1: Кратчайшее задание сначала на гаечном станке:
Этот график ставит операцию, имеющую самое короткое время работы, на Blanking машины первой и самое длинное в конце. Идея здесь заключается в том, чтобы затолкать на завод как можно раньше как можно больше деталей. Затем исследуют пропускную способность:
idx = 1; S1 = sortrows(optimes(:, [1 2]), 2); for i = 1:length(S1) repeat = requirements(S1(i), 2); for j = 1:repeat newSchedule(idx) = S1(i); idx = idx + 1; end end scheduleID = size(schedule, 2) + 1; schedule(:, scheduleID) = newSchedule'; sim(modelname); open_system([modelname '/Good Parts Generated']);

close_system([modelname '/Good Parts Generated']);
Расписание 2: Кратчайшее задание сначала на фрезерных станках:
Этот график ставит операцию, имеющую самое короткое время работы на фрезерных станках, первым и самым длинным в конце. Идея снова состоит в том, чтобы как можно раньше вытолкнуть как можно больше деталей на завод из другой стартовой ветви завода. Затем исследуют пропускную способность:
idx = 1; S2 = sortrows(optimes(:, [1 3]), 2); for i = 1:length(S2) repeat = requirements(S2(i), 2); for j = 1:repeat newSchedule(idx) = S2(i); idx = idx + 1; end end scheduleID = size(schedule, 2) + 1; schedule(:, scheduleID) = newSchedule'; sim(modelname); open_system([modelname '/Good Parts Generated']);

close_system([modelname '/Good Parts Generated']);
Расписание 3: Кратчайшее задание сначала на крепежной машине:
Этот график ставит операцию, имеющую самое короткое время работы, на крепежную машину первой и самое длинное в конце. Идея здесь состоит в том, чтобы вытолкнуть детали из машины с узкими местами как можно раньше. Затем исследуют пропускную способность:
idx = 1; S4 = sortrows(optimes(:, [1 5]), 2); for i = 1:length(S4) repeat = requirements(S4(i), 2); for j = 1:repeat newSchedule(idx) = S4(i); idx = idx + 1; end end scheduleID = size(schedule, 2) + 1; schedule(:, scheduleID) = newSchedule'; sim(modelname); open_system([modelname '/Good Parts Generated']);

close_system([modelname '/Good Parts Generated']);%%
Приложение 4: Кратчайшее задание сначала с использованием совокупного времени изготовления:
Этот график учитывает совокупное время выполнения на всех машинах. Операция, имеющая самое короткое совокупное время выполнения, ставится на первое место, а самая длинная идет до конца. Затем исследуют пропускную способность:
idx = 1; cumulativeSum = sortrows([optimes(:, 1) sum(optimes(:, [2 3 5 6]), 2)], 2); for i=1:length(cumulativeSum) repeat = requirements(cumulativeSum(i), 2); for j = 1:repeat newSchedule(idx) = cumulativeSum(i); idx = idx + 1; end end scheduleID = size(schedule, 2) + 1; schedule(:, scheduleID) = newSchedule';
sim(modelname);
open_system([modelname '/Good Parts Generated']);

close_system([modelname '/Good Parts Generated']);
Расписания с 5 по 8: Случайные графики:
Графики 5-8 в таблице Excel - это все случайные графики, которые удовлетворяют заказу на работу. Эти расписания можно генерировать, начиная с любого расписания и генерируя случайную перестановку с помощью функции RANDPERM. Ниже приведены результаты для «Приложения 8»:
scheduleID = 9;
sim(modelname);
open_system([modelname '/Good Parts Generated']);

close_system([modelname '/Good Parts Generated']);
Моделирование всех вышеперечисленных стратегий предполагает, что график, связанный с «Кратчайшей работой сначала на крепежной машине», «График 3» дает нам лучшую пропускную способность.
После выбора наилучшего расписания производится оценка количества работников, необходимых в двух пулах работников. Мы начинаем с трех работников, работающих в производственной зоне и трех в инспекционной зоне.
numMfgWorkers = 3; numInspectWorkers = 3; sim(modelname); open_system([modelname '/Manufacturing Workers in Use']); open_system([modelname '/Inspection workers in Use']); open_system([modelname '/Good Parts Generated']);



close_system([modelname '/Manufacturing Workers in Use']); close_system([modelname '/Inspection workers in Use']); close_system([modelname '/Good Parts Generated']);
Из областей мы видим, что максимальное количество работников в пуле производства и контроля, используемых в любой данный момент времени, редко превышает два. Сокращение числа работников до двух свидетельствует об отсутствии влияния на пропускную способность при лучшем использовании работников.
numMfgWorkers = 2; numInspectWorkers = 2; sim(modelname); open_system([modelname '/Manufacturing Workers in Use']); open_system([modelname '/Inspection workers in Use']); open_system([modelname '/Good Parts Generated']);



close_system([modelname '/Manufacturing Workers in Use']); close_system([modelname '/Inspection workers in Use']); close_system([modelname '/Good Parts Generated']);
В этом примере показано, как мы можем использовать SimEvents для моделирования магазина работ. Использование скриптов MATLAB позволяет экспериментировать и приходить к лучшему расписанию.
% The following script closes and cleans up the model bdclose(modelname); clear numMfgWorkers numInspectWorkers modelname excelFile ... scheduleID discard_rate scopes schedule requirements ... seed optimes parameters;
Генератор объектов | Сервер сущностей | Очередь | Приобретатель ресурсов | Пул ресурсов | Средство освобождения ресурсов