全球FlexSim系统仿真中文论坛

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

作者: LIUQIAN    时间: 2018-11-4 16:49
标题: 怎么用标签记录合成器上每种item的数量
模型中合成器进行打包时,需要记录托盘上每种item的数量,我在合成器的进入触发,写了设置标签数量的代码,但是标签值没有任何变化。请老师们帮忙解答,谢谢。
作者: Pureua    时间: 2018-11-4 17:26
本帖最后由 Pureua 于 2018-11-4 17:28 编辑 4 n- z* ]. r  M% X
/ {+ T  \! C& y% t
我用switch语句写的代码,跑出来后,托盘上产生了对应的标签,不知道是否达到了你的目的,供你参考
作者: LIUQIAN    时间: 2018-11-4 17:47
Pureua 发表于 2018-11-4 17:26
+ t" \2 p" {* ?' E3 _2 B: b我用switch语句写的代码,跑出来后,托盘上产生了对应的标签,不知道是否达到了你的目的,供你参考

; d, s8 I& {( j您好,您的模型中是设置好了的每种item的数量。我想做的是不知道每个托盘上每种商品的数量,去自动记录。thank you anyway.
作者: zorsite    时间: 2019-5-20 13:17
先说代码的问题:
  1. /* 标签设置*/+ I! n+ x$ \6 k* U
  2. {2 z* I/ R; n# s4 c0 i
  3. if (port!=1)
    4 S5 {4 ~# f' l# \
  4.    {
    $ ?6 F" g- s# r" B9 c, a9 S
  5.            if(getitemtype(item)==1)
    & W4 r$ _/ I8 R! C( G
  6.              {
    ! g2 z) R( d' x1 b1 S: Z
  7.                      int value=inc(label(item,"item1"),1);+ g5 J4 E$ Y& f& C; Z8 `
  8.                      setlabelnum(item,"item1",value);/ }0 F+ r! u% U
  9.                      }
    1 Q5 `* ]( |% [: t6 U; S" {# t
  10.            if(getitemtype(item)==2)
    / B, S2 {( R, W3 U, M! @1 `; @( h/ J
  11.              {
    ) U. a" w0 q  k" \% K9 u
  12.                      int value=inc(label(item,"item2"),1);
    3 A# m8 q6 ]- [6 {7 S, s1 n
  13.                      setlabel(item,"item2",value);1 H- N" K. O6 N2 m
  14.                      }   
    # d2 }* w4 r$ R1 z; o7 a  ?
  15.            if(getitemtype(item)==3)
    . P( F8 P) Q+ K  y; ?8 v: s
  16.              {
    # q1 x7 k7 L0 I5 n4 F+ J) |( E
  17.                      int value=inc(label(item,"item3"),1);% F6 k0 j+ n9 L
  18.                      setlabelnum(item,"item3",value);
    , ?4 z, c' {/ D4 G- z4 C
  19.                      } 0 S4 ?3 y+ E" L4 ]. i; P- t& Z
  20.            if(getitemtype(item)==4)0 H+ }  G) i: x) {4 s  _6 X
  21.              {7 v9 N; b, F1 {* s: a
  22.                      int value=inc(label(item,"item4"),1);; p# |5 \. ]% K! ^- {
  23.                      setlabelnum(item,"item4",value);
    1 M* d( z7 C4 h* d% a' F
  24.                      }
    7 B& u  F# b( ?
  25.    }                    / }5 C2 Y# p9 |! P
  26. }   }& l7 J0 j$ A4 l' t5 `
复制代码

0 W* X+ A7 ~) h/ ^# L1.你在托盘上创建的标签名是"Item1","Item2"...但是在代码中写成了"item1"、"item2"....。Flexsim代码大小写敏感,所以无法获取到正确的标签。2.你建模的时候使用的是Flexsim2016或更高版本,但是在写代码的时候使用了非常古老的函数setlabelnum。setlabelnum函数已弃用多年,我已经查不到其相关说明了。如果你对点语法不熟悉的话,可以使用setlabel命令代替。setlabel命令可以在没有相应标签名的时候先创建标签再给标签赋值。结合第一个问题,setlabel的结果就是:在找不到"item1“标签的时候,先在item上创建一个名为"item1"的标签,然后再赋值。当然了,因为前一句语句6 d1 p2 o9 ~, L% I
  1. int value=inc(label(item,"item1"),1);
复制代码
无法找到正确的标签,所以value永远是0。  f. C2 b9 G* T# p' k7 F' T# y. m
3.你在代码中加入了if (port!=1)的判断,这非常正确,应该排除托盘,只在box进入合成器的时候改变标签。但是再想想,你要给谁增加标签呢?是box还是pallet?你希望根据进入box的类型增加pallet上相应标签的值。那么,setlabelnum函数中的第一个参数应该是什么?如果是item的话,就是要在box上设置标签值,而非pallet。所以此处应先找到pallet对象:/ A$ B; b* O7 M, d

/ s7 X7 \: Y4 H6 L% k
  1. if(getitemtype(item)==1)1 s" l# T8 z& _- {
复制代码
也就是说,你确实应该根据box(item)的类型值来进行判断,但是判断结束之后,你要改变的标签在pallet身上,不在box(item)身上。
6 @$ p4 u8 N' ?. H  ^3 {  w4.inc函数本就是增加(减少)节点值。既然已经增加了,就不必要在用setlabel函数重新设置一次了。
) C& h, k& U7 [5 }! j. U5 {# l0 q
  1. treenode pallet=first(current);
    % _, F8 I  A9 Q8 E
  2. int value=inc(label(pallet,"item1",1);
复制代码
8 M- z1 B" p# C  I1 ~4 o  r. ]$ L

1 B$ o! x; _! F5 V( w
+ f9 m& g1 \6 m+ b( Q( `说完代码问题之后,我们再从模型逻辑上来想一想。% q# G9 W* [+ O1 r/ F
你在托盘上设置标签值的作用是什么?模型中没有体现出来用处。如果仅仅是为了练习编写代码,这样写当然可以,甚至可以说这是一个非常好的案例。) Q+ s0 u% `) t5 Z0 h3 C) d) ~
如果不是为了练习,这段代码就没有意义了。因为托盘上的临时实体的数量早就在全局表中定义好了。如果需要,直接根据托盘类型值读取全局表就可以了。
$ q: {/ ^6 c2 ]. H9 M- P3 v1 D& M4 f- s4 y3 @1 a, @0 e5 x
附上我的代码以供参考。* r7 X3 ~5 {, O* e4 \  d2 A
  1. /* 标签设置*/+ ~5 |$ e' Z- l+ z% ]$ U
  2. if (port!=1)
    - r: u' a- `, |5 @/ [( V+ K
  3. {         
    - y2 I+ B! f: N" w
  4.         treenode pallet=first(current);//找到托盘+ s$ Z. y# {- x7 c( f8 ~
  5.            int type=getitemtype(item);//获取临时实体类型值/ Y' X4 u3 i" E9 a7 ~
  6.            string labelname=concat("Item",numtostring(type));//根据类型值生成标签名5 s- P% ]) {' L
  7.         inc(label(pallet,labelname),1);        //标签值+1% h# A# s- ^% I) r' _. o' T( s2 e
  8. }
复制代码

2 @/ U# z* }  G, P# b0 Y; j, D( z7 x' r' U

作者: 08290625    时间: 2019-9-20 09:01
zorsite 发表于 2019-5-20 13:17
+ J5 f2 Y( a( s9 N, @4 u/ Z先说代码的问题:
1 F, @6 Z7 |7 }  u1.你在托盘上创建的标签名是"Item1","Item2"...但是在代码中写成了"item1"、"item2".... ...
6 ]  `+ a# _- p5 |% C7 o
感谢到位的解析,学习了




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