设为首页收藏本站

最大的系统仿真与系统优化公益交流社区

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 4110|回复: 10

关于Decide模块与Connections的设置??

[复制链接]
发表于 2008-7-26 11:36:43 | 显示全部楼层 |阅读模式
放暑假了,论坛好久都没动静了,发个贴,活跃一下,大家交流交流。
一个比较难的问题,最近遇到了一个关于Arena开发的问题:
代码如下:
Dim Decide, Process As Arena.Module
  Dim m As Arena.Model
  Set m = ThisDocument.Model   
            Set Decide = m.Modules.Create("BasicProcess", "Decide", 2000, 3000)
            Set Process = m.Modules.Create("BasicProcess", "rocess", 3000, 3000)           
            With Decide
               .Data("Type") = "N-way by Condition"
               .Data("N If(1)") = "Expression"
               .Data("N Value(1)") = "Entity.Type == 1"
               .Data("N If(2)") = "Expression"
               .Data("N Value(2)") = "Entity.Type == 2"
               .UpdateShapes
            End With
           
            m.Connections.Create Decide, Process, "Next Label No", "Label", , , ""
            'm.Connections.Create Decide, Process, "N Next Label Yes", "Label1", , , ""
上面的语句创建了两个模块,Decide模块采用N-way-condition的判断模式,具有两个YES出口,一个NO出口。利用上面的语句成功链接NO出口与Process模块。但我想利用最后一句让其中一个YES出口与Process模块链接则会出错(这时我会注释掉倒数第二句语句)。
最后一句话我注释掉了,因为出错。大家可以把上面语句拷到空模型中作为一个宏运行一遍。
我不知道为什么出错,这样的话就没发设置decide模块的Yes出口与process模块进行链接。
PS:补充一点知识:
如果Decide模块采用2-WAY-BY CHANCE的模式,则:
  m.Connections.Create Decide, Process, "Next Label Yes", "Label", , , ""
可以成功实现YES出口的链接。但用N-WAY-BY Condition则不行。
另外:大家可以试着用宏记录一遍手动创立上面的链接。关闭记录宏后,删掉链接,再执行刚才的宏记录则会报错。

这个问题有点复杂,希望大家有什么想法可以交流交流。期待高手出来帮我解决。
此贴永久有效!等候大家放假归来。

最后贴上Arena帮助中关于Connection的创建解释,希望大家能帮助理解:
Create Method

Syntax

Create(IDispatch *srcModule, IDispatch *destModule, srcOperand As String, destOperand As String, srcRepeatIndex As Long, destRepeatIndex As Long, xPoints() as Long, yPoints() as Long) As Connection

Description

Creates a new connection and adds it to the Connections collection. If the connection will emanate from a repeatable exit point, the srcRepeatIndex identifies which repeat tuple (starting at one) the connection should use. Similarly, if the destination module’s entry point operand is in a repeat group, the destRepeatIndex defines the tuple to which the connection will be made. The xPoints and yPoints arrays may be used to define exact intermediate points for the connection line. If either array is passed, both must be supplied. If you are connecting a repeating exit point, the exit point operand must first be created using the Data method; e.g., myModule.Data("ExitRG(1)") = "". This corresponds to adding a tuple interactively via the module dialog, then adding a connection between the created repeatable exit point and another module.



[ 本帖最后由 mayiArena 于 2008-7-28 09:32 编辑 ]

评分

参与人数 1仿真币 +18 +1 收起 理由
苘苘 + 18 + 1 促进交流

查看全部评分

 楼主| 发表于 2008-7-28 09:52:06 | 显示全部楼层
被评分了。谢谢。
我觉得关于Create方法的翻译是很重要的,我做不到有效的理解。特别是tuple这个单词的意思。希望大家能帮忙。
发表于 2008-7-30 19:15:48 | 显示全部楼层
这个问题,我已经解决了.非常简单.下面是我的方法:

用VBA生成模块时,会自动地将前后的模块连接起来,因为生成模块后,系统是默认选中所生成的模块的,大家用过Arena都应该知道,在选中某模块的情形下,再从面板中拖曳出一个模块时,会自动有线将这两个模块连接起来.这个地方就是重点!
楼主生成Decide后紧跟着生成Process,这样一来,Decide的else出口会自动跟Process的入口连接起来,就算没有下面这一句
的.m.Connections.Create Decide, Process, "Next Label No", "Label", , , ""
也会达到效果的.
如果要是再生成另外一个Process,那么我们看到的则是前一个Process跟后一个Process自动连接起来.而我们原本想的是将Decide的另外一个出口跟第二个Process连接起来.
那么怎么样做才能达到这样的效果呢?

答:去掉默认选中生成的模块!
代码是object.shape.selected = False   '其中object为生成的模块对象名,如楼主文中的Decide,Process.
每生成一个模块后都加上面这么一句.
这样一来,各生成的模块间就不会有线自动连接了.

