在自动化立体库的仿真项目中,如果要出库的货物外侧有货物阻挡,则需要堆垛机先把阻挡的货物移到别的巷道再进行出库作业。模型布局如图所示: 建模步骤如下: 1. 创建一个货架,勾选Floor Storage(平置货架)。该货架作为整个立库的第一层。 注意:本demo只示意立库为一层时的做法,如果实际应用中涉及到多层可复制该货架修改z轴坐标并在逻辑中加入立库层——即第几个货架的判断。 2. 由于布局中货架位于堆垛机右侧,而货架默认列从左开始为第一列,故旋转货架Z轴180度,使货物入库从右侧开始放置。 3. 使用PF产生初始库存,50个item。 4. 出库item为随机选择 5. 在PF的出库逻辑线中,如果经过判断要出库的item外侧有其他item阻挡,则堆垛机先去装载需要挪出的物料,load之后逻辑判断该物料需要放置到哪一层(即哪一个巷道),判断逻辑为从第一层开始循环并在爆仓时进行弹窗提醒,若找到能存放的level则把level存在item的level标签上进行记录,如下图: 6. 有了上面第五点对于level的判断,我们在货架的放置到列触发器中写如下代码: int cellcap = 1; int nrofbays = rackgetnrofbays(current); if(!objectexists(item.labels["level"])) { for (int index= 1; index <= nrofbays; index ++) { if(rackgetbaycontent(current, index ) < cellcap * rackgetnroflevels(current,index )) returnindex ; } } else//倒库 { int ii =1; while(rackgetcellcontent(current,ii,item.level)>0) { ii++; } return ii; } return 1; 在货架的放置到层触发器中写如下代码: int cellcap = 1; int nroflevels = rackgetnroflevels(current,baynumber); if(!objectexists(item.labels["level"])) { for (int index= 1; index <= nroflevels ; index ++){ if(rackgetcellcontent(current, baynumber, index ) < cellcap) returnindex ; } } else//倒库 { returnitem.level; } return 1; 注意:货架的这两个触发器的触发顺序是先触发放置到列,再触发放置到层。所以我先把放置到的层的编号在PF中unload之前确定下来,以便在放置到列中可以调用到。
* i* Z& j( C3 e+ U5 `1 e5 P! O$ o6 l |