全球FlexSim系统仿真中文论坛

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

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

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

本帖子中包含更多资源

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

x
推荐
zorsite 发表于 2019-5-20 13:17:14 | 只看该作者
先说代码的问题:
  1. /* 标签设置*/
    , P$ A1 A; O; ?, k1 J( z/ s
  2. {
    ) j, F2 `0 m; D
  3. if (port!=1)
    " {3 @4 `$ O  i3 D/ u
  4.    {
    - N/ }" o4 m; U5 N1 P3 ~. g, m
  5.            if(getitemtype(item)==1)
    0 `) ?" ]% X; x& [
  6.              {3 S* m2 k: e# x3 _. r
  7.                      int value=inc(label(item,"item1"),1);* d, S9 ^" s& P: X$ _7 c! ~
  8.                      setlabelnum(item,"item1",value);
    ) m: O: D; V# D" u& S' L
  9.                      }
    0 c+ Z8 B8 v) p9 S2 g
  10.            if(getitemtype(item)==2)0 D$ K' y, l! b
  11.              {
    6 L  Q/ b! N2 r
  12.                      int value=inc(label(item,"item2"),1);
    - y! |# d# Q* u! Z" t+ r
  13.                      setlabel(item,"item2",value);
    ; }& ?9 `1 j* t+ a3 g
  14.                      }   . G/ o" c$ S, e" [! z
  15.            if(getitemtype(item)==3)2 Y  {* s; }3 ?5 j) K- v* s
  16.              {
    , ~+ j' `! |' k& \8 \1 y$ u
  17.                      int value=inc(label(item,"item3"),1);
    & F* T+ V% j4 X) L3 ^  w) v
  18.                      setlabelnum(item,"item3",value);
    3 Q- l% P- ]/ u* ?9 n
  19.                      } 3 P9 ?9 g# Q* ~. b
  20.            if(getitemtype(item)==4)$ |5 L* o5 N  o
  21.              {
    ( |; N: m; o" S/ r
  22.                      int value=inc(label(item,"item4"),1);
    9 S0 Z) B( Y- R* \5 Q1 w
  23.                      setlabelnum(item,"item4",value);
      o9 j- J2 U5 X3 V% ~3 L$ \
  24.                      } & c9 V+ K9 Q# s! r
  25.    }                    ( d2 A- l5 D) h2 Q( Y1 [8 r- ]$ c
  26. }
    / 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: |& `
  1. 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
  1. 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  [
  1. treenode pallet=first(current);  \+ ?# e* F7 k0 F9 G
  2. 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) ]
  1. /* 标签设置*/
    . E  {6 f7 d6 R1 }! d7 a
  2. if (port!=1)% E4 c' T0 g; J' v' F
  3. {          + r) v: z. N3 b
  4.         treenode pallet=first(current);//找到托盘
    : U" L  G. S( T9 ?% t4 _
  5.            int type=getitemtype(item);//获取临时实体类型值: u, O' O) y4 t0 J8 z. w
  6.            string labelname=concat("Item",numtostring(type));//根据类型值生成标签名& \, }1 ]8 W8 X+ n
  7.         inc(label(pallet,labelname),1);        //标签值+18 i. A! |. j" z# O* i6 ?" m' W
  8. }
复制代码
$ [$ r. T& l4 W, f' z9 @) e" H+ g* {

1 O7 c4 u) b) i$ z/ s, S' t
2#
Pureua 发表于 2018-11-4 17:26:27 | 只看该作者
本帖最后由 Pureua 于 2018-11-4 17:28 编辑
" J, W: W. }, q: U0 o/ x
9 M5 q2 h' B) G我用switch语句写的代码,跑出来后,托盘上产生了对应的标签,不知道是否达到了你的目的,供你参考

本帖子中包含更多资源

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

x
3#
 楼主| LIUQIAN 发表于 2018-11-4 17:47:16 | 只看该作者
Pureua 发表于 2018-11-4 17:26( C& F* G, t5 Q9 r
我用switch语句写的代码,跑出来后,托盘上产生了对应的标签,不知道是否达到了你的目的,供你参考

" P$ w2 s# K+ w( M  Y' |; b您好,您的模型中是设置好了的每种item的数量。我想做的是不知道每个托盘上每种商品的数量,去自动记录。thank you anyway.
5#
08290625 发表于 2019-9-20 09:01:58 | 只看该作者
zorsite 发表于 2019-5-20 13:17
# h7 U! |) s! v' s. E, k5 t先说代码的问题:
/ @- x$ ^0 K8 ~1.你在托盘上创建的标签名是"Item1","Item2"...但是在代码中写成了"item1"、"item2".... ...

5 v0 Q, c! u$ o  P, Q感谢到位的解析,学习了
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-9-1 18:15 , Processed in 0.080664 second(s), 15 queries .

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

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