全球FlexSim系统仿真中文论坛

标题: flexsim入门:上传实训时的小题目和模型(8) [打印本页]

作者: adysunshine    时间: 2012-8-10 08:51
标题: flexsim入门:上传实训时的小题目和模型(8)
1 模型描述
发生器产生四种临时实体,服从整数均匀分布,类型值分别为1、2、3、4,颜色分别为红色、蓝色、黑色、黄色,进入暂存区;
四种临时实体最后将被分别放置到四个货架相应的位置上,每个货架都分为10列、6层;每个临时实体被放置到货架上的位置是随机的,每个临时实体被放置到货架上的列数和层数都服从整数均匀分布;
红色和蓝色临时实体进入分拣传送带1自动分拣,分拣传送带1长度为10,接着蓝色临时实体从分拣传送带1的出口点2处被分拣至传送带1上,然后堆垛机1将传送带1上的临时实体放置到货架2相应的位置上;
红色临时实体从分拣传送带1的出口点5处被分拣至传送带2上,然后堆垛机1将传送带2上的临时实体放置到货架1相应的位置上;
同样的,黑色和黄色临时实体进入分拣传送带2自动分拣,分拣传送带2长度为10,接着黄色临时实体从分拣传送带2的出口点2处被分拣至传送带3上,然后堆垛机2将传送带3上的临时实体放置到货架3相应的位置上; 黑色临时实体从分拣传送带2的出口点6处被分拣至传送带4上,然后堆垛机2将传送带4上的临时实体放置到货架4相应的位置上;
2 模型布局
[attach]701[/attach]
[attach]700[/attach]
作者: pymj4    时间: 2012-8-29 13:00
谢谢
作者: adysunshine    时间: 2012-10-19 10:27
5.0版本的建模步骤
(1)连接
发生器与暂存区——“A”连接;
暂存区分别与分拣传送带1和分拣传送带2——“A”连接;
分拣传送带1分别与传送带1和传送带2——“A”连接;
分拣传送带2分别与传送带3和传送带4——“A”连接;
传送带1与货架1——“A”连接;
传送带2与货架2¬¬——“A”连接;
传送带3与货架3——“A”连接;
传送带4与货架4——“A”连接;
传送带1和传送带2分别与堆垛机1——“S”连接;
传送带3和传送带4分别与堆垛机2——“S”连接。
(2)参数设定
a:临时实体类型和颜色的设定
双击打开“发生器”的属性窗口
打开“触发器”选项卡
在“创建触发”下添加
——设置临时实体类型:
临时实体item
临时实体类型:duniform(1,4)
——根据临时实体类型值设置颜色
值:getitemtype(item)
Cases:
case 1: colorred(item);break;
case 2: colorblue(item);break;
case 3: colorblack(item);break;
case 4: coloryellow(item);break;
default: colorarray(item, value);break;
单击“确定”关闭窗口

b:临时实体流向的设定
双击打开“暂存区”属性窗口
打开“临时实体流”选项卡
在“输出发送至端口”下选择
——根据临时实体类型值执行不同的case值:
值:getitemtype(item)
Cases:
case 1: return 1;
case 2: return 1;
case 3: return 2;
case 4: return 2;
default: return 0;
“确定”
双击打开“分拣传送带1”属性窗口,
在分拣传送带流向属性选项卡下设置“发送条件”
——安端口
case 1: return getitemtype(item) == 2;
case 2: return getitemtype(item) == 1;
case 3: return 1;
default: return 1;
如下图8.1:
[attach]855[/attach]         
图8.1:分拣传送带1流向的设定
        出口改为2和5
[attach]854[/attach]
图8.2:分拣传送带1分拣出口的设定
同理:设置分拣传送带2
[attach]853[/attach]
图8.3:分拣传送带2的输出流向设定
[attach]852[/attach]
图8.4:分拣传送带2分拣出口的设定
其余实体流向均选择默认状态,即发送至“第一个可用端口

c:运输工具的设定
分别设置传送带1、2、3、4使用运输工具
——指定端口 中间端口1

d:临时实体最终位置的确定
双击打开“发生器“属性窗口
在“触发器“选项卡下继续创建”创建触发“
——设置标签:
实体:item
标签:“lie”
值:duniform(1,10)
——设置标签:
实体:item
标签:“ceng”
值:duniform(1,6)
如下图8.5:
[attach]851[/attach]
图8.5:临时实体最终位置的实现(标签的设置)
确定”关闭窗口
双击打开“货架1”属性窗口
在“货架”选项卡“放置到列”选择
——指定
列数:getlabelnum(item,“lie”)
[attach]850[/attach]
图8.6:放置到货架列位置的设置(通过查询标签)
“放置到层”选择
——指定
层号:getlabelnum(item,“ceng”)
[attach]849[/attach]
图8.7:放置到货架层位置的设置(通过查询标签)
同理:对货架2、3、4做同样的设置
“确定”——“重置”——“保存”
作者: zt130025    时间: 2012-10-24 17:27
很不错的模型
作者: 端的轻飘    时间: 2012-11-1 11:02
学习
作者: zorsite    时间: 2012-12-7 20:25
本帖最后由 zorsite 于 2012-12-8 09:17 编辑

对于这个案例我有一点不明白:货架本身就可以设置随机放置,为什么还要在创建临时实体的时候在增加两个标签来确定该实体在货架中的行列值呢?从最终的结果来看,这么做和在货架中设置随机放置的结果是一样的。

