1、Flexsim培训(续),课程大纲,第五部分、建模语言第六部分、概念和模型,第五部分 建模语言,Flexsim层次化结构树形结构建模语言定制模型逻辑,什么是节点?,Flexsim的基本数据结构是一个层次化的树形结构主树模型和工程相关的对象和数据视图树包括图形用户界面相关的对象和下拉菜单模型树模型相关的对象和数据节点是“树”的基本构成单元节点在表面是看不到的,它们包含了对象、图形用户界面和数据的所有信息,节点结构,节点有名字节点可以拥有一个数据项数值字符串对象如果节点拥有对象数据,使用 查看含有对象信息的展开的节点列表(数据项和成员函数)如果节点包含子节点,使用 展开并查看子节点,节点符号,标准
2、文件夹对象对象数据C+函数FlexScript(Flexsim脚本)函数,模型树样本,什么是函数?,函数名(参数1,参数2,等等)参数可以是数值字符串指向对象或节点的指针函数举例colorrandom(item)许多Flexsim函数的作用都是从“树”中读取数据和向“树”存放数据,一般规则,区分大小写(A不等同于a)没有限制特定的格式(以“易读的”代码为目标,可以自由使用空格、制表符和回车换行)文本字符串由引号括起,mytext函数调用后面用圆括号,逗号分隔函数的参数,moveobject(item, container)函数总是以分号结束根据需要可以在数学和逻辑表达式中自由地使用圆括号,(x
3、+10)*y大括号用于定义一段逻辑表达双斜线用于一行中其后的部分,/my comment多行注释以/*开始,*/结束名字定义中不能含有空格或特殊字符,下划线除外名字中可以含有数字,但是不能以数字开头,书写逻辑可能用到的帮助,现有的下拉菜单选项示例和模型(/samples和/userprojects/DemoModels)Command Summary(命令集)Command Hints(命令提示)C+参考书,变量类型,int(整数型),1、999double(双精度型),0.0、123.45string(字符串型),goodfsnode*(节点指针型),theOp、item,变量声明和赋值,整
4、数型,int index = 1;双精度型,double length = 10.5;字符串型,string str1 = qualified;节点指针型,fsnode* myItem = last(current);,数学运算符,x + y:x加yx y:x减yx * y:x乘以yx / y:x除以ysqrt(x):x的平方根pow(x,y):x的y次方trunc(x):x取整数部分frac(x):x的小数部分fmod(x,y):x除以y的余数min(x,y):x和y的较小值max(x,y):x和y的较大值,比较,x y:x大于yx = y:x大于等于yx 2)moveobject(last
5、(current),queue);,在程序中,while循环是在测试表达式为真时使得一段代码一直反复重复执行的结构,所以为了避免无限循环下去,最终测试表达式的值要为假。,“for”循环结构,for(start expression; test expression; count expression)code blockfor(int index = 1; index = content(current); index+)totalWeight += getlabelnum(rank(current,index),weight);,for循环允许一段代码重复执行一定次数,测试表达式最终值同样需
6、要为假,以避免无限循环。,代码练习四,目的学习使用for循环描述组合器将8个箱子放在1个托盘上一个发生器提供托盘,另外一个发生器提供箱子组合器发送实体到一条输送机,再由这条输送机发送到另一条输送机在第一条输送机的离开触发器,使用for循环改变托盘上所有箱子的颜色问题尝试使用setobjectshapeindex函数改变箱子的外形,代码练习四布局,第六部分 概念和模型,通过搭建一些模型学习更多Flexsim概念和用法,模型四概念,实体类型“推”与“拉”式规则概率分布函数,处理器“拉”实体,Pull From Port(接收端口):实体可以进入的输入端口Pull Requirement:决定是否允
7、许一个实体进入上游对象发送端口项设置为Open all ports(所有端口),模型四,目的学习使用“拉”式规则,根据实体的实体类型定义它们的加工路线描述电子部件加工完成后需要接受测试两种类型的部件会进入堆放区,它们的到达是随机的,其中40%是类型为1的,60%是类型为2的。部件到达的间隔时间服从均值为40秒的指数分布两台测试机用于类型为1的部件,三台测试机用于类型为2的部件 测试时间服从120到150秒的均匀分布问题尝试平衡各个测试机的工作量尝试使用“推”规则实现此模型,模型四布局,模型五概念,标签和实体类型经验分布:全局表触发器顺序,模型五,目的学习如何在实体上设置和使用标签,用于决定加工
8、路线描述零件的到达服从均值为30秒的指数分布,四种类型的零件分别占全部零件的20%、30%、40%、10%。四台处理器分别处理这四种不同类型的零件。首次加工的零件的处理时间服从100到120秒的均匀分布,返工的零件的处理时间服从120到130秒的均匀分布。零件加工完成后会被测试。每个零件的测试时间是10秒钟。测试合格的产品会离开模型,10%的产品会需要返工。返工的零件将被优先处理问题瓶颈在哪里?尝试改变需要返工的零件的形状,模型五布局,模型六概念,全局表标签触发器,全局表函数,gettablenum(tablename, rownum, colnum)settablenum(tablename
9、, rownum, colnum, num)gettablestr(tablename, rownum, colnum)settablestr(tablename, rownum, colnum, str)settablenum(Inventory, 1, 5, content(current)gettablestr(Alias, getitemtype(item), 2),模型六,目的使用全局表定义加工路线的简单案例学习使用标签跟踪实体的加工步骤描述3种不同的产品需要进入一个由5台处理器组成的加工单元产品按照下述路线被处理类型为1的产品需要经过工作台1、3和2类型为2的产品需要经过工作台1、
10、2和4类型为3的产品需要经过工作台2、4、3和5使用全局表,以保证产品按照正确的顺序发送到相应的工作台进行加工所有没有完全加工完成的产品都放置在同一个堆放区中问题尝试用颜色标示产品所处的加工步骤,模型六布局,模型七概念,任务序列优先级全局指针,模型七,目的学习如何使用一个操作员同时负责搬运和处理实体描述零件的到达时间间隔是服从均值为20秒的指数分布。零件到达后由操作员将其运送到一个空闲的工作台上。操作员需要对零件进行10秒钟的预处理之后工作台自行处理实体,需要20秒钟时间加工完成后,实体离开系统一个操作员负责所有的三个工作台问题 使操作员在运送完一个实体后,立即对该实体进行预处理尝试不使用中心
11、端口连接实现此模型,模型七布局,模型八概念,发送端口“中断”需求,模型八,目的学习使用移动资源上的“中断”需求项描述发生器均匀地产生三种不同类型的实体,并随机发送到其后的三个堆放区内。一辆运输车将实体运送到后面的三个堆放区内,此三个堆放区分别可以容纳一种类型的实体。实体经过处理器,最后由接收器离开系统。运输车辆最多一次可以装载5个实体。运输车辆只能同时装载同一类型的实体。问题 尝试其他“中断”需求选项,观察运输车辆的行为。,模型八布局,模型九概念,移动资源组自定义任务序列时间表,模型九,目的练习使用移动资源组、调度规则描述一个工作单元有5个工作台每个零件必须依次在5个工作台上进行加工此工作单元
12、中有一组由3个操作员组成的移动资源组操作员负责运送每个零件到下一个工作台,以及预处理任务预处理时间是5秒钟,处理时间是15秒钟每25秒到达一个新零件问题每小时的生产能力是多少?使用自定义任务序列,以提高生产能力。使用时间表,安排操作员在不同的时间休息。,模型九布局,模型十概念,更新组合器组件列表Excel数据导入,定制Excel数据导入/导出,规则 必须首先使用excellaunch函数启动Excel,然后使用excelopen函数打开一个Excel文档。使用excelsetsheet函数指定一个表单,然后可以使用excelreadnum,excelwritenum,excelimportta
13、ble和excelexporttable等函数进行读写操作。如果需要打开另一个文档,需要先使用excelclose函数关闭当前文档。最后使用excelquit函数退出Excel。示例excellaunch();excelopen(C:Program FilesFlexsim3userprojectsTrainingExcel Custom.xls);excelsetsheet(Sheet1);excelwritenum(1,2,gettablenum(Data,1,1);settablenum(Data,1,1,excelreadnum(1,1);excelclose(true);excelq
14、uit();,模型十,目的学习如何控制组合器的组件列表学习如何从Excel导入数据到发生器的到达时刻表描述一个供应商向5个不同的客户提供总共10种不同的产品每个客户的订单不同每个客户所订的产品放在一个托盘上,经过输送机进入接收器使用订单和时刻表两个表格构建此模型问题从Excel中导入所需的表格,模型十布局,模型十订单表,模型十到达时刻表,更深一步的概念和模型,打开、关闭输入/输出端口消息抽象模型全局对象指针自定义任务序列数据库用户事件模型初始化代码全局C+代码用户函数,模型A1概念,打开、关闭输入/输出端口消息,基本对象控制函数,closeinput(obj),openinput(obj)st
15、opinput(obj),resumeinput(obj)closeoutput(obj),openoutput(obj)stopoutput(obj),resumeoutput(obj)sendmessage(toobj, fromobj, param1, param2, param3)senddelayedmessage(toobj, delaytime, fromobj, param1, param2, param3)stopobject(obj),resumeobject(obj)moveobject(obj, container)closeoutput(current)senddel
16、ayedmessage(centerobject(current,1),10,current,1,getlabelnum(current,2),0),消息,消息:一个对象发送到另一个对象的信息当一个对象接收到消息时,它的“OnMessage”(消息)触发器被触发消息的发出是通过函数sendmessage(发出即时消息)和senddelayedmessage(发出延时消息)每条消息可以有三个附加的数值型参数,消息执行机制,模型A1,目的学习如何控制产品流和发送延时消息描述工作台在处理完每个产品之后,需要等待5秒钟,才能继续处理后面的产品。使用closeinput和senddelayedmessa
17、ge函数实现此功能。问题如果此工作台最多可以同时处理两件产品,每次处理完一批(一件或两件)产品之后需要等待,如何实现?,模型A1布局,模型A2概念,抽象模型全局对象指针For循环moveobject函数,模型A2,目的学习创建抽象模型的方法学习在触发器中定义C+逻辑代码描述每天都有货物到达,也都有订单到达,1份货物可以满足1份订单的需求。每天到达货物的数量和每天的订单数量都服从均值为10的指数分布。一共有5种不同类型的货物和订单,每天到达的货物和订单都会是其中一种,而且每一种的可能性都相同。货物和订单的类型相匹配。货物到达时,如果现存的订单显示需要这种货物,那么货物要立即满足订单的需要,同时更
18、新订单;如果不需要则暂时存放起来。订单到达时,如果库存中的货物有可以满足需要的,那么立即消除相应的货物和订单;否则将订单保留。问题如果连续运行1年需要多大的容量以暂存货物?画出表示每天缺货总量的曲线图订单被满足的平均等待时间是多长?,模型A2布局,模型A3概念,自定义任务序列全局对象指针,移动资源控制,简单指令createdelaytask(centerobject(current, 1), 100, STATE_UTILIZED, 0, 0)freeoperators(op, item)自创建任务序列createemptytasksequence(te, priority, preempti
19、ng) 返回值为指向此任务序列的指针(例如fsnode* ts)inserttask(ts, tasktype, involved1, involved2, param1, param2, param3, param4)dispatchtasksequence(ts),任务序列示例,fsnode *forklift = centerobject(current, 1);fsnode *origin = inobject(current, 1);fsnode *destination = outobject(current, 2);fsnode *item = first(origin);fsn
20、ode *ts = createemptytasksequence(forklift, 0, 0);inserttask(ts, TASKTYPE_TRAVEL, origin, NULL);inserttask(ts, TASKTYPE_FRLOAD, item, origin);inserttask(ts, TASKTYPE_TRAVEL, destination, NULL);inserttask(ts, TASKTYPE_FRUNLOAD, item, destination);dispatchtasksequence(ts);,任务类型,TASKTYPE_LOAD: item, so
21、urce TASKTYPE_FRLOAD: item, station, outputport TASKTYPE_UNLOAD: item, target TASKTYPE_FRUNLOAD: item, station, inputport TASKTYPE_UTILIZE: involved, station, state TASKTYPE_DELAY: NULL, NULL, delaytime, state TASKTYPE_BREAK: NULL, NULL TASKTYPE_TRAVEL: destination, NULL TASKTYPE_TRAVELTOLOC: NULL,
22、NULL, lx, ly, lz, endspeed TASKTYPE_TRAVELRELATIVE: NULL, NULL, ox, oy, oz, endspeedTASKTYPE_SENDMESSAGE: toobj, fromobj, param1, param2, param3, delaytimeTASKTYPE_MOVEOBJECT: obj, container, port,模型A3,目的学习如何创建自己的任务序列描述模型中包括一个发生器,五个工作台和一个接收器操作员从发生器取一个实体到第一个工作台进行加工,完成后再运送到第二个工作台进行加工,依此类推,直到全部加工完成后送到接
23、收器。也就是说同一个操作员要负责一个实体从头到尾的全部流程。使用全局对象指针代替中心端口连接问题一个实体需要多长时间才能完成所有的工序?,模型A3布局,模型A4概念,数据库用户事件模型初始化代码,数据库,Flexsim通过ODBC访问数据库有两种不同的模式可以使用表格模式SQL模式察看当前数据表,选择View(视图)菜单下的Current Database Table(当前数据表),数据库相关函数,dbopen(alias, tablename, modenum)dbclose()dbgettablenum(row, col)、dbgettablestr(row, col)dbsettable
24、num(row, col, num)、dbsettablestr(row, col, str)、dbchangetable(tablename)(表格模式专用)dbsqlquery(query)(SQL模式专用)dbopen(myDB, Table1, 1)dbopen(FlexsimDB, SELECT * FROM Table1, 0)dbsqlquery(UPDATE Table1 SET Quantity = 20 WHERE Name = Product5),ODBC设置,模型A4,目的学习Flexsim相关的数据库操作描述数据库中有NameTable和ProcessTimeTabl
25、e两张表发生器根据NameTable给每个生成的实体定义名字,处理器根据ProcessTimeTable决定加工时间在Model Startup Code(模型初始化代码)中完成数据表格的初始化,使用User Events(用户事件)在特定时间改变ProcessTimeTable中的某个处理时间问题分别尝试使用表格和SQL模式完成此模型,模型A4布局,模型A5概念,全局C+代码用户函数,全局C+代码和用户函数使用,Global C+ Code(全局C+代码)通常用于定义全局变量或全局性的子函数,也常在这里导入外部C+代码文件。#include ./././userprojects/custom
26、code.cppUser Command(用户函数)用于用户自定义函数作为补充。通过用户函数定义的函数与原有函数具有相同的效力,如可以在命令集中找到相关说明。传递到用户函数的参数要使用parnode,parval,parstr等函数转换为相应的类型。用户函数所接受的实参为数值型,可以使用tonum函数进行类型转换。用户函数的返回值为双精度型,模型A5,目的学习用户函数和全局C+代码的使用描述发生器为每个生成的实体创建标签“priority”,并随机赋值为1到5的整数。实体进入堆放区后,按照它们的标签值进行排序,排序算法由预先定义的函数实现。问题分别尝试使用用户函数,全局C+代码和外部C+代码文件定义算法函数,模型A5布局,