全球FlexSim系统仿真中文论坛

搜索
查看: 14855|回复: 10
打印 上一主题 下一主题

【脑洞大开】如何快速获取暂存区各类型临时实体数量

[复制链接]
跳转到指定楼层
1#
zorsite 发表于 2016-4-19 12:19:49 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
在某一时点(时点自己决定)想要获取暂存区中临时实体有多少种类型,以及每种类型的临时实体有多少个。
* [7 b0 V; b# b2 x2 ]$ g如何编写代码最简洁、占用系统资源最少、逻辑最清晰?
# ^1 D2 |- j- k2 f$ [7 V* M1 M! d请回复的时候附上主要代码。
& V8 ?- H2 E& U附件基于Flexsim7.7.4。
& A9 A3 ^- T: v' H, h4 j
; x4 K: W2 u2 z' ^2 f  q+ d: y

本帖子中包含更多资源

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

x
11#
susan 发表于 2016-12-1 13:00:58 | 只看该作者
10# lulu-luka
# A* `' J* h7 c1 u  B
7 t5 |; e: a! r3 L& I5 K
" [% H4 Y* Q! v: X" d您好,该问题已在其他版块回复。
10#
lulu-luka 发表于 2016-12-1 09:59:56 | 只看该作者
1# zorsite 1 \) m8 o8 G$ S* y' H  W
都是大神级别的老师啊~我想实现一个实时的物料拉动,暂存区的实体数量一旦达到某个设定值就会触发发生器批量生产输出,如何用代码实现啊,求助求助
9#
FFFrenk 发表于 2016-5-29 17:41:11 | 只看该作者
看到加老师使用了 SQL这种「作弊」的手段,我也小试牛刀,代码如下:
  1. 9 L! p7 f+ _3 j4 a4 C, l
  2. treenode Queue=node("Queue3", model());//the queue
    4 W7 }: e# U* d: }  U3 {7 B
  3. query("select $2 as Type , count(*) as TypeNum from $1 group by Type",
    ) E( N# D& G* k, @8 c' w2 O7 s
  4.         /*$1*/Queue,1 \. |* F7 g! q& _/ X8 Q3 _
  5.         /*$2*/getitemtype($iter(1)));- x4 ?: }5 N/ d9 N
  6. dumpquery(reftable("ResultTable"), 1);& t+ q8 ]1 g, u
复制代码
8#
xiaoling1569 发表于 2016-4-25 20:03:43 | 只看该作者
2# 慧娴亚伦 # o9 J" \! Y2 r$ s/ `$ b
非常感谢。
7#
xiaoling1569 发表于 2016-4-25 20:03:09 | 只看该作者
2# 慧娴亚伦
6#
 楼主| zorsite 发表于 2016-4-20 16:10:52 | 只看该作者
