全球FlexSim系统仿真中文论坛

标题: 根据全局表更新合成器的合成清单 [打印本页]

作者: zorsite    时间: 2015-11-25 11:27
标题: 根据全局表更新合成器的合成清单
随手翻译了一下,不成体系。搞清楚合成器的第一个输入端口和其他输入端口的区别可能更容易看懂。- {" I* @' G) v& |3 x# `2 ^
  1. /**根据全局表更新合成清单*/1 U0 S" a2 R1 A+ W; G; q: s9 n( O
  2. string tablename ="订单表";
    " T; d+ T; d; C; z4 g; q& n
  3. /*0 }& h5 m' G8 J' u# k) D/ w. D7 s
  4. This option should only be used on Combiners.8 I8 o3 w+ i" z% e! @4 `
  5. 这段代码只能用于合成器。
    ; j0 b, X' s, b2 ]. t7 a
  6. Each column in the GlobalTable is the component list for a single itemtype.  V' j. X% [& I& _6 K) i
  7. 全局表中的每一列是被合成临时实体的清单。9 ?/ m/ @0 Q% V" y: w
  8. The itemtype of the first flowitem to enter is used to find the correct column.2 ^4 {' W, c- @/ U- g9 L
  9. 从第一个输入端口进入的临时实体的类型决定了在全局表中的哪一列去查询合成清单。
      n3 G7 T% n0 }$ ^
  10. It is assumed that the global table has a row for each input port number 2 and higher.
    ; x6 ?3 p! v" L9 u$ O* g
  11. 全局表的每一行都代表着一个编号大于等于2的输入端口。
    ) q  |' ]1 z0 n* Z2 w) t5 I$ P
  12. */0 b7 P2 F. _- j" B0 k9 E! h
  13. 4 j# U+ s, w/ `: H4 h$ m& \
  14. if(port == 1)* e) @+ R1 ?( Q
  15. {  //The trigger on entry code fires each time a flow item enters the combiner.
    6 S* o3 \1 ~% w) D4 I
  16.    //For this reason we check to make sure that the port entered is equal to 1
    " d, _: J) u+ x, j4 K: Q
  17.    //because only the container will enter through port 1.
    2 I: g. q0 ?: [2 ^( d# k! ?, c
  18.         //每个临时实体进入合成器都会激活进入触发,所以必须要检查临时实体是否是从第一个端口进入的。5 A& S) ?0 I* ^" @! m# i4 P
  19.         //只有从第一个端口进入的临时实体才是托盘等容器类临时实体。& e! K" P7 H  R) \, }9 L' V
  20.         //在上文已经解释过,第一个端口进入的临时实体的类型决定了采用全局表中的哪一列来设置合成清单。: j- D0 `5 b  P
  21.   //The component list in a combiner is set up as a table.  This allows us to use the cell commands to obtain the node that contains
    " p7 @/ l; |: C% k7 x6 X; l, D1 Y# ^
  22.   //合成清单以表格的形式存在。我们可以使用cell命令来获取数据节点。6 ]6 K5 B5 k" l# O7 g
  23.   //the number of items to retrieve from each port.  Once you know what node contains the information you can use the setnodenum
    % ?3 M  N$ m* F2 _
  24.   //command to set the component list number based on the global table.
    # F0 G+ q7 j- V  }; H8 }5 k. R% P
  25.   //当你知道数据存储于哪个节点之后,你就可以读取全局表中的数据,然后使用setnodenum命令在合成器中设置合成清单。/ S9 I8 Z* L1 y

  26. ) }! [; |6 _- |! Q4 l, k- q
  27.   treenode thelist = getvarnode(current,"componentlist");7 A0 a% A  Z0 R, m1 ^! D2 S* l* X" k; a
  28.   treenode thesum = getvarnode(current,"targetcomponentsum");
    ( u6 C: N: h' d* P- r" a
  29. //更改合成清单需要对两个数据节点进行设置。一个是componentlist,这个节点有一列数据,记录了从每个端口输入多少个临时实体。! B) ?  b! L# I) M  r
  30. //另一个是targetcomponentsum,记录本次打包的临时实体的总数。: Z! L1 c- ~, t6 }
  31.   setnodenum(thesum,0);
      I, ?: u' u$ L: h
  32. 8 Y. Y8 x! e2 h3 |
  33.   for(int index=1; index<=nrows(thelist); index++)3 ^* g7 M' p# B3 h
  34.   //componentlist以表格的形式存在,只有一列。如果合成器有n个输入端口,那么就有n-1行。(第一个输入端口输入的是容器)" d: S- u! S- O( m. w7 a! X
  35.   {
    6 u- Y4 o  n% Z
  36.     setnodenum(cellrowcolumn(thelist,index,1),gettablenum(tablename,index,getitemtype(item)));
    + A" n- P, K' Y) y
  37.     //第一输入端口进入的临时实体的类型,决定了使用全局表中的哪一列数据。% ^' f; _$ g. I# L) B# N
  38.     //把该列数据全部读取出来,依次写入componentlist。6 ]9 G8 e# Z* N3 E* u/ p
  39.     inc(thesum,gettablenum(tablename,index,getitemtype(item)));
    ) {. e0 z6 U8 h$ d$ ]8 W1 Q
  40.     //同时更新targetcomponentsum的值。, S5 H+ _+ q8 L9 V* q
  41.   }- k! L7 R' J1 _1 k0 v& N
  42. }
复制代码

作者: 大摸鱼    时间: 2015-11-26 22:31
感谢加老师分享,这么详细的解释对初学者来说是巨大的福音啊
作者: 草色青青    时间: 2017-3-29 14:40
1# zorsite
  P+ s0 D' g7 u3 s
2 P  h3 `4 `% f4 g( q老师,仔细阅读了一下你的解释,我有一个疑问,那如果我是有几个合成器,每个合成器只加工一种零件,也就是每个合成器只有两个输入端,一个是临时实体类型(托盘)输入端1,一个是零件i的输入端2,那这样设置m*n的全局表(m是处理器个数,n是托盘的类型数)还能正确更新合成清单吗?还是谁需要对每一个合成器都重新设置一个全局表?请老师讲解一下
作者: liuzhifan    时间: 2017-3-30 09:39
3# 草色青青
+ U2 y; ]8 |# Z. D5 x) B+ h你的问题可以解决呀,所有合成器可以读取同一份全局表,但是读取不同的列就行了
作者: zorsite    时间: 2017-4-18 07:24
本帖最后由 zorsite 于 2017-4-18 07:40 编辑
  r: Y. k( n4 j0 d6 e# q2 |+ P0 a) d
9 F7 O# i  ?! f) u5 S 3# 草色青青
; g$ |) S+ w1 a假设你有3个合成器,分别只接受类型为1、2、3的临时实体进行合成。+ j5 S  }8 q$ E5 ^! j/ ~
托盘类型1托盘类型2托盘类型3
合成器1321
合成器2123
合成器3251
2 T- u7 Z  x/ h$ E
[attach]3634[/attach]
5 O1 Y& C' ?7 m5 s, Y以第3行,第2列为例解释一下这个表格的含义:
8 |3 ?; M8 d7 v+ X, j当第3个合成器(第三行)接收到类型为2(第二列)的托盘时,从上游拉取5个(第三行第二列的值为5)类型为3(合成器3只合成类型为3的临时实体)的临时实体进行加工。9 K) Q- b& }5 H3 K8 u+ |% G1 E
& r2 Y7 }( `0 w# U( o4 [  R0 m
仍然是根据全局表更新组件列表,代码如下:
  1. string tablename = "GlobalTable1";8 K3 m0 T( T" R$ h" x. n; X
  2. if(port == 1)4 ]( l  I  K7 S, B0 f: |
  3. {( U( ~" q; z7 n# o4 K
  4. int row=ipopno(current,2);
      A( j0 m# n' O' e
  5. int col=getitemtype(item);
    3 I( b0 `0 O9 y1 U+ ?
  6. double num=gettablenum(tablename,row,col);, |6 o- c4 [+ f3 I! L3 J0 V, f4 q
  7. treenode thelist = getvarnode(current,"componentlist");: B" o. ^; u) B8 U
  8. treenode thesum = getvarnode(current,"targetcomponentsum");6 L' s9 j3 @! j) H# O. J  h
  9. setnodenum(cellrowcolumn(thelist,1,1),num);
    7 F7 G# W2 r) w: V. q9 u0 a# }
  10. setnodenum(thesum,num);0 A* }5 ?2 v% Y
  11. }
