全球FlexSim系统仿真中文论坛

标题: 怎么用标签记录合成器上每种item的数量 [打印本页]

作者: LIUQIAN    时间: 2018-11-4 16:49
标题: 怎么用标签记录合成器上每种item的数量
模型中合成器进行打包时,需要记录托盘上每种item的数量,我在合成器的进入触发,写了设置标签数量的代码,但是标签值没有任何变化。请老师们帮忙解答,谢谢。
作者: Pureua    时间: 2018-11-4 17:26
本帖最后由 Pureua 于 2018-11-4 17:28 编辑
8 H4 B) z5 ~3 {4 o( _6 n8 r, L# o9 ]# M1 B0 Q9 F% ~
我用switch语句写的代码,跑出来后,托盘上产生了对应的标签,不知道是否达到了你的目的,供你参考
作者: LIUQIAN    时间: 2018-11-4 17:47
Pureua 发表于 2018-11-4 17:26
+ }" d8 l* x0 `5 s2 M; H0 d+ u我用switch语句写的代码,跑出来后,托盘上产生了对应的标签,不知道是否达到了你的目的,供你参考

& T9 Z' m3 z0 e3 ?您好,您的模型中是设置好了的每种item的数量。我想做的是不知道每个托盘上每种商品的数量,去自动记录。thank you anyway.
作者: zorsite    时间: 2019-5-20 13:17
先说代码的问题:
  1. /* 标签设置*/
    / K0 o" E- |6 [0 p6 W/ n8 L
  2. {6 x9 k% V) n7 a% c% n3 `1 {! g
  3. if (port!=1)
    - x! j! v1 g; @8 p# u5 _7 \
  4.    {' `, H( s, m4 a; z4 H8 G
  5.            if(getitemtype(item)==1)
    % E9 A' C" c5 `: ]
  6.              {# i3 F, \& O. `1 `& u4 b& L. D
  7.                      int value=inc(label(item,"item1"),1);
    % z+ o& ?9 e7 w8 v, j- M; b! z2 O
  8.                      setlabelnum(item,"item1",value);
    7 a: z% Q1 A/ P! X! O! z; U1 V
  9.                      }
    . R5 n7 c1 }+ q
  10.            if(getitemtype(item)==2)
    # K# a5 F* @- q" g* C
  11.              {6 a/ N8 O+ A* s9 m0 s4 l1 B! b
  12.                      int value=inc(label(item,"item2"),1);
    1 Z, ~( a" o# L4 T: e  }
  13.                      setlabel(item,"item2",value);
    4 N" O! h- K/ D' b# m/ G8 s
  14.                      }   
    5 r4 ]8 C. P- \% J& B3 E
  15.            if(getitemtype(item)==3)
    / w+ l) s. R/ t. p* u
  16.              {
    ' r; t# I; x5 Q* K1 C/ u
  17.                      int value=inc(label(item,"item3"),1);# z4 l5 I7 g! m+ \' C/ x: x, f! U
  18.                      setlabelnum(item,"item3",value);* _  s7 h, y; U9 [
  19.                      } ( F: m& R9 v2 Y" O$ m1 ?" V5 A
  20.            if(getitemtype(item)==4): S. _. ~8 m( q1 m4 ^- O. q
  21.              {
    ) ^/ g; t: c- Q; p9 [
  22.                      int value=inc(label(item,"item4"),1);
    & v3 d8 L+ P6 S( J$ O0 a% m# q
  23.                      setlabelnum(item,"item4",value);; ^0 d# m0 X6 I
  24.                      }
    ! F7 \" N; z- F# S( S5 w6 D% p
  25.    }                    3 @, N3 I9 C; I7 S$ ]
  26. } - b: W+ h0 N: n5 `8 O9 O. Q) Q2 t
复制代码

" v2 @& j! [7 Y0 b5 l1.你在托盘上创建的标签名是"Item1","Item2"...但是在代码中写成了"item1"、"item2"....。Flexsim代码大小写敏感,所以无法获取到正确的标签。2.你建模的时候使用的是Flexsim2016或更高版本,但是在写代码的时候使用了非常古老的函数setlabelnum。setlabelnum函数已弃用多年,我已经查不到其相关说明了。如果你对点语法不熟悉的话,可以使用setlabel命令代替。setlabel命令可以在没有相应标签名的时候先创建标签再给标签赋值。结合第一个问题,setlabel的结果就是:在找不到"item1“标签的时候,先在item上创建一个名为"item1"的标签,然后再赋值。当然了,因为前一句语句- E! K! w/ C; }) j0 p9 O
  1. int value=inc(label(item,"item1"),1);
复制代码
无法找到正确的标签,所以value永远是0。
  B( q9 C$ S8 M/ x3.你在代码中加入了if (port!=1)的判断,这非常正确,应该排除托盘,只在box进入合成器的时候改变标签。但是再想想,你要给谁增加标签呢?是box还是pallet?你希望根据进入box的类型增加pallet上相应标签的值。那么,setlabelnum函数中的第一个参数应该是什么?如果是item的话,就是要在box上设置标签值,而非pallet。所以此处应先找到pallet对象:3 E  n# M7 a2 n; n
' O. d( a2 {" E# H* ?% Q! [
  1. if(getitemtype(item)==1)
    2 g. t4 r" d4 S9 c3 V( L- M/ J
复制代码
也就是说,你确实应该根据box(item)的类型值来进行判断,但是判断结束之后,你要改变的标签在pallet身上,不在box(item)身上。
0 ~0 j" r' H( D7 e9 I: J$ s3 X/ r4.inc函数本就是增加(减少)节点值。既然已经增加了,就不必要在用setlabel函数重新设置一次了。
. n) [9 V. e+ I: R; n( }& `6 F% a
  1. treenode pallet=first(current);
    # {/ d' W  W: O7 D  o2 _0 q
  2. int value=inc(label(pallet,"item1",1);
复制代码
- x+ f- T' ?4 _- f& q" _

* k0 A' m2 N# b/ }% O. m
- S& i. \1 Y8 ^说完代码问题之后,我们再从模型逻辑上来想一想。
  H0 ]$ Y2 O; j6 L& m. p你在托盘上设置标签值的作用是什么?模型中没有体现出来用处。如果仅仅是为了练习编写代码,这样写当然可以,甚至可以说这是一个非常好的案例。' E" P  c  w7 \
如果不是为了练习,这段代码就没有意义了。因为托盘上的临时实体的数量早就在全局表中定义好了。如果需要,直接根据托盘类型值读取全局表就可以了。
. Y5 D: S# C# v* T7 L4 G# T$ u
) ~- c( D& f9 X( g) a& R1 |  z# b7 X4 U附上我的代码以供参考。
7 Y0 B; m4 M1 c1 M) q( ^8 j
  1. /* 标签设置*/
    ( {  w9 h7 v4 f  ^: K
  2. if (port!=1)* t& O) @2 r$ @2 I, U: M
  3. {          * L9 a6 N" C/ v1 {
  4.         treenode pallet=first(current);//找到托盘
    ) Z& n* o2 b  w/ g$ d; V+ @
  5.            int type=getitemtype(item);//获取临时实体类型值) \# r1 {( B7 r6 Y4 u3 y
  6.            string labelname=concat("Item",numtostring(type));//根据类型值生成标签名$ P* f7 |5 ~( a9 w
  7.         inc(label(pallet,labelname),1);        //标签值+1  @2 _( Z! l8 y& R8 J4 R6 y
  8. }
复制代码

- S8 ?: d" }/ C( Q: u- T9 F( k) a: X2 ^: N4 p5 }* P

作者: 08290625    时间: 2019-9-20 09:01
zorsite 发表于 2019-5-20 13:17
4 p( y2 b: v: b先说代码的问题:
8 m) j- i" ?- {  F9 _$ v- \1.你在托盘上创建的标签名是"Item1","Item2"...但是在代码中写成了"item1"、"item2".... ...

* ]2 \, P: V0 ]; q+ L感谢到位的解析,学习了




欢迎光临 全球FlexSim系统仿真中文论坛 (http://www.flexsimasia.com/) Powered by Discuz! X3.3