本例中考察的堆垛机、货架的使用,另外还有switch函数的使用。
暂存区send to port代码:
  1. treenode item = parnode(1);
  2. treenode current = ownerobject(c);
  3. int value = getitemtype(item);
  4. switch(value){
  5. case 1: return 1;
  6. case 2: return 1;
  7. case 3: return 2;
  8. case 4: return 2;
  9. default: return 0;
  10. }
复制代码
这段语句最终返回的是1或者2,为send to port指定一个端口号。
当value=1时(即getitemtype返回的值为1——即当前临时实体的类型为1),执行case 1: return 1;返回1。即类型为1的实体从端口1发送。
当value=2时(即getitemtype返回的值为2——即当前临时实体的类型为2),执行case 2: return 1;返回1。即类型为2的实体从端口1发送。
当value=3时(即getitemtype返回的值为3——即当前临时实体的类型为3),执行case 3: return 2;返回2。即类型为3的实体从端口2发送。
当value=4时(即getitemtype返回的值为4——即当前临时实体的类型为4),执行case 4: return 2;返回2。即类型为4的实体从端口2发送。
【如果value不在这4中case之中,比如类型5的临时实体,则返回端口0,即不发送,该临时实体会一直堆积在暂存区中。】这是我的猜测,不知是否正确,有待验证。

这种端口分配规则还可以用另一种思路来解读:
临时实体类型1和2发送至端口1;临时实体类型3和4发送至端口2。
或者:
临时实体类型小于3发送至端口1;临时实体类型大于2发送至端口2。
所以我们可以简化代码:
  1. treenode item = parnode(1);
  2. treenode current = ownerobject(c);
  3. if (getitemtype(item)<3) return 1;
  4. else return 2;
复制代码
上面这段代码没有容错机制,如果来了类型为5的临时实体,也会被发送到端口2。如果要像第一段代码那样严谨,应修改如下:
  1. treenode item = parnode(1);
  2. treenode current = ownerobject(c);
  3. if (getitemtype(item)<=2) return 1;
  4. else
  5.    {
  6.           if(getitemtype(item)>=3 && getitemtype(item)<=4) return 2;
  7.                 else ruturn 0;
  8.    }
复制代码
一般来说,如果case比较少的话,也可以用if语句来实现。

在flexsim6.0中文版中,分拣传送带的默认发送条件只有1个,即一直往第一个(可用)端口发送,我们需要自己编写发送代码。
需要注意的是,分拣传送带和传送带的发送机制是不一样的,见http://flexsim.asia/viewthread.php?tid=3073&extra=page%3D1
每到达一个临时实体,分拣传送带会依次将该实体送往所有端口一一尝试,如果return函数返回ture,则发送;如果return函数返回false,则不发送,继续送往下一个端口进行判断,直至return函数返回ture。
分拣传送带1的send requirement代码如下:
  1. treenode current = ownerobject(c);
  2. treenode item = parnode(1);
  3. int port = parval(2);

  4. switch(port){
  5. case 1: return getitemtype(item) == 2;
  6. case 2: return getitemtype(item) == 1;
  7. case 3: return 1;
  8. default: return 1;
  9. }
复制代码
Case 1实际上指代的是第一端口,如果当前临时实体类型为2,则从第一端口发送;
Case 2指代的是第二端口,如果当前实体为1,则从第二端口发送。
当前分拣传送带有第三个端口吗?我认为没有。
所以对于
  1. case 3: return 1;
  2. default: return 1;
复制代码
我也不明白是什么意思。

实际上,上述代码可以简化:
  1. treenode current = ownerobject(c);
  2. treenode item = parnode(1);
  3. int port = parval(2);

  4. return getitemtype(item) != port;
复制代码
因为是类型为2的临时实体发送到1号端口,类型为1的临时实体发送到2号端口,所以判断条件为不等于。


分拣传送带2的send requirement代码如下:
  1. treenode current = ownerobject(c);
  2. treenode item = parnode(1);
  3. int port = parval(2);

  4. switch(port){
  5. case 1: return getitemtype(item) == 4;
  6. case 2: return getitemtype(item) == 3;
  7. case 3: return 1;
  8. default: return 1;
  9. }
复制代码
同理,上述代码可以简化:
  1. treenode current = ownerobject(c);
  2. treenode item = parnode(1);
  3. int port = parval(2);

  4. return (getitemtype(item)-2) != port;
复制代码

作者: zorsite    时间: 2012-12-7 21:08
本帖最后由 zorsite 于 2012-12-7 21:18 编辑

如果实在不想编写代码的话,可以使用全局表。全局表的使用可以回顾小题目和模型(7)。
暂存区发送至端口设置为查询全局表比较简单,分拣传送带的设置相对比较麻烦。关键还是分拣传送带的端口分配机制比较特殊。

对于分拣传送带的发送条件设置,可以按如下步骤进行:
创建一个名为duankou的全局表,4行,每一行的值如下:
2
1
2
1
两条分拣传送带发送条件代码:
  1. treenode current = ownerobject(c);
  2. treenode item = parnode(1);
  3. int port = parval(2);

  4. return gettablenum("duankou",getitemtype(item),1)==port;
复制代码

作者: zorsite    时间: 2012-12-8 10:08
switch case的处理是这样的:
如果每个case语句后面不加break,那么程序会顺着那个找到的case顺序执行下去,直到遇到break,或者return才跳出switch。




欢迎光临 全球FlexSim系统仿真中文论坛 (http://www.flexsimasia.com/) Powered by Discuz! X3.3