返回列表 回复 发帖

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

随手翻译了一下,不成体系。搞清楚合成器的第一个输入端口和其他输入端口的区别可能更容易看懂。
  1. /**根据全局表更新合成清单*/
  2. string tablename ="订单表";
  3. /*
  4. This option should only be used on Combiners.
  5. 这段代码只能用于合成器。
  6. Each column in the GlobalTable is the component list for a single itemtype.
  7. 全局表中的每一列是被合成临时实体的清单。
  8. The itemtype of the first flowitem to enter is used to find the correct column.
  9. 从第一个输入端口进入的临时实体的类型决定了在全局表中的哪一列去查询合成清单。
  10. It is assumed that the global table has a row for each input port number 2 and higher.
  11. 全局表的每一行都代表着一个编号大于等于2的输入端口。
  12. */

  13. if(port == 1)
  14. {  //The trigger on entry code fires each time a flow item enters the combiner.
  15.    //For this reason we check to make sure that the port entered is equal to 1
  16.    //because only the container will enter through port 1.
  17.         //每个临时实体进入合成器都会激活进入触发,所以必须要检查临时实体是否是从第一个端口进入的。
  18.         //只有从第一个端口进入的临时实体才是托盘等容器类临时实体。
  19.         //在上文已经解释过,第一个端口进入的临时实体的类型决定了采用全局表中的哪一列来设置合成清单。
  20.   //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
  21.   //合成清单以表格的形式存在。我们可以使用cell命令来获取数据节点。
  22.   //the number of items to retrieve from each port.  Once you know what node contains the information you can use the setnodenum
  23.   //command to set the component list number based on the global table.
  24.   //当你知道数据存储于哪个节点之后,你就可以读取全局表中的数据,然后使用setnodenum命令在合成器中设置合成清单。

  25.   treenode thelist = getvarnode(current,"componentlist");
  26.   treenode thesum = getvarnode(current,"targetcomponentsum");
  27. //更改合成清单需要对两个数据节点进行设置。一个是componentlist,这个节点有一列数据,记录了从每个端口输入多少个临时实体。
  28. //另一个是targetcomponentsum,记录本次打包的临时实体的总数。
  29.   setnodenum(thesum,0);

  30.   for(int index=1; index<=nrows(thelist); index++)
  31.   //componentlist以表格的形式存在,只有一列。如果合成器有n个输入端口,那么就有n-1行。(第一个输入端口输入的是容器)
  32.   {
  33.     setnodenum(cellrowcolumn(thelist,index,1),gettablenum(tablename,index,getitemtype(item)));
  34.     //第一输入端口进入的临时实体的类型,决定了使用全局表中的哪一列数据。
  35.     //把该列数据全部读取出来,依次写入componentlist。
  36.     inc(thesum,gettablenum(tablename,index,getitemtype(item)));
  37.     //同时更新targetcomponentsum的值。
  38.   }
  39. }
复制代码
感谢加老师分享,这么详细的解释对初学者来说是巨大的福音啊
一万年太久,吾辈只争朝夕
1# zorsite
) {* }$ O9 b- }5 G( \5 f
/ [0 }7 |/ H5 ^# u0 v0 H: ~老师,仔细阅读了一下你的解释,我有一个疑问,那如果我是有几个合成器,每个合成器只加工一种零件,也就是每个合成器只有两个输入端,一个是临时实体类型(托盘)输入端1,一个是零件i的输入端2,那这样设置m*n的全局表(m是处理器个数,n是托盘的类型数)还能正确更新合成清单吗?还是谁需要对每一个合成器都重新设置一个全局表?请老师讲解一下
3# 草色青青 & z$ v/ V: J) t2 \
你的问题可以解决呀,所有合成器可以读取同一份全局表,但是读取不同的列就行了
坚持学习flexsim,努力成为一名flexsim仿真工程师
本帖最后由 zorsite 于 2017-4-18 07:40 编辑 + E& ^/ j5 x& a

- D  I# K1 T. J/ C* C 3# 草色青青 ; t5 }% ], z3 e7 y$ }7 v
假设你有3个合成器,分别只接受类型为1、2、3的临时实体进行合成。& t: _3 Y7 Z' D; |. g8 m3 }
托盘类型1托盘类型2托盘类型3
合成器1321
合成器2123
合成器3251
" D7 V4 L5 w: E5 Q+ k$ C3 V; z
/ Q. F  P. R" u* [; B( H
以第3行,第2列为例解释一下这个表格的含义:; t5 V8 M& u( a6 b, ^
当第3个合成器(第三行)接收到类型为2(第二列)的托盘时,从上游拉取5个(第三行第二列的值为5)类型为3(合成器3只合成类型为3的临时实体)的临时实体进行加工。
0 z5 H7 z9 I9 l& Z
: ]" F4 ~' ]# c  V仍然是根据全局表更新组件列表,代码如下:
  1. string tablename = "GlobalTable1";
  2. if(port == 1)
  3. {
  4. int row=ipopno(current,2);
  5. int col=getitemtype(item);
  6. double num=gettablenum(tablename,row,col);
  7. treenode thelist = getvarnode(current,"componentlist");
  8. treenode thesum = getvarnode(current,"targetcomponentsum");
  9. setnodenum(cellrowcolumn(thelist,1,1),num);
  10. setnodenum(thesum,num);
  11. }
复制代码
附件: 您所在的用户组无法下载或查看附件
本帖最后由 zorsite 于 2017-4-18 07:39 编辑
; Z8 @/ J5 J, n* V6 Y  Q
$ H/ N; G8 d; U# S( F更多的时候,我们使用的是这样的表格:
托盘类型1托盘类型2托盘类型3
临时实体类型1123
临时实体类型2121
临时实体类型3121
2 C8 ?) l' s; l4 h) v
: `1 H$ Z1 T/ S7 e( a2 [: X" u% F
只有一个合成器,进入不同类型的托盘时,拉取不同数量的各种类型的临时实体来进行打包。
附件: 您所在的用户组无法下载或查看附件
Mark~
Boom Lulu Luka
6# zorsite
! i% x, t/ u. @8 t# X6 C0 d: [. D; Y% s2 H4 x  G: C

) M: C8 [- t) o: X刚刚学习了这个例子,第一次发现合成器的上游可以不需要与输入端口个数相同的实体,只需要一个实体多次A连接就形成多个端口。所以在使用合成器的时候有n个输入端口,但很有可能只有有小于n的上游固定实体。感觉很有趣啊。
Boom Lulu Luka
谢谢分享,激发了大家的学习兴趣
返回列表