全球FlexSim系统仿真中文论坛

搜索
查看: 6137|回复: 4
打印 上一主题 下一主题

怎么用标签记录合成器上每种item的数量

[复制链接]
1#
zorsite 发表于 2019-5-20 13:17:14 | 显示全部楼层
先说代码的问题:
  1. /* 标签设置*/
    ' ~. b. q, _( R) ^/ ]7 A4 I
  2. {; E+ d( K. W" T
  3. if (port!=1)# g- [( o! r8 r. T4 G
  4.    {$ ?8 \! q8 ^) V1 G1 |6 S% {4 x
  5.            if(getitemtype(item)==1)
    * K7 i( ^1 h- d  f3 ?
  6.              {% o& a! c1 R2 b6 N) w
  7.                      int value=inc(label(item,"item1"),1);) x7 i9 I2 u8 }+ `5 ?: v! g8 R
  8.                      setlabelnum(item,"item1",value);" I2 v: J% P3 N- h8 z
  9.                      }
    " c6 z3 @" ^( |# M
  10.            if(getitemtype(item)==2)) r% q& ~$ N5 s1 z/ ?! ~
  11.              {
    ) ^8 X5 |) l; a& E; e9 I+ o2 a
  12.                      int value=inc(label(item,"item2"),1);5 f' h7 V' g6 `
  13.                      setlabel(item,"item2",value);
    5 Y6 S& L9 G2 I+ _2 D8 G5 o. f
  14.                      }   6 Q( Z5 e1 M8 }5 Z1 D
  15.            if(getitemtype(item)==3)2 |" U4 c$ P, m5 J1 S. X5 k
  16.              {- Z, O, z' p! e, n9 r
  17.                      int value=inc(label(item,"item3"),1);
    % u8 v; K0 w9 u
  18.                      setlabelnum(item,"item3",value);: J" Q! e& i0 N: ?  f6 v
  19.                      }
    ' t; Z, _6 b  G! D( \
  20.            if(getitemtype(item)==4)8 i; i  ?5 R# Y7 I" _* A6 Y# D& K
  21.              {. I! l- X( a9 |+ F. c& \  L' A
  22.                      int value=inc(label(item,"item4"),1);0 d0 ~4 z% U! O4 H6 {8 f9 n0 v
  23.                      setlabelnum(item,"item4",value);5 u7 E) P9 w7 J2 l8 f9 D
  24.                      }
    . r& J/ I+ L" l
  25.    }                   
    ) }9 o: M6 ?, s/ _9 C5 G. ?
  26. } : f1 Q+ m/ _+ t3 L  Q( R3 w
复制代码
: d2 G  r8 r7 V+ \
1.你在托盘上创建的标签名是"Item1","Item2"...但是在代码中写成了"item1"、"item2"....。Flexsim代码大小写敏感,所以无法获取到正确的标签。2.你建模的时候使用的是Flexsim2016或更高版本,但是在写代码的时候使用了非常古老的函数setlabelnum。setlabelnum函数已弃用多年,我已经查不到其相关说明了。如果你对点语法不熟悉的话,可以使用setlabel命令代替。setlabel命令可以在没有相应标签名的时候先创建标签再给标签赋值。结合第一个问题,setlabel的结果就是:在找不到"item1“标签的时候,先在item上创建一个名为"item1"的标签,然后再赋值。当然了,因为前一句语句+ p" _1 c$ e# I4 J! D
  1. int value=inc(label(item,"item1"),1);
复制代码
无法找到正确的标签,所以value永远是0。+ l% T/ C% q! n" y7 R! t/ _9 Z
3.你在代码中加入了if (port!=1)的判断,这非常正确,应该排除托盘,只在box进入合成器的时候改变标签。但是再想想,你要给谁增加标签呢?是box还是pallet?你希望根据进入box的类型增加pallet上相应标签的值。那么,setlabelnum函数中的第一个参数应该是什么?如果是item的话,就是要在box上设置标签值,而非pallet。所以此处应先找到pallet对象:
. f1 x. V; S' Y/ p# U1 A8 D4 J; I) R/ f' m9 p: _
  1. if(getitemtype(item)==1)
    & `- v8 C7 o' x1 D% V! {+ L: B( t
复制代码
也就是说,你确实应该根据box(item)的类型值来进行判断,但是判断结束之后,你要改变的标签在pallet身上,不在box(item)身上。  a+ i* y7 D, [: s+ L
4.inc函数本就是增加(减少)节点值。既然已经增加了,就不必要在用setlabel函数重新设置一次了。( D8 O/ p2 t# \( P1 @8 D
  1. treenode pallet=first(current);1 l8 f/ U: }5 b4 ]
  2. int value=inc(label(pallet,"item1",1);
复制代码
3 W+ d3 V: a9 h. s9 `0 r9 Y

- ?! v, h9 a: ~4 \, J! J- Z+ v2 b  F  v8 H4 x. r% z8 z. X/ e  y' u
说完代码问题之后,我们再从模型逻辑上来想一想。1 E) r6 j% T$ U
你在托盘上设置标签值的作用是什么?模型中没有体现出来用处。如果仅仅是为了练习编写代码,这样写当然可以,甚至可以说这是一个非常好的案例。
& E8 `1 S9 x/ B0 a' v4 B如果不是为了练习,这段代码就没有意义了。因为托盘上的临时实体的数量早就在全局表中定义好了。如果需要,直接根据托盘类型值读取全局表就可以了。: j$ d" ~7 |8 ?& b- E
' P2 `% o9 s  d* v' h
附上我的代码以供参考。6 [3 ?3 t' w0 E6 H2 W
  1. /* 标签设置*/
    2 g3 u  J: G1 |4 p
  2. if (port!=1)
      M8 r5 ^* A5 K$ j- _/ |+ }1 X+ A
  3. {          ) z$ u$ D2 S4 T
  4.         treenode pallet=first(current);//找到托盘
    # n( u! v$ E9 M% W3 L: }9 i
  5.            int type=getitemtype(item);//获取临时实体类型值+ x7 P1 n. M% Q; s
  6.            string labelname=concat("Item",numtostring(type));//根据类型值生成标签名7 ?, ]( ]  G; H
  7.         inc(label(pallet,labelname),1);        //标签值+1
    8 ^/ a  S, b1 i/ W
  8. }
复制代码

) c, C: i; E0 R6 A% c- J/ x/ O8 D/ [1 K5 ]
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-7-13 16:25 , Processed in 0.081438 second(s), 13 queries .

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

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