FlexSim实战练习(二)

提示:这里需要用到脚本函数有两个

  • Array.splic(int fromindex,int count)
  • Array.splic(int fromindex,int count,Array insert())
Array cars = ["Volvo","BMW","Audi","Ford"];
cars.splice(2,2); // ["Volvo", "Ford"]
cars.splice(3, 1, ["Lotus", "Kia"]);    // ["Volvo", "BMW", "Lotus", "Kia", "Ford"]

Array.append(Array otherArray)

Array myArray = [1,2,3,4,5];
myArray.append([7,8,9]);   //[1,2,3,4,5,7,8,9]

以上FlexSim软件版本为19版。


1、案例背景及3D布局说明

如图所示,系统会按照时间表(Arrival Schedule)生成不同类型的产品。
首先,根据产品类型分别进入对应的两个传送带上;
然后,根据产品的批次在合成器上进行合成;
最后,进入到一个暂存区进行缓存,等待订单计划下达。

产品到达

其中,ID表示产品编号,Type表示产品类型,B_ID表示产品一批次的数量。

这张图表示,一共有4种类型的订单(该全局表名称“info”),其中类型1订单需要{ST101,ST102,ST103,ST104}共4种产品组成,类型2,、类型3以及类型4订单如图所示。


2、详细流程图文解释

在整个仿真项目流程中,一共可以分为三个部分:

  • 产品在发生器上产生,通过传送带进入合成器进行合成批次,最后进入缓存区等待订单下达;
  • 订单下达指令;
  • 订单下达后,操作员就会前往缓存区,对缓存区上的产品进行刷选,选择下达订单需要的产品搬运至放有tote的暂存区上进行订单组成。当满足订单需求后,操作员就会搬运该订单前往中转场。

第一步

完成后,你的模型布局应该类似于上图。
具体操作如下:

  1. 从Library模型库中拖出3个Source,4个Queue,2个Straight Conveyor,2个Combiner;
  2. 按照图中连线方式进行"A"链接;

注意,2个Source、2个Queue与2个Combiner链接时,必须要Source首先链接到Combiner,且2个Source都产生Pallet.

  1. 2个Conveyor的上游Queue,双击打开,找到send to port,并选择By Expression>item.Type;
  2. 选择一个Combiner,在进入触发和离开触发中,写上代码如下:
//进入触发
if (port == 2)
{  int de=item.B_ID;Table thelist = getvarnode(current, "componentlist");treenode thesum = getvarnode(current, "targetcomponentsum");// thesum.value = 0;for(int index = 1; index <= thelist.numRows; index++) {thelist[index][1] = item.B_ID;//inc(thesum, item.B_ID);}
}
//离开触发
item.labels.assert("B_ID").value = item.first.B_ID;
item.labels.assert("ID").value = item.first.ID;
//把产品上的标识赋值给下面的托盘。
  1. 对combiner下游的Queue,在进入触发里设置Push to List1,并打开List1列表,进行如下的设置;

    以上是"第一部分"流程的所有活动。


第二步

具体操作如下:

  1. 从库中将以下实体添加到model中:
    (1)1个 Source
    (2)1个Queue
    (3) 1个"Operator1"
  2. 将Source和Queue进行"A"链接;
  3. 在Queue的进入触发上,写上如下代码:
treenode OP=Model.find("Operator1");
senddelayedmessage(OP,0,current,item.Order,0,0);//item.Order对应的是订单编号

应该会有人问,这第二步的作用是什么。它的作用就是:利用发生器按时间间隔发送一个Box到Queue上,使进入触发的代码被触发,这一个流程来模拟"订单下发"动作。
Source的设置可以参考我的,当然,你也可以自己编写。

以上是"第二部分"流程的所有活动。


第三步

  1. 从库中将以下实体添加到"model中:
    (1)1个 Source;
    (2)12个Queu;
    (3)1个BasicFR;
  2. 按照文章第一张图布局的样子,对Source与1个Queue进行"A"链接,同时,Queue与另外10个Queue进行"A"链接;
  3. 对下游10个Queue的进入触发中设置Push to List1:
if(true) {string listName = "List1";List(listName).push(item,2);}
  1. Process Flow>Add a general Process Flow,最终流程图样如下:

