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



作为超级牛马怎么能天天处理异常呢?所以只能想个办法给货架做个任务管控了,识别重复货架码咱们直接在日志中抛出报错!哈哈!咱可真是个天才(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则咱们认为这个库里面是货架是在点位上的,所以不能入库,就进下面的分支走到继续任务,由人工进行检查后再进行继续触发回到探测任务重新获取货架编号(上层会指定对应的搬运任务号,所以任务不能随意取消,上层要过账记库存的!!!)

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