4.2.X入库编排进行货架重复货码卡控任务编排(一)
适用于现场客户对供应商直供货架入库,出现库内货架被探测任务打断导致现场入库后出现货架刷空情况,仅适用于潜伏车!

现场货架不是咱们苦命的哥们贴的货架,且现场货架总计超过一万个(咱们自己贴得贴到猴年马月去)


作为超级牛马怎么能天天处理异常呢?所以只能想个办法给货架做个任务管控了,识别重复货架码咱们直接在日志中抛出报错!哈哈!咱可真是个天才(bushi)~还不快点点赞!点赞的各位看官!晚上财神就去敲门了

咳咳!好了,不多说了!咱们直接正文(第一部分)走起!

首先咱们先来看一下咱们的任务编排(是不是已经晕了?)



来来!不要慌,咱们慢慢的来看!

首先第一步,我们先看第一个节点!

很标准的申请站点,但是这个节点获取的可不是终点哈!咱们这是对终点进行获取!为啥?要做校验,因为现场那个上层的挑终点逻辑有点问题,会挑到已有货架的终点!所有有点呆(因为这个事情,现场的哥们已经快处理异常处理疯了)~~~~

好!接下来咱们来讲第二个节点,我们一起来看!

根据货架长过滤车型,顾名思义,这个是一个根据货架长度获取车型的脚本,最终的输出是filterRobotType;这参数,我们一起吧脚本展开看看!

import robot.glory.framework.util.StringUtil;
import robot.glory.tas.frame.model.task.dto.param.SubmitParam;
import robot.glory.tas.frame.model.task.enums.RobotTypeEnum;
import org.slf4j.Logger
import org.slf4j.LoggerFactory
import java.util.List;
import java.util.Map;
import com.alibaba.fastjson2.JSON

    SubmitParam submitParam = (SubmitParam)execution.getVariable("submitParam");
    Map<String,Object> values =submitParam.getExtra().getValues();
    String filterRobotType="";
    Float podSize=null;
    if(values!=null && !StringUtil.isEmpty(values.get("podSize"))){
        podSize= Float.valueOf(String.valueOf(values.get("podSize").split("\\*")[0]));
        logger.info("货架长是"+podSize);
    }
    if(podSize!=null && podSize>=2000){
        filterRobotType="18";
    }else if(podSize!=null && podSize<=2000){
        filterRobotType="17";
    }
    filterRobotType;

原理就是通过上层下发的任务参数获取对应的货架长宽,并且判断这个参数是必带的值,咱们来看一下上层下发的参数结构;

{"data":{"extra":{"values":{"inBind":"","podSize":"2400*1050*1800","matCount":"","podWeight":"1"},"carrierInfo":[{"carrierCode":"","carrierType":""}]},"taskType":"D1","groupCode":"CT202602100577","targetRoute":[{"seq":"0","code":"ZZ-HDRJX-01-101","type":"SITE"},{"seq":"1","code":"ZZ1-HDRGZZ-JX-02-001","type":"SITE"}],"initPriority":1,"robotTaskCode":"20260211184827240845"},"pageNo":"","pageSize":"","performer":"LES","requestId":"AGV0220260211004597","interfaceNo":"API_LES_AGV_C0002"}

咱们可以看到,上层下发带有podSize参数,这个脚本的作用就是取出podSize参数中的长,上层下发的podSize代表着长*宽*高,所以我们只需要长就足够了,后面输出的filterRobotType9就是我们在系统中配置的车型了


所以这个脚本的作用就很明了了

下一个!


查找AMR类型这个就是咱们老生常谈的了,不过要注意一下咱们的参数,要填写从前序输出的参数嗷!不然就不会按照自己的脚本内输出的参数进行分车了!

好了咱们来讲一下我认为最坑的一个了瞄了个咪得,这个探测任务,为啥不使用一个节点,而非要带一个内嵌流程,给这个封装到一起呢?


因为这个探测任务,它竟然不能锁车,是的,你没看错,它不能锁车,节点里面给了锁车它不能锁车!而且更坑的是这个探测它只能探测一次,除了获取一下货架编号,它!啥!也!做!不!了!是的,它就只能获取一下相机的图像!就真只获取一下图像,如果相机有读到货码就上传,没读到就上传空值!


当时测试的时候,人已经被折磨的崩溃了!


所以在后面加上了一个空车移动对车进行锁定

这就是我为啥要在用这个内嵌的字流程好,说到这个,各位也知道我为啥要加这个定时循环和这个判断了吧


声明载具编号就是去获取对应的货架编号,如果输出为空则返回继续进行探测,如果输出的不为空则进入到下一步


在这里我也用到了一个脚本,通过SDK获取对应的载具信息


相关脚本如下:

import robot.glory.cms.domain.Amr; 
import robot.glory.framework.util.StringUtil; 
import java.util.*; 
import robot.glory.tas.frame.model.item.carrier.dto.CarrierNo; 
import robot.glory.tas.sdk.model.amr.AmrSdk; 
def CarrierNo = carrierSdk.getCarrier(carrierCode); 
logger.info("载具信息:" + CarrierNo); 
CarrierNo;

然后,我通过这个脚本输出的载具信息,判断是否在点位上存在绑定关系,及能通过货架号获取到对应的站点编号


从而输出参数给到后面的判断节点进行判断,相关脚本如下:

String inSlotCode = "0";
String SlotCode = CarrierNo.slot.slotCode;
if(SlotCode != null && SlotCode.length() !=0){
    isSlotCode = "1";
}
inSlotCode;

如果传出的参数不为空,且这个获取出来的参数的字符串长度也不等于0则咱们认为这个库里面是货架是在点位上的,所以不能入库,就进下面的分支走到继续任务,由人工进行检查后再进行继续触发回到探测任务重新获取货架编号(上层会指定对应的搬运任务号,所以任务不能随意取消,上层要过账记库存的!!!)


好了,咱们第一部分讲完了!下期咱们来讲讲第二部分!并会在第二部分附上任务流程的压缩包!还不快动动发财的手指点点赞!

版权声明:本文为V社区用户原创内容,转载时必须标注文章的来源(V社区),文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至:v-club@hikrobotics.com 进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。
上一篇

linux服务器tcdump抓包脚本

下一篇

DataBus2.1流程中调用接口导致死循环把线程沾满了

评论请先登录 登录
全部评论 0
Lv.0
0
关注
0
粉丝
0
创作
0
获赞
相关阅读
  • 突破标签印刷缺陷检测瓶颈,海康机器人推出高效易用型解决方案
    2026-03-10 浏览 0
  • 【计算成像】超越像素:计算光学与下一代工业视觉系统
    2026-03-09 浏览 0
  • 读码器TCP通讯配置全解析:从客户端到服务器的实战指南
    2026-03-09 浏览 0

请升级浏览器版本

您正在使用的浏览器版本过低,请升级最新版本以获得更好的体验。

推荐使用以下浏览器