全球FlexSim系统仿真中文论坛

搜索
查看: 11174|回复: 11
打印 上一主题 下一主题

对于处理离散实体的固定实体,可否指定关闭某一个端口?

[复制链接]
跳转到指定楼层
1#
zorsite 发表于 2015-9-29 14:48:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zorsite 于 2015-9-29 22:08 编辑
0 C1 Y( r5 n+ w, p8 {8 A% b2 |' ~  [, w
我们知道有些命令可以打开、关闭输入输出。比如:打开输入输出:openinput、openoutput
& n% o) y! t# ]  z* b- u& e/ J关闭输入输出:closeinput、closeoutput
' ?/ u2 D; K+ H" C假设在重置触发中使用closeoutput命令关闭暂存区的输出。
  1. closeoutput(current);
复制代码
关闭输出端口后输出端口右侧会出现红色的小方块表示关闭,一旦使用了closeoutput,所有的输出都将被关闭,即使有些端口仍然处于可用状态,临时实体也无法离开。
) T: E% e) V/ C' A
( T; T0 W  n% }3 d' s" T- L+ o/ [
注意:
3 W3 O. }  U! p# _1 mConnectionsin和connectionsout表示的是实体的输入、输出状态。为0则表示打开,为1表示关闭。& S1 `+ l/ O1 Y4 a
Connectionsin和connectionsout下的子结点表示有多少个端口,为0则表示不可用,为1则表示可用。可以在第一张图片中看到有1个绿色的三角箭头表示输入端口可用,2个红色的三角箭头表示输出端口不可用,以及红色三角箭头右侧的红色长方块表示输出关闭。

! i' ~1 L  j" Q8 G/ I5 v9 _Flexsim中还有命令可以打开、关闭指定的端口:openip、openop、closeip、closeop
: \0 y; ~$ D* W& n& A$ _5 |1 O3 R。命令注释中说明此命令用于流体对象。离散实体内部行为会控制打开或关闭端口,可导致此命令失效。
Modelers should only use this command when working with fluid objects because the internal behavior of discrete objects controls the opening and closing of their ports, and therefore this command may be overridden.

% D/ L' d! z7 L2 g: F是否真的会失效呢?测试一下。
5 W& d4 g. X# K0 M删除重置触发中的closeoutput命令,更改为
  1. closeop(current,1);
复制代码
只关闭暂存区的第一个输出端口,重置模型看效果如何。
. V- Q3 X2 o* r2 V, m8 J! g' o* K0 I, [# [

3 g" C2 t# Y" _3 x6 S  Z5 i! ?  {) D不管是从模型还是从树结构中观察,好像都没有发现第一输出端口被关闭。
# }$ F- A- E9 \1 x& }没关系,还有一个命令专门查看某个端口是否打开:opopen。如果处于打开状态则返回1,否则返回0.
8 g- E$ R# H& W; W# X9 t- Q$ o
! j3 A1 o) I8 u: i
8 i& q5 ?/ z: ?  O通过中断调试,在本地变量窗口中查看两个端口的opopen返回值,发现都返回1,表示都处于打开状态,并没有被关闭,结果和在树结构中观察到的一致。: ]& n; T0 }$ x7 B. D8 b; f
结论:不能通过closeip、closeop命令来关闭处理离散实体的固定实体的输出输入端口。( ^, u) l4 \0 g, H2 d4 A

) e. H! N6 O$ K, o我对Flexsim中的端口相关命令进行了一下分类,并总结了一些规律:
) Q3 n" p' p- s" a) u
ip=input port
' a+ [2 P9 W: C0 Uop=output port1 ^" n' C. U0 j% q
cp=center port
* U" I7 b# X  d$ I2 H( Vnr=number数量- m$ r2 ~+ m  |
no=NO.序号,号码
) F! I, T. j2 q

# \0 k4 F2 ?7 c# S4 l命令大致分为以下几类:
" m! ?2 D! }: x操作类:. [$ _, J5 l8 P; m# v
比如打开、关闭、停止、恢复
  G$ N# _6 Z3 W  o/ Z8 N判断类:6 @9 B  n8 l0 `# p
