|
先说代码的问题:- /* 标签设置*/( m; ^3 `7 H! v9 C
- {: q* Q9 }7 C' z2 V4 n
- if (port!=1)8 ?, h! X% t/ L1 c: N( D
- {3 B' e8 z2 p# s* i
- if(getitemtype(item)==1)) Q( H6 ?* x) w( H6 o; p
- {
) ?( ?6 X; A: v - int value=inc(label(item,"item1"),1);
5 }5 ^6 M+ ?. h9 r - setlabelnum(item,"item1",value);
" r* e% |. p6 J - }
$ k5 m; [- M* `) ~ - if(getitemtype(item)==2)6 [1 T: P [; y c5 D
- {- u. `6 G6 X" ?$ D- y0 u/ |
- int value=inc(label(item,"item2"),1);
0 q. A% c1 i# X& x& Z" E ^ - setlabel(item,"item2",value);
; H) ?: w8 P1 c1 C) P' { - }
5 |2 [& g7 z. _0 @2 h - if(getitemtype(item)==3)
# l8 _+ M# ?; ]" S - {! J/ p) c* C- k
- int value=inc(label(item,"item3"),1);
- k- z4 g' S0 [ - setlabelnum(item,"item3",value);
/ s9 l* Q- V4 M( g: q# v% e - }
7 d& ~( z5 c! L4 ^' z( | - if(getitemtype(item)==4) q% F8 M- z; A [- i+ t
- {
, M6 r k6 X; Y$ i; i1 U8 V6 w* z - int value=inc(label(item,"item4"),1);1 b* }2 u4 o6 I$ x) }
- setlabelnum(item,"item4",value);
5 H% I3 ]3 A3 } }8 {" A( } - }
/ X; b' O6 r' w - }
3 o' k3 B. F# D' h) z* F% ~ - } 0 Y, Z& d. S8 S& b0 y, m' d
复制代码
( t! g% c2 @5 G3 e8 @1 y& `1.你在托盘上创建的标签名是"Item1","Item2"...但是在代码中写成了"item1"、"item2"....。Flexsim代码大小写敏感,所以无法获取到正确的标签。2.你建模的时候使用的是Flexsim2016或更高版本,但是在写代码的时候使用了非常古老的函数setlabelnum。setlabelnum函数已弃用多年,我已经查不到其相关说明了。如果你对点语法不熟悉的话,可以使用setlabel命令代替。setlabel命令可以在没有相应标签名的时候先创建标签再给标签赋值。结合第一个问题,setlabel的结果就是:在找不到"item1“标签的时候,先在item上创建一个名为"item1"的标签,然后再赋值。当然了,因为前一句语句
) N+ Y8 k0 T- f# q- int value=inc(label(item,"item1"),1);
复制代码 无法找到正确的标签,所以value永远是0。! x1 B8 p3 @1 S
3.你在代码中加入了if (port!=1)的判断,这非常正确,应该排除托盘,只在box进入合成器的时候改变标签。但是再想想,你要给谁增加标签呢?是box还是pallet?你希望根据进入box的类型增加pallet上相应标签的值。那么,setlabelnum函数中的第一个参数应该是什么?如果是item的话,就是要在box上设置标签值,而非pallet。所以此处应先找到pallet对象:
& O4 U$ i7 l$ u# T m3 Q5 a2 b
, ], h6 d; s% O3 S- if(getitemtype(item)==1)* Y D1 ^" \9 l
复制代码 也就是说,你确实应该根据box(item)的类型值来进行判断,但是判断结束之后,你要改变的标签在pallet身上,不在box(item)身上。
, S4 X" U* G, e4.inc函数本就是增加(减少)节点值。既然已经增加了,就不必要在用setlabel函数重新设置一次了。6 Z. Y" i Y( H4 s7 f: L6 z
- treenode pallet=first(current);
' d$ ], J: U/ T4 v9 { - int value=inc(label(pallet,"item1",1);
复制代码
- Z* Q8 ]) p" q# e) d
9 o5 p7 [. c- e* B# C" ^/ ?7 _/ H( ]$ j6 m
$ P4 p9 M4 w$ ~. _- Q" `- P. R0 m说完代码问题之后,我们再从模型逻辑上来想一想。4 r4 W. ?' q M
你在托盘上设置标签值的作用是什么?模型中没有体现出来用处。如果仅仅是为了练习编写代码,这样写当然可以,甚至可以说这是一个非常好的案例。
& [. ~$ u8 w. l7 P& U如果不是为了练习,这段代码就没有意义了。因为托盘上的临时实体的数量早就在全局表中定义好了。如果需要,直接根据托盘类型值读取全局表就可以了。
9 B5 Q& d! H1 z7 j5 _
: ]# a' r4 I* @& V. [& P附上我的代码以供参考。
0 J7 R6 p5 k3 Q! u9 @/ c0 {, B- /* 标签设置*/
2 @/ A8 T3 M/ g - if (port!=1)
8 [. X8 ?& [( V! k - { H3 G3 i+ P' V. h
- treenode pallet=first(current);//找到托盘
$ k( @& E5 O5 p# M. P - int type=getitemtype(item);//获取临时实体类型值
9 y- g6 J3 b7 t* ]/ r - string labelname=concat("Item",numtostring(type));//根据类型值生成标签名! _- s& Z. ^" B% ^, b6 |. Q' N
- inc(label(pallet,labelname),1); //标签值+1
" u7 H( {8 e) ~% K - }
复制代码
# F( v# K, \9 r9 a) C6 ~, }2 L: c2 Y6 v/ t$ w/ A: G$ W* |
|
|