零件part1以特定的主动方式进入系统,进入系统的时间分布服从已知Excel表中的时间分布,进入系统后,零件暂时存放于缓冲区store中,等待机器取走加工。在该模型中,零件要经过3个加工工序,第一个加工工序有2台设备,第二个加工工序有3台设备,第3个加工工序有1台设备,每道工序的加工时间都从已知的Excel表中相关数据获得。并且在仿真运行过程中,系统实时的向EXCEL中写下当前各个工序的工作状态;当需求得到满足,离开系统时,向EXCEL中写下这一需求在系统中的时间。模型的最终界面如图1所示,模型下载。
图1 模型最终界面
(1) 元素说明
在该模型中主要的元素以及元素的作用如表1所示。
表1 元素说明
元素名称 |
元素类型 |
元素数量 |
元素作用 |
Part1 |
Part |
1 |
所用的零件 |
Store |
Buffer |
1 |
模拟缓冲器 |
Machine1 |
Machine |
2 |
模拟工序1机器 |
Machine2 |
Machine |
3 |
模拟工序2机器 |
Machine3 |
Machine |
1 |
模拟工序3机器 |
Arrivals |
variable(real) |
16 |
零件的到达时间 |
Cellvalue |
variable(real) |
1 |
代表output表对应工序对应机器的行数 |
Temporaryvalue |
variable(string) |
1 |
暂时存放partsize属性的变量 |
X |
variable(integer) |
1 |
1~3之间随机变量 |
Processtime |
variable(real) |
1 |
零件的实际加工时间 |
Rownumber |
Variable(integer) |
1 |
存放零件加工时间的Excel表中的行数 |
Numberofmachines |
Variable(integer) |
1 |
各道工序的机器数量 |
Cycletime |
Variable(real) |
1 |
各道工序的加工时间 |
Partsize |
Attribute(string) |
1 |
代表零件的大小属性 |
Arrivaltime |
Attribute(real) |
1 |
零件到达系统的时间 |
(2) 运行时间
模型暂定运行时间为100个时间单位。
(1) 制作Excel表
该模型需要与Excel表进行数据交互,所以,在建立模型之前,我们需要对Excel表进行设计。在这里,我们新建一个Excel空白文档。并且将表存储在与我们建立的该模型的同一路径下,命名为“xllinks.Xls”。这样运行该模型时才能与该表进行数据交互。
其次,将该excel文档中的sheet1和sheet2表重命名,分别命名为“inputdata”和“output”。
然后将模型中需要与excel交互的数据资料输入inputdata表中,如图2所示。注意该模型中所需数据的引用位置一定要与该表中相关数据的位置相符合。
图2 inputdata表
最后建立output表,这张表主要用语模型运行时对一些相关数据的输出。如图3所示。
图3 output表
(2) 定义元素
在设计窗口右击鼠标,选择“define”对各个元素进行定义。在simulation下定义如表1所示的元素。
(3) 元素可视化设计
l Part元素的可视化设计
Part元素主要是对其name和icon属性进行可视化设计,这点前面案例已经介绍,在此不再赘述。
l Machine元素的可视化设计
Machine1、machine2、machine3元素可视化设计分别对其name、icon和part queue属性进行可视化设计,前面案例已经涉及,在此不再赘述。
l buffer元素的可视化设计
store元素主要是对其name、icon、rectangle、expression以及text属性进行设置。这些属性的可视化设计在前面案例都有提到过,在此不再赘述。
(4) 模型详细设计
l Initialize actions的详细设计
在该模型运行之前,我们首先要将Excel表中的相关数据取出来,放到相应的变量中去,等待我们运行时的调用,这个环节叫做模型的初始化过程。在witness中,读取Excel表中数据的方法有两种:
I.通过仿真系统的初始化活动来对Excel表中的数据进行调用。使用此方法的步骤如下:
l 选择系统菜单项Model/Initialize Actions…,激活程序编辑窗口;
l 写入XLReadArray ()函数,来读取工作表中特定区域的数据给变量;
II.通过变量的初始化活动。使用此方法的步骤如下:
l 双击变量,打开detail对话框;
l 选择Actions页框中的Initialize…按钮;
l 弹出程序编辑对话框;
l 点击程序编辑对话框上的Excel…按钮;
l 选定数据表所处的工作簿;
l 选定工作簿中工作表中的特定区域;
l 单击确定即可;
在这里我们使用第一种方法,选择系统菜单项Model/Initialize Actions…,激活程序编辑窗口,向其中写入如下程序:
XLReadArray ("\\XLLinks.xls","InputData","$D$6:$D$8",CycleTime)
XLReadArray ("\\XLLinks.xls","InputData","$E$6:$E$8",NumberOfMachines)
SET QUANTITY OF Machine1 TO NumberOfMachines (1)
SET QUANTITY OF Machine2 TO NumberOfMachines (2)
SET QUANTITY OF Machine3 TO NumberOfMachines (3)
XLReadArray ("\\XLLinks.xls","InputData","$E$15:$E$30",Arrivals)
RowNumber = 7
解释程序:
(a) 首先我们在这里解释一下XLReadArray ()函数和XLWriteArray ()函数
XLReadArray ()函数
该函数用来将EXCLE工作表中的特定区域的数据读给WITNESS的变量或变量数组。如果读取成功,该函数返回1,否则,返回0。
函数语法:XLReadArray (WorkbookName,WorksheetName,Range,Array)
其中,
WorkbookName 字符型,指定包含需要数据的工作簿名称及其路径;
WorksheetName 字符型,指定包含数据的工作表的名称;
Range 字符型,指定包含数据的工作表中的区域;
Array 名型,指定将读取的数据赋予的变量的名称;
XLWriteArray ()函数
该函数用来将WITNESS的变量或变量数组的值写入EXCEL中去。如果写入成功,该函数返回1,否则,返回0。
函数语法:XLWriteArray (WorkbookName,WorksheetName,Range,Array)
其中,
WorkbookName 字符型,指定写入数据的的工作簿名称及其路径;
WorksheetName 字符型,指定写入数据的工作表的名称;
Range 字符型,指定写入数据的工作表中的区域;
Array 名型,指定所写入的数据变量的名称;
(b) 对上述初始化语句的解释
第一行:将与模型在同一路径下的工作簿XLLinks.xls中的工作表InputData中的D6:D8三个单元的数据读取出来,分别赋予CycleTime(1) 、CycleTime(2)、 CycleTime(3);
第二行:将与模型在同一路径下的工作簿XLLinks.xls中的工作表InputData中的E6:E8三个单元的数据读取出来,分别赋予NumberOfMachines (1) 、NumberOfMachines (2)、 NumberOfMachines (3);
第三行至第五行:通过变量NumberOfMachines数组中的数据来设置工作台的数量;
第六行:将InputData中的E15:E30这十六个单元的数据读取出来,赋予数组Arrivals。
第七行:对rownumber进行初始化设计,rownumber表示processtime在excel表中存放的位置相应的行数。Rownumber初始值赋值为7表示我们processtime从output表中的第七行开始存入。
l Part元素的详细设计
双击part1元素,进入对part1元素的详细设计,如图4所示。
¨ 在type栏中选择active with profile,在选定了需求part元素的到达模式为Active With Profile后,part的detail对话框上会动态显示“arrival profile”页框,来进行profile的设计。
图4 part1元素详细设计
¨ 点开arrival profile选项卡,进入如图5所示的设计区域。在time display栏中选择8小时工作制。在左侧的volume栏中依次输入arrivals(i),表示零件到达的时间由arrivals变量从Excel表中引入的数据来控制。
图5 arrival profile设计