判断输入输出状态、
$ f; [) J0 i7 P0 _2 I, }7 \判断输入输出端口状态、
; D( w* u: l9 T$ }( h% N判断端口连接是否畅通、; j, d. o* O' C4 x' C! l
判断上下游端口是否可用
1 M! n9 j9 f9 Q统计类:
1 k# }9 {& a4 E
统计输入输出中间端口的数量
" U5 H% x, t+ s5 V3 d, r; F+ ^$ @1 y# B获得上下游实体类) I  ^1 }  J% ~: R' N
获得上下游端口号码类3 y7 z( d) D5 i* c% j& e
打开输入输出
" n7 A% G0 n( xopeninput
. a. R# _1 _7 ]) j% popenoutput9 e1 Z& e2 _- d0 d
关闭输入输出$ g3 U* F6 g1 R3 n, P2 k
closeinput
4 c, R1 S/ Q$ W, K* }closeoutput
- c% \, M/ z7 g/ {2 {停止输入输出( K) F& j0 c  G  Q* j
stopinput
# }; _( I2 \2 E/ ?) `2 bstopoutput
: S6 X2 ?. j6 _, S" `8 A  v& @恢复输入输出! L% c& f" _+ q# s9 E6 U7 J
resumeinput1 [3 x  N, J1 b' v
resumeoutput
, N, q3 d" R( o* T1 k0 i打开某个输入输出端口(用于流动实体)
& O% T: j/ a* n( T) nopenip9 K; G7 @& e0 n! x
openop
9 \5 U% |/ O. ]: o0 \打开所有输入输出端口(用于流动实体)% n# F# p' c6 P+ V8 ?
openallip- J, K0 }" F! L4 C. Z% k
openallop9 J1 |0 c5 Q3 I: G
关闭某个输入输出端口(用于流动实体)  r9 A1 j- u& f0 V
closeip5 G6 O& \, ]# h: R9 x) I, m7 I
closeop
8 h, L* {6 G/ l% z5 b1 t关闭所有输入输出端口(用于流动实体)
3 G( r! _  W2 q; R# b' xcloseallip
7 z# H0 B5 B% P0 Dcloseallop0 h$ Q( J" t4 u+ D' m. R
" A" u+ Z: J8 D, r: N
判断输入输出是否打开
( v6 |! D! i$ U+ t' T- _+ l
inputopen
2 i) p7 X" R8 w) ~5 q% g0 houtputopen
% G$ l% i+ e) B判断输入输出(端口)是否就绪(畅通)
7 B  O3 e. H+ S3 U& q. B3 h& Uipready
5 Q& q, m4 h1 topready
# s6 X( e0 f$ q- D2 V1 }) @判断某个输入输出端口是否打开
9 e" q3 o. k% }ipopen
) n7 r9 o! p  Ropopen
! U6 \- f1 u& \* N7 P& ]: \# R判断上下游端口是否可用6 z1 Z- l* q, M/ `3 K/ w' k
ipavailable- {# h+ q7 g+ K0 f
opavailable; }5 |' O4 V) F: q, X' G

% `, ~8 Y$ p8 ^( x" X统计输入输出中间端口数量
8 F6 G% r! `7 Y- K% J
nrcp2 H+ H3 ~8 b8 d
nrip
) F/ @7 s" f/ B7 M: G( Snrop
  g0 g, X+ Y9 {  V; K$ y: }& @
