本帖最后由 Yumaotuo 于 2018-5-17 09:44 编辑
1、模型描述:
传送带左右两侧各有两台设备,产品通过传送带分拣至第一个缺货的设备,设备前有一个容量为1的暂存区作待加工品的缓存。若无可用下游,产品在传送带指定决策点的位置等待,直到出现第一个可用的下游。
2、模型布局:
依下图进行布局,发生器产生产品进入传送带,传送带依次与四个暂存区A连接,形成4个离开衔接点,决策点依次与4个离开衔接点A连接。暂存区与各自的处理器A连接,加工完的产品进入吸收器。
3、建模逻辑:
我们在暂存区中创建表示暂存区当前容量的标签Content,产品到达决策点时停止,持续判断暂存区的Content标签值是否有为0的,若有就发送产品。
决策点到达触发: /**停止临时实体并做第一轮的判断发送至下游*/ Conveyor.DecisionPoint current = param(1); Object item = param(2); Conveyor conveyor = param(3); Conveyor.Item conveyorItem = conveyor.itemData[item]; //************* PickOption Start *************\\ conveyorstopitem(item);//停止临时实体 for(int i=1;i<=current.outObjects.length;i++)//对下游端口循环判断 { if(current.outObjects.outObjects[1].Content == 0)//Content标签等于0即为空载 { conveyorresumeitem(item);//恢复临时实体 conveyorsenditem(item, current.outObjects);//发送临时实体到可用下游 current.outObjects.outObjects[1].Content=1;//Content标签值置为1,表示该下游不可用 item.color = Color.byNumber(i);//更改相应的颜色 break;//跳出循环 } if(i==4)//如果未发现可有下游 { senddelayedmessage(current,0,item,1);//发送1号消息至当前实体 } }
决策点消息触发: **下游有空时接收消息,并0.1秒刷新一次*/ Conveyor.DecisionPoint current = param(9); Conveyor conveyor = param(10); if(msgparam(1)==1)//接收消息 { Object item = msgsendingobject();//声明item for(int i=1;i<=current.outObjects.length;i++)//对下游端口循环判断 { if(current.outObjects.outObjects[1].Content == 0)//Content标签等于0即为空载 { conveyorresumeitem(item);//恢复临时实体 conveyorsenditem(item, current.outObjects);//发送临时实体到可用下游 current.outObjects.outObjects[1].Content=1;//Content标签值置为1,表示该下游不可用 item.color = Color.byNumber(i);//更改相应的颜色 break;//跳出循环 } if(i==4)//如果未发现可有下游 { senddelayedmessage(current,0.1,item,1);//0.1秒后再次判断是否有可用下游 } } }
产品发送到暂存区需要一段时间,若根据暂存区容量来判断是否可用,那么第一个产品未到达之前该暂存区一直可用,这段时间内到达决策点的产品都会被发送至该暂存区,所以这里用标签来表示暂存区的容量,接收到发送指令后即设置标签值为1表示该暂存区已经被补货。模型中用到的标签和消息触发,在建模中使用都比较广泛。 |