全球FlexSim系统仿真中文论坛

搜索
查看: 24196|回复: 16
打印 上一主题 下一主题

根据全局表更新合成器的合成清单

[复制链接]
跳转到指定楼层
1#
zorsite 发表于 2015-11-25 11:27:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
随手翻译了一下,不成体系。搞清楚合成器的第一个输入端口和其他输入端口的区别可能更容易看懂。
$ b4 _: ]4 t3 n+ o
  1. /**根据全局表更新合成清单*/0 P" n0 O4 ~6 Y0 g
  2. string tablename ="订单表";
    1 R- j" l- j2 d( `* I, ]7 p0 o, y6 F
  3. /*$ u! V* ?0 m/ y; p
  4. This option should only be used on Combiners.$ \% w& ~. `7 T- ]% N+ \7 O
  5. 这段代码只能用于合成器。
    * W7 L% z: M6 I" Y- U! z
  6. Each column in the GlobalTable is the component list for a single itemtype.
    7 _1 L" q' q7 S: m( T
  7. 全局表中的每一列是被合成临时实体的清单。
    7 _6 G$ Z) g7 j5 ~: r
  8. The itemtype of the first flowitem to enter is used to find the correct column.
    " s# i3 F3 ~. c& u3 y: K! n+ h; h
  9. 从第一个输入端口进入的临时实体的类型决定了在全局表中的哪一列去查询合成清单。
    5 {3 |5 `$ o3 H7 T* u5 D
  10. It is assumed that the global table has a row for each input port number 2 and higher.
    ( p  \# p, O1 c$ Y5 S7 b' v9 m
  11. 全局表的每一行都代表着一个编号大于等于2的输入端口。, D) R2 Q2 Q7 e+ x& j0 {
  12. */4 \0 C! @2 N# g0 ?
  13. $ P& z, I( d2 d6 t
  14. if(port == 1)! k- `/ w! e$ _! t
  15. {  //The trigger on entry code fires each time a flow item enters the combiner.9 A6 x. C5 {0 u& ~8 w
  16.    //For this reason we check to make sure that the port entered is equal to 1
    ' z- u' [: @& T+ P" }% G5 z% r
  17.    //because only the container will enter through port 1.( l# ~( ~; h- ?
  18.         //每个临时实体进入合成器都会激活进入触发,所以必须要检查临时实体是否是从第一个端口进入的。; Q0 X" j# y7 g4 m" H) `2 _2 {
  19.         //只有从第一个端口进入的临时实体才是托盘等容器类临时实体。0 F# A2 g! c, d+ X9 ], l. A* r- z
  20.         //在上文已经解释过,第一个端口进入的临时实体的类型决定了采用全局表中的哪一列来设置合成清单。
    ; H+ m/ n7 L7 C
  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& a# k6 B! U! _0 q) q0 P( G
  22.   //合成清单以表格的形式存在。我们可以使用cell命令来获取数据节点。1 y3 q, F" C3 l
  23.   //the number of items to retrieve from each port.  Once you know what node contains the information you can use the setnodenum5 Q2 w6 |  S! ~  B8 X( P5 c0 z
  24.   //command to set the component list number based on the global table.5 z5 [# Z1 {& y. x, T7 ?
  25.   //当你知道数据存储于哪个节点之后,你就可以读取全局表中的数据,然后使用setnodenum命令在合成器中设置合成清单。
      a' ?. v3 c8 Z7 a7 j

  26. 5 U) Q( I4 i: S
  27.   treenode thelist = getvarnode(current,"componentlist");" h; W( r# ^8 @% ~7 O( B# v
  28.   treenode thesum = getvarnode(current,"targetcomponentsum");
    1 s9 Z2 L- h" a/ g" N* d9 e
  29. //更改合成清单需要对两个数据节点进行设置。一个是componentlist,这个节点有一列数据,记录了从每个端口输入多少个临时实体。
    + _$ D  O- x, n
  30. //另一个是targetcomponentsum,记录本次打包的临时实体的总数。
    % T. v! s; ~: k' E5 T! h9 {* |/ g# n
  31.   setnodenum(thesum,0);2 A% i- K# u  a% \, f8 \
  32. - V$ o4 |6 P- g# h9 T/ u8 O6 {
  33.   for(int index=1; index<=nrows(thelist); index++)
    & _3 v& ]* R, ~* u! s
  34.   //componentlist以表格的形式存在,只有一列。如果合成器有n个输入端口,那么就有n-1行。(第一个输入端口输入的是容器)
    7 m" s  m( `+ }; e% C- p- g1 S" J
  35.   {1 ~; r& H2 k5 V
  36.     setnodenum(cellrowcolumn(thelist,index,1),gettablenum(tablename,index,getitemtype(item)));
    % Q5 d* X* J% m+ o0 T
  37.     //第一输入端口进入的临时实体的类型,决定了使用全局表中的哪一列数据。
    4 y4 q) Z& ]" M
  38.     //把该列数据全部读取出来,依次写入componentlist。( Q( K$ t3 X& b$ t4 @! P1 X
  39.     inc(thesum,gettablenum(tablename,index,getitemtype(item)));5 I# w/ C& D6 E
  40.     //同时更新targetcomponentsum的值。
    3 f6 }) Z+ _; U# C# e
  41.   }7 L# Y) \$ Y8 `, M* t; u
  42. }
