全球FlexSim系统仿真中文论坛

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

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

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

本帖子中包含更多资源

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

x
推荐
zorsite 发表于 2019-5-20 13:17:14 | 只看该作者
先说代码的问题:
  1. /* 标签设置*/% h  R0 O& s+ ?. W, V& @; t8 F1 [
  2. {; z9 E* P& J* V+ f% p% @
  3. if (port!=1)- W( V5 k4 z5 x+ s
  4.    {$ U, f' Y4 L0 l) P( f
  5.            if(getitemtype(item)==1)8 N& F7 I4 f4 V3 u
  6.              {
    ' H0 h8 ^* ^9 M% {; s% F# F
  7.                      int value=inc(label(item,"item1"),1);
    ' ~1 X+ |) h  M# a, J7 E3 Z
  8.                      setlabelnum(item,"item1",value);
      c3 s" u6 w- O( z2 ]
  9.                      }' b/ u+ g6 N# U6 W$ z2 Y7 a
  10.            if(getitemtype(item)==2)
    , R. o, r0 k& X
  11.              {
    ! M+ D4 d! N0 E/ |9 Y9 z
  12.                      int value=inc(label(item,"item2"),1);9 K/ ]4 @6 m6 |# _/ h6 l# n
  13.                      setlabel(item,"item2",value);
    8 |0 ?& X- y# \( B
  14.                      }   
    2 m. P. ~; d; V4 _4 z; n; x
  15.            if(getitemtype(item)==3)) W% U( K5 ]  R
  16.              {6 o8 [* R) c( q7 s( m3 L6 U, j2 {: @
  17.                      int value=inc(label(item,"item3"),1);
    ; a9 [0 {8 j# c" N+ k
  18.                      setlabelnum(item,"item3",value);
    : V# @) q% `; F# o2 H
  19.                      }
    3 h0 w  b  Z- E0 }; w
  20.            if(getitemtype(item)==4)
    * w* T" k% o* p
  21.              {+ E) J. D( D9 K5 b
  22.                      int value=inc(label(item,"item4"),1);2 e, O) `- `. U1 F" c: [- s$ J3 i0 x
  23.                      setlabelnum(item,"item4",value);
    ) q  k3 U$ Z0 E! j8 g0 @3 F# Q7 }
  24.                      } 8 c; }" T1 }, |- V
  25.    }                    % v) X& n* B' ~1 B5 W9 u( v9 [
  26. }
    : |. R  [8 H" ?/ n' P
复制代码

- Y7 m! m3 e6 e7 t  H2 v6 r1.你在托盘上创建的标签名是"Item1","Item2"...但是在代码中写成了"item1"、"item2"....。Flexsim代码大小写敏感,所以无法获取到正确的标签。2.你建模的时候使用的是Flexsim2016或更高版本,但是在写代码的时候使用了非常古老的函数setlabelnum。setlabelnum函数已弃用多年,我已经查不到其相关说明了。如果你对点语法不熟悉的话,可以使用setlabel命令代替。setlabel命令可以在没有相应标签名的时候先创建标签再给标签赋值。结合第一个问题,setlabel的结果就是:在找不到"item1“标签的时候,先在item上创建一个名为"item1"的标签,然后再赋值。当然了,因为前一句语句9 [4 |6 H. q' }8 P& ^) b
  1. int value=inc(label(item,"item1"),1);
复制代码
无法找到正确的标签,所以value永远是0。7 K& q' s- ~8 a5 X- Z+ G& a, c
3.你在代码中加入了if (port!=1)的判断,这非常正确,应该排除托盘,只在box进入合成器的时候改变标签。但是再想想,你要给谁增加标签呢?是box还是pallet?你希望根据进入box的类型增加pallet上相应标签的值。那么,setlabelnum函数中的第一个参数应该是什么?如果是item的话,就是要在box上设置标签值,而非pallet。所以此处应先找到pallet对象:# \) `4 x, P- W* O

2 Q. O6 N3 _. C9 b5 d
  1. if(getitemtype(item)==1)6 |% P0 U" A$ P' A; v5 F1 K
复制代码
也就是说,你确实应该根据box(item)的类型值来进行判断,但是判断结束之后,你要改变的标签在pallet身上,不在box(item)身上。
1 A7 c: B. j* n/ b3 N9 G6 F- `4.inc函数本就是增加(减少)节点值。既然已经增加了,就不必要在用setlabel函数重新设置一次了。
2 t5 R% J6 ?9 U/ x; C% B/ i
  1. treenode pallet=first(current);
    4 Y# w' Q! N7 \. d) g& j
  2. int value=inc(label(pallet,"item1",1);
复制代码
* C3 F: u# H8 v

2 o( u# y' H+ F) ~+ @# s& j. r/ j) W! `% d
说完代码问题之后,我们再从模型逻辑上来想一想。# r7 A- {; M2 |- t! m; A& k7 L
你在托盘上设置标签值的作用是什么?模型中没有体现出来用处。如果仅仅是为了练习编写代码,这样写当然可以,甚至可以说这是一个非常好的案例。
. v- D4 s2 k8 `+ c& ^1 v2 M如果不是为了练习,这段代码就没有意义了。因为托盘上的临时实体的数量早就在全局表中定义好了。如果需要,直接根据托盘类型值读取全局表就可以了。  I' a: {/ g1 ^# Y$ M) T

3 `% [' W! g# H! S4 k* n& |- A( e附上我的代码以供参考。
3 l& E5 H- N* V5 s" u
  1. /* 标签设置*/) l) O# P  e8 N: g" {5 R7 Q
  2. if (port!=1)* e1 x1 A* U2 H* b8 P  V1 q
  3. {         
    1 p2 N5 Y8 `/ b: J) i; C  m) c
  4.         treenode pallet=first(current);//找到托盘
    4 r6 Q! c( D) @1 ~+ {3 o- h
  5.            int type=getitemtype(item);//获取临时实体类型值
    & r( ?. y9 }; d0 X7 b
  6.            string labelname=concat("Item",numtostring(type));//根据类型值生成标签名
    % ~" H) X' Y* T8 b1 B
  7.         inc(label(pallet,labelname),1);        //标签值+18 u/ P& ^* [1 P' x
  8. }
复制代码
- D- k% a' F5 l! h5 T- K" g
8 \1 B% z8 X. K4 G- I- h+ c
2#
Pureua 发表于 2018-11-4 17:26:27 | 只看该作者
本帖最后由 Pureua 于 2018-11-4 17:28 编辑
! F5 e6 t2 p0 \; _( o* }8 @( O" p5 P" y( S: x$ _. z
我用switch语句写的代码,跑出来后,托盘上产生了对应的标签,不知道是否达到了你的目的,供你参考

本帖子中包含更多资源

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

x
3#
 楼主| LIUQIAN 发表于 2018-11-4 17:47:16 | 只看该作者
Pureua 发表于 2018-11-4 17:26
) b0 h/ o& r; \5 _, K1 _2 w" d我用switch语句写的代码,跑出来后,托盘上产生了对应的标签,不知道是否达到了你的目的,供你参考
$ `! @- B  k1 Q3 R5 m; x: _
您好,您的模型中是设置好了的每种item的数量。我想做的是不知道每个托盘上每种商品的数量,去自动记录。thank you anyway.
5#
08290625 发表于 2019-9-20 09:01:58 | 只看该作者
zorsite 发表于 2019-5-20 13:179 z' D. K, [7 S* B
先说代码的问题:
& `5 n, o9 ?7 t/ {2 {1.你在托盘上创建的标签名是"Item1","Item2"...但是在代码中写成了"item1"、"item2".... ...
5 w; e; B" p4 @4 ^0 x
感谢到位的解析,学习了
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-6-30 08:16 , Processed in 0.073923 second(s), 15 queries .

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

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