全球FlexSim系统仿真中文论坛

标题: moveobject命令的一些疑惑 [打印本页]

作者: zorsite    时间: 2014-9-15 21:53
标题: moveobject命令的一些疑惑
本帖最后由 zorsite 于 2016-4-7 11:54 编辑
) ]" o# c. n8 i/ p/ Z0 U  ]/ w" Y9 V! U; ~# m( I
模型中有四个实体:
) i* Y' R$ S# U4 H/ x. Y7 R发生器,处理器,暂存区,独立暂存区。6 o. b. h9 q. p, ~: v* c8 [
发生器,处理器,暂存区依次A连接。
4 F  U" f3 I4 ?独立暂存区不与任何实体相连。5 A$ A! X7 C) E9 \& d" y3 ]

( h, {4 M0 N+ m4 N发生器中产生两种类型的临时实体,! C+ [. @, E+ ^* G
第一种临时实体加工后传送到暂存区,
) p  m# j/ S5 R& d/ {3 k/ m  C第二种临时实体加工后“移动”到独立暂存区。& Z8 {. g; O4 F2 [/ i& \) A: c
' |7 c4 R! x. w' P
发生器中创建触发中代码如下:! i0 H7 B6 P& A3 p: `
setitemtype(item,duniform(1,2));

8 E" d: E" G$ {/ Ncolorarray(item,getitemtype(item));; L9 G) `6 v  j/ S5 z& d6 g
& F" q/ B, [1 |* k; i2 k0 p# ?
处理器的“加工结束触发”中加入以下代码:
, L7 P+ f9 m; T! j% u1 ]if (getitemtype(item)==2) moveobject(item,node("独立暂存区", model()));0 o, ]$ e+ `* s) l* [
; g; X% l3 n  c+ A' J) ]' p
各种触发器触发时间的先后顺序为:# m$ Q8 G+ s. w- \# O6 K; S5 w
重置触发à进入触发à预置结束触发à加工结束触发à发送至端口à使用运输工具à离开触发$ @" r) M* Y( G  O3 t8 x/ ~+ H
加工结束触发在发送至端口触发之前,$ f1 N' }5 I2 ~" _5 b  t* W) u
理论上来讲,第二种临时实体加工完成后先应该先被移动到独立暂存区。
0 z$ \1 U/ q& Y3 V  c0 Q
+ B7 ~# d, B% Z5 P* a可是模型运行起来并不是这样子,所有的临时实体全部堆积在暂存区。7 I. E% _' W1 q, g
没有任何临时实体进入“独立暂存区”。
3 K) I1 l& p( p3 V请问问题出在哪里?
: k/ s7 F9 Y- v6 T6 C# `0 g/ W9 \! t: q* }: X+ h- u3 A2 }: e2 t
moveobject (obj object, obj location[, num outport])" h$ \$ M9 L) b: p7 g) w$ F8 T
Moves object to the specified location
+ e, s; N1 v6 n9 n3 E- t7 `移动对象到指定位置。9 q( M& }3 A* E4 `/ V% N2 B
Description
1 D4 H. `" m( WThis command moves the object to the specified location through the specified port. 7 {/ t7 L% J* }! q
可以指定从哪个端口输出。
& I+ ^$ N  ]- cThe specified port does not have to actually exist, this value is used by the receiving location to be able to reference the port the object came in through. ! ^2 W% A1 x( L* K( ?
这个端口并不一定要真正存在,主要是为了告诉接收方对象是通过哪个端口进入的。: K" p5 l8 h- C; o3 K
When an object moves into location, the OnReceive event function of location is executed.
5 C$ `8 g; R- |5 [6 ~4 a. F4 X当对象移动到指定位置时,将激活(执行)接收方的“接收触发”事件。(什么实体会有接收触发?)
# Z: Q2 W0 _# \/ L/ V8 zThis includes the OnEntry trigger function.
- A' ^+ p  B7 ^" ], U( p这包括“进入触发”。(什么意思?接收方的进入触发吗?这句话有什么含义?)
5 M& w. {  z& w, {8 F  j( dExplicitly calling this on a flowitem with events queued up for it may cause problems. / l$ t; k3 S5 d
如果临时实体有事件要执行时使用这个命令将会引发不可预知的错误。
( N" R4 U2 c8 t/ [& V! ~Only use when you know that no events are pending for the object being moved.
6 ~: p# q4 m5 ]只有被移动的对象没有任何事件要执行的时候才能使用这个命令。' D+ ^+ P/ ~) h8 |: T
[attach]2203[/attach]
作者: FFFrenk    时间: 2014-9-16 09:06
"Only use when you know that no events are pending for the object being moved."8 b& Z& N4 J" O" x4 M; z; \, W3 y
这句话其实是很关键的一句话。7 W, A, T  x( k% x# D6 e
; b1 V6 k. T, r* @
从你的模型中可以看出来,在执行moveobject这个任务的时候,flowitem的确是被移动到了独立暂存区上(通过断点独立暂存区的OnEntry可以看出来。)( f/ X7 i; T: j6 {& F& g
3 a  T, \7 s! X" W, X
只是,关键是,同一个时刻(时间点),被移动到独立暂存区上的flowitem又触发了处理器的sendtoport选项,也就是说此时的“被移动的对象有任何事件要执行”。- N. W0 R* A. y+ o9 X+ C
因为是同一个flowitem触发了sendtoport选项,所以即使已经到了独立暂存区上的flowitem也会被送到下游端口“暂存区”上。
$ L9 D" a2 c& R7 t" b, B$ v" O- t- ^' V$ |" G
也就是说,在确保flowitem在同一时刻没有事件需要执行的情况下,才可以使用moveobject这个命令。1 Z$ b& e6 N2 T
执行了这个命令之后,flowitem必定会触发两个触发器:
5 q& e- k+ Q4 ^7 h1.flowitem当前所处实体的离开触发。
' n3 b% m- o6 C* v) N2.flowitem移动到目标实体的进入触发。
( k5 h! F( q+ z0 `5 B& e, ^+ D& G" u$ {* m3 \$ R3 `# U
以上。
作者: zorsite    时间: 2014-9-16 09:39
嗯,读了你的解释后,大概明白一些了。
+ ?( i( X9 H) B, q9 ?我之前以为,$ l9 W" l4 }3 E' q* ^* R5 i* y
因为“加工结束触发”在“发送端口触发”之前,
( T  V9 H% v- q3 p( `/ i- l所以应该先执行“加工结束触发”,将临时实体移动到独立暂存区,0 y+ F% n2 r+ a) a% v/ m! E
之后该临时实体就应该停留在独立暂存区了。( @8 _, y6 y. X3 z& s, M& K

  k1 @/ J4 ?4 y( G! n6 `3 X现在看来这种想法是错误的。
' X' p+ @* \5 b$ f5 g) i( L9 P$ F" a+ G, [+ B9 U3 w
即使临时实体被移走了,接下来仍然会按照处理器的既定顺序激活”发送至端口“触发。0 e2 y$ v% ]7 b9 f5 E- K7 x
恰恰是因为”发送至端口触发“在”加工结束触发“之后,所以临时实体被移走了之后仍然通过默认端口(唯一的端口)传送到暂存区。
2 Q- L  z9 O7 z. ^3 T" k# b9 U" r* n$ H. ]# O! ]( x
那么这里就有一个问题:当临时实体离开处理器后,在新的临时实体进来之前,离开的这个临时实体仍然是当前实体(current)的(item)吗?current仍然对此(item)有掌控权限吗?# S) O5 B! W) e" r1 V% o' x
7 e: x) B1 [8 u; s, t
楼上说:
% V$ ^* k; F9 T8 x8 G, ?! J同一个时刻(时间点),被移动到独立暂存区上的flowitem又触发了处理器的sendtoport选项,* f. \: x/ y* F; ~4 j( Y9 m" G" Z+ u
执行了这个命令之后,flowitem必定会触发两个触发器:* i8 |2 E. T" p4 Q
1.flowitem当前所处实体的离开触发。' ]" G1 e3 K9 f1 P
2.flowitem移动到目标实体的进入触发。
6 h# t6 u% T* |  W# s

4 z0 y' [# @+ c) b- v/ t我有些疑惑:1 o; Y% Y: K' E3 ]1 \0 c
1、同一时刻(时点)“加工结束触发”和“发送至端口”同时被触发?这两个不应该是有先后顺序的吗?  W- M- U: T$ a  [$ g, [- A
2、moveobject命令执行后,会激活处理器的”离开触发“,和独立暂存区的"进入触发”,如果按照这个解释,离开触发中没有任何代码,应该没有动作被执行啊?
作者: 蓝桥书生    时间: 2014-9-16 10:14
我获取了加工结束触发的时间和发送至端口的时间,他们确实是同时触发的,而且下游暂存区的进入触发也和这两个同时发生
作者: 雪饼    时间: 2014-9-16 10:31
加工结束触发、sendtoport以及使用运输工具这三个触发,虽然代码上有前后读取顺序,但是里面引用的item为同一个,所以才会出现上述情况。你在sendtoport里面再加个条件就ok了
作者: zorsite    时间: 2014-9-16 13:31
本帖最后由 zorsite 于 2014-9-16 13:33 编辑 # C) w2 ]3 O3 n, o# j# s* t
我获取了加工结束触发的时间和发送至端口的时间,他们确实是同时触发的,而且下游暂存区的进入触发也和这两个同时发生
3 M& p. o: h. L蓝桥书生 发表于 2014-9-16 10:14
. j7 [: R! P1 R& I: \

4 ?+ ~! X. f% S" ^1 e% ?  Y4 l
" G0 R6 f' u. k2 W: j2 `这个时间精度是多少?会不会是现在的CPU速度太快了所以两者的时间没有差别?5 e+ c3 b6 C8 @, S
加工结束触发、/ m4 y# Z" Q: f' R. |# O$ t- {4 I# k
发送至端口、
: U6 G# ~* i" m$ d% Y+ R9 K( r独立暂存区的进入触发
# Y: ?2 M2 J$ H4 X5 N从逻辑上来讲,至少加工结束触发是先于独立暂存区的进入触发的啊~" G2 S+ A1 L" e# ~5 B) U* q5 @, M
从时间上来看,应该依次为:
% \8 n$ V1 q$ V2 v5 Z加工结束--moveobject--进入触发, O. |6 d& `6 A3 z1 R& G, j
只有这样逻辑上才讲得通啊。
! S6 S) e& ~( M) ]# f6 G8 `' g1 u& t/ C, I( @

) p8 B. z2 a2 c0 U' |8 a
加工结束触发、sendtoport以及使用运输工具这三个触发,虽然代码上有前后读取顺序,但是里面引用的item为同一个,所以才会出现上述情况。你在sendtoport里面再加个条件就ok了0 d( Y2 h8 K2 n6 k) W# S( h
雪饼 发表于 2014-9-16 10:31

- [, m- H* R0 i/ g
% T  s$ S0 q1 N) o出现上述情况指的是这三者真的是同一时间触发的吗?" |( X% o7 h" D' F0 N1 ]' v
在sendtoport中加入什么条件可以避免这一现象?
作者: FFFrenk    时间: 2014-9-16 18:24
3# zorsite
- n) m- x, H- i; @" d
  S7 p! {+ `) r这里涉及到一个flexsim原理的问题。  ~9 s4 T( ?9 P+ C6 [
在同一个仿真时间点,能够触发很多触发器。6 `5 }: V+ y: k2 C' B+ G; U7 o8 K6 c
比如对于发生器来说,下游端口可用的情况下,* I6 @+ t# I7 `5 F
会同时触发,并且先后触发:8 _1 \& F1 D) ]4 U) T- G
1.On ceration. Z& b' ?: V, W- [3 G* l2 o& L8 w( ]
2.Sendtoport
1 Y2 E) I1 Q2 P3.On exit
: e8 D; B' |! C
( x+ y: [3 v7 s' \( f2 K而且带有点强制触发的意思(这句话完全个人猜测)。
7 c. V) s: j  y7 `* G- d; r2 A/ i
也就是说,你在On ceration设置mobeobject的时候,第二和第三个其实不会自动消除,还会继续执行。
0 n5 O. h. n6 a# q/ ]6 b2 i- p只是,你在使用moveboject的时候,再1和2之间插入了一个新的要执行的东西。执行完之后(具体表现为,item被移动到暂存区上)。。* y' _1 E. ~0 W* x& X
继续强制执行,2,3触发器,item被移动到下游端口。
' S9 _4 o2 H! Y/ F/ w* R$ S. l& S2 k" G. w: A
另外,其实每个触发器里都是有写代码的。
# q: h4 q7 l3 \# x比如
8 [9 S8 W3 z3 B+ R* u9 \8 Wtreenode current = ownerobject(c);4 t, \/ L7 M, C4 U$ h% Y
所以,不存在不写代码就不会触发的情况。7 x2 T$ o) h- R8 O% n* @9 P
以上。
作者: 慧娴亚伦    时间: 2014-9-16 21:18
其实准确上也不是强制触发,是因为On creation这个触发器触发,实际上也是一个事件发生,同时后面两个Sendtoport和On exit事件也已经在事件发生的队列中等候了(触发的时间点也已经预计好了),所以一定会触发这两个触发器。
% ~; d: W; k1 P7 D6 ^+ ^事件的发生实际上就驱动着flexsim的模型运行,原理跟任务序列很较多相似之处。
作者: 657776724    时间: 2015-11-12 10:27
好东西!收益匪浅
作者: zorsite    时间: 2015-12-25 14:12
" P/ j2 ]6 ^8 Z" R: S( {6 t
……不存在不写代码就不会触发的情况
' z( x1 S2 a( U! Z& K$ vFFFrenk 发表于 2014-9-16 18:24

( w1 X# T) {5 Z: T重新翻看了一遍各位大神的回复,对这个问题的理解又深刻了一分。
% }3 j; k# K: T1 y* s* I; e6 l5 ^" d/ a5 H
其实"Send to Port“触发即使不写任何代码,也会被发送到”First available“端口。
- N8 G- W4 j* B0 j; h) H所以,为了让已经被搬运到其他地方的临时实体不再执行”发送至端口“触发,可行的办法是在”发送至端口“触发中编写代码,把临时实体发送至一个不存在的端口。' U* I  |2 i# S, r" S; W4 X6 ^
错误的办法是:不对已搬运到其他地方的临时实体进行任何的操作。因为不做任何操作即默认发送至”First available“端口。




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