全球FlexSim系统仿真中文论坛

标题: 传送带和分拣传送带的输出端口确定机制 [打印本页]

作者: zorsite    时间: 2013-9-12 20:56
标题: 传送带和分拣传送带的输出端口确定机制
本帖最后由 zorsite 于 2013-9-13 09:47 编辑 4 E4 }, r6 i* L+ z, k/ x
) L- q: B. D3 S# E1 O  Y# i
当传送带有多个输出端口,需要指定从哪一个端口输出时,可以直接指定目标端口的序号。: P5 K6 s: z# C2 r/ \* ?9 J7 l, h
以按临时类型来指定输出端口为例,只需在传送带的“发送至端口”代码区录入以下代码:
  1. treenode item = parnode(1);) @: Q6 L8 I" O# }6 W9 `* H
  2. return getitemtype(item);
复制代码
当临时实体进入传送带后,传送带读取临时实体的类型,然后分配至与类型相同的输出端口。这种机制很好理解。
" {: ]4 [4 Q, W, g2 o8 W& g6 |" _  m6 h5 W
延伸思考:! r" j. |& Z5 ~+ Y( D2 r7 \( r
如果return 0;,表示什么意思?第一个可用端口。+ z9 g+ o, I! y8 ]% Z
如果return -1呢?不发送。( Z6 X$ _! \, q7 P
如果return一个不存在的端口值,比如return 1000000,又会出现什么情况?道理同-1,找不到端口,不发送。9 X5 t# x' x7 B- {0 C2 r! [- ?% B* y
7 I! F  w* z( G. ?  y5 j4 P! }
  q! B1 _. x1 f; A/ Z/ ]; \: [
但分拣传送带的输出端口分配机制有些不同。4 D/ \6 X, H- J$ I; y
分拣传送带没有“发送至端口”这一选项,取而代之的是“发送条件”。默认的发送条件是“一直发送”。打开“一直发送”的代码编辑窗口,核心代码只有一句:
  1. return 1;
    : E9 x* {. s" U) B  G% g7 D
复制代码
把return 1改为return 2、return 3、return 0、return -1会是什么情况?; @) g) ~9 O/ E# R1 D+ M9 ~+ [
return 0不发送) s  C7 F' z  x6 J5 e8 |. W
return 1发送到第一个可用端口,如果没有可用端口则不发送。
- [: B, z8 Y( v) d3 L! {return 2,return 3...return 100000,同return 1+ s: d( k0 w, M# Q
return -1,同return10 M9 B8 Q; [5 t& C
  c0 ]% B$ F$ i2 W7 i7 N
也就是说,分拣传送带的发送条件只返回两种值:零和非零。返回零时不发送,返回非零时发送。
2 q3 h7 f& ]& Y7 K  _  V那么,如何确定发送至哪一个端口呢?+ l4 u9 g  g9 p# o
临时实体进入分拣传送带后,分拣传送带读取临时实体的类型,并依次与现有输出端口对比。
# U* n7 r) z: p# |# L6 J如果临时实体类型与某一端口号相符,则返回Ture,从此端口发送。( t9 a- t! y( V
如果不相符,返回False,继续与下一端口进行对比,直到找到相符的端口。; r4 W+ \9 o! ~. J4 a, N1 Q
如果全部端口都不相符,则不发送。
9 e  l2 ^9 s% {5 V8 \9 D+ C1 ^( e; J. ]2 s
如果仍然由临时实体的类型决定的话,应该用以下代码实现:
  1. $ T$ F6 J" [9 t) {( H$ e
  2. return (getitemtype(item)==port);
    2 \3 H2 S# p; c, Z# |2 t1 X
复制代码
上述代码比较临时实体的类型和端口号,
1 F+ L* a; w5 z如果两者相符,则返回TURE,发送,9 j/ B$ d4 g8 l* o
如果不相符,则返回FALSE,不发送,继续对比下一端口,直到两者相符为止。如果没有任何端口相符,则不发送。7 z# P. `/ B3 d- t

9 r; l& I0 A  ~& p' @3 p8 Y至于一句代码就实现了所有端口的循环对比,我认为可能此对比机制内建于分拣传送带的底层。
作者: 慧娴亚伦    时间: 2013-9-13 10:44
感谢楼主分享软件建模经验!
作者: 天性518    时间: 2013-9-17 13:30
加老师解释的非常清楚,感谢分享。在这里补充一个传送带(基本传送带),这是需要写代码才能接受临时实体与释放,而且它的功能多了一个决策点,这对我们实现一些传送带的功能很有帮助的。
作者: a445608540    时间: 2014-2-13 11:14
这个很给力,必须赞个
作者: a445608540    时间: 2014-2-13 11:17
我试了试,如果发送指定端口可以用: M# x* y) X0 k
switch(port)
+ V6 G6 q( I/ y+ e! V; |# U{
" J+ H4 ?% ~, F+ k& b1 F2 xcase 1: return getitemtype(item)==2;
* F, i6 o$ G0 |; A….. y" V: w, h$ u/ f2 u3 Q0 S
}
作者: gvgasa    时间: 2021-5-11 05:16
谢谢大哥,这个说的太到位了!




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