# a$ s) }% F# K" t( m  g返回上中下游实体
. S9 K4 \1 |( e
centerobject8 t4 u, ?! K: W. H" E+ B; b  C
inobject
% i! E- R5 a$ B# ?; @+ o- @0 xoutobject
# G2 b$ {! I7 k. R. A7 a, B4 k获取上下游端口号码
5 |6 y9 i8 G. Z; z  d' r
ipopno上游输出端口号码
. m; t- |' K( |cpcpno中间端口号码
# A  _$ G# c4 X8 gopipno上游输入端口号码
( r8 l4 u$ t! U, [

本帖子中包含更多资源

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

x

评分

参与人数 1威望 +10 收起 理由
慧娴亚伦 + 10 给力!

查看全部评分

2#
大摸鱼 发表于 2015-9-29 19:23:47 | 只看该作者
加老师的帖子篇篇都是精华呀,感谢加老师无私分享
3#
慧娴亚伦 发表于 2015-9-29 20:38:38 | 只看该作者
目前看到下载次数有18次,但是回帖非常少,感谢楼主无私奉献,希望大家学习至少也给楼主一些支持和感谢!
4#
 楼主| zorsite 发表于 2015-9-29 22:01:58 | 只看该作者
哈哈,回帖什么的我不介意的,但是有人回帖我还是很开心的。特别是二位版主的回帖,更是给了我无穷的动力。
/ |" d! k' E) @" r其实没有建设性意见的回帖还是少来点好,这样后来者查看的时候不至于浪费太多时间。
5#
657776724 发表于 2015-10-2 08:17:37 | 只看该作者
很详细!很深入!感谢分享!不过在“判断”的那一个部分那几个代码似乎让人难以区分差别
6#
657776724 发表于 2015-10-3 10:19:30 | 只看该作者
说一下自己的理解,不知道对不对:
) y3 c8 N9 C' Z4 J/ L0 ~  \1、inputopen是用来判断箭头前面是否带杆;/ r; K' p6 g) s, U3 x& M
2、ipopen是用来判断箭头的颜色;
- J: `1 S) b  d( y) M3、ipavailable是综合判断是否带杆和箭头颜色;
9 ^6 F' E/ J/ l! _9 j2 [6 e0 ~请指正
7#
shiningcz 发表于 2015-10-8 14:45:11 | 只看该作者
我同意楼上对inputopen和ipopen的理解,但ipavailable是判断上游实体的端口状态,不是自身,有点区别
8#
781643823 发表于 2015-10-8 17:00:19 | 只看该作者
这个问题已经在4.0的时候就做过了 ,如果要真的解决关闭某一个输出端口,只能关闭他的下一个实体的输入端,就是在onexit写入代码closeinput(outobject(current,1)),就可以了!你可以试试
9#
慧娴亚伦 发表于 2015-10-9 16:18:33 | 只看该作者
我觉得这样想是不是可以加深大家的理解:
: `5 J) H5 P. i8 D6 m! \' A8 d端口是否开放(open)和输出是否打开(inputopen)都只是输出端口一个片面的属性,不能决定到底能否将实体向下游发送。而是否可用(available)则是一个更加严格的概念,需要各方条件都符合才行。
10#
 楼主| zorsite 发表于 2015-10-9 20:47:00 | 只看该作者