以下操作都将在Process Flow 上进行:
(1)拉入1个事件监听的发生器,并用吸管吸取操作员的On Message,同时在Msg Param1这一行,写入"Order",并选择assign,Order表示订单编号。
(2)拉入1个Pull form List 和1个List,通过Pull form List右边的感叹号与List进行链接。打开Pull form List,在Assign to 中写入token.Pallet,并在Partition ID填入2,表示为拉入的token.Pallet是10个Queue进入的Tote。
(3)拉入2个Assign Labels,并分别命名为“goal_01”和“Array”。goal_01的作用是获取当前下达订单对应需要几种产品,因此,代码为Table("info").cell(token.Order,1).as(Table).numRows。Array的作用是将当前订单对应的产品编号,通过数组的形式存储到对应的Queue上,即up(token.Pallet)。代码如下:

Table dd=Table("info").cell(token.Order,1);
Array Save =up(token.Pallet).as(Object).save;
for(int i=1;i<=token.goal;i++)
{string name=dd.cell(i,1).value;Save.append([name]);
}return Save;
  1. 拉入1个Assign Labels,并命名为“OP”,用于将model中的操作员以及中转场进行赋值。
  2. 拉入1个Assign Labels:“goal_02”,1个Wait for event,1个Delay,1个Decide,并进行连线,如图所示。

    这里,goal_02的作用是获取进入缓存区的产品数量Queue_Num=token.Q_01.subnodes.length,在Decide中进行判断token.Queue_Num >=1,如果成立,token就会顺着直线往下走;否则,token就会前往Wait for event等待并监听缓存区有产品进入后,再次判断token.Queue_Num >=1是否成立。
  3. 拉入1个Custom Code,1个Assign Labels,1个Delay,1个Decide,并进行连线,如图所示。

    其中Custom Code的代码如下:
