|
先说代码的问题:- /* 标签设置*/% h R0 O& s+ ?. W, V& @; t8 F1 [
- {; z9 E* P& J* V+ f% p% @
- if (port!=1)- W( V5 k4 z5 x+ s
- {$ U, f' Y4 L0 l) P( f
- if(getitemtype(item)==1)8 N& F7 I4 f4 V3 u
- {
' H0 h8 ^* ^9 M% {; s% F# F - int value=inc(label(item,"item1"),1);
' ~1 X+ |) h M# a, J7 E3 Z - setlabelnum(item,"item1",value);
c3 s" u6 w- O( z2 ] - }' b/ u+ g6 N# U6 W$ z2 Y7 a
- if(getitemtype(item)==2)
, R. o, r0 k& X - {
! M+ D4 d! N0 E/ |9 Y9 z - int value=inc(label(item,"item2"),1);9 K/ ]4 @6 m6 |# _/ h6 l# n
- setlabel(item,"item2",value);
8 |0 ?& X- y# \( B - }
2 m. P. ~; d; V4 _4 z; n; x - if(getitemtype(item)==3)) W% U( K5 ] R
- {6 o8 [* R) c( q7 s( m3 L6 U, j2 {: @
- int value=inc(label(item,"item3"),1);
; a9 [0 {8 j# c" N+ k - setlabelnum(item,"item3",value);
: V# @) q% `; F# o2 H - }
3 h0 w b Z- E0 }; w - if(getitemtype(item)==4)
* w* T" k% o* p - {+ E) J. D( D9 K5 b
- int value=inc(label(item,"item4"),1);2 e, O) `- `. U1 F" c: [- s$ J3 i0 x
- setlabelnum(item,"item4",value);
) q k3 U$ Z0 E! j8 g0 @3 F# Q7 } - } 8 c; }" T1 }, |- V
- } % v) X& n* B' ~1 B5 W9 u( v9 [
- }
: |. R [8 H" ?/ n' P
复制代码
- Y7 m! m3 e6 e7 t H2 v6 r1.你在托盘上创建的标签名是"Item1","Item2"...但是在代码中写成了"item1"、"item2"....。Flexsim代码大小写敏感,所以无法获取到正确的标签。2.你建模的时候使用的是Flexsim2016或更高版本,但是在写代码的时候使用了非常古老的函数setlabelnum。setlabelnum函数已弃用多年,我已经查不到其相关说明了。如果你对点语法不熟悉的话,可以使用setlabel命令代替。setlabel命令可以在没有相应标签名的时候先创建标签再给标签赋值。结合第一个问题,setlabel的结果就是:在找不到"item1“标签的时候,先在item上创建一个名为"item1"的标签,然后再赋值。当然了,因为前一句语句9 [4 |6 H. q' }8 P& ^) b
- int value=inc(label(item,"item1"),1);
复制代码 无法找到正确的标签,所以value永远是0。7 K& q' s- ~8 a5 X- Z+ G& a, c
3.你在代码中加入了if (port!=1)的判断,这非常正确,应该排除托盘,只在box进入合成器的时候改变标签。但是再想想,你要给谁增加标签呢?是box还是pallet?你希望根据进入box的类型增加pallet上相应标签的值。那么,setlabelnum函数中的第一个参数应该是什么?如果是item的话,就是要在box上设置标签值,而非pallet。所以此处应先找到pallet对象:# \) `4 x, P- W* O
2 Q. O6 N3 _. C9 b5 d- if(getitemtype(item)==1)6 |% P0 U" A$ P' A; v5 F1 K
复制代码 也就是说,你确实应该根据box(item)的类型值来进行判断,但是判断结束之后,你要改变的标签在pallet身上,不在box(item)身上。
1 A7 c: B. j* n/ b3 N9 G6 F- `4.inc函数本就是增加(减少)节点值。既然已经增加了,就不必要在用setlabel函数重新设置一次了。
2 t5 R% J6 ?9 U/ x; C% B/ i- treenode pallet=first(current);
4 Y# w' Q! N7 \. d) g& j - int value=inc(label(pallet,"item1",1);
复制代码 * C3 F: u# H8 v
2 o( u# y' H+ F) ~+ @# s& j. r/ j) W! `% d
说完代码问题之后,我们再从模型逻辑上来想一想。# r7 A- {; M2 |- t! m; A& k7 L
你在托盘上设置标签值的作用是什么?模型中没有体现出来用处。如果仅仅是为了练习编写代码,这样写当然可以,甚至可以说这是一个非常好的案例。
. v- D4 s2 k8 `+ c& ^1 v2 M如果不是为了练习,这段代码就没有意义了。因为托盘上的临时实体的数量早就在全局表中定义好了。如果需要,直接根据托盘类型值读取全局表就可以了。 I' a: {/ g1 ^# Y$ M) T
3 `% [' W! g# H! S4 k* n& |- A( e附上我的代码以供参考。
3 l& E5 H- N* V5 s" u- /* 标签设置*/) l) O# P e8 N: g" {5 R7 Q
- if (port!=1)* e1 x1 A* U2 H* b8 P V1 q
- {
1 p2 N5 Y8 `/ b: J) i; C m) c - treenode pallet=first(current);//找到托盘
4 r6 Q! c( D) @1 ~+ {3 o- h - int type=getitemtype(item);//获取临时实体类型值
& r( ?. y9 }; d0 X7 b - string labelname=concat("Item",numtostring(type));//根据类型值生成标签名
% ~" H) X' Y* T8 b1 B - inc(label(pallet,labelname),1); //标签值+18 u/ P& ^* [1 P' x
- }
复制代码 - D- k% a' F5 l! h5 T- K" g
8 \1 B% z8 X. K4 G- I- h+ c
|
|