本帖最后由 zorsite 于 2015-10-9 20:49 编辑
0 U) \( f# v/ s+ T/ b" @9 a0 m% c
9# 慧娴亚伦
$ s( W% w+ r3 i# p4 p
. u1 J* C% K: _+ I总结的很有道理。5 ~  m# u4 t$ K; s8 x- n3 Q/ i% h
也很感谢各位非常有意义的讨论和回帖。
- w$ _! I, X- ^, G% a9 |  `( J/ f/ f
1 [% u6 L7 k, T, j我之所以提出这样一个问题,是在做FMAT样题第一题的时候,FFFrenk版主提醒说有更简单的解决方案,就是系统自带的拉入策略“Pull Best Item”。missman也给出了自己的代码。见http://www.flexsim.asia/viewthread.php?tid=5361&page=1&fromuid=610#pid17648
( I7 j- C: n+ o1 q4 `" ~+ `于是我就去研究“Pull Best Item”策略,发现其设置了非常严格的端口检测条件,有兴趣的可以观摩观摩:
  1. # H- t4 |# ~6 p, J* `0 a
  2. int nrports = nrip(current);
    2 {/ i, Q8 i) T: G5 g) y2 U
  3. int domax = 0;2 d$ d" B! K% j6 y9 v8 I3 _; A; w
  4. if (!inputopen(current))8 C$ c, U' e) J
  5. return PULL_REEVALUATE_ON_READY;+ y+ v, X/ @# y) _1 V  ~) O5 n7 i
  6. double bestval = domax?-10000000000:10000000000;# W  ?, G7 t# R
  7. int bestportnr = 0;
    " A7 S$ Z% }& `* @- c
  8. treenode bestitem = NULL;* \5 H: X# j% v5 i: q: A6 h  F1 k, U
  9. for (int i = 1; i <= nrports; i++) {9 s: J4 B$ x7 Q* F0 D5 i6 [0 N' ^
  10. treenode object = inobject(current, i);
    6 r& G6 C1 f* a* n" u
  11. if (!outputopen(object))
    3 ~  B2 _3 }1 x+ Z/ f$ ^
  12.   continue;
      H% v/ Z8 S% p5 w! N, L/ Z
  13. int opnr = ipopno(current, i);2 W- ?( P  g9 G/ R7 |3 s
  14. if (!opopen(object, opnr))
    + }* k0 Q4 A( N! x( d  P; G/ {- h
  15.   continue;
    0 @# j5 r8 o& @8 y7 h1 @9 j! o
  16. int startindex = 1; int endindex = content(object) + 1; int incr = 1;
    9 _, Q( V3 T- q3 r) |4 [7 f3 W- N
  17. if (getvarnum(object, "lifo")) {
    # c" |& \5 V3 g1 N$ R6 I& o5 K
  18.   startindex = content(object);& @& _, l& `, T' V
  19.   endindex = 0;6 Q/ I# l; i0 H6 R4 u  m/ V
  20.   incr = -1;5 I. S# V* x0 r& q% z. |
  21. }. N# T# A, D! [* H8 v
  22. 5 g+ C  A6 ]6 n( z- H* {# w( e  T) R
  23. for (int j = startindex; j != endindex; j+=incr) {7 J0 E: f; t8 ]- b- u4 Z# Y. P8 S
  24.   treenode item = rank(object, j);
    ) a3 \  e& F" {7 M5 Y
  25.   if (evaluatepullcriteria(current, item, i)) {
    ' n' [8 f2 m* z
  26.    double val = getitemtype(item);0 P+ V1 n5 y0 |8 j2 _
  27.    int newbest = domax ? val > bestval : val < bestval;2 p7 o  w* ^* x
  28.    if (newbest) {
    . y" W8 ^1 l1 T: E/ w& y
  29.     bestval = val;# |8 R3 Z, |# \& b. T
  30.     bestitem = item;' A( G2 s+ v# E$ W
  31.     bestportnr = i;+ J( A8 j# r+ A9 m7 r
  32.    }7 T+ }# N/ Y9 N/ B
  33.   }
    5 E! ?" K1 R4 Y/ o; T6 j+ B
  34. }
    # S7 l5 N7 H( e1 P/ n! e: F5 @7 j; A
  35. }
    5 o# w9 z+ B1 u0 }* v* c) M
  36. if (bestitem)
    , t( S5 h. l, Y! T* h, B
  37. pullitem(current, bestitem, bestportnr, BYPASS_ALL);$ N! m4 b  b3 G. w" {" d* f: I! A
  38. else return PULL_REEVALUATE_ON_READY;+ z8 E$ p4 M% m% `3 W, }& Y( T7 @
  39. return 0;. e5 N" f" i; u6 a; C% u& v
复制代码
在这段代码中,前三个if都是判断端口状态的。
1 r$ o0 t& \: z* fif (!inputopen(current)); n( J( H! l( ?% R
return PULL_REEVALUATE_ON_READY;0 X: ~3 ?' L& F  e
//如果处理器端口没打开,用return跳出此段代码& E( z/ c- d# @; R/ R6 ?
......
3 W: ~  B, r) v* b! }1 r4 Afor (int i = 1; i <= nrports; i++) {: v  L8 }% K- {9 {4 U, f  I# Y
treenode object = inobject(current, i);/ G/ n( |, v9 ~1 {! ]: Q7 V8 ]
if (!outputopen(object))
$ `/ Z7 r9 ^+ c* z  continue;
" A/ p! a) j7 ?* _, ^/ a0 }, V//如果上游输出端口没打开,用continue跳出此次for循环
  i% t6 ]; m/ z5 b3 g) mint opnr = ipopno(current, i);' A$ T1 F; o4 X: r2 ]+ M5 u
if (!opopen(object, opnr))" ?1 K" ?- C' N  |* d
continue;$ Q* o$ j. G' U- Y2 P
//如果上游输出端口打开了,继续判断上游实体与当前实体相连的那个输出端口是否打开,如果没打开,则用continue跳出此次for循环
! c- \& H1 @/ d9 A) T; v4 [" V5 `4 b; `( V! w
我主要是对最后一次判断比较不理解,因为根据我在前面的分析,固定实体是不能单独打开或关闭某个端口的。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-6-28 13:20 , Processed in 0.083550 second(s), 16 queries .

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

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