|
先说代码的问题:- /* 标签设置*/
1 i/ w* M/ B+ ~0 [ - {% t7 H# m/ O. B% |" K- `" f
- if (port!=1)
- d1 h3 Q1 k4 s, i, b: V - {& O$ R4 E& T; |3 R9 F- J. U& Y
- if(getitemtype(item)==1); t3 R: h8 L: W; N
- {
$ B6 j0 d8 @! l4 [6 K0 A. c9 q5 ? - int value=inc(label(item,"item1"),1);
; }% ~( F I; _2 d$ e& Q. }* ~ - setlabelnum(item,"item1",value);* k, P+ C1 s3 C4 F0 M
- }( V3 @$ ^' e! W' o+ r9 m3 X8 ^$ Y
- if(getitemtype(item)==2)$ y3 T- W/ v( o5 x8 J7 B
- {
2 ^* k+ Y/ R6 ^2 b6 N - int value=inc(label(item,"item2"),1);0 r7 I# a8 @2 V$ e& X( G
- setlabel(item,"item2",value);
. U* y6 n/ M, S2 ^- v# C - } 3 V' i- G" Y1 d* @! e7 _
- if(getitemtype(item)==3)# H w- b1 g6 U: O$ `; G
- {% V, S) g" _, p% L
- int value=inc(label(item,"item3"),1);: N' O. e2 S0 v, I
- setlabelnum(item,"item3",value);
" ~" ` `* `7 p3 R: g6 E* _2 | - }
: d! N4 ~7 ~0 N. S; t - if(getitemtype(item)==4)
. p6 i5 w2 j- j/ u - {
& O' f/ E2 H2 v - int value=inc(label(item,"item4"),1);( t, b$ Q% r3 V2 I7 z
- setlabelnum(item,"item4",value);
8 ?! H& _; W1 r/ @6 _% s8 w - } + ]5 L8 j4 V" O8 K
- }
6 D# g2 b* Z' U, |$ C% x7 M- D - } 5 D( A/ i3 z2 }
复制代码
( K6 a! [0 `5 Z4 E1.你在托盘上创建的标签名是"Item1","Item2"...但是在代码中写成了"item1"、"item2"....。Flexsim代码大小写敏感,所以无法获取到正确的标签。2.你建模的时候使用的是Flexsim2016或更高版本,但是在写代码的时候使用了非常古老的函数setlabelnum。setlabelnum函数已弃用多年,我已经查不到其相关说明了。如果你对点语法不熟悉的话,可以使用setlabel命令代替。setlabel命令可以在没有相应标签名的时候先创建标签再给标签赋值。结合第一个问题,setlabel的结果就是:在找不到"item1“标签的时候,先在item上创建一个名为"item1"的标签,然后再赋值。当然了,因为前一句语句2 J3 ~) h6 _# L
- int value=inc(label(item,"item1"),1);
复制代码 无法找到正确的标签,所以value永远是0。# ?0 W9 H7 t V
3.你在代码中加入了if (port!=1)的判断,这非常正确,应该排除托盘,只在box进入合成器的时候改变标签。但是再想想,你要给谁增加标签呢?是box还是pallet?你希望根据进入box的类型增加pallet上相应标签的值。那么,setlabelnum函数中的第一个参数应该是什么?如果是item的话,就是要在box上设置标签值,而非pallet。所以此处应先找到pallet对象: J; H& S3 J( N- N; V
6 _( u! v6 F6 {( d( s$ o8 K- if(getitemtype(item)==1)* h" c, }: |' a; [
复制代码 也就是说,你确实应该根据box(item)的类型值来进行判断,但是判断结束之后,你要改变的标签在pallet身上,不在box(item)身上。 I, T& q! m. \' i
4.inc函数本就是增加(减少)节点值。既然已经增加了,就不必要在用setlabel函数重新设置一次了。
# I2 U, ?. q9 ~5 p8 Y- treenode pallet=first(current);8 D C2 n- ]# C
- int value=inc(label(pallet,"item1",1);
复制代码 $ A3 j- m6 W. }$ Z: O% B
2 C/ W" Z& T2 n) j* u/ b( c( U/ N* W D, U0 O* J+ M* m
说完代码问题之后,我们再从模型逻辑上来想一想。
2 E& E0 E3 M- \+ Y8 H `8 H你在托盘上设置标签值的作用是什么?模型中没有体现出来用处。如果仅仅是为了练习编写代码,这样写当然可以,甚至可以说这是一个非常好的案例。. P* ~1 C7 `5 [) C/ i) ~7 z
如果不是为了练习,这段代码就没有意义了。因为托盘上的临时实体的数量早就在全局表中定义好了。如果需要,直接根据托盘类型值读取全局表就可以了。" j" J. N4 X S; ?7 X7 T
2 |! y! J% U0 N2 _
附上我的代码以供参考。+ q8 |& b* t, V% L& a& F
- /* 标签设置*/
) M: B( I% S4 c" j6 c( ] - if (port!=1)
! p- a- R- ^; R- @, Q2 D9 n - { 2 v0 O, M) K5 x. }
- treenode pallet=first(current);//找到托盘& b( ?5 D8 [3 r7 R+ y8 A- y+ _
- int type=getitemtype(item);//获取临时实体类型值
/ h% f" g3 B& b9 ` - string labelname=concat("Item",numtostring(type));//根据类型值生成标签名8 h1 R+ O6 {' c
- inc(label(pallet,labelname),1); //标签值+1
0 R# |$ T& x- l% d, \; ]5 ~ - }
复制代码
; n4 Q- d9 a: c* u4 l6 R: x! K: r3 K% ?+ T1 ~$ O# j: ^/ m8 G' f
|
|