当各模块生成好之后,再用connection就可以连了.连接的顺序是程序固定的,先会连else的出口,然后再连Yes从上到下各出口.
model.Connections.Create Decide, Process1      '先连Decide和Process1,此时是Decide的else出口跟Process1相连
model.Connections.Create Decide, Process2      '再连Decide和Process2,此时是Decide的第1个Yes出口跟Process2相连
model.Connections.Create Decide, Process3      '后连Decide和Process3,此时是Decide的第2个Yes出口跟Process3相连


OK,问题解决.

至于为什么宏录制了后再运行就运行不了,我觉得对于楼主说的这个例子来说是必然的.
m.Connections.Create Decide, Process, "Next Label Yes", "Label", , , ""
上面这句代码中的"Next Label Yes"和"Label",后面一个"Label"应该是对应的Process的吧?但Process里面有Label吗?

[ 本帖最后由 zhangcan 于 2008-8-6 16:21 编辑 ]

评分

参与人数 1仿真币 +20 +1 收起 理由
xywf2008 + 20 + 1 我很赞同,cancan同学不错哦 加油加油!! ...

查看全部评分

 楼主| 发表于 2008-7-31 22:40:02 | 显示全部楼层
先感谢楼上的回复。
首先自我检讨一下没有把问题讲清楚。
先介绍一下关于模块的一些参数:

对于Arena中的每一个模块,为了实现与其他模块的链接,所以定义了入口和出口,对于一般的模块,只有一个入口和出口,在Arena中定义为:label和next label。默认是隐藏的,在模块属性框中是找不到的。在connections.create函数中是作为srcOperand 与 destOperand 来使用的。如下面:Model.Connections.Create create, process,"Next Label", "Label", 11, 24, xValues, yValues;就表示将create的next label与process模块的label连起来。这样就实现了create与process的链接。
但对于多个入口或出口的模块,如decide,如果是2-way-chance,则Yes出口定义为:Next Label Yes,No出口定义为:Next Label No.我们通过编写代码: m.Connections.Create Decide, Process, "Next Label No", "Label", , , ""就可以实现No出口与Process的label进行链接。如果改为m.Connections.Create Decide, Process, "Next Label Yes", "Label", , , ""则可以实现Yes出口与Process的label进行链接。
但如果改为N-way-chance则不同了。因为还是只有一个No出口所以, m.Connections.Create Decide, Process, "Next Label No", "Label", , , ""仍然可以实现No出口的链接。但这时有多个YES出口,所以这些出口叫做:N Next Label Yes。

我想问的是在N-way条件下为什么:m.Connections.Create Decide, Process, "N Next Label Yes", "Label", , , ""就会报错。不能链接。

我在建模时遇到这个问题时,采用的方法和楼上的类似。不去指定这些label。但遇到这个问题后,我就觉得提出来让大家讨论讨论,挺好。没想到没说清楚。。不好意思了!

另外解释一下connections.create的方法:
Create(IDispatch *srcModule, IDispatch *destModule, srcOperand As String, destOperand As String, srcRepeatIndex As Long, destRepeatIndex As Long, xPoints() as Long, yPoints() as Long) As Connection
srcModule:起始模块 destModule:结束模块;
srcOperand:起始模块的出口:通常为Next label,对于多出口模块则不一样如decide则为:Next Label Yes和Next Label No;  
destOperand :结束模块的入口:通常为Label。对于多入口模块则不一样如match则为:Label1和label2;
xPoints yPoints:指连接线的拐点坐标,没有实际意义。

我想顺便请教大家一下:srcRepeatIndex As Long, destRepeatIndex As Long的用处。。

版主看一下能否再跟我加个金币啥的,那天给我加了金币后,我在论坛下了点东西,一下就低于权限值了,下不了了。急死了。所以拜托了,看在这么多文字的份儿上。

[ 本帖最后由 mayiArena 于 2008-7-31 22:43 编辑 ]

评分

参与人数 2仿真币 +18 +1 收起 理由
苘苘 + 1
xywf2008 + 18 刻苦钻研的好孩子!鼓励以下! ...

查看全部评分

发表于 2008-8-1 15:33:10 | 显示全部楼层
请你再仔细看看zhangcan 同学的回复
他的意思是生成每个模块之后,先用object.shape.selected = False   改变该模块默认的选中状态,在生成一个N-way的decide模块和n个需要和它连接的模块之后再用 model.Connections.Create Decide, Process1  这样的语句将decide的各出口与相应的模块连接起来,系统默认的连接顺序是先连接else的出口,然后从上到下依次连接其余各出口。
  假设要把一个三个出口的decide模块分别与Process1,Process2,Process3连接,else联Process3,其他连个从上到下联Process1,Process2,则顺序应该是:
model.Connections.Create Decide, Process1
model.Connections.Create Decide, Process2     
model.Connections.Create Decide, Process3     
你再试试,zhangcan同学的代码运行结果我看过了,没问题的

评分

