В этом примере показано, как смоделировать производственный объект. Этот объект состоит из линии сборки, которая обрабатывает задания на основе заранее определенного графика. В этом примере вы проходите через рабочий процесс для:
Анализ влияния графика заданий на пропускную способность
Оценка количества работников
Производственный объект обеспечивает производство 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');
Для изготовления конкретного варианта детали A и детали B, которые соответствуют варианту, объединяются в производственную область. Детали проходят следующие шаги перед выходом из производственной области:
PartA проходит операцию гашения
PartB проходит операцию фрезерования
Обе части затем крепятся
Затем сборка проходит операцию Finishing
Среднее время завершения операции для каждого варианта приведено в таблице 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: Кратчайшая работа сначала на машине гашения:
Этот график помещает операцию, имеющую самое короткое время работы на машине гашения, первой и самой длинной в конце. Идея здесь состоит в том, чтобы втолкнуть как можно больше деталей на объект как можно раньше. Затем исследуется пропускная способность:
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']);
Из данных по возможностям мы видим, что максимальное количество работников в пулах Manufacturing и Inspection, используемых в любую конкретную точку времени, редко превышает два. Сокращение количества работников до двух показов, что нет влияния на пропускную способность при лучшем использовании работников.
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;
Entity Generator | Сервер сущности | Очередь | Приобретатель ресурсов | Пул ресурсов | Ресурс Releaser