这个例子说明了如何制造工厂模型。该工厂包括一个装配线的,基于一个预先确定的调度进程的作业。这个例子指导您完成一个工作流程:
分析作业计划对吞吐量的影响
估计工人人数
制造工厂根据预先定义的时间表来满足40种不同产品变体的生产。每个变体都需要两部分,分别对应于该变体的PartA和PartB。每个零件都经过一系列的制造步骤。以下建模细节在一个Excel文件中指定,在模型初始化期间读取:
零件到达工厂的时间表
装配线上各工位的变异型的操作时间
不同工作者池中的工作者数量
检查区域的不合格率
下面的脚本将读取excel文件并初始化所有参数。
模型中使用的变量的初始化%excelFile = [matlabroot…' /工具箱/ slde /例子/ seExampleEstimatingAssemblyLineThroughput.xlsx '];时间= xlsread (excelFile,“MfgSchedule”);optim = xlsread (excelFile,“OperationTimes”);参数= xlsread (excelFile,“参数”);numMfgWorkers =参数(1);制造业工人的数量numInspectWorkers =参数(2);检验区域的工人人数discard_rate =参数(4)/ 100;质量废品率种子= 12345;%的随机数种子modelname =“seExampleEstimatingAssemblyLineThroughput”;open_system (modelname);范围= find_system (modelname,“LookUnderMasks”,“上”,“BlockType”,“范围”);cellfun (@ (x) close_system (x)范围);
制造工厂主要由两个区域组成:
生产区域
检验区域
生产面积:工厂收到工作订单这是要实现的。一个工作订单指定该特定变量的变量ID和所需数量。实体生成器根据满足的预定义序列生成部件工作订单。在本例中,序列要么是从MATLAB脚本生成的,要么是从excel工作表读取的。下面的脚本将读取工作订单excel文件中的需求。
需求= xlsread (excelFile,'要求');
为了制造一个特定的变体,与变体相对应的零件a和零件b一起被带入制造区域。零件在离开生产区域前要经过以下步骤:
零件进行下料操作
零件经过铣削加工
然后这两个部分被固定
然后,组装完成
每个变量的平均操作完成时间都列在excel表中。假设操作完成时间有4%的变化。制造工人从铣床和紧固件机上装卸零件。
open_system ([modelname' /铣削Operation1 ']);
close_system ([modelname' /铣削Operation1 ']);
检查面积:成品进入检验区域,在那里产品要么被证明是合格的,要么被拒绝和报废。这个例子假设在检查区域有5%的不合格率。检查工人从三个检查机器上装卸零件。
open_system ([modelname“/检查机”]);
close_system ([modelname“/检查机”]);
以满足工作订单需求与最佳的吞吐量,不同的时间表可以产生。在本例中,吞吐量是工厂生产的好产品的总数。下载188bet金宝搏名为“MfgSchedule”的表单显示了一些满足条件的时间表工作订单。以下脚本根据特定的标准生成工作调度:
附表1:最短的工作首先对下料机:
这个时间表把在落料机上运行时间最短的操作放在第一位,最长的操作放在最后。这里的想法是尽可能早地将尽可能多的部件投入工厂。然后检查吞吐量:
idx = 1;S1 = sortrows(optimes(:, [1 2]), 2);为i = 1:长度(S1)重复=要求(S1(i), 2);为j = 1:repeat newSchedule(idx) = S1(i);idx = idx + 1;结束结束scheduleID = size(schedule, 2) + 1;schedule(:, scheduleID) = newSchedule';sim (modelname);open_system ([modelname/好的部分生成的]);
close_system ([modelname/好的部分生成的]);
附表2:最短的工作首先在铣床上:
这个时间表把在铣床上运行时间最短的操作放在第一位,最长的操作放在最后。同样的想法是尽可能早地从工厂的另一个分支开始,将尽可能多的部件推入工厂。然后检查吞吐量:
idx = 1;S2 = sortrows(optimes(:, [1 3]), 2);为i = 1:长度(S2)重复=要求(S2(i), 2);为j = 1:repeat newSchedule(idx) = S2(i);idx = idx + 1;结束结束scheduleID = size(schedule, 2) + 1;schedule(:, scheduleID) = newSchedule';sim (modelname);open_system ([modelname/好的部分生成的]);
close_system ([modelname/好的部分生成的]);
附表3:最快的工作首先在紧固件:
这个时间表把在紧固件上运行时间最短的操作放在第一位,最长的操作放在最后。这里的想法是尽可能早地将零件推出瓶颈机器。然后检查吞吐量:
idx = 1;S4 = sortrows(optimes(:, [1 5]), 2);为i = 1:长度(S4)重复=要求(S4(i), 2);为j = 1:repeat newSchedule(idx) = S4(i);idx = idx + 1;结束结束scheduleID = size(schedule, 2) + 1;schedule(:, scheduleID) = newSchedule';sim (modelname);open_system ([modelname/好的部分生成的]);
close_system ([modelname/好的部分生成的]);% %
附表4:最短的工作首先使用累计制造时间:
此计划考虑在所有计算机上累计运行时间。具有最短的累计运行时间的操作是首先把和最长的一个去年底。然后检查吞吐量:
idx = 1;[optimes(:, 1)和(optimes(:, [2 3 5 6]), 2)];为i=1:长度(累积量)重复=要求(累积量(i), 2);为j = 1:repeat newSchedule(idx) =累积量(i);idx = idx + 1;结束结束scheduleID = size(schedule, 2) + 1;schedule(:, scheduleID) = newSchedule';
sim (modelname);open_system ([modelname/好的部分生成的]);
close_system ([modelname/好的部分生成的]);
附表5至8:随机时间表:
excel表中的附表5到8都是随机的,满足工作订单。可以从任何调度开始,使用RANDPERM函数生成随机排列,从而生成这些调度。以下是“附表8”的结果:
scheduleID = 9;sim (modelname);open_system ([modelname/好的部分生成的]);
close_system ([modelname/好的部分生成的]);
通过对以上策略的仿真,表明该调度方案是可行的与“紧固件上最短的工作”相关,“Schedule 3”为我们提供了最佳吞吐量。
在选择了最佳的调度之后,将对这两个工作者池中所需的工作者数量进行估计。我们从三个在制造部门工作的工人和三个在检查部门工作的工人开始。
numMfgWorkers = 3;numInspectWorkers = 3;sim (modelname);open_system ([modelname“/使用中的制造业工人”]);open_system ([modelname“/使用中的检验工人”]);open_system ([modelname/好的部分生成的]);
close_system ([modelname“/使用中的制造业工人”]);close_system ([modelname“/使用中的检验工人”]);close_system ([modelname/好的部分生成的]);
从范围中我们可以看到,在任何给定的时间点上,在制造和检验池中使用的工人的最大数量很少超过两个。将工人数量减少到两个表明更好的工人利用率对吞吐量没有影响。
numMfgWorkers = 2;numInspectWorkers = 2;sim (modelname);open_system ([modelname“/使用中的制造业工人”]);open_system ([modelname“/使用中的检验工人”]);open_system ([modelname/好的部分生成的]);
close_system ([modelname“/使用中的制造业工人”]);close_system ([modelname“/使用中的检验工人”]);close_system ([modelname/好的部分生成的]);
这个例子展示了我们如何使用SimEvents来建模一个作业商店。MATLAB脚本的使用使我们能够进行实验并得出最佳的时间表。
下面的脚本关闭并清理模型bdclose (modelname);清晰的numMfgWorkersnumInspectWorkersmodelnameexcelFile…scheduleIDdiscard_rate作用域时间表需求…种子optim参数;
实体发生器|实体服务器|队列|资源收购方|资源池|资源发布人