|
先说代码的问题:- /* 标签设置*/
7 i0 x: K* B4 I- | - {2 v! U# a7 w( Z
- if (port!=1) h, I' H0 d5 O5 I3 i+ E
- {% H6 k3 T. ]8 C. b( O. ?
- if(getitemtype(item)==1). z' b7 j/ O6 x7 {1 Q& q
- {
. q5 {3 x+ ] w4 p - int value=inc(label(item,"item1"),1);- y6 W- x" C7 r" p1 S/ _
- setlabelnum(item,"item1",value);, d" \* ?9 J0 D
- }. _, E1 s. s+ q5 A6 _. S2 e9 X
- if(getitemtype(item)==2)
6 e1 J( n6 Z, h& ] - {
- U# A2 `, w6 |. x+ B& {$ a6 c) N - int value=inc(label(item,"item2"),1);
& e" g3 u8 b+ o2 G - setlabel(item,"item2",value);, `# n/ s9 _7 L
- }
3 b, ~/ R- p( Z - if(getitemtype(item)==3)0 v! t4 q4 d3 h3 t1 n$ _$ b
- {7 v0 U7 x, K, k9 Y" O/ R
- int value=inc(label(item,"item3"),1);
) a" W4 {# f, P - setlabelnum(item,"item3",value);
6 W B1 G6 R: F% H. { - }
) X9 j+ I6 f& F. L# ` - if(getitemtype(item)==4)
+ G& O% `/ P& b - {
; T9 X# m' ?. M) X4 m - int value=inc(label(item,"item4"),1);/ V' ~0 N; y/ N" ]) R
- setlabelnum(item,"item4",value);
/ s; f' Y$ Y. T/ u" S: x! T g - }
5 W5 ]% @% k1 A8 Q7 |4 k - }
9 l4 I* }- {1 C- z2 ^ - }
' k6 _: M1 q' ^5 Z9 g; T# c- g
复制代码 " n7 A) b( ^3 F) P4 _. }
1.你在托盘上创建的标签名是"Item1","Item2"...但是在代码中写成了"item1"、"item2"....。Flexsim代码大小写敏感,所以无法获取到正确的标签。2.你建模的时候使用的是Flexsim2016或更高版本,但是在写代码的时候使用了非常古老的函数setlabelnum。setlabelnum函数已弃用多年,我已经查不到其相关说明了。如果你对点语法不熟悉的话,可以使用setlabel命令代替。setlabel命令可以在没有相应标签名的时候先创建标签再给标签赋值。结合第一个问题,setlabel的结果就是:在找不到"item1“标签的时候,先在item上创建一个名为"item1"的标签,然后再赋值。当然了,因为前一句语句( ] D' G {: D1 K
- int value=inc(label(item,"item1"),1);
复制代码 无法找到正确的标签,所以value永远是0。' D j" a/ u3 V) P- q
3.你在代码中加入了if (port!=1)的判断,这非常正确,应该排除托盘,只在box进入合成器的时候改变标签。但是再想想,你要给谁增加标签呢?是box还是pallet?你希望根据进入box的类型增加pallet上相应标签的值。那么,setlabelnum函数中的第一个参数应该是什么?如果是item的话,就是要在box上设置标签值,而非pallet。所以此处应先找到pallet对象:/ [+ X5 P7 N( U% @
2 N$ f d7 i3 q' G7 B- if(getitemtype(item)==1)
4 ?& l9 b' s# C! G) J+ W" C- K8 n
复制代码 也就是说,你确实应该根据box(item)的类型值来进行判断,但是判断结束之后,你要改变的标签在pallet身上,不在box(item)身上。
; @3 c" p( _3 w4.inc函数本就是增加(减少)节点值。既然已经增加了,就不必要在用setlabel函数重新设置一次了。
, G# q2 G) O. r8 q( X. h- treenode pallet=first(current);
. X$ B$ W! n9 x) f. G3 r5 t - int value=inc(label(pallet,"item1",1);
复制代码
5 t# a! B( z- O7 b
- @/ M" n) }4 i" E" s2 W9 T; T
# }5 S, [3 C8 e& A0 b/ C说完代码问题之后,我们再从模型逻辑上来想一想。3 h( m& W# A' k' `
你在托盘上设置标签值的作用是什么?模型中没有体现出来用处。如果仅仅是为了练习编写代码,这样写当然可以,甚至可以说这是一个非常好的案例。
# b& E! ~5 p2 O, A, X2 {9 _! l如果不是为了练习,这段代码就没有意义了。因为托盘上的临时实体的数量早就在全局表中定义好了。如果需要,直接根据托盘类型值读取全局表就可以了。* R; X' ~9 Z2 u
" I6 @ N; C L8 {( j附上我的代码以供参考。1 l# }* V( P' q8 D" q: B
- /* 标签设置*/# ^- N( n: b* c
- if (port!=1)
! ^2 M, s$ H' R: W& w" a$ H8 } - {
9 Z6 G$ n. n) O1 ]0 W& c Q - treenode pallet=first(current);//找到托盘# V2 C* z" U/ @* ~
- int type=getitemtype(item);//获取临时实体类型值
, v, E& v: Q! {, V/ Q - string labelname=concat("Item",numtostring(type));//根据类型值生成标签名
4 K0 K) T1 e6 w - inc(label(pallet,labelname),1); //标签值+1
: V1 F( b# @& z9 V" s0 J- V - }
复制代码
" w# C6 T$ {2 }
* z' S) f# F3 n+ W% t |
|