复制代码
推荐
 楼主| zorsite 发表于 2020-4-1 20:39:49 | 只看该作者
河上羊 发表于 2020-1-30 16:20
/ h& j$ t; w/ p" T9 I0 a您全局表中临时实体类型1,怎么跟发生器生成的临时实体1绑定的呢?我运行的时候好像是混乱的。
+ u8 g- h4 Q& J+ I/ t" E
这里涉及到几个知识点:
% N( ~2 Y8 J7 u发生器产生不同类型的临时实体(box)
- L6 e* N$ d" t9 W( E  {托盘发生器产生不同类型的容器(pallet)) A8 F+ Q( a" W! h3 y# ]
2 ~* Y' M3 X# Z0 I8 j9 m
暂存区的send to port选项设置为“根据类型发送”,以此让不同的box从不同的端口进入合成器。
: q$ y* B/ o" [; K4 U7 g- n( l# L9 l' v; o& X! @
合成器根据进入托盘的类型在全局表中查找相应的合成清单。
' e5 C# o. i/ m  C
. Y3 l7 Z1 o2 `/ n5 R, J不要着急,多看多思考,再看再思考,又看又思考,慢慢就知道是怎么回事了。
2#
大摸鱼 发表于 2015-11-26 22:31:57 | 只看该作者
感谢加老师分享,这么详细的解释对初学者来说是巨大的福音啊
3#
草色青青 发表于 2017-3-29 14:40:12 | 只看该作者
1# zorsite
2 W$ k  w/ v4 O; S" {
. A8 Y9 r/ d) X& ~0 X. i老师,仔细阅读了一下你的解释,我有一个疑问,那如果我是有几个合成器,每个合成器只加工一种零件,也就是每个合成器只有两个输入端,一个是临时实体类型(托盘)输入端1,一个是零件i的输入端2,那这样设置m*n的全局表(m是处理器个数,n是托盘的类型数)还能正确更新合成清单吗?还是谁需要对每一个合成器都重新设置一个全局表?请老师讲解一下
4#
liuzhifan 发表于 2017-3-30 09:39:17 | 只看该作者
3# 草色青青 $ C- @0 C$ Q- e& T1 H4 A
你的问题可以解决呀,所有合成器可以读取同一份全局表,但是读取不同的列就行了
5#
 楼主| zorsite 发表于 2017-4-18 07:24:37 | 只看该作者
本帖最后由 zorsite 于 2017-4-18 07:40 编辑
" R0 z: H2 z8 n' v0 k0 @/ E% A8 U
2 m/ o2 f# T7 j0 [ 3# 草色青青
4 `0 x' [/ b. D+ `# F假设你有3个合成器,分别只接受类型为1、2、3的临时实体进行合成。
/ |0 H& Y5 T" J8 _4 ?+ P: E
托盘类型1托盘类型2托盘类型3
合成器1321
合成器2123
合成器3251
2 ^" A6 W- u9 g

& X! Y- ?9 u  G- h以第3行,第2列为例解释一下这个表格的含义:$ b% {2 U1 O- X7 J+ S  I5 y
当第3个合成器(第三行)接收到类型为2(第二列)的托盘时,从上游拉取5个(第三行第二列的值为5)类型为3(合成器3只合成类型为3的临时实体)的临时实体进行加工。
: f0 d2 x; B5 {
( d: U3 V- r6 ?/ O% O2 T仍然是根据全局表更新组件列表,代码如下:
  1. string tablename = "GlobalTable1";
    + L- c0 I/ C7 r3 U5 t
  2. if(port == 1)5 t' O4 y! z- g4 o$ U1 [' z+ s
  3. {
    ) g4 L! ^/ L" B8 n& W! m8 I  A
  4. int row=ipopno(current,2);
    0 U3 \2 @) d$ c6 b& c" r! ]1 I
  5. int col=getitemtype(item);
    - n1 {9 G/ F- s! M6 u4 I* N6 x
  6. double num=gettablenum(tablename,row,col);
    , c. j$ R( E$ M& M
  7. treenode thelist = getvarnode(current,"componentlist");' n7 V6 x2 _/ R# x/ G; M$ A+ m2 J
  8. treenode thesum = getvarnode(current,"targetcomponentsum");
    2 l7 k5 s/ A- t" t$ M
  9. setnodenum(cellrowcolumn(thelist,1,1),num);( B7 G3 s: d/ v5 ~, c/ V
  10. setnodenum(thesum,num);
    " }8 |  v" [* \6 n8 N
  11. }
复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
6#
 楼主| zorsite 发表于 2017-4-18 07:35:09 | 只看该作者
本帖最后由 zorsite 于 2017-4-18 07:39 编辑 : ^9 g, K) G& j
& P4 O5 j# N4 W+ m& k# v8 U, q+ Z; B
更多的时候,我们使用的是这样的表格:
托盘类型1托盘类型2托盘类型3
临时实体类型1123
临时实体类型2121
临时实体类型3121
* f, U$ k/ s* U
, Y5 W7 ?+ H7 C  R8 w+ ^- w
只有一个合成器,进入不同类型的托盘时,拉取不同数量的各种类型的临时实体来进行打包。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
7#
lulu-luka 发表于 2017-4-18 11:23:57 | 只看该作者
Mark~
8#
lulu-luka 发表于 2017-4-21 06:10:24 | 只看该作者
6# zorsite
% h& y3 I4 ^: I" a; b5 h8 h- c6 g% Z; }- t" R6 T2 d* J

; l/ @% ?' a3 L5 y) R0 ]刚刚学习了这个例子,第一次发现合成器的上游可以不需要与输入端口个数相同的实体,只需要一个实体多次A连接就形成多个端口。所以在使用合成器的时候有n个输入端口,但很有可能只有有小于n的上游固定实体。感觉很有趣啊。
9#
eb_sun 发表于 2017-4-23 14:04:13 | 只看该作者
谢谢分享,激发了大家的学习兴趣
10#
eb_sun 发表于 2017-5-7 22:58:21 | 只看该作者
再次温习合成器代码,谢谢楼主大神的模型及其详细解释!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|手机版|Archiver|全球FlexSim系统仿真中文论坛 ( 京ICP备14043114号-2 )

GMT+8, 2025-9-19 13:55 , Processed in 0.076882 second(s), 16 queries .

Powered by Discuz! X3.3© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表