flexsim的数组功能很弱,我一直想要找一种更为灵活的工具来实现这一目的。
* Q. `7 R* ]( `$ G  O& `FFFrenk给了我新的思路,用bundle data。
2 s2 C# h0 x6 R$ H: d* U7 r3 l& Z相比数组,bundle更灵活,但是不能放在内存中(我不知道如何放入),只能保存在全局表中。. @7 |7 u% Z, k* [
一下是我的代码:" A; x: H( I. z" Z$ V
  1. treenode queue=node("Queue3", model());
    . H( p0 i7 M0 l+ G* N3 b
  2. treenode bundle=reftable("bundle");8 O5 }  L% n5 o+ m" I. n1 T
  3. //创建两张全局表:bundle和统计结果。bundle全局表要勾选上Use Bundle。0 R& t+ T1 [  u7 v" j, q! @
  4. clearbundle(bundle);//清除所有数据7 p+ e, q3 K9 ]
  5. addbundlefield(bundle,"type",1);
    + A+ C0 V7 O, L
  6. addbundlefield(bundle,"qnt",1);//新增字段! Z" h5 v0 b4 o6 _
  7. forobjecttreeunder(queue)
    * q4 u+ y' ?% L7 f. j: D
  8. addbundleentry(bundle,getitemtype(a),1);//把每一个临时实体的类型写入bundle表; E5 x# k7 w8 L6 R  I1 q. h
  9. query("select type, sum(qnt) as quantity from $1 group by type order by type",bundle);//按类型分组统计数量
    " h: G1 \# v' j( R. O5 W" l
  10. //如果全局表勾选了Use Bundle,只能使用$来传递表名,不能使用 query("select * form bundle");
    ) c, f! u- ^2 c- `+ V8 K5 [
  11. //使用as语句指定别名时,别名不能和原来的名字相同:不能使用 sum(quantity) as quantity
      g! H' Q0 v0 L1 I; Y- m
  12. dumpquery(reftable("统计结果"));//输出到统计结果表
复制代码

评分

参与人数 1威望 +20 收起 理由
大摸鱼 + 20

查看全部评分

5#
FFFrenk 发表于 2016-4-19 21:42:53 | 只看该作者
思路是:将 type 转换成 str 作为某个东西的引用,这样就省去了一轮的 Loop ;
7 ]( a/ p* F% d具体来说,是用 bundle 中 getbundlefieldnr 可以传递引用参数来实现。8 }# T+ i, y: Z7 _! W4 p
恰好,7.7版本开始, FlexSim 可以使用 bundle 存储表格数据,不仅带来了更加轻便的数据处理,也带来了很多新的特性。(赶快升级呀!)( Y$ d5 M% o3 g# l( N8 I( _

, S/ W" u; d" h4 d以下是实例:
5 H) l: Z, G2 {; S/ ]( A5 ^创建一个名为"GlobalTable1"的全局表,并改成 Use Bundle。9 f1 \' I8 y4 F2 l. I' U
6 |) S/ @0 p8 A! K  A1 i+ A
之后就是在需要统计的时间点或者事件处,运行如下代码:
  1. / m, z6 l; V  d0 n: O  k
  2. treenode queue=node("Queue3", model());) e: y5 i- g0 J; ?  s# J& R) r

  3. ( Y% X2 Z2 C2 a
  4. treenode targetTable=reftable("GlobalTable1");
    2 `( J& I- w8 p/ e8 g$ P+ S
  5. settablesize(targetTable,1,1);
    7 ?. G1 u; [0 Y4 _
  6. forobjecttreeunder(queue)5 ~* I( {# U& X
  7. {5 b$ Y; `. h+ P) A: p$ ~
  8.         string typeStr=numtostring(getitemtype(a),0,5);" [- k# _/ @/ [; i% ~( l8 }% r5 n
  9.         int col=getbundlefieldnr(targetTable, typeStr)+1;) h2 ^+ p) [$ P9 Z  X9 O
  10.         if (col)
    ! i8 c  \: e) `- e0 S8 q
  11.         {
    + y. n. D; L8 X5 T
  12.                 settablenum(targetTable,1,col,gettablenum(targetTable,1,col)+1);: \  ~5 i1 w# h4 G3 ~$ |
  13.         }7 b: B; z0 U6 a$ e( V7 y+ u3 g9 _
  14.         else
    ) p4 A+ n3 {) f, E2 S: |* r' g
  15.         {
    4 @$ i, }5 E9 c  r* O
  16.                 addtablecol(targetTable);
    " S0 c% u/ d& Q$ C
  17.                 int nrCols=gettablecols(targetTable);- M, L) ~* N, m- c
  18.                 settableheader(targetTable,2,nrCols,typeStr);  H7 C) S& x; |2 ]. b- U4 q
  19.                 settablenum(targetTable,1,nrCols,1);, R. x# \9 _1 D8 t+ t
  20.         }
    0 N0 H* A3 E& q! _" I% r1 f4 j
  21. }% i$ x- S2 O# B# V8 F& Z
复制代码
ps:有个小缺陷,全局表第一行第一列的内容无法加入统计。

评分

参与人数 1威望 +10 收起 理由
大摸鱼 + 10

查看全部评分

4#
FFFrenk 发表于 2016-4-19 20:25:06 | 只看该作者
谢谢陈老师捧场~~# }5 }& S# _% L& a
我的代码写在模型的停止运行中。treenode queue=node("Queue3", model());2 `, Z) I  `8 o  F, o) |
, q$ P8 O6 c- N# s( _$ {; D+ B
settablesize("统计结果",0,0);//清空全局表
/ P1 F( y6 a2 q- T9 C//可以没有直接增加全局表的命令……
  y$ j3 i% ~9 h5 O//先把数据写入数组" t* e8 w* _4 A& L0 y8 A: b: W5 [
...
/ C4 a0 A' c0 ]3 U9 |, H( Tzorsite 发表于 2016-4-19 17:13
0 v2 \6 v' E' T# r0 w6 ^

7 e& N& v5 ?) h7 W- y- Q6 j看了一下加老师代码,有个小问题....
, S$ u5 e, c% k, o3 D$ W5 B2 Jitemtype有可能是多精度型(包括小数、负数)的,并不都是正整数....
3#
 楼主| zorsite 发表于 2016-4-19 17:13:25 | 只看该作者
本帖最后由 zorsite 于 2016-4-20 16:18 编辑
& ?2 D/ P; h# @7 T( F& t1 u) f# A
# @4 _9 _- `" p& D3 @1 E谢谢陈老师捧场~~
( Z7 Y; {* H: d: j* G我的代码写在模型的停止运行中。谢谢FFFrenk的提醒,临时实体的类型并不总是整数,所以以下代码在使用上有局限性。
  1. treenode queue=node("Queue3", model());$ _4 q+ q9 \3 x0 Z0 j, x5 P$ X

  2. 2 x$ w: g5 S2 @' x$ [
  3. settablesize("统计结果",0,0);//清空全局表# Z% ]) x5 C0 l$ f& a  I0 z7 _+ a
  4. //先把数据写入数组! m, ]+ v- j8 q2 Y  u  S" I2 M
  5. int cont=content(queue);//获取暂存区中临时实体总数/ F: |% D- X* S+ L
  6. intarray array=makearray(cont);//创建一个数组8 L& Z- i& t' y
  7. for (int i=1;i<=cont;i++)& D7 _& |) N) T" ^3 ~" g
  8. {
    - d  ?- e5 V! U7 T+ E
  9.         int type=getitemtype(rank(queue,i));
    ' u1 g% y% W; }4 @- q! Y
  10.         array[type]+=1;//计算每种临时实体的数量
    , Q# p' c5 Q6 f' S7 ^# I
  11. }
    * T! i* Y9 p9 P3 v$ {! S/ ]0 i# e0 U! D
  12. //再把数据写入全局表
    2 A6 x+ _7 F8 k6 v, e: [$ l
  13. int row=1;+ E! f& O; \# c& g1 p  d
  14. for (int i=1;i<=cont;i++)
    * Z( h8 [: v+ C: A  p
  15. {        if (array)//如果某种临时实体的数量不为零3 v- F: u+ {6 {. H( J
  16.         {
    4 P! b+ r9 F' u" f) b0 _9 b
  17.                 settablesize("统计结果",gettablerows("统计结果")+1,2);//新增一行
    5 u2 M3 e4 X- u. g& M
  18.                 settablenum("统计结果",row,1,i);//记录其类型
    " ?3 j; L8 L+ E7 A1 J
  19.                 settablenum("统计结果",row,2,array);        //记录其数量; ?+ \( E* L) Y, C8 W( X% \$ e! n- l1 \
  20.                 row+=1;! @; m1 Z+ a, C4 j3 B/ E" a' Q
  21.         }        9 a$ Q! ], E" X( E7 s0 R/ q( e
  22. }
    0 m# J7 a: M" c) k3 i3 Z, S8 L# m
  23. settableheader("统计结果",2,1,"类型");6 Z5 i5 x& ~4 X: A: @- i# ?8 w
  24. settableheader("统计结果",2,2,"数量");
复制代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-6-28 06:01 , Processed in 0.081952 second(s), 16 queries .

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

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