Этот пример показывает вам, как смоделировать завод-изготовитель. Объект состоит из сборочного конвейера что задания процессов на основе заранее установленного графика. Этот пример обходит вас через рабочий процесс для:
Анализ удара задания планирует на пропускную способность
Оценка количества рабочих
Завод-изготовитель угождает производству 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);
Завод-изготовитель в основном состоит из двух областей:
Область Manufacturing
Область Inspection
Область Manufacturing: объект получает заказы задания, которые должны быть выполнены. Порядок задания задает вариант ID и необходимое количество для той особой разновидности. Генераторы Сущности генерируют части на основе предопределенной последовательности, которая удовлетворяет порядку задания. В этом примере последовательность или сгенерирована из скрипта MATLAB или читается из листа Excel. Следующий скрипт читает требования порядка задания из файла Excel.
requirements = xlsread(excelFile, 'Requirements');
Чтобы произвести особую разновидность, PartA и PartB, которые соответствуют варианту, вводятся вместе в производственную область. Части проходят следующие шаги прежде, чем оставить производственную область:
PartA проходит Изготовление заготовок
PartB проходит операцию Milling
Оба части затем закрепляются
Блок затем проходит операцию Finishing
Средние времена завершения операции для каждого варианта сведены в таблицу в листе Excel. Принято 4%-е изменение во времена завершения операции. Рабочие от производственного пула рабочего загружают и разгружают части от Дробления и Крепления машин.
open_system([modelname '/Milling Operation1']);
close_system([modelname '/Milling Operation1']);
Область Inspection: готовое изделие вводит область Inspection, где продукт, как или сертифицируют, в порядке или отклоняется и фрагментируется. Этот пример принимает 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' дает нам лучшую пропускную способность.
После выбора лучшего расписания сделана оценка количества рабочих, необходимых в двух пулах рабочего. Мы начинаем с трех рабочих, работающих в области Manufacturing и три в области Inspection.
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;
Entity Generator | Сервер сущности | Очередь | Получатель ресурса | Пул ресурсов | Ресурс Releaser