|
先说代码的问题:- /* 标签设置*/3 _" \3 s0 ?7 J3 a" ~
- {
/ |2 W" ^0 v0 _$ V8 U0 n - if (port!=1)
% B2 G. V# O3 |& {( s - {; _5 q& V, q; w/ K8 p9 ^2 }
- if(getitemtype(item)==1)
; u7 ]6 t! C7 F3 R - {4 ~, j5 k6 ?% i1 E! J/ Q7 \) ?7 M
- int value=inc(label(item,"item1"),1);6 N4 \4 g) r& b z, x6 ]
- setlabelnum(item,"item1",value);7 x4 F. G" K5 y" i
- }5 r( H% s2 F' q4 `* R/ I' H# K
- if(getitemtype(item)==2)2 Q$ a' _; Z1 l
- {) e" b$ L* a/ d% c, h7 h5 L) j
- int value=inc(label(item,"item2"),1);
, }4 J; {/ P% {5 R" R - setlabel(item,"item2",value);8 _, |' H! g7 s
- } 9 a% d1 G+ i0 y" O! p, f. L
- if(getitemtype(item)==3)
# N$ W- |3 h( O, W! C7 n - {4 K! _8 d% _5 \2 m4 O B. ]7 C
- int value=inc(label(item,"item3"),1);
; d+ Q+ i3 R. R1 J5 a# x; w& V - setlabelnum(item,"item3",value);
* O9 J2 v K5 m- Z' M! I& s - } $ X& Y) J( ?, ?
- if(getitemtype(item)==4)( u+ L$ }+ F9 s9 C* g
- {- x4 a- j5 I6 ~$ M( p* a& j
- int value=inc(label(item,"item4"),1);
7 r9 S* C1 u+ w0 D - setlabelnum(item,"item4",value);( _, U$ \2 ^( H, b9 T) V
- }
7 f# W9 L% |3 ~4 N( ^ - }
' K3 h0 m3 t/ M* C) i9 t - } 2 o& a0 |: ^0 ~, O/ x8 A
复制代码 4 c4 T2 D @& j5 ^: s/ i
1.你在托盘上创建的标签名是"Item1","Item2"...但是在代码中写成了"item1"、"item2"....。Flexsim代码大小写敏感,所以无法获取到正确的标签。2.你建模的时候使用的是Flexsim2016或更高版本,但是在写代码的时候使用了非常古老的函数setlabelnum。setlabelnum函数已弃用多年,我已经查不到其相关说明了。如果你对点语法不熟悉的话,可以使用setlabel命令代替。setlabel命令可以在没有相应标签名的时候先创建标签再给标签赋值。结合第一个问题,setlabel的结果就是:在找不到"item1“标签的时候,先在item上创建一个名为"item1"的标签,然后再赋值。当然了,因为前一句语句 e- \2 F! o9 w
- int value=inc(label(item,"item1"),1);
复制代码 无法找到正确的标签,所以value永远是0。
$ t4 j' p; N! K, u3.你在代码中加入了if (port!=1)的判断,这非常正确,应该排除托盘,只在box进入合成器的时候改变标签。但是再想想,你要给谁增加标签呢?是box还是pallet?你希望根据进入box的类型增加pallet上相应标签的值。那么,setlabelnum函数中的第一个参数应该是什么?如果是item的话,就是要在box上设置标签值,而非pallet。所以此处应先找到pallet对象:; E2 a. x) h$ e( R. i: `9 R$ }6 A
: ]$ ~" @& n/ w$ C4 o, u
- if(getitemtype(item)==1)
5 P: T9 [ m% x
复制代码 也就是说,你确实应该根据box(item)的类型值来进行判断,但是判断结束之后,你要改变的标签在pallet身上,不在box(item)身上。9 t. c: S' _# L# y. t! Z. i ^/ H" n* t
4.inc函数本就是增加(减少)节点值。既然已经增加了,就不必要在用setlabel函数重新设置一次了。+ \6 V. L U8 b4 A9 ?& \+ c9 q
- treenode pallet=first(current);
, s- f i/ q E - int value=inc(label(pallet,"item1",1);
复制代码 7 }- Y* T7 Z# l$ s
- A. K) P9 l- V$ H1 j0 n' i. x2 l
% W9 y5 O Q8 ~# ?) n说完代码问题之后,我们再从模型逻辑上来想一想。
$ n( _7 A! T. X# k; M6 M你在托盘上设置标签值的作用是什么?模型中没有体现出来用处。如果仅仅是为了练习编写代码,这样写当然可以,甚至可以说这是一个非常好的案例。
) b6 |" U2 s: \: {7 j如果不是为了练习,这段代码就没有意义了。因为托盘上的临时实体的数量早就在全局表中定义好了。如果需要,直接根据托盘类型值读取全局表就可以了。0 P* s% S' L+ _- y
; I4 P. M6 _8 e) [6 x% S附上我的代码以供参考。
: q+ l: P8 s7 f$ K; g. k# _$ |- /* 标签设置*/
$ F/ C' t( D* M( O& P6 u - if (port!=1)" D6 ~+ q* o: K# ]3 U. d
- { 4 w4 @ } n3 p8 t" n( Z
- treenode pallet=first(current);//找到托盘7 [0 P( ?, D0 [7 e) A# l0 d$ \" V
- int type=getitemtype(item);//获取临时实体类型值
, g0 s7 o/ n# A - string labelname=concat("Item",numtostring(type));//根据类型值生成标签名( u( w, D5 b6 @
- inc(label(pallet,labelname),1); //标签值+1
) b9 b4 M! |* [$ x+ w: b- w6 Q7 M - }
复制代码 7 N+ _3 t, i2 F
- M4 c! B! R9 t' Q |
|