|
先说代码的问题:- /* 标签设置*/
, P$ A1 A; O; ?, k1 J( z/ s - {
) j, F2 `0 m; D - if (port!=1)
" {3 @4 `$ O i3 D/ u - {
- N/ }" o4 m; U5 N1 P3 ~. g, m - if(getitemtype(item)==1)
0 `) ?" ]% X; x& [ - {3 S* m2 k: e# x3 _. r
- int value=inc(label(item,"item1"),1);* d, S9 ^" s& P: X$ _7 c! ~
- setlabelnum(item,"item1",value);
) m: O: D; V# D" u& S' L - }
0 c+ Z8 B8 v) p9 S2 g - if(getitemtype(item)==2)0 D$ K' y, l! b
- {
6 L Q/ b! N2 r - int value=inc(label(item,"item2"),1);
- y! |# d# Q* u! Z" t+ r - setlabel(item,"item2",value);
; }& ?9 `1 j* t+ a3 g - } . G/ o" c$ S, e" [! z
- if(getitemtype(item)==3)2 Y {* s; }3 ?5 j) K- v* s
- {
, ~+ j' `! |' k& \8 \1 y$ u - int value=inc(label(item,"item3"),1);
& F* T+ V% j4 X) L3 ^ w) v - setlabelnum(item,"item3",value);
3 Q- l% P- ]/ u* ?9 n - } 3 P9 ?9 g# Q* ~. b
- if(getitemtype(item)==4)$ |5 L* o5 N o
- {
( |; N: m; o" S/ r - int value=inc(label(item,"item4"),1);
9 S0 Z) B( Y- R* \5 Q1 w - setlabelnum(item,"item4",value);
o9 j- J2 U5 X3 V% ~3 L$ \ - } & c9 V+ K9 Q# s! r
- } ( d2 A- l5 D) h2 Q( Y1 [8 r- ]$ c
- }
/ D7 \9 i5 l" [) }; J) p7 j: F
复制代码
# E% g6 T2 C" S. W9 ]% X$ S! s* }1 [1.你在托盘上创建的标签名是"Item1","Item2"...但是在代码中写成了"item1"、"item2"....。Flexsim代码大小写敏感,所以无法获取到正确的标签。2.你建模的时候使用的是Flexsim2016或更高版本,但是在写代码的时候使用了非常古老的函数setlabelnum。setlabelnum函数已弃用多年,我已经查不到其相关说明了。如果你对点语法不熟悉的话,可以使用setlabel命令代替。setlabel命令可以在没有相应标签名的时候先创建标签再给标签赋值。结合第一个问题,setlabel的结果就是:在找不到"item1“标签的时候,先在item上创建一个名为"item1"的标签,然后再赋值。当然了,因为前一句语句! J) w4 e3 z0 f7 x: |& `
- int value=inc(label(item,"item1"),1);
复制代码 无法找到正确的标签,所以value永远是0。# S2 `0 A* C' C# E
3.你在代码中加入了if (port!=1)的判断,这非常正确,应该排除托盘,只在box进入合成器的时候改变标签。但是再想想,你要给谁增加标签呢?是box还是pallet?你希望根据进入box的类型增加pallet上相应标签的值。那么,setlabelnum函数中的第一个参数应该是什么?如果是item的话,就是要在box上设置标签值,而非pallet。所以此处应先找到pallet对象:; ?; U8 n/ i" @
v+ g. a4 x: I- F9 i0 b. f0 d9 D+ r- if(getitemtype(item)==1)1 q$ r- m1 G) O) K1 f
复制代码 也就是说,你确实应该根据box(item)的类型值来进行判断,但是判断结束之后,你要改变的标签在pallet身上,不在box(item)身上。6 F/ v9 s9 L/ A8 ?5 v4 E, l
4.inc函数本就是增加(减少)节点值。既然已经增加了,就不必要在用setlabel函数重新设置一次了。
) Q! L% m3 k7 i' E F [- treenode pallet=first(current); \+ ?# e* F7 k0 F9 G
- int value=inc(label(pallet,"item1",1);
复制代码
! W9 U- x; a3 ?0 I. ?+ y+ q' C8 t
6 K7 E* U& ~5 B# K! O
# ^8 l! P- u Z. _( y2 H8 k2 F说完代码问题之后,我们再从模型逻辑上来想一想。
& @6 c, O; x5 M0 |' X* H你在托盘上设置标签值的作用是什么?模型中没有体现出来用处。如果仅仅是为了练习编写代码,这样写当然可以,甚至可以说这是一个非常好的案例。
+ F. Z! W9 S" f5 `, \7 Y如果不是为了练习,这段代码就没有意义了。因为托盘上的临时实体的数量早就在全局表中定义好了。如果需要,直接根据托盘类型值读取全局表就可以了。
( R1 G1 X1 Z3 c& z
7 C d9 l" d; z6 C! R7 @4 V1 }附上我的代码以供参考。0 n% G4 y& Y) ]
- /* 标签设置*/
. E {6 f7 d6 R1 }! d7 a - if (port!=1)% E4 c' T0 g; J' v' F
- { + r) v: z. N3 b
- treenode pallet=first(current);//找到托盘
: U" L G. S( T9 ?% t4 _ - int type=getitemtype(item);//获取临时实体类型值: u, O' O) y4 t0 J8 z. w
- string labelname=concat("Item",numtostring(type));//根据类型值生成标签名& \, }1 ]8 W8 X+ n
- inc(label(pallet,labelname),1); //标签值+18 i. A! |. j" z# O* i6 ?" m' W
- }
复制代码 $ [$ r. T& l4 W, f' z9 @) e" H+ g* {
1 O7 c4 u) b) i$ z/ s, S' t |
|