循环任务大多用到像展会之类的需要稳定跑循环的场景中,指定次数的循环技术分享会已经介绍过了,这里不再多嘴= = 这里只介绍无限循环的配置方法。
我们以某展会的CTU的循环场景为例,假设CTU的循环路线为路线如下(初始状态下层为满,高层为空)

那么可以知道基本节点为4个平层搬运,实现四个搬运,1、2将料箱从下层搬运到高层,3、4将料箱从高层搬到底层回到初始状态,然后进行下一轮循环。模板如下:

这里的循环任务涉及到四个点位,所以下发任务需要给四个点位,R1-R4分别对应右下、左下、左上、右上四个仓位。

接下来看看平层搬运的点位设置----
平层搬运1:起点接口参数1,终点接口参数3
平层搬运2:起点接口参数2,终点接口参数4
到这里关键点就来了,因为我们前面两个平层搬运都是两个料箱的第一次搬运,已经申请到载具并且知道了载具的实际位置,我们后面两个平层搬运也只是复用载具对象,所以不必再次申请载具,直接使用前序节点输出的载具对象。我们每一个平常搬运输出的载具对象名称默认都是carrier,终点仓位都是slot,所以我们这里需要用到不同节点的载具和站点,所以需要区分一下
一定要先修改节点输出再去配置平层搬运3、4的点位信息(参照下文将carrier分别改为carrier1、carrier2…)
平层搬运3:起点是前序节点输出的载具变量(carrier2),终点是接口参数2
平层搬运4:起点是前序节点输出的载具变量(carrier1),终点是接口参数1
修改第一个平层搬运的输出,carrier改为carrier1,slot改为slot1

同理,第二个平层搬运carrier改为carrier2,slot改为slot2,第三个…
最后一个节点脚本逻辑用于去复制原始参数生成新的任务单,如果没有生成成功当前任务就不会结束,但是当前任务不结束,任务就会卡在第四个平层搬运,carrier4,slot4就不会被释放,陷入死循环了,所以我们需要手动释放一下,加入释放载具和释放站点


下面就是重头戏了,我们的脚本逻辑!把下面这一长段复制进行就ok了,这里任务下发了四个点位,所targetRouteList.add()方法调用了四次,用于去复制四个点位,如果只有两个点位,那就只用保留两次调用就可以了。
import robot.glory.tas.frame.model.task.dto.param.SubmitParam;
import robot.glory.tas.frame.model.task.dto.TargetRoute;
import robot.glory.framework.util.UuidUtil;
import robot.glory.tas.frame.msg.gbt.service.GbtTaskService;
import robot.glory.framework.core.context.SpringContext;
import java.util.List;
import com.google.common.collect.Lists;
SubmitParam submitParam = (SubmitParam)execution.getVariable(“submitParam”);
SubmitParam param = new SubmitParam();
String uuid = UuidUtil.genUuid();
param.setRobotTaskCode(uuid);
param.setHeaderParam(submitParam.getHeaderParam());
List < TargetRoute > targetRouteList = Lists.newArrayList();
targetRouteList.add(submitParam.getTargetRoute().get(0)); //复制第一个点
targetRouteList.add(submitParam.getTargetRoute().get(1)); //复制第二个点
targetRouteList.add(submitParam.getTargetRoute().get(2)); //复制第三个点
targetRouteList.add(submitParam.getTargetRoute().get(3)); //复制第四个点
param.setTargetRoute(targetRouteList);
param.setTaskType(submitParam.getTaskType());
param.setInitPriority(submitParam.getInitPriority());
param.setExtra(submitParam.getExtra());
param.setRobotCode(submitParam.getRobotCode());
param.setRobotType(submitParam.getRobotType());
param.setDeadline(submitParam.getDeadline());
param.setInterrupt(submitParam.getInterrupt());
param.setGroupCode(submitParam.getGroupCode());
param.getHeaderParam().setRequestId(uuid);
GbtTaskService gbtTaskService = SpringContext.getBean(“gbtTaskService”);
gbtTaskService.doSubmit(param);
param
PS:指定次数循环的配置方法:https://www.v-club.com/home/article/9952
这里强调一下,有兄弟指出为什么不用指定循环次数的那种方式将循环次数设置的无限大来实现无限循环,指定次数的循环,所有搬运任务都在一个任务链里面,如果循环次数多了,就会导致数据越来越庞大,导致后面去查看这个任务链时会很卡,对系统性能也有影响,也不方便维护,所以不推荐