treenode BF=Model.find("BasicFR1");//就是之前拉入的BasicFR,这边需要注意名字要一样,或者改成你model中BF的名字;
int Queue_num=token.Q_01.subnodes.length;//再次获取缓存区中产品的数量值,确定for循环的次数。
Array save_item=Model.find("BasicFR1").save_item;//获取BF上的Array数组(以下简称BF);
Array Save=up(token.Pallet).save;//获取Tote存放的Queue上的Array数组(以下简称Qu);
for(int i=1;i<=Queue_num;i++)
{treenode item=token.Q_01.subnodes[i];string item_id=item.ID;for(int j=1;j<=Save.length;j++){string order_id=Save[j];if(item_id==order_id)//如果缓存区中有产品属于当前订单组成部分,则把Qu中该产品编号从数组中剔除出去,并在BF中添加被剔除的产品编号{Save.splice(j,1);save_item.append([order_id]);break;}}
}
int array_num=save_item.length;
if(array_num == 4)//获取BF数组长度,如果长度==4,说明目前产品已满足订单需求;如果长度==0,说明目前产品不属于该订单;
{BF.panduan = 1;
}
else if(array_num ==0)
{BF.panduan = 3;
}
else
{BF.panduan = 2;
}

判断完毕后,将判断结果赋值给BasicFR的panduan标签。最后通过Decide把token送到对应的下游去。
8. 这一步没有什么好讲的,主要是从BF上save_item存着需要搬运的订单组,以及订单组的长度save_item_L;


9. 这里的代码需要注意的是,把BF上存放订单的Array("save_item ")清空,用于下个token进入时的保存。

以上是第三步的所有活动。


总结

由于篇幅的限制,许多知识点无法详细说明,而且其中一些代码只适用于订单数量为4个的时候,存在优化的空间。

FlexSim实战练习(二)——多品种小批量订单拣选作业相关推荐

  1. 多品种+小批量生产计划方法

    生产模式分为备货型生产MTS.订货生产方式MTO.混合型生产MTS+MTO和按订单设计生产ETO 四种,除了MTS是大批量生产,其余通常是小批量生产.大批量生产和小批量生产有何异同呢? 同:都是根据需 ...

  2. 机加工程序工时程序_团宠来袭 | 针对多品种小批量的机加工柔性生产解决方案...

    "天下之至柔,驰骋天下之至坚.无有入于无间,吾是以知无为之有益."老子指出,世间最柔弱的东西里面往往蓄着人们看不见的巨大力量,使得最坚强的东西也无法抵挡.就像水是最柔的东西,但却能 ...

  3. 小批量、多品种生产模式如何快速响应客户交期

    总经理在面对糟糕的履约情况时,经常质问供应链总监和CIO们:"别扯太远了!你们就告诉我,面对我们每月上千个不同品种.每周每天几百个不同交期的定单与客户的紧急插单,几十道工序,几千种物料--, ...

  4. 多品种、小批量生产计划的编制方法与质量控制措施

    当下中国制造业多集中在多品种小批量生产企业,这种生产方式开始占有越来越重要的地位. 随着市场竞争的加剧,现代企业所处的市场环境发生了深刻的变革,企业竞争越来越强调基于客户需求的竞争.因此,企业的生产方 ...

  5. 2022年高教社杯国赛E题思路——小批量物料的生产安排

    1 E题:小批量物料的生产安排 某电子产品制造企业面临以下问题:在多品种小批量的物料生产中,事先无法知道物料的 实际需求量.企业希望运用数学方法,分析已有的历史数据,建立数学模型,帮助企业合理地 安排 ...

  6. 小批量制造企业生产计划

    随着信息科技的发展和市场需求的多样化,产品定制化要求越来越高,交期要求越来越短,成本竞争越来越明显,传统制造行业的生产方式越来越不适应动态变化的市场需求.订单型生产企业采取怎样的生产计划与控制方法来快 ...

  7. Python-项目实战-《外星人入侵》Pygame小游戏-阶段二:外星人来了

    来源于<Python编程从入门到实践>的13章外星人来了. 此为第二阶段: Python-项目实战-<外星人入侵>Pygame小游戏-阶段一:武装飞船(含教程)_Kox233的 ...

  8. Vue + Spring Boot 项目实战(二十一):缓存的应用

    重要链接: 「系列文章目录」 「项目源码(GitHub)」 本篇目录 前言 一.缓存:工程思想的产物 二.Web 中的缓存 1.缓存的工作模式 2.缓存的常见问题 三.缓存应用实战 1.Redis 与 ...

  9. go-ElasticSearch实战篇(二)

    前言 哈喽,everybody,这是go-elastic学习系列教程第二篇文章.????上一篇我们学习了ElasticSearch基础,如果还不懂基础的,可以先看一看上一篇文章,????传送门.这一篇 ...

最新文章

  1. Centos6.4建立本地yum源
  2. webpack 配置简单说几句 ?
  3. c++ 获取64位进程模块地址_针对银行木马BokBot核心模块的深入分析
  4. 单片机GPIO软件模拟I2C通讯程序
  5. Java非线程安全问题的解决方法
  6. C语言如何使用其他文件定义的结构体?(C++报错:无法转换到不完整的类【需在头文件中定义结构体??】)
  7. 63. Unique Paths II and 64. Minimum Path Sum
  8. db h2 数据类型_H2Database数据类型
  9. Flutter快速上车之Widget 1
  10. 博为峰Java技术题 ——JavaSE Swing顶层容器中添加菜单栏
  11. 掌门教育微服务体系 Solar(下)
  12. DelayQueue浮光掠影
  13. 【热点】印度年轻人跟中国年轻人有什么不同
  14. 202105 word中部分文字有背景颜色,无法去除
  15. R语言gganimate的使用与呈现
  16. JavaIO—Day21
  17. VScode常用插件下载
  18. 考虫第十一节课 写译3:救命作文2
  19. java 54张扑克牌_Java基础高级综合练习题扑克牌的创建
  20. 电磁攻击方法与能量攻击方法的对比

热门文章

  1. 淘宝爬取图片和url
  2. Win11 + RTX3060 配置Cuda等深度学习环境
  3. 【机器人学习】四自由度机械臂运动学轨迹规划分析+运动空间分析+动力学分析(三维模型+matlab代码)
  4. “会员制营销”和“EMAIL营销”
  5. winxp iso镜像u盘安装
  6. 驾照理论考试android应用
  7. 360 mysql读写分离_基于360的Atlas中间件实现MySQL的读写分离
  8. 帽子设计作品——蒸汽朋克的乌托邦,机械配件的幻想世界!
  9. 游戏做任务的基本流程
  10. iOS14 第6个测试版发布,更新内容一览