参与人数 1 +1 收起 理由
苘苘 + 1 挺热烈啊,:-)

查看全部评分

发表于 2008-8-1 15:38:14 | 显示全部楼层
Module: Decide         
   Operands Contained in Dialog 'Decide':
   Operand Name                       Text
   ---------------------------------- --------------------------------
   Label (Hidden)                    
   Next Label Yes (Hidden)           
   Next Label No (Hidden)            
   Typeis (Hidden)                  
   TrueUV (Hidden)                  
   FalseUV (Hidden)                  
   If_N (Hidden)                     
   With_N (Hidden)                  
   ElseUV (Hidden)                  
   V_NumberOutTrue (Hidden)         
   V_StatsTrue (Hidden)              
   V_CategoryTrue (Hidden)           
   V_NumberOutFalse (Hidden)         
   V_StatsFalse (Hidden)            
   V_CategoryFalse (Hidden)         
   Percent True Expr (Hidden)        
   2DArrayIndexes (Hidden)           
   1DArrayIndex (Hidden)            
   RealVar (Hidden)                  
   Name                               Name                              
   Type                               Type                              
   Percent True                       Percent True                     
   If                                 If                                
   VNamed                             Named                             
   Row                                Row                              
   Column                             Column                           
   ANamed                             Named                             
   TypeNamed                          Named                             
   Is                                 Is                                
   Value                              Value                             

   Operands Contained in Repeat Group 'Conditions':
   Operand Name                       Text
   ---------------------------------- --------------------------------
   N Typeis (Hidden)                 
   N Next Label Yes (Hidden)         
   UV (Hidden)                       
   N Percent True Expr (Hidden)      
   N 2DArrayIndexes (Hidden)         
   N 1DArrayIndex (Hidden)           
   N RealVar (Hidden)               
   N Percent True                     Percent True                     
   N If                               If                                
   N VNamed                           Named                             
   N Row                              Row                              
   N Column                           Column                           
   N ANamed                           Named                             
   N TypeNamed                        Named                             
   N Is                               Is                                
   N Value                            Value                             


==============================
上面这段是Arena安装目录中BasicProcess.txt里面的内容.
左边是VBA调用时用的名称,右边是程序中对应的.
Label的确是Operand Name ,且是隐藏的.只可调用,不能修改

评分

参与人数 1仿真币 +18 +1 收起 理由
苘苘 + 18 + 1

查看全部评分

 楼主| 发表于 2008-8-1 20:32:48 | 显示全部楼层
我不是说这种做法有问题。建模的时候我采用的也是类似的方法。
zhangcan同学的方法是对的。我也肯定了。
上面你列出的那个表,就是我在第二个帖子中介绍的内容。

我是想问的:为什么在N-WAY情况下,调用N Next Label Yes会出错。并没有说要修改啊。

估计是我的帖子没说清楚。大家再好好看看我的帖子,就知道我想问的是什么了。

anyway,thanks!
发表于 2008-8-6 16:54:21 | 显示全部楼层
回复:
你上面说的:
我想问的是在N-way条件下为什么:m.Connections.Create Decide, Process, "N Next Label Yes", "Label", , , ""就会报错。不能链接。
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
如果是N-WAY的话,那么出口也就有多个点了。"N Next Label Yes"到底是表示的哪个N呢?

目前你指的这个问题我也没有完全弄清楚。我做了一个小测试,结果很奇怪。
你可以试一下

把下面这句代码改一下:
m.Connections.Create Decide, Process, "N Next Label Yes", "label"

变成:
for i = 1 to 2
    m.Connections.Create Decide, Process, "N Next Label Yes", "label",i
next

运行一下看,你会发现。。。。。。。

但如果是写成:
    m.Connections.Create Decide, Process, "N Next Label Yes", "label",1
        m.Connections.Create Decide, Process, "N Next Label Yes", "label",2
却又得不到上面循环运行的结果。
然而
for i = 1 to 2
    m.Connections.Create Decide, Process, "N Next Label Yes", "label",i
next

m.Connections.Create Decide, Process, "N Next Label Yes", "label",1
m.Connections.Create Decide, Process, "N Next Label Yes", "label",2
是同样意义的代码。却得出不同的结果。真让我纳闷了。
 楼主| 发表于 2008-8-22 09:53:19 | 显示全部楼层
放假归来。
N Next Label Yes目前我发现还不需要指定1或2,如果指定了(还不知道如何指定)会报错。至于为什么只能使用 i 这种变量,我估计还得研究srcRepeatIndex 这个参数。
多谢楼上!
发表于 2009-1-5 21:23:07 | 显示全部楼层
这个帖子挺不错,可以再回味一下下,08年本板块比较热烈,比较有气氛的帖子之一
发表于 2009-1-6 11:21:24 | 显示全部楼层
不懂这个的东西,来学习.
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|Archiver|手机版|SimulWay 道于仿真   

GMT+8, 2024-11-22 09:59 , Processed in 0.015891 second(s), 16 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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