|
|
[i=s] 本帖最后由 Yumaotuo 于 2018-5-4 09:37 编辑 [/i]
[align=left][font=微软雅黑][size=4][color=#ff0000]1、模型描述[/color][/size][/font][/align][align=left][font=微软雅黑][size=4][color=#ff0000]
[/color][/size][/font][/align][align=left][font=微软雅黑]此案例是一个多载[/font]AGV调度模型的简化模型,AGV容量为3,产品加工完毕后由AGV搬运至卸货点,各个加工台在加工结束后呼叫距离自己最近的AGV执行搬运任务,并且AGV装满3个货物之后才去卸货点卸货。[/align][align=left][font=微软雅黑][size=4][color=#ff0000]
[/color][/size][/font][/align][align=left][size=4][color=#ff0000]2、模型布局[/color][/size][/align]
[align=left][/align]
[align=left][font=微软雅黑]模型中有[/font]6台处理器在加工完产品后需要请求AGV过来搬运,搭建AGV路径网络,并在交叉路口放置控制区域进行基本的避碰。[/align][align=left][font=微软雅黑]发生器[/font]A连接6台处理器,并在发生器设置随机可用端口;[/align][align=left]6台处理器A连接卸载区的暂存区;[/align][align=left][font=微软雅黑]处理器、暂存区和[/font]AGV全部A连接至路径网络;[/align]
[align=left][font=微软雅黑][size=4][color=#ff0000]3、逻辑设置[/color][/size][/font][/align][align=left][font=微软雅黑][size=4][color=#ff0000]
[/color][/size][/font][/align][align=left][font=微软雅黑][size=2][color=#0000ff]写入任务执行器列表[/color][/size][/font][/align][align=left][font=微软雅黑][size=2][color=#0000ff]
[/color][/size][/font][/align][align=left][font=微软雅黑][size=2][color=#000000]在AGV的自定义绘图触发器中,将未满载的AGV写入任务执行器列表[/color][/size][/font][/align][align=left][font=微软雅黑][size=2][color=#000000]if (current.subnodes.length<3) //[/color][/size][/font][font=微软雅黑][size=2][color=#9acd32]当AGV装载货物没满三个的时候[/color][/size][/font][/align][align=left][font=微软雅黑][size=2][color=#000000]{[/color][/size][/font][/align][align=left][font=微软雅黑][size=2][color=#000000] string listName = "TEList1";[/color][/size][/font][/align][align=left][font=微软雅黑][size=2][color=#000000] List(listName).push(current, 0);//[/color][/size][/font][font=微软雅黑][size=2][color=#9acd32]把自己推入任务执行器列表等待被占用[/color][/size][/font][/align]
[align=left][font=微软雅黑][size=2][color=#000000]}[/color][/size][/font][/align][align=left][font=微软雅黑][size=2][color=#0000ff]从任务执行器列表中拉入[/color][/size][/font][/align][align=left][font=微软雅黑][size=2][color=#0000ff]
[/color][/size][/font][/align][align=left][font=微软雅黑][size=2][color=#000000]在处理器的使用运输工具下拉列表选择使用列表中的从任务执行器列表中拉入,并选择ORDER BY distance ASC,即按任务执行器离当前处理器的距离按升序排序。所有处理器执行同样的操作。[/color][/size][/font][/align][align=left][font=微软雅黑][size=2][color=#000000]
[/color][/size][/font][/align][align=left][/align]
[align=left][color=#0000ff]实现满载后才卸货[/color][/align][align=left][color=#0000ff]
[/color][/align][align=left][font=微软雅黑]完成上两步后可以实现处理器调用最近的[/font]AGV执行任务,但是不能实现装满3个后再去卸载。完成上两步之后打开处理器的使用运输工具的代码编辑框,在下面红字标注处作简单的修改即可。[/align][align=left][font=微软雅黑]if (true) {[/font][/align][align=left][font=微软雅黑] int callbackCase = param(5);[/font][/align][align=left][font=微软雅黑] #define CALLBACK_CASE 10293[/font][/align][align=left][font=微软雅黑] treenode pulled = 0;[/font][/align][align=left][font=微软雅黑] treenode ts = 0;[/font][/align][align=left][font=微软雅黑] if (callbackCase != CALLBACK_CASE) {[/font][/align][align=left][font=微软雅黑] ts = createemptytasksequence(assertattribute(current, "stored", 0), priority, preempt);[/font][/align][align=left][font=微软雅黑]
[/font][/align][align=left][font=微软雅黑] inserttask(ts,TASKTYPE_TRAVEL, current, NULL);[/font][/align][align=left][font=微软雅黑] inserttask(ts,TASKTYPE_LOAD, item, current, port);[/font][/align]
[align=left][font=微软雅黑] inserttask(ts,TASKTYPE_BREAK, NULL, NULL);[/font][/align][align=left][font=微软雅黑][size=10.5pt][color=#9acd32]//删去原有的卸载任务序列[/color][/size][/font][/align][align=left][font=微软雅黑][color=#000000] string listName = "TEList1";[/color][/font][/align][align=left][font=微软雅黑][color=#000000] List list = List(listName);[/color][/font][/align][align=left][font=微软雅黑][color=#000000] string queryStr = "ORDER BY distance ASC";[/color][/font][/align][align=left][font=微软雅黑][color=#000000] Variant partitionId = 0;[/color][/font][/align][align=left][font=微软雅黑][color=#000000] int removeFromList = 1;[/color][/font][/align][align=left][font=微软雅黑][color=#000000] int addToBackOrders = 1;[/color][/font][/align][align=left][font=微软雅黑][color=#000000] pulled = list.pull(queryStr, 1, addToBackOrders ? 1 : 0, ts, partitionId, (removeFromList ? 0 : LIST_DO_NOT_REMOVE) | LIST_RETURN_BACK_ORDER_IF_NOT_FULFILL);[/color][/font][/align][align=left][font=微软雅黑][color=#000000] if (isclasstype(pulled, "ListBackOrder"))[/color][/font][/align][align=left][font=微软雅黑][color=#000000] eventlisten(pulled, "OnFulfill", c, 0, LIST_ON_FULFILL_VALUE, ts, 0, 0, CALLBACK_CASE);[/color][/font][/align][align=left][font=微软雅黑][color=#000000] else if (objectexists(pulled)) {[/color][/font][/align]
[align=left][font=微软雅黑][color=#000000] movetasksequence(ts, pulled);[/color][/font][/align][align=left][color=#9acd32][font=微软雅黑][size=10.5pt]//装载第3个box后加入卸载任务序列,注意此处任务序列生成的时候AGV上只有两个货物,[/size][/font][/color][/align][align=left][font=微软雅黑][size=10.5pt][color=#9acd32]pulled.subnodes.length等于2,不能把第三个货物也卸载掉[/color][/size][/font][/align][align=left][font=微软雅黑][color=#000000] if(pulled.subnodes.length==2)[/color][/font][/align][align=left][font=微软雅黑][color=#000000] {[/color][/font][/align][align=left][font=微软雅黑][color=#000000] inserttask(ts,TASKTYPE_TRAVEL, destination, NULL);[/color][/font][/align][align=left][font=微软雅黑][color=#000000] for(int i=1;i<=pulled.subnodes.length;i++)[/color][/font][/align][align=left][font=微软雅黑][color=#000000] {[/color][/font][/align][align=left][font=微软雅黑][color=#000000] inserttask(ts,TASKTYPE_UNLOAD,pulled.subnodes[i],destination);[/i][/color][/font][/align][align=left][font=微软雅黑][color=#000000] }[/color][/font][/align][align=left][font=微软雅黑][color=#000000] }[/color][/font][/align][align=left][font=微软雅黑][color=#000000] dispatchtasksequence(ts);[/color][/font][/align][align=left][font=微软雅黑][color=#000000] }[/color][/font][/align][align=left][font=微软雅黑][color=#000000] } else {[/color][/font][/align][align=left][font=微软雅黑][color=#000000] pulled = param(1);[/color][/font][/align][align=left][font=微软雅黑][color=#000000] ts = param(2);[/color][/font][/align][align=left][font=微软雅黑][color=#000000] if (objectexists(pulled)) {[/color][/font][/align][align=left][font=微软雅黑][color=#000000] movetasksequence(ts, pulled);[/color][/font][/align][align=left][font=微软雅黑][color=#000000] dispatchtasksequence(ts);[/color][/font][/align][align=left][font=微软雅黑][color=#000000] }[/color][/font][/align][align=left][font=微软雅黑][color=#000000] } [/color][/font][/align][align=left][font=微软雅黑][color=#000000]}[/color][/font][/align][font=微软雅黑]
[/font][align=left][font=微软雅黑][color=#000000]return 0;[/color][/font][/align][align=left][font=微软雅黑][color=#000000]
[/color][/font][/align][align=left][font=微软雅黑][size=10.5pt][color=#4169e1][font=微软雅黑]把[/font]AGV上的货全部卸完[/color][/size][/font][/align][align=left][i][font=微软雅黑][size=10.5pt][color=#4169e1]
[/color][/size][/font][/i][/align][align=left][i][/i][/align]
[align=left][font=微软雅黑]在卸货处的控制点触发写入以下代码:[/font][/align][align=left][font=微软雅黑]Object que1 = model().find("Queue1");[/font][/align][align=left][font=微软雅黑]for(int index=1;index<=te.subnodes.length;index++)[/font][/align][align=left][font=微软雅黑]{[/font][/align][align=left][font=微软雅黑] moveobject(te.subnodes[index],que1);[/font][/align][align=left][font=微软雅黑]}[/font][/align][align=left][font=微软雅黑]这个模型适用于多台多载AGV同时作业,满足就近调度和满载而归的基本调度逻辑。[/font][/align]
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
|