复制代码
[attach]3632[/attach]
作者: zorsite    时间: 2017-4-18 07:35
本帖最后由 zorsite 于 2017-4-18 07:39 编辑 ; }7 f6 V$ I: g: _% O) `! `
0 b% Z. v0 |# E2 [% C3 m
更多的时候,我们使用的是这样的表格:
托盘类型1托盘类型2托盘类型3
临时实体类型1123
临时实体类型2121
临时实体类型3121

8 a( C4 G( n4 O+ N9 i  M) g0 H[attach]3633[/attach], ~, \0 k- L6 s
只有一个合成器,进入不同类型的托盘时,拉取不同数量的各种类型的临时实体来进行打包。
作者: lulu-luka    时间: 2017-4-18 11:23
Mark~
作者: lulu-luka    时间: 2017-4-21 06:10
6# zorsite
# |: B% ]* \5 d9 S8 Q# t" ?( X' D6 z( K
1 ^/ V6 `9 Z. r2 S3 T7 ?; t) B
刚刚学习了这个例子,第一次发现合成器的上游可以不需要与输入端口个数相同的实体,只需要一个实体多次A连接就形成多个端口。所以在使用合成器的时候有n个输入端口,但很有可能只有有小于n的上游固定实体。感觉很有趣啊。
作者: eb_sun    时间: 2017-4-23 14:04
谢谢分享,激发了大家的学习兴趣
作者: eb_sun    时间: 2017-5-7 22:58
再次温习合成器代码,谢谢楼主大神的模型及其详细解释!
作者: lina    时间: 2017-5-15 14:26
可是读取的顺序怎么固定呢?比如按照123顺次进行合成。系统默认的是没有规律的。还有就是我想了好几天也想不明白,一个合成器,两个订单(一个全局表内),两个类型托盘,怎么让一种类型特定合成某张订单?
作者: lulu-luka    时间: 2017-5-16 01:25
11# lina
% P, P: w: @5 Q
0 ?* A5 e8 j; |2 B) n
+ k  k9 i+ V; t, a0 x! r! c9 c您所说的读取顺序是指订单的读取顺序还是单个订单里不同货物的拿取(读取)顺序?另外您下面描述的问题很不清晰,大家可能无法正确理解您的问题所在,建议您在问问题的时候将自己所要实现的功能描述清楚,这样大家才好帮助您。$ X3 ?- R3 `$ n9 u3 F' l
读取顺序的话如果是订单的读取顺序取决于订单进入合成器的第一个端口的前后顺序,单个订单里的读取顺序是按照您的订单全局表和合成器除第一个输入端口的其他输入端口的顺序,系统是有默认规律的。这个规律取决于合成清单和合成器输入端口的排序,通过拉动模式下调用操作员进行搬运是可以看出顺序的区别的,详见附件模型。
作者: zorsite    时间: 2017-5-16 02:07
11# lina 看六楼的案例。
( `/ a- l+ d6 h" [( Dhttp://flexsimasia.com/viewthread.php?tid=5555&page=1&fromuid=610#pid22455' l. I) H0 `6 B7 L8 ]6 C$ }) C

