|
先说代码的问题:- /* 标签设置*/
5 s& B: }2 J% q: N9 ]( L/ Z! n - {& t3 T- m. T0 n R6 y% x
- if (port!=1)
3 C& m% a- F7 F, f% ^& l6 C2 T - {1 c- s6 R4 ?; i- R; c
- if(getitemtype(item)==1)
# ~+ e2 [5 C# |# D - {; I2 T ]/ B# ]0 ^4 C/ q4 c6 p
- int value=inc(label(item,"item1"),1);5 T, S# n0 e1 ]
- setlabelnum(item,"item1",value);
- A( D0 f+ M& V& M& ? - }' T$ e3 C: x9 a, y/ e. _
- if(getitemtype(item)==2)8 k6 }; b4 C3 {5 ?, I' p4 E
- {
. w* W5 B9 G* t* ^6 L - int value=inc(label(item,"item2"),1);/ c, Q* e" i7 e1 \* a. u
- setlabel(item,"item2",value);% L( T& x: W$ f8 t2 {( z) T* e
- }
; C* f: Q+ l; S; t2 O% x6 q - if(getitemtype(item)==3)
) `0 g$ \* \! U - {
' z4 O6 ?, g% ^2 v. J+ l - int value=inc(label(item,"item3"),1);
( p9 F6 y- W3 I4 X - setlabelnum(item,"item3",value);8 @+ |$ u( U; s8 R+ t- {
- }
' A2 o5 A' f6 b - if(getitemtype(item)==4)2 v+ A) w& Y o1 j/ F
- {$ q1 Y, J6 H# [2 x2 F L
- int value=inc(label(item,"item4"),1);
# I6 `% w) Q2 F" _, H6 V4 q; F% c - setlabelnum(item,"item4",value);* U1 j. Q R' P0 Q% t
- }
3 |7 X+ L5 Y# x' ^2 x. H$ Z - }
0 c, r: F4 i: o L' p { - }
0 \9 u8 O1 ~6 F7 B
复制代码
/ L+ ^( E) {; P6 R1.你在托盘上创建的标签名是"Item1","Item2"...但是在代码中写成了"item1"、"item2"....。Flexsim代码大小写敏感,所以无法获取到正确的标签。2.你建模的时候使用的是Flexsim2016或更高版本,但是在写代码的时候使用了非常古老的函数setlabelnum。setlabelnum函数已弃用多年,我已经查不到其相关说明了。如果你对点语法不熟悉的话,可以使用setlabel命令代替。setlabel命令可以在没有相应标签名的时候先创建标签再给标签赋值。结合第一个问题,setlabel的结果就是:在找不到"item1“标签的时候,先在item上创建一个名为"item1"的标签,然后再赋值。当然了,因为前一句语句
; H4 E- z* |( g9 Y- int value=inc(label(item,"item1"),1);
复制代码 无法找到正确的标签,所以value永远是0。! j1 L7 L; S: D
3.你在代码中加入了if (port!=1)的判断,这非常正确,应该排除托盘,只在box进入合成器的时候改变标签。但是再想想,你要给谁增加标签呢?是box还是pallet?你希望根据进入box的类型增加pallet上相应标签的值。那么,setlabelnum函数中的第一个参数应该是什么?如果是item的话,就是要在box上设置标签值,而非pallet。所以此处应先找到pallet对象:
N- ~; o. j" F% I% \3 e+ P
. a: O9 X: X7 I3 ?+ R3 ~- if(getitemtype(item)==1)
& U: b% k# Q4 x! D
复制代码 也就是说,你确实应该根据box(item)的类型值来进行判断,但是判断结束之后,你要改变的标签在pallet身上,不在box(item)身上。/ u- O/ ~% B a }6 f/ M4 q, `1 x/ d
4.inc函数本就是增加(减少)节点值。既然已经增加了,就不必要在用setlabel函数重新设置一次了。
{$ [/ ~4 @2 n! V& P" T, P# w- treenode pallet=first(current);8 }! Q s+ x+ V. f# q
- int value=inc(label(pallet,"item1",1);
复制代码 ( F3 ?6 a/ K1 `4 `
" K- }$ V' p5 e+ r* \# |$ A
4 E) \2 c; p6 A6 {2 v# D8 E$ p说完代码问题之后,我们再从模型逻辑上来想一想。
. P$ X" s& _, H% }你在托盘上设置标签值的作用是什么?模型中没有体现出来用处。如果仅仅是为了练习编写代码,这样写当然可以,甚至可以说这是一个非常好的案例。
/ r- M9 @. l# V& N$ E. t如果不是为了练习,这段代码就没有意义了。因为托盘上的临时实体的数量早就在全局表中定义好了。如果需要,直接根据托盘类型值读取全局表就可以了。
S5 g7 ]+ V2 `6 X7 q
$ ^6 f! q# L s, k/ Z' f4 A3 H附上我的代码以供参考。
|4 L3 @& G- i8 K i ?5 I- /* 标签设置*/0 M; Q8 g6 \0 b, e. F/ d5 ?$ X
- if (port!=1)
, ^, s# v+ S( Q6 O1 n - { 9 r$ L; N. @ c n. z( Y8 E
- treenode pallet=first(current);//找到托盘6 E: c# a3 i5 D3 o0 U; {
- int type=getitemtype(item);//获取临时实体类型值5 B' |9 v+ q' g6 f5 i
- string labelname=concat("Item",numtostring(type));//根据类型值生成标签名
$ ^8 ~( |: v: m - inc(label(pallet,labelname),1); //标签值+1
$ P- p2 k1 g) q% q& ?; R+ U - }
复制代码 : r( A* O+ h! l, @+ y: G
. [' m. h3 E: W+ Z9 j% w |
|