在之前文章《“(FlexSim 学习笔记)案例1:不合格产品二次优先加工,两次不合格作废》中简单描述了下 flexsim 合成器的合成打包工作原理,并在该文“3.3、合成器合成打包选择“这节内容中,通过直接修改“更新合成器组件列表”事件的代码,以适应实际要求。
言犹未尽。直接修改“更新合成器组件列表”事件的总代码量虽然只有几行,但涉及到树节点操作,不太方便理解。故本文尝试再仔细阐述flexsim的合成器工作机制,并采取不用代码的方式来实现其工作过程。
一、合成器打包工作机制
首先我们来看合成器的组件列表。合成器始终会先接收来自输入端口1的货品(并把它当作容器),然后再按下图所示的组件列表,分别接收其他输入端口的货物进行组合打包。例如下图表示合成器从输入端口1接收到容器后,再从输入端口2/3/4分别接收2、3、2个货物,然后进行打包。也即打包完成后,该容器中共有7个货物。
上图的数量设置多少无所谓,因为实际案例中往往需要按订单,设法动态更新此表的数量。
如何更新呢?方法就是在合成器的On Entry触发器中,设置动态更新合成器组件表。这样的话,只要合成器从输入端口1收到某个容器,就会立刻执行更新合成器的组件列表。
上图涉及的order表是全局表,需要预先创建,例如下图(3行5列)。是不是与3行1列的合成器组件表非常相像,除了列多了点?
order全局表有5列,要用它去更新合成器组件列表,那么究竟该取那列值呢?这就涉及利用某个标签值了。例如下图的流程,某个标签值 item.orderID=3(左图),就是取全局表order(中图)的第3列值的意思,再用此列值去更新合成器组件表(右图)的相应数量。
那么标签orderID 又从哪来呢?可以考虑给容器定义orderID标签。这样的话,按合成器的工作机制,合成器会先从输入端口1接收容器,紧接着触发On Entry 事件,因为我们在该事件中设置了更新合成器组件,那么flexsim就可利用此容器的orderID标签值,去执行更新合成器组件列表的一系列操作。
二、案例
接下来我们用一个案例来具体实现合成器的打包工作机制。
如上图,有4个发生器,第1个是托盘发生器产生托盘容器(与合成器A连接时,应保证是合成器的第一个输入端口),其他是货物发生器,分别产生红/绿/蓝货物。托盘离开发生器时,将生成订单信息。合成器接收到托盘后,按订单要求进行打包(即合成器最终在此托盘中分别放置红/绿/蓝货物若干数量,进行打包)。
三、解决方案
1、创建order订单全局表,3行1列
2、托盘
在工具箱临时实体栏中选择托盘,新增4个数值标签,名称及值分别为 r=0,g=0,b=0,orderID=1
r 表示订单中的红色货物数量,g 表示绿色货物数量,b 表示蓝色货物数量,orderID 对应订单全局表 order 的第几列(列索引) ,因为order表只有1列,故orderID初始值设置为1,表示取订单表order的第1列。
3、托盘发生器
3.1、托盘发生器的临时实体栏选托盘,表示该发生器产生托盘。
3.2、在托盘发生器的On Creation触发器分别设置托盘的 r,g,b 标签值为1~5的随机数。
这样的话,每产生1个托盘,托盘的 r/g/b 分别就有随机值,比如 r=3,g=5,b=2,表示此托盘要对应的订单为红色货物3个,绿色货物5个,蓝色货物2个。
3.3、在托盘发生器的On Exit 触发器中,设置”写入全局表“3次,分别将托盘的 r,g,b 数量写入订单全局表order的第1行第1列,第2行第1列,第3行第1列。
4、红色货物发生器/绿色货物发生器/蓝色货物发生器
在红色货物发送器的On Creation 触发器中,设置Type标签和颜色为1,产生类型为1的红色货物。
其他颜色货物发生器的设置类推。
5、合成器
在合成器的On Entry触发器中,设置”更新合成器组件列表“,表为order,标签为orderID,表示通过托盘的orderID值,来取order表的对应列,去更新组件表。这里托盘的orderID值已经有初始值=1,所以更新取的是order表的第1列。
6、全部完成。
四、最终效果
五、小结
1、定义一个订单全局表;
2、对托盘容器,定义和订单数量相关的标签,以及和订单列索引相关的标签;
3、在某个合适的触发器中,利用托盘标签值去修改订单全局表;
4、在合成器的进入触发器中,用订单全局表去更新合成器组件表。