全球FlexSim系统仿真中文论坛

搜索
查看: 4524|回复: 4
打印 上一主题 下一主题

怎么用标签记录合成器上每种item的数量

[复制链接]
跳转到指定楼层
1#
LIUQIAN 发表于 2018-11-4 16:49:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
模型中合成器进行打包时,需要记录托盘上每种item的数量,我在合成器的进入触发,写了设置标签数量的代码,但是标签值没有任何变化。请老师们帮忙解答,谢谢。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
推荐
zorsite 发表于 2019-5-20 13:17:14 | 只看该作者
先说代码的问题:
  1. /* 标签设置*/
    1 i/ w* M/ B+ ~0 [
  2. {% t7 H# m/ O. B% |" K- `" f
  3. if (port!=1)
    - d1 h3 Q1 k4 s, i, b: V
  4.    {& O$ R4 E& T; |3 R9 F- J. U& Y
  5.            if(getitemtype(item)==1); t3 R: h8 L: W; N
  6.              {
    $ B6 j0 d8 @! l4 [6 K0 A. c9 q5 ?
  7.                      int value=inc(label(item,"item1"),1);
    ; }% ~( F  I; _2 d$ e& Q. }* ~
  8.                      setlabelnum(item,"item1",value);* k, P+ C1 s3 C4 F0 M
  9.                      }( V3 @$ ^' e! W' o+ r9 m3 X8 ^$ Y
  10.            if(getitemtype(item)==2)$ y3 T- W/ v( o5 x8 J7 B
  11.              {
    2 ^* k+ Y/ R6 ^2 b6 N
  12.                      int value=inc(label(item,"item2"),1);0 r7 I# a8 @2 V$ e& X( G
  13.                      setlabel(item,"item2",value);
    . U* y6 n/ M, S2 ^- v# C
  14.                      }   3 V' i- G" Y1 d* @! e7 _
  15.            if(getitemtype(item)==3)# H  w- b1 g6 U: O$ `; G
  16.              {% V, S) g" _, p% L
  17.                      int value=inc(label(item,"item3"),1);: N' O. e2 S0 v, I
  18.                      setlabelnum(item,"item3",value);
    " ~" `  `* `7 p3 R: g6 E* _2 |
  19.                      }
    : d! N4 ~7 ~0 N. S; t
  20.            if(getitemtype(item)==4)
    . p6 i5 w2 j- j/ u
  21.              {
    & O' f/ E2 H2 v
  22.                      int value=inc(label(item,"item4"),1);( t, b$ Q% r3 V2 I7 z
  23.                      setlabelnum(item,"item4",value);
    8 ?! H& _; W1 r/ @6 _% s8 w
  24.                      } + ]5 L8 j4 V" O8 K
  25.    }                   
    6 D# g2 b* Z' U, |$ C% x7 M- D
  26. } 5 D( A/ i3 z2 }
复制代码

( K6 a! [0 `5 Z4 E1.你在托盘上创建的标签名是"Item1","Item2"...但是在代码中写成了"item1"、"item2"....。Flexsim代码大小写敏感,所以无法获取到正确的标签。2.你建模的时候使用的是Flexsim2016或更高版本,但是在写代码的时候使用了非常古老的函数setlabelnum。setlabelnum函数已弃用多年,我已经查不到其相关说明了。如果你对点语法不熟悉的话,可以使用setlabel命令代替。setlabel命令可以在没有相应标签名的时候先创建标签再给标签赋值。结合第一个问题,setlabel的结果就是:在找不到"item1“标签的时候,先在item上创建一个名为"item1"的标签,然后再赋值。当然了,因为前一句语句2 J3 ~) h6 _# L
  1. int value=inc(label(item,"item1"),1);
复制代码
无法找到正确的标签,所以value永远是0。# ?0 W9 H7 t  V
3.你在代码中加入了if (port!=1)的判断,这非常正确,应该排除托盘,只在box进入合成器的时候改变标签。但是再想想,你要给谁增加标签呢?是box还是pallet?你希望根据进入box的类型增加pallet上相应标签的值。那么,setlabelnum函数中的第一个参数应该是什么?如果是item的话,就是要在box上设置标签值,而非pallet。所以此处应先找到pallet对象:  J; H& S3 J( N- N; V

6 _( u! v6 F6 {( d( s$ o8 K
  1. if(getitemtype(item)==1)* h" c, }: |' a; [
复制代码
也就是说,你确实应该根据box(item)的类型值来进行判断,但是判断结束之后,你要改变的标签在pallet身上,不在box(item)身上。  I, T& q! m. \' i
4.inc函数本就是增加(减少)节点值。既然已经增加了,就不必要在用setlabel函数重新设置一次了。
# I2 U, ?. q9 ~5 p8 Y
  1. treenode pallet=first(current);8 D  C2 n- ]# C
  2. int value=inc(label(pallet,"item1",1);
复制代码
$ A3 j- m6 W. }$ Z: O% B

2 C/ W" Z& T2 n) j* u/ b( c( U/ N* W  D, U0 O* J+ M* m
说完代码问题之后,我们再从模型逻辑上来想一想。
2 E& E0 E3 M- \+ Y8 H  `8 H你在托盘上设置标签值的作用是什么?模型中没有体现出来用处。如果仅仅是为了练习编写代码,这样写当然可以,甚至可以说这是一个非常好的案例。. P* ~1 C7 `5 [) C/ i) ~7 z
如果不是为了练习,这段代码就没有意义了。因为托盘上的临时实体的数量早就在全局表中定义好了。如果需要,直接根据托盘类型值读取全局表就可以了。" j" J. N4 X  S; ?7 X7 T
2 |! y! J% U0 N2 _
附上我的代码以供参考。+ q8 |& b* t, V% L& a& F
  1. /* 标签设置*/
    ) M: B( I% S4 c" j6 c( ]
  2. if (port!=1)
    ! p- a- R- ^; R- @, Q2 D9 n
  3. {          2 v0 O, M) K5 x. }
  4.         treenode pallet=first(current);//找到托盘& b( ?5 D8 [3 r7 R+ y8 A- y+ _
  5.            int type=getitemtype(item);//获取临时实体类型值
    / h% f" g3 B& b9 `
  6.            string labelname=concat("Item",numtostring(type));//根据类型值生成标签名8 h1 R+ O6 {' c
  7.         inc(label(pallet,labelname),1);        //标签值+1
    0 R# |$ T& x- l% d, \; ]5 ~
  8. }
复制代码

; n4 Q- d9 a: c* u4 l6 R: x! K: r3 K% ?+ T1 ~$ O# j: ^/ m8 G' f
2#
Pureua 发表于 2018-11-4 17:26:27 | 只看该作者
本帖最后由 Pureua 于 2018-11-4 17:28 编辑
  Q% M+ A7 n# s" V) b5 f. ]5 {) G0 `# c- N# d! X6 i' q
我用switch语句写的代码,跑出来后,托盘上产生了对应的标签,不知道是否达到了你的目的,供你参考

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
3#
 楼主| LIUQIAN 发表于 2018-11-4 17:47:16 | 只看该作者
Pureua 发表于 2018-11-4 17:26
& m( o  G# C' h; u我用switch语句写的代码,跑出来后,托盘上产生了对应的标签,不知道是否达到了你的目的,供你参考
' {. {9 w; k, @
您好,您的模型中是设置好了的每种item的数量。我想做的是不知道每个托盘上每种商品的数量,去自动记录。thank you anyway.
5#
08290625 发表于 2019-9-20 09:01:58 | 只看该作者
zorsite 发表于 2019-5-20 13:17' A. f1 Z) F' y8 ]' U+ @0 d: ~
先说代码的问题:
; E$ ]' q3 X' x6 e9 F& }% t1.你在托盘上创建的标签名是"Item1","Item2"...但是在代码中写成了"item1"、"item2".... ...
# L4 j( s9 N$ w
感谢到位的解析,学习了
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|手机版|Archiver|全球FlexSim系统仿真中文论坛 ( 京ICP备14043114号-2 )

GMT+8, 2024-4-26 13:48 , Processed in 0.082446 second(s), 15 queries .

Powered by Discuz! X3.3© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表