发帖
 找回密码
 立即注册
搜索
11 0 0

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

技术交流2 11 11 2015-9-29 14:48:25
[i=s] 本帖最后由 zorsite 于 2015-9-29 22:08 编辑 [/i]

我们知道有些命令可以打开、关闭输入输出。比如:[font=宋体]打开输入输出:[/font]openinput、openoutput
[font=宋体]关闭输入输出:[/font]closeinput、closeoutput
假设在重置触发中使用closeoutput命令关闭暂存区的输出。[code]closeoutput(current);[/code]关闭输出端口后输出端口右侧会出现红色的小方块表示关闭,一旦使用了closeoutput,所有的输出都将被关闭,即使有些端口仍然处于可用状态,临时实体也无法离开。

[quote]注意:
Connectionsin和connectionsout表示的是实体的输入、输出状态。为0则表示打开,为1表示关闭。
Connectionsin和connectionsout下的子结点表示有多少个端口,为0则表示不可用,为1则表示可用。可以在第一张图片中看到有1个绿色的三角箭头表示输入端口可用,2个红色的三角箭头表示输出端口不可用,以及红色三角箭头右侧的红色长方块表示输出关闭。

[/quote]
Flexsim中还有命令可以打开、关闭指定的端口:openip、openop、closeip、closeop
。命令注释中说明此命令用于流体对象。离散实体内部行为会控制打开或关闭端口,可导致此命令失效。[quote]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. [/quote]
是否真的会失效呢?测试一下。
删除重置触发中的closeoutput命令,更改为[code]closeop(current,1);[/code]只关闭暂存区的第一个输出端口,重置模型看效果如何。


不管是从模型还是从树结构中观察,好像都没有发现第一输出端口被关闭。
没关系,还有一个命令专门查看某个端口是否打开:opopen。如果处于打开状态则返回1,否则返回0.


通过中断调试,在本地变量窗口中查看两个端口的opopen返回值,发现都返回1,表示都处于打开状态,并没有被关闭,结果和在树结构中观察到的一致。
结论:不能通过closeip、closeop命令来关闭处理离散实体的固定实体的输出输入端口。

我对Flexsim中的端口相关命令进行了一下分类,并总结了一些规律:
[quote]ip=input port
op=output port
cp=center port
nr=number数量
no=NO.序号,号码[/quote]