" ]& ?9 c" ]$ I# I7 n, r提示:2 t, `+ ?" W1 y7 T0 u/ F
1.订单和托盘类型是对应的。有几种订单,就应该有几种托盘类型。有几种托盘类型,就应该有几种订单,反映在全局表中,就是应该有几列。% k% G: m/ P$ \9 q
2.“读取的顺序怎么固定”,我想你的意思应该是按照订单1、订单2、订单3依次打包吧。这个订单其实是由托盘发生器产生的托盘类型决定的,如果你想要按顺序,那就在托盘发生器中自己去定义这个顺序。比如使用Arrival Schedule。
3 k- k8 ?. [3 ~6 n
0 _2 M! a' ]$ H, b/ ~5 p& g- ~3 u* n6 L; K8 ^' D" t( q
[attach]3720[/attach]
作者: 河上羊    时间: 2020-1-30 10:17
zorsite 发表于 2017-5-16 02:07
; A! s* u# f6 [11# lina 看六楼的案例。
8 N# j5 ^/ `  @9 hhttp://flexsimasia.com/viewthread.php?tid=5555&page=1&fromuid=610#pid22455 ...
+ B. L1 E- ?: Z
您好,最开始生成的两种货物类型,怎么跟合成器里面绑定的全局表行的货物种类标签绑定的呢?我做的时候输出种类都是混乱的。
作者: 河上羊    时间: 2020-1-30 16:20
zorsite 发表于 2017-4-18 07:35
$ V# ~+ H  Z# R2 L1 F1 H; ~更多的时候,我们使用的是这样的表格:
6 Z$ n! b7 ?/ v% b( D3 z! V
3 Z& i$ _3 {' A& c' ^" f" n只有一个合成器,进入不同类型的托盘时,拉取不同数量的各种类型 ...

! x) y) T& `: Z3 A. x( M您全局表中临时实体类型1,怎么跟发生器生成的临时实体1绑定的呢?我运行的时候好像是混乱的。
作者: zorsite    时间: 2020-4-1 20:39
河上羊 发表于 2020-1-30 16:20
6 `+ m5 p/ B# F您全局表中临时实体类型1,怎么跟发生器生成的临时实体1绑定的呢?我运行的时候好像是混乱的。
# r) [, e( f' r1 C
这里涉及到几个知识点:+ T# ^  F" S: ]- C. ]
发生器产生不同类型的临时实体(box)
* V: H: K" _: w, o3 g. G' {* F2 N托盘发生器产生不同类型的容器(pallet)& s2 |3 ?( [: ^% U' W7 n
, S( d6 ]9 P: |; ^# q. ?0 ]
暂存区的send to port选项设置为“根据类型发送”,以此让不同的box从不同的端口进入合成器。
$ {0 |& A& I- f: g4 }
' W9 M* a, F- s4 v! ~- }合成器根据进入托盘的类型在全局表中查找相应的合成清单。
9 v$ G6 a$ s$ J2 Z& F9 d1 K- E% {) h+ l, E, a
不要着急,多看多思考,再看再思考,又看又思考,慢慢就知道是怎么回事了。
作者: 心乃1234    时间: 2020-4-2 11:24
谢谢分享




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