|
先说代码的问题:- /* 标签设置*/: |% t0 G- M2 q. W- F
- {
$ M9 f4 S' T& B, }1 j - if (port!=1)7 m5 t. ^6 I8 U- o5 }
- {
7 V8 X* V# F, i7 B' g - if(getitemtype(item)==1)
! `& |9 ], I. u9 ~ - {
& ~7 S6 \9 B [) ] - int value=inc(label(item,"item1"),1);; |# l6 I4 N7 l* N1 l
- setlabelnum(item,"item1",value);
+ I- W" `+ n3 c0 N0 U6 v$ k* S& B K - }, _0 U& |8 e1 c" {
- if(getitemtype(item)==2)
; B* Y$ M2 w3 K* R5 F- g - {
* x) m$ v! a* |$ E8 p - int value=inc(label(item,"item2"),1);; `9 m9 c6 f/ D. i3 u
- setlabel(item,"item2",value);. b; Z! \9 M! C6 r4 A r5 n
- } 8 P& c+ C( M2 N
- if(getitemtype(item)==3)$ \ E- T7 S2 F* P" P" ?8 q
- {
& S5 |/ e2 F: e5 n" j7 k" t - int value=inc(label(item,"item3"),1);
. d' j D2 T. v4 A9 ~* C. r - setlabelnum(item,"item3",value); g T7 N+ E- i9 }+ X8 m
- } 3 k2 @( f2 s- \' e
- if(getitemtype(item)==4)
1 b" U. ~* e3 z, `, n, d3 o - {
2 H# Y4 }1 H: a+ { - int value=inc(label(item,"item4"),1);
. {5 |& l1 ]% N6 R/ Y& v - setlabelnum(item,"item4",value);( }: D$ }) q- _! r( |' E$ m
- } + i- C U9 D& m5 K0 H* T* Y
- } O9 l) }% m# a: P0 L# @! G4 q' t! X
- } 2 x" W7 {4 R' ]4 q; f
复制代码 : P& }, [( v/ K% _, m4 S5 ^
1.你在托盘上创建的标签名是"Item1","Item2"...但是在代码中写成了"item1"、"item2"....。Flexsim代码大小写敏感,所以无法获取到正确的标签。2.你建模的时候使用的是Flexsim2016或更高版本,但是在写代码的时候使用了非常古老的函数setlabelnum。setlabelnum函数已弃用多年,我已经查不到其相关说明了。如果你对点语法不熟悉的话,可以使用setlabel命令代替。setlabel命令可以在没有相应标签名的时候先创建标签再给标签赋值。结合第一个问题,setlabel的结果就是:在找不到"item1“标签的时候,先在item上创建一个名为"item1"的标签,然后再赋值。当然了,因为前一句语句
]1 ] {. z9 f M+ J- int value=inc(label(item,"item1"),1);
复制代码 无法找到正确的标签,所以value永远是0。2 Q3 H d4 r* \4 `$ {
3.你在代码中加入了if (port!=1)的判断,这非常正确,应该排除托盘,只在box进入合成器的时候改变标签。但是再想想,你要给谁增加标签呢?是box还是pallet?你希望根据进入box的类型增加pallet上相应标签的值。那么,setlabelnum函数中的第一个参数应该是什么?如果是item的话,就是要在box上设置标签值,而非pallet。所以此处应先找到pallet对象:
; z3 ^9 f5 Q" \* U% v/ E$ a0 [ ^
) d* B4 }% |5 B: [- if(getitemtype(item)==1)- ^& x4 }2 ?) o& K# Q/ d
复制代码 也就是说,你确实应该根据box(item)的类型值来进行判断,但是判断结束之后,你要改变的标签在pallet身上,不在box(item)身上。
% W+ _- `% S$ c: k5 o4.inc函数本就是增加(减少)节点值。既然已经增加了,就不必要在用setlabel函数重新设置一次了。+ k1 b" G( A9 V7 t0 H: H7 B
- treenode pallet=first(current);
& H$ F0 T8 b) U. k7 c# | - int value=inc(label(pallet,"item1",1);
复制代码 % |; M3 C/ Q: t! }
$ o% Q0 { f# Y( N, ]. k, d6 C4 f q& [
说完代码问题之后,我们再从模型逻辑上来想一想。' h1 @4 m$ R0 N) F( \, ?
你在托盘上设置标签值的作用是什么?模型中没有体现出来用处。如果仅仅是为了练习编写代码,这样写当然可以,甚至可以说这是一个非常好的案例。' J z* \3 C6 L* h. b2 m
如果不是为了练习,这段代码就没有意义了。因为托盘上的临时实体的数量早就在全局表中定义好了。如果需要,直接根据托盘类型值读取全局表就可以了。4 v; z, I! q3 e1 {# z7 J- |7 f
& q! G/ j, `+ A! X) r' L1 v0 P R, h
附上我的代码以供参考。
; s0 a( A! A- ^' ]) m- /* 标签设置*/% J, [5 k0 W6 Y+ z
- if (port!=1)9 W V. _% [" M |8 [
- { - B) ^. l; `1 U7 w4 b7 u
- treenode pallet=first(current);//找到托盘9 b5 m; Z H0 |, X. I* O
- int type=getitemtype(item);//获取临时实体类型值
( ?: {" V" n* j0 z - string labelname=concat("Item",numtostring(type));//根据类型值生成标签名
5 O* S) Z% Z0 C4 v/ @5 t4 R# ] - inc(label(pallet,labelname),1); //标签值+1* v& R1 M' V, B
- }
复制代码
! L; K; V/ l; L5 M
# t8 P: i8 Q$ B8 d0 ^- s |
|