命令大致分为以下几类:
[color=#ff0000]操作类:[/color]
比如打开、关闭、停止、恢复
[color=#ff0000]判断类:[/color]
判断输入输出状态、
判断输入输出端口状态、
判断端口连接是否畅通、
判断上下游端口是否可用
[color=#ff0000]统计类:
[/color]统计输入输出中间端口的数量
[color=#ff0000]获得上下游实体类[/color]
[color=#ff0000]获得上下游端口号码类[/color]
[quote]
打开输入输出
openinput
openoutput
关闭输入输出
closeinput
closeoutput
停止输入输出
stopinput
stopoutput
恢复输入输出
resumeinput
resumeoutput
打开某个输入输出端口(用于流动实体)
openip
openop
打开所有输入输出端口(用于流动实体)
openallip
openallop
关闭某个输入输出端口(用于流动实体)
closeip
closeop
关闭所有输入输出端口(用于流动实体)
closeallip
closeallop

[color=#ff0000]判断输入输出是否打开
[/color]inputopen
outputopen
[color=#ff0000]判断[/color]输入输出(端口)是否就绪(畅通)
ipready
opready
[color=#ff0000]判断[/color]某个输入输出端口是否打开
ipopen
opopen
[color=#ff0000]判断[/color]上下游端口是否可用
ipavailable
opavailable

[color=#ff0000]统计输入输出中间端口数量
[/color]nrcp
nrip
nrop

[color=#ff0000]返回上中下游实体
[/color]centerobject
inobject
outobject
[color=#ff0000]获取上下游端口号码
[/color]ipopno上游输出端口号码
cpcpno中间端口号码
opipno上游输入端口号码[/quote]
──── 0人觉得很赞 ────

本帖子中包含更多资源

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

x
2015-9-29 19:23:47
加老师的帖子篇篇都是精华呀,感谢加老师无私分享:lol
2015-9-29 20:38:38
目前看到下载次数有18次,但是回帖非常少,感谢楼主无私奉献,希望大家学习至少也给楼主一些支持和感谢!
2015-9-29 22:01:58
哈哈,回帖什么的我不介意的,但是有人回帖我还是很开心的。特别是二位版主的回帖,更是给了我无穷的动力。
其实没有建设性意见的回帖还是少来点好,这样后来者查看的时候不至于浪费太多时间。
2015-10-2 08:17:37
很详细!很深入!感谢分享!不过在“判断”的那一个部分那几个代码似乎让人难以区分差别
2015-10-3 10:19:30
说一下自己的理解,不知道对不对:
1、inputopen是用来判断箭头前面是否带杆;
2、ipopen是用来判断箭头的颜色;
3、ipavailable是综合判断是否带杆和箭头颜色;
请指正:)
2015-10-8 14:45:11
我同意楼上对inputopen和ipopen的理解,但ipavailable是判断上游实体的端口状态,不是自身,有点区别
2015-10-8 17:00:19
提示: 作者被禁止或删除 内容自动屏蔽
2015-10-9 16:18:33
我觉得这样想是不是可以加深大家的理解:
端口是否开放(open)和输出是否打开(inputopen)都只是输出端口一个片面的属性,不能决定到底能否将实体向下游发送。而是否可用(available)则是一个更加严格的概念,需要各方条件都符合才行。
2015-10-9 20:47:00
[i=s] 本帖最后由 zorsite 于 2015-10-9 20:49 编辑 [/i]

[b][url=http://flexsim.asia/redirect.php?goto=findpost&pid=18220&ptid=5505]9#[/url] [i]慧娴亚伦[/i] [/b]

总结的很有道理。
也很感谢各位非常有意义的讨论和回帖。

我之所以提出这样一个问题,是在做FMAT样题第一题的时候,[url=http://www.flexsim.asia/space.php?uid=29661][color=#0066cc]FFFrenk[/color][/url]版主提醒说有更简单的解决方案,就是系统自带的拉入策略“Pull Best Item”。[url=http://www.flexsim.asia/space.php?uid=1434][color=#0066cc]missman[/color][/url]也给出了自己的代码。见[url=http://www.flexsim.asia/viewthread.php?tid=5361&page=1&fromuid=610#pid17648]http://www.flexsim.asia/viewthread.php?tid=5361&page=1&fromuid=610#pid17648[/url]
于是我就去研究“Pull Best Item”策略,发现其设置了非常严格的端口检测条件,有兴趣的可以观摩观摩:[code]
int nrports = nrip(current);
int domax = 0;
if (!inputopen(current))
return PULL_REEVALUATE_ON_READY;
double bestval = domax?-10000000000:10000000000;
int bestportnr = 0;
treenode bestitem = NULL;
for (int i = 1; i <= nrports; i++) {
treenode object = inobject(current, i);
if (!outputopen(object))
  continue;
int opnr = ipopno(current, i);
if (!opopen(object, opnr))
  continue;
int startindex = 1; int endindex = content(object) + 1; int incr = 1;
if (getvarnum(object, "lifo")) {
  startindex = content(object);
  endindex = 0;
  incr = -1;
}

for (int j = startindex; j != endindex; j+=incr) {
  treenode item = rank(object, j);
  if (evaluatepullcriteria(current, item, i)) {
   double val = getitemtype(item);
   int newbest = domax ? val > bestval : val < bestval;
   if (newbest) {
    bestval = val;
    bestitem = item;
    bestportnr = i;
   }
  }
}
}
if (bestitem)
pullitem(current, bestitem, bestportnr, BYPASS_ALL);
else return PULL_REEVALUATE_ON_READY;
return 0;
[/code]在这段代码中,前三个if都是判断端口状态的。
[color=red]if (!inputopen(current))[/color]
return PULL_REEVALUATE_ON_READY;
//如果处理器端口没打开,用return跳出此段代码
......
for (int i = 1; i <= nrports; i++) {
treenode object = inobject(current, i);
[color=red]if (!outputopen(object))[/color]
  continue;
//如果上游输出端口没打开,用continue跳出此次for循环
int opnr = ipopno(current, i);
[color=red]if (!opopen(object, opnr))[/color]
continue;
[color=#444444]//如果上游输出端口打开了,继续判断上游实体与当前实体相连的那个输出端口是否打开,如果没打开,则用continue跳出此次for循环[/color]

我主要是对最后一次判断比较不理解,因为根据我在前面的分析,固定实体是不能单独打开或关闭某个端口的。
您需要登录后才可以回帖 立即登录
高级模式
12下一页
技术交流2
热门问答
查看更多
1
Flexsim初级建模工程师水平标准
Flexsim初级建模工程师水平标准
62
234
2
无意中找到的资料,非常适合于初学者
无意中找到的资料,非常适合于初学者
47
229
3
厂区生产线布局优化案例!新做的!
厂区生产线布局优化案例!新做的!
47
224
4
flexsim中文教程,pdf文档已整理-重新整理
flexsim中文教程,pdf文档已整理-重新整理
38
114
5
流水作业线的仿真
流水作业线的仿真
36
83
博主榜
+ 5