|
先说代码的问题:- /* 标签设置*/
' ~. b. q, _( R) ^/ ]7 A4 I - {; E+ d( K. W" T
- if (port!=1)# g- [( o! r8 r. T4 G
- {$ ?8 \! q8 ^) V1 G1 |6 S% {4 x
- if(getitemtype(item)==1)
* K7 i( ^1 h- d f3 ? - {% o& a! c1 R2 b6 N) w
- int value=inc(label(item,"item1"),1);) x7 i9 I2 u8 }+ `5 ?: v! g8 R
- setlabelnum(item,"item1",value);" I2 v: J% P3 N- h8 z
- }
" c6 z3 @" ^( |# M - if(getitemtype(item)==2)) r% q& ~$ N5 s1 z/ ?! ~
- {
) ^8 X5 |) l; a& E; e9 I+ o2 a - int value=inc(label(item,"item2"),1);5 f' h7 V' g6 `
- setlabel(item,"item2",value);
5 Y6 S& L9 G2 I+ _2 D8 G5 o. f - } 6 Q( Z5 e1 M8 }5 Z1 D
- if(getitemtype(item)==3)2 |" U4 c$ P, m5 J1 S. X5 k
- {- Z, O, z' p! e, n9 r
- int value=inc(label(item,"item3"),1);
% u8 v; K0 w9 u - setlabelnum(item,"item3",value);: J" Q! e& i0 N: ? f6 v
- }
' t; Z, _6 b G! D( \ - if(getitemtype(item)==4)8 i; i ?5 R# Y7 I" _* A6 Y# D& K
- {. I! l- X( a9 |+ F. c& \ L' A
- int value=inc(label(item,"item4"),1);0 d0 ~4 z% U! O4 H6 {8 f9 n0 v
- setlabelnum(item,"item4",value);5 u7 E) P9 w7 J2 l8 f9 D
- }
. r& J/ I+ L" l - }
) }9 o: M6 ?, s/ _9 C5 G. ? - } : 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
- 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: _
- 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
- treenode pallet=first(current);1 l8 f/ U: }5 b4 ]
- 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
- /* 标签设置*/
2 g3 u J: G1 |4 p - if (port!=1)
M8 r5 ^* A5 K$ j- _/ |+ }1 X+ A - { ) z$ u$ D2 S4 T
- treenode pallet=first(current);//找到托盘
# n( u! v$ E9 M% W3 L: }9 i - int type=getitemtype(item);//获取临时实体类型值+ x7 P1 n. M% Q; s
- string labelname=concat("Item",numtostring(type));//根据类型值生成标签名7 ?, ]( ] G; H
- inc(label(pallet,labelname),1); //标签值+1
8 ^/ a S, b1 i/ W - }
复制代码
) c, C: i; E0 R6 A% c- J/ x/ O8 D/ [1 K5 ]
|
|