src/main/java/com/zy/asrs/entity/BasRgv.java
New file @@ -0,0 +1,190 @@ package com.zy.asrs.entity; import com.baomidou.mybatisplus.annotations.TableField; import com.baomidou.mybatisplus.annotations.TableId; import com.baomidou.mybatisplus.annotations.TableName; import com.baomidou.mybatisplus.enums.IdType; import com.core.common.Cools; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import org.springframework.format.annotation.DateTimeFormat; import java.io.Serializable; import java.text.SimpleDateFormat; import java.util.Date; @Data @TableName("asr_bas_rgv") public class BasRgv implements Serializable { private static final long serialVersionUID = 1L; /** * RGV编号 */ @ApiModelProperty(value= "RGV编号") @TableId(value = "rgv_no", type = IdType.INPUT) @TableField("rgv_no") private Integer rgvNo; /** * 可入 */ @ApiModelProperty(value= "可入") @TableField("in_enable") private String inEnable; /** * 可出 */ @ApiModelProperty(value= "可出") @TableField("out_enable") private String outEnable; /** * 作业态 */ @ApiModelProperty(value= "作业态") @TableField("rgv_sts") private Integer rgvSts; /** * 任务号 */ @ApiModelProperty(value= "任务号") @TableField("wrk_no1") private Integer wrkNo1; /** * 堆垛机号 */ @ApiModelProperty(value= "堆垛机号") @TableField("wrk_no2") private Integer wrkNo2; /** * 错误码 */ @ApiModelProperty(value= "错误码") @TableField("rgv_err") private Long rgvErr; /** * 标记 */ @ApiModelProperty(value= "标记") @TableField("pak_mk") private String pakMk; /** * 状态 1: 正常 0: 禁用 */ @ApiModelProperty(value= "状态 1: 正常 0: 禁用 ") private Integer status; /** * 添加人员 */ @ApiModelProperty(value= "添加人员") @TableField("create_by") private Long createBy; /** * 添加时间 */ @ApiModelProperty(value= "添加时间") @TableField("create_time") @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") private Date createTime; /** * 修改人员 */ @ApiModelProperty(value= "修改人员") @TableField("update_by") private Long updateBy; /** * 修改时间 */ @ApiModelProperty(value= "修改时间") @TableField("update_time") @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") private Date updateTime; /** * 备注 */ @ApiModelProperty(value= "备注") private String memo; /** * 有物无物 */ @ApiModelProperty(value= "有物无物") private int loaded2; public BasRgv() {} public BasRgv(Integer rgvNo,String inEnable,String outEnable,Integer rgvSts,Integer wrkNo1,Integer wrkNo2,Long rgvErr,String pakMk,Integer status,Long createBy,Date createTime,Long updateBy,Date updateTime,String memo) { this.rgvNo = rgvNo; this.inEnable = inEnable; this.outEnable = outEnable; this.rgvSts = rgvSts; this.wrkNo1 = wrkNo1; this.wrkNo2 = wrkNo2; this.rgvErr = rgvErr; this.pakMk = pakMk; this.status = status; this.createBy = createBy; this.createTime = createTime; this.updateBy = updateBy; this.updateTime = updateTime; this.memo = memo; } // BasRgv basRgv = new BasRgv( // null, // RGV编号[非空] // null, // 可入 // null, // 可出 // null, // 作业态 // null, // 任务号 // null, // 堆垛机号 // null, // 错误码 // null, // 标记 // null, // 状态 // null, // 添加人员 // null, // 添加时间 // null, // 修改人员 // null, // 修改时间 // null // 备注 // ); public String getStatus$(){ if (null == this.status){ return null; } switch (this.status){ case 1: return "正常"; case 0: return "禁用"; default: return String.valueOf(this.status); } } public String getCreateTime$(){ if (Cools.isEmpty(this.createTime)){ return ""; } return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.createTime); } public String getUpdateTime$(){ if (Cools.isEmpty(this.updateTime)){ return ""; } return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.updateTime); } } src/main/java/com/zy/asrs/entity/BasRgvMap.java
New file @@ -0,0 +1,85 @@ package com.zy.asrs.entity; import com.baomidou.mybatisplus.annotations.TableField; import com.baomidou.mybatisplus.annotations.TableId; import com.baomidou.mybatisplus.annotations.TableName; import com.baomidou.mybatisplus.enums.IdType; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.io.Serializable; @Data @TableName("asr_bas_rgv_map") public class BasRgvMap implements Serializable { private static final long serialVersionUID = 1L; /** * RGV编号 */ @ApiModelProperty(value= "RGV编号") @TableId(value = "rgv_no", type = IdType.INPUT) @TableField("rgv_no") private Integer rgvNo; /** * 开始范围 */ @ApiModelProperty(value= "开始范围") @TableField("start_route") private Integer startRoute; /** * 结束范围 */ @ApiModelProperty(value= "结束范围") @TableField("end_route") private Integer endRoute; /** * 当前位置 */ @ApiModelProperty(value= "当前位置") @TableField("now_route") private Integer nowRoute; /** * 状态 */ @ApiModelProperty(value= "状态") @TableField("rgv_status") private Integer rgvStatus; /** * 锁-开始-位置 */ @ApiModelProperty(value= "锁-开始-位置") @TableField("lock_start_route") private Integer lockStartRoute; /** * 锁-结束-位置 */ @ApiModelProperty(value= "锁-结束-位置") @TableField("lock_end_route") private Integer lockEndRoute; public BasRgvMap() {} public BasRgvMap(Integer rgvNo, Integer startRoute, Integer endRoute, Integer nowRoute, Integer rgvStatus, Integer lockStartRoute, Integer lockEndRoute) { this.rgvNo = rgvNo; this.startRoute = startRoute; this.endRoute = endRoute; this.nowRoute = nowRoute; this.rgvStatus = rgvStatus; this.lockStartRoute = lockStartRoute; this.lockEndRoute = lockEndRoute; } public Integer getRgvNoOther(){ return 3-this.rgvNo; } } src/main/java/com/zy/asrs/entity/BasRgvOpt.java
New file @@ -0,0 +1,230 @@ package com.zy.asrs.entity; import com.baomidou.mybatisplus.annotations.TableField; import com.baomidou.mybatisplus.annotations.TableId; import com.baomidou.mybatisplus.annotations.TableName; import com.baomidou.mybatisplus.enums.IdType; import com.core.common.Cools; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import org.springframework.format.annotation.DateTimeFormat; import java.io.Serializable; import java.text.SimpleDateFormat; import java.util.Date; @Data @TableName("asr_bas_rgv_opt") public class BasRgvOpt implements Serializable { private static final long serialVersionUID = 1L; /** * ID */ @ApiModelProperty(value= "ID") @TableId(value = "id", type = IdType.INPUT) private Long id; /** * 任务号1 */ @ApiModelProperty(value= "任务号1") @TableField("wrk_no1") private Integer wrkNo1; /** * 任务号2 */ @ApiModelProperty(value= "任务号2") @TableField("wrk_no2") private Integer wrkNo2; /** * 穿梭车 */ @ApiModelProperty(value= "穿梭车") @TableField("rgv_no") private Integer rgvNo; /** * 下发时间 */ @ApiModelProperty(value= "下发时间") @TableField("send_time") @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") private Date sendTime; /** * 作业 */ @ApiModelProperty(value= "作业") private String mode; /** * 源排 */ @ApiModelProperty(value= "源排") @TableField("source_row") private Integer sourceRow; /** * 源列 */ @ApiModelProperty(value= "源列") @TableField("source_bay") private Integer sourceBay; /** * 源层 */ @ApiModelProperty(value= "源层") @TableField("source_lev") private Integer sourceLev; /** * 源站 */ @ApiModelProperty(value= "源站") @TableField("source_sta") private Integer sourceSta; /** * 目标排 */ @ApiModelProperty(value= "目标排") @TableField("pos_row") private Integer posRow; /** * 目标列 */ @ApiModelProperty(value= "目标列") @TableField("pos_bay") private Integer posBay; /** * 目标层 */ @ApiModelProperty(value= "目标层") @TableField("pos_lev") private Integer posLev; /** * 目标站 */ @ApiModelProperty(value= "目标站") @TableField("pos_sta") private Integer posSta; /** * 响应结果 1: 正常 0: 失败 */ @ApiModelProperty(value= "响应结果 1: 正常 0: 失败 ") private Integer response; /** * 修改时间 */ @ApiModelProperty(value= "修改时间") @TableField("update_time") @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") private Date updateTime; /** * 修改人员 */ @ApiModelProperty(value= "修改人员") @TableField("update_by") private Long updateBy; /** * 备注 */ @ApiModelProperty(value= "备注") private String memo; public BasRgvOpt() {} public BasRgvOpt(Integer wrkNo1, Integer wrkNo2, Integer rgvNo, Date sendTime, String mode, Integer sourceRow, Integer sourceBay, Integer sourceLev, Integer sourceSta, Integer posRow, Integer posBay, Integer posLev, Integer posSta, Integer response, Date updateTime, Long updateBy, String memo) { this.wrkNo1 = wrkNo1; this.wrkNo2 = wrkNo2; this.rgvNo = rgvNo; this.sendTime = sendTime; this.mode = mode; this.sourceRow = sourceRow; this.sourceBay = sourceBay; this.sourceLev = sourceLev; this.sourceSta = sourceSta; this.posRow = posRow; this.posBay = posBay; this.posLev = posLev; this.posSta = posSta; this.response = response; this.updateTime = updateTime; this.updateBy = updateBy; this.memo = memo; } public BasRgvOpt(Integer wrkNo1, Integer wrkNo2, Integer rgvNo, Date sendTime, String mode, Integer sourceSta, Integer posSta, Integer sourceRow, Integer posRow, Integer response, Date updateTime, Long updateBy) { this.wrkNo1 = wrkNo1; this.wrkNo2 = wrkNo2; this.rgvNo = rgvNo; this.sendTime = sendTime; this.mode = mode; this.sourceSta = sourceSta; this.posSta = posSta; this.sourceRow = sourceRow; this.posRow = posRow; this.response = response; this.updateTime = updateTime; this.updateBy = updateBy; } // BasRgvOpt basRgvOpt = new BasRgvOpt( // null, // ID[非空] // null, // 任务号 // null, // 穿梭车 // null, // 下发时间 // null, // 作业 // null, // 源排 // null, // 源列 // null, // 源层 // null, // 源站 // null, // 目标排 // null, // 目标列 // null, // 目标层 // null, // 目标站 // null, // 响应结果 // null, // 修改时间 // null, // 修改人员 // null // 备注 // ); public String getSendTime$(){ if (Cools.isEmpty(this.sendTime)){ return ""; } return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.sendTime); } public String getResponse$(){ if (null == this.response){ return null; } switch (this.response){ case 1: return "正常"; case 0: return "失败"; default: return String.valueOf(this.response); } } public String getUpdateTime$(){ if (Cools.isEmpty(this.updateTime)){ return ""; } return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.updateTime); } } src/main/java/com/zy/asrs/entity/WrkMastSta.java
New file @@ -0,0 +1,202 @@ package com.zy.asrs.entity; import com.baomidou.mybatisplus.annotations.TableField; import com.baomidou.mybatisplus.annotations.TableId; import com.baomidou.mybatisplus.annotations.TableName; import com.baomidou.mybatisplus.enums.IdType; import com.core.common.Cools; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import org.springframework.format.annotation.DateTimeFormat; import java.io.Serializable; import java.text.SimpleDateFormat; import java.util.Date; @Data @TableName("asr_wrk_mast_sta") public class WrkMastSta implements Serializable { private static final long serialVersionUID = 1L; /** * ID */ @ApiModelProperty(value= "ID") @TableId(value = "id", type = IdType.AUTO) private Long id; /** * 工作号 */ @ApiModelProperty(value= "工作号") @TableField("wrk_no") private Long wrkNo; /** * 工作档开始位置 */ @ApiModelProperty(value= "工作档开始位置") @TableField("wrk_start") private Integer wrkStart; /** * 工作档结束位置 */ @ApiModelProperty(value= "工作档结束位置") @TableField("wrk_end") private Integer wrkEnd; /** * 小车接货位置 */ @ApiModelProperty(value= "小车接货位置") @TableField("sta_start") private Integer staStart; /** * 小车放货位置 */ @ApiModelProperty(value= "小车放货位置") @TableField("sta_end") private Integer staEnd; /** * 添加时间 */ @ApiModelProperty(value= "添加时间") @TableField("create_time") @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") private Date createTime; /** * 修改时间 */ @ApiModelProperty(value= "修改时间") @TableField("update_time") @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") private Date updateTime; /** * 类型 0:非空 1:空板 */ @ApiModelProperty(value= "类型 1:满版 2:空板") private Integer type; /** * 工作状态 0:初始 1:等待小车取 2:等待小车放 3:完成 */ @ApiModelProperty(value= "工作状态 0:初始 1:等待小车取 2:等待小车放 3:完成") @TableField("wrk_sts") private Integer wrkSts; /** * 行号 */ @ApiModelProperty(value= "行号") @TableField("line_number") private Integer lineNumber; /** * 工作类型 */ @ApiModelProperty(value= "工作类型 1:取(叠盘) 2:拆盘 5:满取 6:满放") @TableField("wrk_type") private Integer wrkType; /** * 工作类型 */ @ApiModelProperty(value= "工作类型") @TableField("wrk_crn") private Integer wrkCrn; /** * 标记时间 */ @ApiModelProperty(value= "标记时间") @TableField("bign_time") @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") private Date bignTime; public WrkMastSta() {} public WrkMastSta(Date now, Integer staStart) { this.wrkNo = staStart.longValue()+19999; this.wrkStart = staStart; this.wrkEnd = staStart; this.staStart = staStart; this.staEnd = staStart; this.createTime = now; this.updateTime = now; this.wrkSts = 0; this.bignTime = now; } public WrkMastSta(Long wrkNo, Integer wrkStart, Integer wrkEnd, Integer staStart, Integer staEnd, Date createTime, Date updateTime, Integer type, Integer wrkSts, Integer lineNumber, Integer wrkType, Date bignTime) { this.wrkNo = wrkNo; this.wrkStart = wrkStart; this.wrkEnd = wrkEnd; this.staStart = staStart; this.staEnd = staEnd; this.createTime = createTime; this.updateTime = updateTime; this.type = type; this.wrkSts = wrkSts; this.lineNumber = lineNumber; this.wrkType = wrkType; this.bignTime = bignTime; } public Integer getStaEnd(Integer souSta) { switch (souSta) { case 100: case 103: case 106: case 109: case 112: case 115: return souSta + 1; default: return souSta; } } // WrkMastSta wrkMastSta = new WrkMastSta( // null, // 工作号[非空] // null, // 工作档开始位置[非空] // null, // 工作档结束位置[非空] // null, // 小车接货位置[非空] // null, // 小车放货位置[非空] // null, // 添加时间 // null, // 修改时间 // null, // 类型 0:非空 1:空板[非空] // null, // 工作状态 0:初始 1:等待小车取 2:等待小车放 3:完成[非空] // null, // 行号[非空] // null, // 工作类型[非空] // null // 标记时间 // ); public String getCreateTime$(){ if (Cools.isEmpty(this.createTime)){ return ""; } return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.createTime); } public String getUpdateTime$(){ if (Cools.isEmpty(this.updateTime)){ return ""; } return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.updateTime); } public String getBignTime$(){ if (Cools.isEmpty(this.bignTime)){ return ""; } return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.bignTime); } } src/main/java/com/zy/asrs/mapper/BasRgvMapMapper.java
New file @@ -0,0 +1,12 @@ package com.zy.asrs.mapper; import com.baomidou.mybatisplus.mapper.BaseMapper; import com.zy.asrs.entity.BasRgvMap; import org.apache.ibatis.annotations.Mapper; import org.springframework.stereotype.Repository; @Mapper @Repository public interface BasRgvMapMapper extends BaseMapper<BasRgvMap> { } src/main/java/com/zy/asrs/mapper/BasRgvMapper.java
New file @@ -0,0 +1,12 @@ package com.zy.asrs.mapper; import com.baomidou.mybatisplus.mapper.BaseMapper; import com.zy.asrs.entity.BasRgv; import org.apache.ibatis.annotations.Mapper; import org.springframework.stereotype.Repository; @Mapper @Repository public interface BasRgvMapper extends BaseMapper<BasRgv> { } src/main/java/com/zy/asrs/mapper/BasRgvOptMapper.java
New file @@ -0,0 +1,12 @@ package com.zy.asrs.mapper; import com.baomidou.mybatisplus.mapper.BaseMapper; import com.zy.asrs.entity.BasRgvOpt; import org.apache.ibatis.annotations.Mapper; import org.springframework.stereotype.Repository; @Mapper @Repository public interface BasRgvOptMapper extends BaseMapper<BasRgvOpt> { } src/main/java/com/zy/asrs/mapper/WrkMastStaMapper.java
New file @@ -0,0 +1,41 @@ package com.zy.asrs.mapper; import com.baomidou.mybatisplus.mapper.BaseMapper; import com.zy.asrs.entity.WrkMastSta; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import org.springframework.stereotype.Repository; import java.util.List; @Mapper @Repository public interface WrkMastStaMapper extends BaseMapper<WrkMastSta> { /* * 获取所有任务数量 * */ Integer selectAllWrkCount108(); Integer selectAllWrkCount108Y(); Integer selectAllWrkCount(@Param("type")Integer type); Integer selectAllWrkStsCount(@Param("type")Integer type,@Param("wrkSts")Integer wrkSts); WrkMastSta selectAllWrkStsCountWrkMastSta(@Param("type")Integer type,@Param("wrkSts")Integer wrkSts); /* * 获取所有可执行任务 * */ List<WrkMastSta> selectAllWrkMastStaList(@Param("type")Integer type); /* * 查询指定工作号任务 * */ WrkMastSta selectByWrkNo(@Param("workNo") Long workNo); /* * 查询不干涉的可执行任务 * */ WrkMastSta selectNoInterfere(@Param("staStarts") List<Integer> staStarts,@Param("staEnds") List<Integer> staEnds); List<WrkMastSta> selectNoInterfereList(@Param("staStarts") List<Integer> staStarts,@Param("staEnds") List<Integer> staEnds); } src/main/java/com/zy/asrs/service/BasRgvOptService.java
New file @@ -0,0 +1,8 @@ package com.zy.asrs.service; import com.baomidou.mybatisplus.service.IService; import com.zy.asrs.entity.BasRgvOpt; public interface BasRgvOptService extends IService<BasRgvOpt> { } src/main/java/com/zy/asrs/service/BasRgvService.java
New file @@ -0,0 +1,8 @@ package com.zy.asrs.service; import com.baomidou.mybatisplus.service.IService; import com.zy.asrs.entity.BasRgv; public interface BasRgvService extends IService<BasRgv> { } src/main/java/com/zy/asrs/service/impl/BasRgvOptServiceImpl.java
New file @@ -0,0 +1,12 @@ package com.zy.asrs.service.impl; import com.baomidou.mybatisplus.service.impl.ServiceImpl; import com.zy.asrs.entity.BasRgvOpt; import com.zy.asrs.mapper.BasRgvOptMapper; import com.zy.asrs.service.BasRgvOptService; import org.springframework.stereotype.Service; @Service("basRgvOptService") public class BasRgvOptServiceImpl extends ServiceImpl<BasRgvOptMapper, BasRgvOpt> implements BasRgvOptService { } src/main/java/com/zy/asrs/service/impl/BasRgvServiceImpl.java
New file @@ -0,0 +1,12 @@ package com.zy.asrs.service.impl; import com.baomidou.mybatisplus.service.impl.ServiceImpl; import com.zy.asrs.entity.BasRgv; import com.zy.asrs.mapper.BasRgvMapper; import com.zy.asrs.service.BasRgvService; import org.springframework.stereotype.Service; @Service("basRgvService") public class BasRgvServiceImpl extends ServiceImpl<BasRgvMapper, BasRgv> implements BasRgvService { } src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -4,19 +4,16 @@ import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.core.common.Cools; import com.core.common.R; import com.core.exception.CoolException; import com.zy.asrs.controller.CrnController; import com.zy.asrs.controller.OpenController; import com.zy.asrs.controller.SiteController; import com.zy.asrs.domain.enums.TaskStatusType; import com.zy.asrs.domain.enums.WorkNoType; import com.zy.asrs.domain.param.CrnOperatorParam; import com.zy.asrs.entity.*; import com.zy.asrs.entity.param.TaskOverToWms; import com.zy.asrs.mapper.*; import com.zy.asrs.service.*; import com.zy.asrs.utils.CommandUtils; import com.zy.asrs.utils.RouteUtils; import com.zy.asrs.utils.Utils; import com.zy.common.service.CommonService; import com.zy.common.utils.HttpHandler; @@ -28,15 +25,12 @@ import com.zy.core.model.CrnSlave; import com.zy.core.model.DevpSlave; import com.zy.core.model.Task; import com.zy.core.model.command.CommandPackage; import com.zy.core.model.command.CrnCommand; import com.zy.core.model.protocol.CrnProtocol; import com.zy.core.model.protocol.StaProtocol; import com.zy.core.properties.SlaveProperties; import com.zy.core.thread.BarcodeThread; import com.zy.core.thread.SiemensDevpThread; import com.zy.system.entity.Config; import com.zy.system.service.ConfigService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; @@ -45,10 +39,6 @@ import org.springframework.transaction.interceptor.TransactionAspectSupport; import java.io.IOException; import java.lang.management.ManagementFactory; import java.lang.management.MemoryMXBean; import java.lang.management.MemoryUsage; import java.lang.management.ThreadMXBean; import java.util.*; /** @@ -1123,5 +1113,1054 @@ return taskWrk; } /** * 入出库 ===>> 小车作业下发 */ public synchronized boolean rgvIoExecute(Integer sign) { boolean rgvIoExecuteSign = false; try{ for (RgvSlave rgvSlave:slaveProperties.getRgv()) { // 获取小车信息 boolean signWork = false; RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, rgvSlave.getId()); RgvProtocol rgvProtocol = rgvThread.getRgvProtocol(); if (rgvProtocol == null) { continue; } BasRgv basRgv = basRgvService.selectById(rgvSlave.getId()); if (basRgv == null) { log.error("{}号RGV尚未在数据库进行维护!", rgvSlave.getId()); continue; } // 只有当RGV空闲、自动,工位一无物//rgv可用 if (rgvProtocol.getStatusType() == RgvStatusType.IDLE && rgvProtocol.getStatusType1() == RgvStatusType.IDLE && rgvProtocol.getStatusType2() == RgvStatusType.IDLE && rgvProtocol.getModeType() == RgvModeType.AUTO && rgvProtocol.getLoaded1()==0 && rgvProtocol.getTaskNo1()==0 && rgvProtocol.getTaskNo2()==0 ) { switch (sign){ //执行小车货物搬运任务 case 1: signWork = rgvRunWrkMastFullSta(rgvSlave); break; //执行小车空板搬运任务 case 2://放//拆盘 signWork = rgvRunWrkMastEmptyStaPut(rgvSlave); break; case 3://满放 signWork = rgvRunWrkMastEmptyStaPutFull(rgvSlave); break; case 4://取叠盘 signWork = rgvRunWrkMastEmptyStaTake(rgvSlave); break; case 5:////满取 signWork = rgvRunWrkMastEmptyStaTakeFull(rgvSlave); break; case 6:////提升 // signWork = qwe(); break; default: break; } for (int signCount = 1;!signWork && signCount<7;signCount++){ switch (signCount){ case 1://执行小车货物搬运任务 signWork = rgvRunWrkMastFullSta(rgvSlave); break; case 2://放//拆盘 signWork = rgvRunWrkMastEmptyStaPut(rgvSlave); break; case 3://满放 signWork = rgvRunWrkMastEmptyStaPutFull(rgvSlave); break; case 4://取叠盘 signWork = rgvRunWrkMastEmptyStaTake(rgvSlave); break; case 5:////满取 signWork = rgvRunWrkMastEmptyStaTakeFull(rgvSlave); break; case 6:////提升 // signWork = rgvRunWrkMastEmptyStaPut(); break; default: break; } } }else { continue; } if (!rgvIoExecuteSign){ rgvIoExecuteSign = signWork; } } // if (!rgvIoExecuteSign){ // if (sign>6){ // // } // } }catch (Exception e){ log.error("RGV小车任务下发报错"+e); } return rgvIoExecuteSign; } /** * 执行小车搬运任务 */ public synchronized boolean rgvRunWrkMastFullSta(RgvSlave rgvSlave) { try{ // for (RgvSlave rgvSlave:slaveProperties.getRgv()) { RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, rgvSlave.getId()); RgvProtocol rgvProtocol = rgvThread.getRgvProtocol(); if (rgvProtocol == null) { return false; } BasRgv basRgv = basRgvService.selectById(rgvSlave.getId()); if (basRgv == null) { log.error("{}号RGV尚未在数据库进行维护!", rgvSlave.getId()); return false; } // 只有当RGV空闲、自动,工位一无物//rgv可用 if (rgvProtocol.getStatusType() == RgvStatusType.IDLE && rgvProtocol.getStatusType1() == RgvStatusType.IDLE && rgvProtocol.getStatusType2() == RgvStatusType.IDLE && rgvProtocol.getModeType() == RgvModeType.AUTO && rgvProtocol.getLoaded1()==0 && rgvProtocol.getTaskNo1()==0 && rgvProtocol.getTaskNo2()==0 ) { BasRgvMap basRgvMap = basRgvMapMapper.selectById(basRgv.getRgvNo()); if (basRgvMap == null) { log.error("{}号RGV尚未在数据库地图中进行维护!", rgvProtocol.getRgvNo()); return false; } List<Integer> route = RouteUtils.getRoute(basRgvMap.getStartRoute(), basRgvMap.getEndRoute()); basRgvMap.setNowRoute(rgvProtocol.getRgvPosI()); //更新小车当前位置站点号 List<WrkMastSta> wrkMastStaList = wrkMastStaMapper.selectNoInterfereList(route, route); for (WrkMastSta wrkMastSta : wrkMastStaList){ if (wrkMastSta.getType()!=1 || wrkMastSta.getWrkType()!=3){//1:满版 3:取放 continue; } BasDevp basDevp = basDevpService.selectById(wrkMastSta.getStaEnd()); if (!basDevp.getAutoing().equals("Y") || basDevp.getLoading().equals("Y") || basDevp.getWrkNo()!=0){ continue; } if (basDevp.getDevNo()>117 && basDevp.getDevNo()<124){ if (basDevp.getLoadingSuper().equals("Y")){ continue; } } if (basDevp.getDevNo()>=118 && basDevp.getDevNo()<=123){ if (!basDevp.getEmptyMk().equals("Y")){ continue; } } Date date = new Date(); SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, rgvSlave.getDevpPlcId()); StaProtocol staProtocol = devpThread.getStation().get(basDevp.getDevNo()); if (staProtocol == null) { log.info(date+"取放任务下发:未查询到站点信息:"+wrkMastSta); continue; } if (!staProtocol.isAutoing() || staProtocol.isLoading() || staProtocol.getWorkNo() != 0){ continue; } if (basDevp.getDevNo()>117 && basDevp.getDevNo()<124){ if (staProtocol.isLoadingSuper()){ continue; } } if (basDevp.getDevNo()>=118 && basDevp.getDevNo()<=123){ if (!staProtocol.isEmptyMk()){ continue; } } BasDevp basDevpS = basDevpService.selectById(wrkMastSta.getStaStart()); if (!basDevpS.getAutoing().equals("Y") || !basDevpS.getLoading().equals("Y") || basDevpS.getWrkNo()!=wrkMastSta.getWrkNo().intValue()){ continue; } StaProtocol staProtocols = devpThread.getStation().get(basDevpS.getDevNo()); if (staProtocols == null) { log.info(date+"取放任务下发:未查询到站点信息:"+wrkMastSta); continue; } if (!staProtocols.isAutoing() || !staProtocols.isLoading() || staProtocols.getWorkNo() != wrkMastSta.getWrkNo().intValue()){ continue; } log.info(date+"取放任务下发:小车工作档:"+wrkMastSta); log.info(date+"取放任务下发:目标站状态:"+basDevp); boolean sign = rgvTakeFullAll(basRgvMap.getRgvNo(), wrkMastSta); if (sign){ boolean signMap = rgvMapUpdate(basRgvMap, wrkMastSta.getStaStart(), wrkMastSta.getStaEnd()); if (signMap){ wrkMastSta.setWrkSts(1); try{ wrkMastStaMapper.updateById(wrkMastSta); }catch (Exception e){ log.error("更新小车任务失败"); } return true; }else { log.error("3864行,货物搬运任务:工作号{}所属任务下发后地图同步失败",wrkMastSta.getWrkNo()); } }else { log.error("工作号{}所属任务下发失败",wrkMastSta.getWrkNo()); } break; } } // } }catch (Exception e){ log.error("3875行执行小车搬运任务下发失败"); log.error("3875行"+e); } return false; } /** * 执行小车搬运任务//拆盘 */ public synchronized boolean rgvRunWrkMastEmptyStaPut(RgvSlave rgvSlave) {//拆盘 try{ // for (RgvSlave rgvSlave:slaveProperties.getRgv()) { RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, rgvSlave.getId()); RgvProtocol rgvProtocol = rgvThread.getRgvProtocol(); if (rgvProtocol == null) { return false; } BasRgv basRgv = basRgvService.selectById(rgvSlave.getId()); if (basRgv == null) { log.error("{}号RGV尚未在数据库进行维护!", rgvSlave.getId()); return false; } // 只有当RGV空闲、自动,工位二有物//rgv可用//拆盘 if (rgvProtocol.getStatusType() == RgvStatusType.IDLE && rgvProtocol.getStatusType1() == RgvStatusType.IDLE && rgvProtocol.getStatusType2() == RgvStatusType.IDLE && rgvProtocol.getModeType() == RgvModeType.AUTO && rgvProtocol.getTaskNo1()==0 && rgvProtocol.getTaskNo2()==0 && (rgvProtocol.getLoaded2()==3 || rgvProtocol.getLoaded2()==1 || rgvProtocol.getLoaded2()==4)////0 无物;1 一层无物二层有物 (只能拆叠) ;2一层有物二层无物() ;3 1、2层都有物 4:()只允许拆盘 ) { BasRgvMap basRgvMap = basRgvMapMapper.selectById(rgvProtocol.getRgvNo()); if (basRgvMap == null) { log.error("{}号RGV尚未在数据库地图中进行维护!", rgvProtocol.getRgvNo()); return false; } basRgvMap.setNowRoute(rgvProtocol.getRgvPosI()); //更新小车当前位置站点号 List<Integer> route = RouteUtils.getRoute(basRgvMap.getStartRoute(), basRgvMap.getEndRoute());//获取活动范围 List<WrkMastSta> wrkMastStaList = wrkMastStaMapper.selectNoInterfereList(route, route);//查询可执行任务 for (WrkMastSta wrkMastSta : wrkMastStaList){ if (wrkMastSta.getType()!=2 || wrkMastSta.getWrkType()!=2){// 2:空板 || 工作类型 1:取(叠盘) 2:拆盘 5:满取 6:满放 continue; } boolean sign = false; if ( wrkMastSta.getStaEnd()!=0){//放 BasDevp basDevp = basDevpService.selectById(wrkMastSta.getStaEnd()); if (!basDevp.getAutoing().equals("Y") || basDevp.getLoading().equals("Y") || basDevp.getWrkNo()!=0){ continue; } if (basDevp.getDevNo()>117 && basDevp.getDevNo()<124){ if (basDevp.getLoadingSuper().equals("Y")){ continue; } } if (basDevp.getDevNo()>=118 && basDevp.getDevNo()<=123){ if (!basDevp.getEmptyMk().equals("Y")){ continue; } } Date date = new Date(); SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, rgvSlave.getDevpPlcId()); StaProtocol staProtocol = devpThread.getStation().get(basDevp.getDevNo()); if (staProtocol == null) { log.info(date+"拆盘任务下发:未查询到站点信息:"+wrkMastSta); continue; } if (!staProtocol.isAutoing() || staProtocol.isLoading() || staProtocol.getWorkNo() != 0){ continue; } if (basDevp.getDevNo()>117 && basDevp.getDevNo()<124){ if (staProtocol.isLoadingSuper()){ continue; } } if (basDevp.getDevNo()>=118 && basDevp.getDevNo()<=123){ if (!staProtocol.isEmptyMk()){ continue; } } log.info(date+"拆盘任务下发:小车工作档:"+wrkMastSta); log.info(date+"拆盘任务下发:目标站状态:"+basDevp); sign = rgvPutEmpty(rgvProtocol.getRgvNo(),wrkMastSta);//拆盘 }else { continue; } if (sign){ boolean signMap = rgvMapUpdate(basRgvMap, basRgvMap.getStartRoute(), wrkMastSta.getStaEnd()); if (signMap){ wrkMastSta.setWrkSts(2); try{ wrkMastStaMapper.updateById(wrkMastSta); }catch (Exception e){ log.error("更新小车任务失败"); } return true; }else { log.error("3857行,货物搬运任务:工作号{}所属任务下发后地图同步失败",wrkMastSta.getWrkNo()); } }else { log.error("工作号{}所属任务下发失败",wrkMastSta.getWrkNo()); } break; } } // } }catch (Exception e){ log.error("3933行执行小车放空板任务下发失败"); log.error("3933行"+e); } return false; } /** * 执行小车搬运任务 */ public synchronized boolean rgvRunWrkMastEmptyStaPutFull(RgvSlave rgvSlave) {//满放 try{ // for (RgvSlave rgvSlave:slaveProperties.getRgv()) { RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, rgvSlave.getId()); RgvProtocol rgvProtocol = rgvThread.getRgvProtocol(); if (rgvProtocol == null) { return false; } BasRgv basRgv = basRgvService.selectById(rgvSlave.getId()); if (basRgv == null) { log.error("{}号RGV尚未在数据库进行维护!", rgvSlave.getId()); return false; } // 只有当RGV空闲、自动,工位二有物//rgv可用 if (rgvProtocol.getStatusType() == RgvStatusType.IDLE && rgvProtocol.getStatusType1() == RgvStatusType.IDLE && rgvProtocol.getStatusType2() == RgvStatusType.IDLE && rgvProtocol.getModeType() == RgvModeType.AUTO && rgvProtocol.getTaskNo1()==0 && rgvProtocol.getTaskNo2()==0 && (rgvProtocol.getLoaded2()==2 || rgvProtocol.getLoaded2()==3 ) ////0 无物;1 一层无物二层有物 ;2一层有物二层无物 (只能满放);3 1、2层都有物 4:()只允许拆盘 ) { BasRgvMap basRgvMap = basRgvMapMapper.selectById(rgvProtocol.getRgvNo()); if (basRgvMap == null) { log.error("{}号RGV尚未在数据库地图中进行维护!", rgvProtocol.getRgvNo()); return false; } basRgvMap.setNowRoute(rgvProtocol.getRgvPosI()); //更新小车当前位置站点号 List<Integer> route = RouteUtils.getRoute(basRgvMap.getStartRoute(), basRgvMap.getEndRoute());//获取活动范围 List<WrkMastSta> wrkMastStaList = wrkMastStaMapper.selectNoInterfereList(route, route);//查询可执行任务 for (WrkMastSta wrkMastSta : wrkMastStaList){ if (wrkMastSta.getType()!=2 || wrkMastSta.getWrkType()!=6){// 2:空板 || 工作类型 1:取(叠盘) 2:拆盘 5:满取 6:满放 7:提升 continue; } boolean sign = false; if ( wrkMastSta.getStaEnd()!=0){//满放 BasDevp basDevp = basDevpService.selectById(wrkMastSta.getStaEnd()); if (!basDevp.getAutoing().equals("Y") || basDevp.getLoading().equals("Y") || basDevp.getWrkNo()!=0){ continue; } if (basDevp.getDevNo()>117 && basDevp.getDevNo()<124){ if (basDevp.getLoadingSuper().equals("Y")){ continue; } } if (basDevp.getDevNo()>=118 && basDevp.getDevNo()<=123){ if (!basDevp.getEmptyMk().equals("Y")){ continue; } } Date date = new Date(); SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, rgvSlave.getDevpPlcId()); StaProtocol staProtocol = devpThread.getStation().get(basDevp.getDevNo()); if (staProtocol == null) { log.info(date+"满放任务下发:未查询到站点信息:"+wrkMastSta); continue; } if (!staProtocol.isAutoing() || staProtocol.isLoading() || staProtocol.getWorkNo() != 0){ continue; } if (basDevp.getDevNo()>117 && basDevp.getDevNo()<124){ if (staProtocol.isLoadingSuper()){ continue; } } if (basDevp.getDevNo()>=118 && basDevp.getDevNo()<=123){ if (!staProtocol.isEmptyMk()){ continue; } } log.info(date+"满放任务下发:小车工作档:"+wrkMastSta); log.info(date+"满放任务下发:目标站状态:"+basDevp); sign = rgvPutEmptyFull(rgvProtocol.getRgvNo(),wrkMastSta); }else { continue; } if (sign){ boolean signMap = rgvMapUpdate(basRgvMap, basRgvMap.getStartRoute(), wrkMastSta.getStaEnd()); if (signMap){ wrkMastSta.setWrkSts(2); try{ wrkMastStaMapper.updateById(wrkMastSta); }catch (Exception e){ log.error("更新小车任务失败"); } return true; }else { log.error("3857行,货物搬运任务:工作号{}所属任务下发后地图同步失败",wrkMastSta.getWrkNo()); } }else { log.error("工作号{}所属任务下发失败",wrkMastSta.getWrkNo()); } break; } } // } }catch (Exception e){ log.error("3933行执行小车放空板任务下发失败"); log.error("3933行"+e); } return false; } public synchronized boolean rgvRunWrkMastEmptyStaTake(RgvSlave rgvSlave) {//叠盘 try{ // for (RgvSlave rgvSlave:slaveProperties.getRgv()) { RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, rgvSlave.getId()); RgvProtocol rgvProtocol = rgvThread.getRgvProtocol(); if (rgvProtocol == null) { return false; } BasRgv basRgv = basRgvService.selectById(rgvSlave.getId()); if (basRgv == null) { log.error("{}号RGV尚未在数据库进行维护!", rgvSlave.getId()); return false; } // 只有当RGV空闲、自动,工位二无物//rgv可用 if (rgvProtocol.getStatusType() == RgvStatusType.IDLE && rgvProtocol.getStatusType1() == RgvStatusType.IDLE && rgvProtocol.getStatusType2() == RgvStatusType.IDLE && rgvProtocol.getModeType() == RgvModeType.AUTO && rgvProtocol.getTaskNo1()==0 && rgvProtocol.getTaskNo2()==0 && (rgvProtocol.getLoaded2()==0 || rgvProtocol.getLoaded2()==1 ) //现场修改:叠盘机,////0 无物;1 一层无物二层有物(只能拆叠) ;2一层有物二层无物 (只能满放);3 1、2层都有物 4:()只允许拆盘 ) { BasRgvMap basRgvMap = basRgvMapMapper.selectById(rgvProtocol.getRgvNo()); if (basRgvMap == null) { log.error("{}号RGV尚未在数据库地图中进行维护!", rgvProtocol.getRgvNo()); return false; } List<Integer> route = RouteUtils.getRoute(basRgvMap.getStartRoute(), basRgvMap.getEndRoute()); basRgvMap.setNowRoute(rgvProtocol.getRgvPosI()); //更新小车当前位置站点号 List<WrkMastSta> wrkMastStaList = wrkMastStaMapper.selectNoInterfereList(route, route); for (WrkMastSta wrkMastSta : wrkMastStaList){ if (wrkMastSta.getType()!=2 || wrkMastSta.getWrkType()!=1){// 2:空板 || 工作类型 1:取(叠盘) 2:拆盘 5:满取 6:满放 continue; } boolean sign = false; if ( wrkMastSta.getStaStart()!=0){//取 BasDevp basDevp = basDevpService.selectById(wrkMastSta.getStaStart()); if (!basDevp.getAutoing().equals("Y") || !basDevp.getLoading().equals("Y")){ continue; } if (basDevp.getDevNo()>=118 && basDevp.getDevNo()<=123){ if (!basDevp.getEmptyMk().equals("Y")){ continue; } } Date date = new Date(); SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, rgvSlave.getDevpPlcId()); StaProtocol staProtocol = devpThread.getStation().get(basDevp.getDevNo()); if (staProtocol == null) { log.info(date+"叠盘任务下发:未查询到站点信息:"+wrkMastSta); continue; } if (!staProtocol.isAutoing() || !staProtocol.isLoading()){ continue; } if (basDevp.getDevNo()>=118 && basDevp.getDevNo()<=123){ if (!staProtocol.isEmptyMk()){ continue; } } log.info(date+"叠盘任务下发:小车工作档:"+wrkMastSta); log.info(date+"叠盘任务下发:目标站状态:"+basDevp); sign = rgvTakeEmpty(rgvProtocol.getRgvNo(),wrkMastSta);//叠盘 }else { continue; } if (sign){ boolean signMap = rgvMapUpdate(basRgvMap, wrkMastSta.getStaStart(), basRgvMap.getStartRoute()); if (signMap){ wrkMastSta.setWrkSts(1); try{ wrkMastStaMapper.updateById(wrkMastSta); }catch (Exception e){ log.error("更新小车任务失败"); } return true; }else { log.error("3879行,货物搬运任务:工作号{}所属任务下发后地图同步失败",wrkMastSta.getWrkNo()); } }else { log.error("工作号{}所属任务下发失败",wrkMastSta.getWrkNo()); } break; } } // } }catch (Exception e){ log.error("3989行执行小车取空板任务下发失败"); log.error("3989行"+e); } return false; } public synchronized boolean rgvRunWrkMastEmptyStaTakeFull(RgvSlave rgvSlave) {//满取 try{ // for (RgvSlave rgvSlave:slaveProperties.getRgv()) { RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, rgvSlave.getId()); RgvProtocol rgvProtocol = rgvThread.getRgvProtocol(); if (rgvProtocol == null) { return false; } BasRgv basRgv = basRgvService.selectById(rgvSlave.getId()); if (basRgv == null) { log.error("{}号RGV尚未在数据库进行维护!", rgvSlave.getId()); return false; } // 只有当RGV空闲、自动,工位二无物//rgv可用 if (rgvProtocol.getStatusType() == RgvStatusType.IDLE && rgvProtocol.getStatusType1() == RgvStatusType.IDLE && rgvProtocol.getStatusType2() == RgvStatusType.IDLE && rgvProtocol.getModeType() == RgvModeType.AUTO && rgvProtocol.getTaskNo1()==0 && rgvProtocol.getTaskNo2()==0 && rgvProtocol.getLoaded2()==0 //现场修改:叠盘机,////0 无物;1 一层无物二层有物(只能拆叠) ;2一层有物二层无物 (只能满放);3 1、2层都有物 4:()只允许拆盘 ) { BasRgvMap basRgvMap = basRgvMapMapper.selectById(rgvProtocol.getRgvNo()); if (basRgvMap == null) { log.error("{}号RGV尚未在数据库地图中进行维护!", rgvProtocol.getRgvNo()); return false; } List<Integer> route = RouteUtils.getRoute(basRgvMap.getStartRoute(), basRgvMap.getEndRoute()); basRgvMap.setNowRoute(rgvProtocol.getRgvPosI()); //更新小车当前位置站点号 List<WrkMastSta> wrkMastStaList = wrkMastStaMapper.selectNoInterfereList(route, route); WrkMast wrkMast = wrkMastMapper.selectBy122ManQu(122,110,15L); if (!Cools.isEmpty(wrkMast)){ WrkMastSta wrkMastSta = wrkMastStaMapper.selectByWrkNo(wrkMast.getWrkNo().longValue()); if (!Cools.isEmpty(wrkMastSta) && wrkMastSta.getType()==2 && wrkMastSta.getWrkType()==5 ){ wrkMastStaList.add(wrkMastSta); } } for (WrkMastSta wrkMastSta : wrkMastStaList){ if (wrkMastSta.getType()!=2 || wrkMastSta.getWrkType()!=5){// 2:空板 || 工作类型 1:取(叠盘) 2:拆盘 5:满取 6:满放 continue; } boolean sign = false; if (wrkMastSta.getStaStart()!=0){//满取 BasDevp basDevp = basDevpService.selectById(wrkMastSta.getStaStart()); if (!basDevp.getAutoing().equals("Y") || !basDevp.getLoading().equals("Y")){ continue; } Date date = new Date(); SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, rgvSlave.getDevpPlcId()); StaProtocol staProtocol = devpThread.getStation().get(basDevp.getDevNo()); if (staProtocol == null) { log.info(date+"满取任务下发:未查询到站点信息:"+wrkMastSta); continue; } if (!staProtocol.isAutoing() || staProtocol.isLoading()){ continue; } log.info(date+"满取任务下发:小车工作档:"+wrkMastSta); log.info(date+"满取任务下发:目标站状态:"+basDevp); sign = rgvTakeEmptyFull(rgvProtocol.getRgvNo(),wrkMastSta); }else { continue; } if (sign){ boolean signMap = rgvMapUpdate(basRgvMap, wrkMastSta.getStaStart(), basRgvMap.getStartRoute()); if (signMap){ wrkMastSta.setWrkSts(1); try{ wrkMastStaMapper.updateById(wrkMastSta); }catch (Exception e){ log.error("更新小车任务失败"); } return true; }else { log.error("3879行,货物搬运任务:工作号{}所属任务下发后地图同步失败",wrkMastSta.getWrkNo()); } }else { log.error("工作号{}所属任务下发失败",wrkMastSta.getWrkNo()); } break; } } // } }catch (Exception e){ log.error("3989行执行小车取空板任务下发失败"); log.error("3989行"+e); } return false; } /* * 有任务但未执行 此时需要调整小车位置 * */ public synchronized void rgvRunWrkMastEmptyStaAvoidance() { try{ // Integer integer = wrkMastStaMapper.selectAllWrkStsCount(null,0);//查询状态为0的任务 // if (integer==0){ // return; // } WrkMastSta wrkMastSta = wrkMastStaMapper.selectAllWrkStsCountWrkMastSta(null, 0); if (Cools.isEmpty(wrkMastSta)){ return; } boolean signRgv = true; boolean signRgv1 = true; boolean signRgv2 = true; for (RgvSlave rgvSlave:slaveProperties.getRgv()) { RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, rgvSlave.getId()); RgvProtocol rgvProtocol = rgvThread.getRgvProtocol(); if (rgvProtocol == null) { continue; } BasRgv basRgv = basRgvService.selectById(rgvSlave.getId()); if (basRgv == null) { log.error("{}号RGV尚未在数据库进行维护!", rgvSlave.getId()); continue; } // 只有当RGV空闲、自动,工位一无物//rgv可用 if (rgvProtocol.getStatusType() == RgvStatusType.IDLE && rgvProtocol.getModeType() == RgvModeType.AUTO && rgvProtocol.getLoaded1()==0 //现场修改:叠盘机,不满都算无物,怎么判断需要跟电控对接 && rgvProtocol.getTaskNo1()==0 && rgvProtocol.getTaskNo2()==0 && rgvProtocol.getStatusType1() == RgvStatusType.IDLE && rgvProtocol.getStatusType2() == RgvStatusType.IDLE ) { if (rgvProtocol.getRgvNo()!=1){ if (!rgvProtocol.getRgvPosI().equals(120) && !rgvProtocol.getRgvPosI().equals(110)){ continue; } rgvAvoidanceXY(rgvProtocol.getRgvNo()); // return; continue; } if (!rgvProtocol.getRgvPosI().equals(110) && !rgvProtocol.getRgvPosI().equals(108) && !rgvProtocol.getRgvPosI().equals(119)){ continue; } Integer count108Y = wrkMastStaMapper.selectAllWrkCount108Y(); if (count108Y!=0){ continue; } // Integer count108 = wrkMastStaMapper.selectAllWrkCount108(); // if (count108!=0){ // continue; // } rgvAvoidanceXY(rgvProtocol.getRgvNo()); continue; // BasRgvMap basRgvMap = basRgvMapMapper.selectById(rgvProtocol.getRgvNo()); // Integer fallMerge = RouteUtils.RouteIndexFarMas(basRgvMap.getRgvNo(), basRgvMap.getEndRoute()); //获取合并干涉项 // List<Integer> route = RouteUtils.getRoute(basRgvMap.getStartRoute(),fallMerge); // List<WrkMastSta> wrkMastStaList = wrkMastStaMapper.selectNoInterfereList(route ,route); // if (!wrkMastStaList.isEmpty()){ // log.info("小车存在可执行任务,跳过避让!!4214"); // return; // } // if (rgvProtocol.getRgvPosI().equals(basRgvMap.getStartRoute())){ //// if (!RouteUtils.RgvRunStaSign(rgvProtocol.getRgvPosI(),RouteUtils.RouteIndexFarMas(rgvProtocol.getRgvNo(),rgvRunSta[rgvProtocol.getRgvNo()-1]),rgvProtocol.getRgvNo())){ //// if (!RouteUtils.RgvRunStaSign(rgvProtocol.getRgvPosI(),rgvRunSta[rgvProtocol.getRgvNo()-1],rgvProtocol.getRgvNo())){ // if (rgvProtocol.getRgvNo()==1){ // signRgv1 = false; // }else { // signRgv2 = false; // } // } // if (rgvProtocol.getRgvNo()==1 && (rgvProtocol.getRgvPosI().equals(101) || rgvProtocol.getRgvPosI().equals(102) )){ // signRgv1 = false; // continue; // } else if (rgvProtocol.getRgvNo()==2 && (rgvProtocol.getRgvPosI().equals(116) || rgvProtocol.getRgvPosI().equals(117) ) ){ // signRgv2 = false; // continue; // } }else { signRgv = false; break; } } // if (signRgv && (signRgv1 || signRgv2)){ // for (RgvSlave rgvSlave:slaveProperties.getRgv()) { // RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, rgvSlave.getId()); // RgvProtocol rgvProtocol = rgvThread.getRgvProtocol(); // if (rgvProtocol == null) { // continue; // } // // // 只有当RGV空闲、自动,工位一无物//rgv可用 // if (rgvProtocol.getStatusType() == RgvStatusType.IDLE // && rgvProtocol.getModeType() == RgvModeType.AUTO // && rgvProtocol.getLoaded1()==0 //现场修改:叠盘机,不满都算无物,怎么判断需要跟电控对接 // && rgvProtocol.getTaskNo1()==0 // && rgvProtocol.getTaskNo2()==0 // && rgvProtocol.getStatusType1() == RgvStatusType.IDLE // && rgvProtocol.getStatusType2() == RgvStatusType.IDLE // ) { // if (rgvProtocol.getRgvNo()==1 && (rgvProtocol.getRgvPosI().equals(101) || rgvProtocol.getRgvPosI().equals(102) )){ // continue; // } else if (rgvProtocol.getRgvNo()==2 && (rgvProtocol.getRgvPosI().equals(116) || rgvProtocol.getRgvPosI().equals(117) ) ){ // continue; // } // BasRgvMap basRgvMap = basRgvMapMapper.selectById(rgvProtocol.getRgvNo()); // rgvAvoidanceXY(rgvProtocol.getRgvNo()); // rgvMapUpdate(basRgvMap,basRgvMap.getStartRoute(),basRgvMap.getStartRoute()); // // } // } // } }catch (Exception e){ log.error("4109行执行小车初始化任务下发失败"); log.error("4109行"+e); } } /* * 刷新地图数据 * */ public synchronized void refreshRgvMap() { try{ for (RgvSlave rgvSlave:slaveProperties.getRgv()) { RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, rgvSlave.getId()); RgvProtocol rgvProtocol = rgvThread.getRgvProtocol(); if (rgvProtocol == null) { continue; } BasRgv basRgv = basRgvService.selectById(rgvSlave.getId()); if (basRgv == null) { log.error("{}号RGV尚未在数据库进行维护!", rgvSlave.getId()); continue; } // 只有当RGV空闲、自动,工位一无物//rgv可用 if (rgvProtocol.getStatusType() == RgvStatusType.IDLE && rgvProtocol.getModeType() == RgvModeType.AUTO && rgvProtocol.getLoaded1()==0 //现场修改:叠盘机,不满都算无物,怎么判断需要跟电控对接 && rgvProtocol.getTaskNo1()==0 && rgvProtocol.getTaskNo2()==0 ) { BasRgvMap basRgvMap = basRgvMapMapper.selectById(rgvSlave.getId()); basRgvMap.setNowRoute(rgvProtocol.getRgvPosI()); rgvMapUpdate(basRgvMap,basRgvMap.getStartRoute(),basRgvMap.getStartRoute()); } } }catch (Exception e){ log.error("4109行执行小车初始化任务下发失败"); log.error("4109行"+e); } } /* * 小车XY移动 避让 * */ public synchronized boolean rgvAvoidanceXY(Integer rgvId){ if (rgvId==1){ try{ BasRgvMap basRgvMap = basRgvMapMapper.selectById(rgvId); // 命令下发区 -------------------------------------------------------------------------- RgvCommand rgvCommand = new RgvCommand(); rgvCommand.setRgvNo(rgvId); // RGV编号 rgvCommand.setAckFinish1((short) 0); // 工位1任务完成确认位 rgvCommand.setTaskNo1((short)32222); // 工位1工作号 rgvCommand.setTaskMode1(RgvTaskModeType.X_MOVE); // 工位1任务模式: 回原点 //basRgvMap.getLockStartRoute().shortValue() rgvCommand.setSourceStaNo1( (short)104); rgvCommand.setCommand((short) 1); //工位1任务确认 if (!MessageQueue.offer(SlaveType.Rgv, rgvId, new Task(4, rgvCommand))) { //step=2,工位1、2写任务; step=4,工位1写任务; step=5,工位2写任务 step=9,回原点 9999任务号 log.error("RGV命令下发失败,RGV号={},任务数据={}", rgvId, JSON.toJSON(rgvCommand)); return false; } else { return true; } }catch (Exception e){ return false; } }else { try{ BasRgvMap basRgvMap = basRgvMapMapper.selectById(rgvId); // 命令下发区 -------------------------------------------------------------------------- RgvCommand rgvCommand = new RgvCommand(); rgvCommand.setRgvNo(rgvId); // RGV编号 rgvCommand.setAckFinish2((short) 0); // 工位2任务完成确认位 rgvCommand.setTaskNo2((short)32222); // 工位2工作号 rgvCommand.setTaskMode2(RgvTaskModeType.X_MOVE); // 工位2任务模式: 回原点 rgvCommand.setSourceStaNo2((short)114); rgvCommand.setCommand((short) 2); //工位2任务确认 if (!MessageQueue.offer(SlaveType.Rgv, rgvId, new Task(5, rgvCommand))) { //step=2,工位1、2写任务; step=4,工位1写任务; step=5,工位2写任务 step=9,回原点 9999任务号 log.error("RGV命令下发失败,RGV号={},任务数据={}", rgvId, JSON.toJSON(rgvCommand)); return false; } else { return true; } }catch (Exception e){ return false; } } } /* * 小车取货至工位任务 * */ public synchronized boolean rgvTakeFullAll(Integer rgvId,WrkMastSta wrkMastSta){ try{ // 命令下发区 -------------------------------------------------------------------------- RgvCommand rgvCommand = new RgvCommand(); rgvCommand.setRgvNo(rgvId); // RGV编号 rgvCommand.setAckFinish1((short) 0); // 工位1任务完成确认位 rgvCommand.setTaskNo1(wrkMastSta.getWrkNo().shortValue()); // 工位1工作号 rgvCommand.setTaskMode1(RgvTaskModeType.FETCH_PUT); // 工位1任务模式: 取放货 rgvCommand.setSourceStaNo1(wrkMastSta.getStaStart().shortValue()); //工位1起点 rgvCommand.setDestinationStaNo1(wrkMastSta.getStaEnd().shortValue()); //工位1目标站点 rgvCommand.setCommand((short) 1); //工位1任务确认 if (!MessageQueue.offer(SlaveType.Rgv, rgvId, new Task(4, rgvCommand))) { //step=2,工位1、2写任务; step=4,工位1写任务; step=5,工位2写任务 log.error("RGV命令下发失败,RGV号={},任务数据={}", rgvId, JSON.toJSON(rgvCommand)); return false; } else { return true; } }catch (Exception e){ return false; } } /* * 小车取货至工位任务 * */ public synchronized boolean rgvTakeFull(Integer rgvId,WrkMastSta wrkMastSta){ try{ // 命令下发区 -------------------------------------------------------------------------- RgvCommand rgvCommand = new RgvCommand(); rgvCommand.setRgvNo(rgvId); // RGV编号 rgvCommand.setAckFinish1((short) 0); // 工位1任务完成确认位 rgvCommand.setTaskNo1(wrkMastSta.getWrkNo().shortValue()); // 工位1工作号 rgvCommand.setTaskMode1(RgvTaskModeType.FETCH); // 工位1任务模式: 取货 rgvCommand.setSourceStaNo1(wrkMastSta.getStaStart().shortValue()); //工位1起点 rgvCommand.setCommand((short) 1); //工位1任务确认 if (!MessageQueue.offer(SlaveType.Rgv, rgvId, new Task(4, rgvCommand))) { //step=2,工位1、2写任务; step=4,工位1写任务; step=5,工位2写任务 log.error("RGV命令下发失败,RGV号={},任务数据={}", rgvId, JSON.toJSON(rgvCommand)); return false; } else { return true; } }catch (Exception e){ return false; } } /* * 小车放货至输送线任务 * */ public synchronized boolean rgvPutFull(Integer rgvId,WrkMastSta wrkMastSta){ try{ // 命令下发区 -------------------------------------------------------------------------- RgvCommand rgvCommand = new RgvCommand(); rgvCommand.setRgvNo(rgvId); // RGV编号 rgvCommand.setAckFinish1((short) 0); // 工位1任务完成确认位 rgvCommand.setTaskNo1(wrkMastSta.getWrkNo().shortValue()); // 工位1工作号 rgvCommand.setTaskMode1(RgvTaskModeType.PUT); // 工位1任务模式: 放货 rgvCommand.setDestinationStaNo1(wrkMastSta.getStaEnd().shortValue()); //工位1目标站点 rgvCommand.setCommand((short) 1); //工位1任务确认 if (!MessageQueue.offer(SlaveType.Rgv, rgvId, new Task(4, rgvCommand))) { //step=2,工位1、2写任务; step=4,工位1写任务; step=5,工位2写任务 log.error("RGV命令下发失败,RGV号={},任务数据={}", rgvId, JSON.toJSON(rgvCommand)); return false; } else { return true; } }catch (Exception e){ return false; } } /* * 小车取空板至工位任务 叠盘 * */ public synchronized boolean rgvTakeEmpty(Integer rgvId,WrkMastSta wrkMastSta){ try{ // 命令下发区 -------------------------------------------------------------------------- RgvCommand rgvCommand = new RgvCommand(); rgvCommand.setRgvNo(rgvId); // RGV编号 rgvCommand.setAckFinish2((short) 0); // 工位2任务完成确认位 rgvCommand.setTaskNo2(wrkMastSta.getWrkNo().shortValue()); // 工位2工作号 rgvCommand.setTaskMode2(RgvTaskModeType.FETCH); // 工位2任务模式: 取货 rgvCommand.setSourceStaNo2(wrkMastSta.getStaStart().shortValue()); //工位2起点 rgvCommand.setCommand((short) 2); //工位2任务确认 if (!MessageQueue.offer(SlaveType.Rgv, rgvId, new Task(5, rgvCommand))) { //step=2,工位1、2写任务; step=4,工位1写任务; step=5,工位2写任务 log.error("RGV命令下发失败,RGV号={},任务数据={}", rgvId, JSON.toJSON(rgvCommand)); return false; } else { return true; } }catch (Exception e){ return false; } } /* * 小车放空板至输送线任务 //拆盘 * */ public synchronized boolean rgvPutEmpty(Integer rgvId,WrkMastSta wrkMastSta){ try{ // 命令下发区 -------------------------------------------------------------------------- RgvCommand rgvCommand = new RgvCommand(); rgvCommand.setRgvNo(rgvId); // RGV编号 rgvCommand.setAckFinish2((short) 0); // 工位2任务完成确认位 rgvCommand.setTaskNo2(wrkMastSta.getWrkNo().shortValue()); // 工位2工作号 rgvCommand.setTaskMode2(RgvTaskModeType.PUT); // 工位2任务模式: 放货 rgvCommand.setDestinationStaNo2(wrkMastSta.getStaEnd().shortValue()); //工位2目标站点 rgvCommand.setCommand((short) 2); //工位2任务确认 if (!MessageQueue.offer(SlaveType.Rgv, rgvId, new Task(5, rgvCommand))) { //step=2,工位1、2写任务; step=4,工位1写任务; step=5,工位2写任务 log.error("RGV命令下发失败,RGV号={},任务数据={}", rgvId, JSON.toJSON(rgvCommand)); return false; } else { return true; } }catch (Exception e){ return false; } } /* * 小车取空板至工位任务 满取 * */ public synchronized boolean rgvTakeEmptyFull(Integer rgvId,WrkMastSta wrkMastSta){ try{ // 命令下发区 -------------------------------------------------------------------------- RgvCommand rgvCommand = new RgvCommand(); rgvCommand.setRgvNo(rgvId); // RGV编号 rgvCommand.setAckFinish2((short) 0); // 工位2任务完成确认位 rgvCommand.setTaskNo2(wrkMastSta.getWrkNo().shortValue()); // 工位2工作号 rgvCommand.setTaskMode2(RgvTaskModeType.FETCH_5); // 工位2任务模式: 满取 rgvCommand.setSourceStaNo2(wrkMastSta.getStaStart().shortValue()); //工位2起点 rgvCommand.setCommand((short) 2); //工位2任务确认 if (!MessageQueue.offer(SlaveType.Rgv, rgvId, new Task(5, rgvCommand))) { //step=2,工位1、2写任务; step=4,工位1写任务; step=5,工位2写任务 log.error("RGV命令下发失败,RGV号={},任务数据={}", rgvId, JSON.toJSON(rgvCommand)); return false; } else { return true; } }catch (Exception e){ return false; } } /* * 小车放空板至输送线任务 //满放 * */ public synchronized boolean rgvPutEmptyFull(Integer rgvId,WrkMastSta wrkMastSta){ try{ // 命令下发区 -------------------------------------------------------------------------- RgvCommand rgvCommand = new RgvCommand(); rgvCommand.setRgvNo(rgvId); // RGV编号 rgvCommand.setAckFinish2((short) 0); // 工位2任务完成确认位 rgvCommand.setTaskNo2(wrkMastSta.getWrkNo().shortValue()); // 工位2工作号 rgvCommand.setTaskMode2(RgvTaskModeType.PUT_6); // 工位2任务模式: 满放 rgvCommand.setDestinationStaNo2(wrkMastSta.getStaEnd().shortValue()); //工位2目标站点 rgvCommand.setCommand((short) 2); //工位2任务确认 if (!MessageQueue.offer(SlaveType.Rgv, rgvId, new Task(5, rgvCommand))) { //step=2,工位1、2写任务; step=4,工位1写任务; step=5,工位2写任务 log.error("RGV命令下发失败,RGV号={},任务数据={}", rgvId, JSON.toJSON(rgvCommand)); return false; } else { return true; } }catch (Exception e){ return false; } } /* * 小车复位 * */ public synchronized boolean rgvComplete(Integer rgvId){ try{ // 命令下发区 -------------------------------------------------------------------------- if (!MessageQueue.offer(SlaveType.Rgv, rgvId, new Task(3, new RgvCommand()))) { //step=2,工位1、2写任务; step=4,工位1写任务; step=5,工位2写任务 log.error("RGV命令下发失败,RGV号={}",rgvId); return false; } else { log.info("RGV命令下发成功,RGV号={}",rgvId); return true; } }catch (Exception e){ log.error("RGV命令下发失败,RGV号={}。异常:"+e,rgvId); return false; } } /* * 小车地图更新 更新锁 * */ public synchronized boolean rgvMapUpdate(BasRgvMap basRgvMapCurrent,Integer staStart,Integer staEnd){ if (rgvOpen){ return true; } // List<Integer> integers = RouteUtils.RouteMapCurrentFar(basRgvMapCurrent.getNowRoute(),staStart,staEnd, basRgvMapCurrent.getLockStartRoute()); //更新当前小车锁 try{ Integer farCurrentStaNo = RouteUtils.RouteIndexFarMas(basRgvMapCurrent.getNowRoute(), staStart, staEnd, basRgvMapCurrent.getLockStartRoute());//获取最远站点 // Integer farCurrentStaNo = RouteUtils.RouteIndexFarMas(staEnd, staStart, staEnd, basRgvMapCurrent.getLockStartRoute());//获取最远站点 Integer fallMerge = RouteUtils.RouteIndexFarMas(basRgvMapCurrent.getRgvNo(), farCurrentStaNo); //获取合并干涉项 basRgvMapCurrent.setLockEndRoute(fallMerge); basRgvMapMapper.updateById(basRgvMapCurrent); //更新另一台小车地图 Integer rgvNoOther = basRgvMapCurrent.getRgvNoOther(); BasRgvMap basRgvMapOther = basRgvMapMapper.selectById(rgvNoOther); List<Integer> integers = RouteUtils.RouteMapCurrentFar(fallMerge, basRgvMapCurrent.getLockStartRoute()); Integer lockEndRoute = RouteUtils.RouteMapOtherFarStnNo(integers, basRgvMapCurrent.getLockStartRoute());//另一台小车可活动最远位置 Integer lockEndRouteL = RouteUtils.RouteIndexFarMasL(rgvNoOther, lockEndRoute);//另一台小车可活动最远位置 basRgvMapOther.setEndRoute(lockEndRouteL); basRgvMapMapper.updateById(basRgvMapOther); return true; }catch (Exception e){ log.error("小车地图更新出错!"); return false; } } } src/main/java/com/zy/asrs/utils/RouteUtils.java
New file @@ -0,0 +1,574 @@ package com.zy.asrs.utils; import com.zy.core.enums.RouteCollectCountType; import java.util.ArrayList; import java.util.List; import static java.util.stream.Collectors.toList; /** * Created by Monkey D. Luffy on 2023/7/18 */ public class RouteUtils { public static final List<Integer> MERGE_STA_NO_One = new ArrayList<Integer>() {{ add(171);add(116);add(117); }}; public static final List<Integer> MERGE_STA_NO_TWO = new ArrayList<Integer>() {{ add(113);add(123);add(114);add(1142); }}; public static final List<Integer> MERGE_STA_NO_THREE = new ArrayList<Integer>() {{ add(107);add(118);add(108);add(119); }}; public static final List<Integer> MERGE_STA_NO_FOUR = new ArrayList<Integer>() {{ add(110);add(120);add(111);add(121); }}; public static final List<Integer> MERGE_STA_NO_FIVE = new ArrayList<Integer>() {{ add(104);add(122);add(105); }}; public static final List<Integer> MERGE_STA_NO_SIX = new ArrayList<Integer>() {{ add(108);add(119);add(110);add(120); }}; public static final List<Integer> MERGE_STA_NO_SEVEN = new ArrayList<Integer>() {{ }}; public static final List<Integer> MERGE_STA_NO_EIGHT = new ArrayList<Integer>() {{ }}; public static final List<Integer> MERGE_STA_NO_NINE = new ArrayList<Integer>() {{ }}; // 正序 public static final List<Integer> TRACK_POSITION_POSITIVE_SEQUENCE1 = new ArrayList<Integer>() {{ add(101);add(102);add(104);add(122);add(105);add(107);add(118);add(108); }}; // 反序 public static final List<Integer> TRACK_POSITION_REVERSE_SEQUENCE2 = new ArrayList<Integer>() {{ add(117);add(116);add(171);add(1142);add(114);add(123);add(113);add(121);add(111);add(120);add(110); }}; public static Integer getEndRoute(Integer endRoute,Integer rgvNo){ if (rgvNo == 1){ if (TRACK_POSITION_POSITIVE_SEQUENCE1.contains(endRoute)){ return endRoute; } else { return 108; } } else if (rgvNo == 2){ if (TRACK_POSITION_REVERSE_SEQUENCE2.contains(endRoute)){ return endRoute; } else { return 110; } } return endRoute; } // 正序 public static final List<Integer> TRACK_POSITION_POSITIVE_SEQUENCE = new ArrayList<Integer>() {{ add(101);add(102);add(104);add(122);add(105);add(107);add(118);add(108);add(119);add(110);add(120);add(111);add(121);add(113);add(123);add(114);add(1142);add(171);add(116);add(117); }}; // 反序 public static final List<Integer> TRACK_POSITION_REVERSE_SEQUENCE = new ArrayList<Integer>() {{ add(117);add(116);add(171);add(1142);add(114);add(123);add(113);add(121);add(111);add(120);add(110);add(119);add(108);add(118);add(107);add(105);add(122);add(104);add(102);add(101); }}; public static String zerofill(String msg, Integer count){ if (msg.length() == count){ return msg; } else if (msg.length() > count){ return msg.substring(0, 16); } else { StringBuilder msgBuilder = new StringBuilder(msg); for (int i = 0; i<count-msg.length(); i++){ msgBuilder.insert(0,"0"); } return msgBuilder.toString(); } } // /* // * 获取干涉最远站点 // * */ // public static Integer RouteIndexFarMas(int rgvNo,Integer staNo){ // List<Integer> staFall = new ArrayList<>(); // if (MERGE_STA_NO_SIX.contains(staNo)){ // staFall = MERGE_STA_NO_SIX; // }else if (MERGE_STA_NO_One.contains(staNo)){ // staFall = MERGE_STA_NO_One; // }else if (MERGE_STA_NO_TWO.contains(staNo)){ // staFall = MERGE_STA_NO_TWO; // }else if (MERGE_STA_NO_THREE.contains(staNo)){ // staFall = MERGE_STA_NO_THREE; // }else if (MERGE_STA_NO_FOUR.contains(staNo)){ // staFall = MERGE_STA_NO_FOUR; // }else if (MERGE_STA_NO_FIVE.contains(staNo)){ // staFall = MERGE_STA_NO_FIVE; // }else { // return staNo; // } // // int indexNo = 0; // if (rgvNo==1){ // indexNo=staFall.size()-1; // } // return staFall.get(indexNo); // } /* * 获取干涉最远站点 * */ public static Integer RouteIndexFarMas(int rgvNo,Integer staNo){ if (rgvNo==1){ switch (staNo){ case 101: case 102: return 102; case 104: case 122: return 118; case 105: return 119; case 107: case 118: return 108; case 108: case 119: return 111; case 110: case 120: return 113; case 111: case 121: return 113; case 113: return 114; case 123: case 114: return 1142; default: return 116; } }else { switch (staNo){ case 117: case 116: case 171: return 1142; case 1142: case 114: return 113; case 123: case 113: return 111; case 121: return 110; case 111: return 110; case 120: case 110: return 108; case 119: case 108: return 107; case 118: case 107: return 105; case 105: case 122: case 104: return 104; default: return 102; } } } /* * 获取干涉最远站点 * */ public static Integer RouteIndexFarMasL(int rgvNo,Integer staNo){ if (rgvNo==1){ switch (staNo){ case 101: case 102: case 104: case 122: case 105: case 107: return 118; case 118: return staNo; default: return 108; } }else { switch (staNo){ case 117: case 116: case 171: case 1142: case 114: case 123: case 113: case 121: return 121; case 111: return staNo; default: return 110; } } } // 获取当前小车未行走的路线集合 public static List<Integer> getRoute(Integer groupStart,Integer groupEnd){ boolean sign = TRACK_POSITION_POSITIVE_SEQUENCE.indexOf(groupStart) < TRACK_POSITION_POSITIVE_SEQUENCE.indexOf(groupEnd); List<Integer> result = new ArrayList<>(); List<Integer> groupRoute = new ArrayList<>(); if (sign){ groupRoute = TRACK_POSITION_POSITIVE_SEQUENCE; }else { groupRoute = TRACK_POSITION_REVERSE_SEQUENCE; } if (groupRoute.contains(groupStart) && groupRoute.contains(groupEnd)) { sign = false; for (Integer route : groupRoute) { if (route.equals(groupStart)){ sign=true; } if (route.equals(groupEnd)){ result.add(route); break; } if (sign){ result.add(route); } } }else { return null; } return result; } /* * 获取最远站点 * */ public static Integer RouteIndexFarMas(Integer a,Integer b,Integer c,Integer d){ int ia = TRACK_POSITION_POSITIVE_SEQUENCE.indexOf(a); int ib = TRACK_POSITION_POSITIVE_SEQUENCE.indexOf(b); int ic = TRACK_POSITION_POSITIVE_SEQUENCE.indexOf(c); int id = TRACK_POSITION_POSITIVE_SEQUENCE.indexOf(d); if (id==0){ if (ia>ib){ if (ia>ic){ return a; }else { return c; } }else { if (ib>ic){ return b; }else { return c; } } }else { if (ia<ib){ if (ia<ic){ return a; }else { return c; } }else { if (ib<ic){ return b; }else { return c; } } } } /* * 获取最远站点 * a:当前位置 * b:开始位置 * c:结束位置 * d:锁开始位置 * */ public static Integer RouteIndexFarMasNew(Integer a,Integer b,Integer c,Integer d){ int ia = TRACK_POSITION_POSITIVE_SEQUENCE.indexOf(a); int ib = TRACK_POSITION_POSITIVE_SEQUENCE.indexOf(b); int ic = TRACK_POSITION_POSITIVE_SEQUENCE.indexOf(c); int id = TRACK_POSITION_POSITIVE_SEQUENCE.indexOf(d); if (id==0){ if (ia>ib){ if (ia>ic){ return a; }else { return c; } }else { if (ib>ic){ return b; }else { return c; } } }else { if (ia<ib){ if (ia<ic){ return a; }else { return c; } }else { if (ib<ic){ return b; }else { return c; } } } } public static Integer[] RouteIndexFarArr(Integer a,Integer b,Integer c,Integer d){ int ia = TRACK_POSITION_POSITIVE_SEQUENCE.indexOf(a); int ib = TRACK_POSITION_POSITIVE_SEQUENCE.indexOf(b); int ic = TRACK_POSITION_POSITIVE_SEQUENCE.indexOf(c); int id = TRACK_POSITION_POSITIVE_SEQUENCE.indexOf(d); return new Integer[]{ia,ib,ic,id}; } /* * a 小车当前位置 * b 小车任务开始位置 * c 小车任务结束位置 * d 小车初始位置 * 获取最大路径差值 * */ public static List<Integer> RouteMapCurrentFar(Integer a,Integer b,Integer c,Integer d){ Integer farStn = RouteIndexFarMas(a, b, c, d); return getRouteIntersection(TRACK_POSITION_POSITIVE_SEQUENCE,getRoute(farStn, d), RouteCollectCountType.DIFFERENCESET); } public static List<Integer> RouteMapCurrentFar(Integer farStn,Integer d){ return getRouteIntersection(TRACK_POSITION_POSITIVE_SEQUENCE,getRoute(farStn, d), RouteCollectCountType.DIFFERENCESET); } /* * 另一台小车最远位置 * */ public static Integer RouteMapOtherFarStnNo(List<Integer> routeDIFF,Integer d){ int id = TRACK_POSITION_POSITIVE_SEQUENCE.indexOf(d); if (id==0){ return routeDIFF.get(0); }else { int size = routeDIFF.size(); return routeDIFF.get(size-1); } } //是否有交集 public static boolean getRouteBoolean(List<Integer> groupCurrent,List<Integer> groupOther){ for (Integer positionCurrent : groupCurrent){ for (Integer positionOther : groupOther){ if (positionCurrent.equals(positionOther)){ return true; } } } return false; } //集合运算 public static List<Integer> getRouteIntersection(List<Integer> groupCurrent, List<Integer> groupOther, RouteCollectCountType routeCollectCountType){ switch (routeCollectCountType){ case INTERSECTION: //交集 return groupCurrent.stream().filter(item -> groupOther.contains(item)).collect(toList()); case DIFFERENCESET: //差集 return groupCurrent.stream().filter(item -> !groupOther.contains(item)).collect(toList()); case UNION: //并集 groupCurrent.addAll(groupOther); return groupCurrent; case DEDUPLICATIONUNION: //去重并集 groupCurrent.addAll(groupOther); return groupCurrent.stream().distinct().collect(toList()); default: return null; } } /* * a 小车当前位置 * b 小车任务开始位置 * c 小车任务结束位置 * sign 另一个小车空闲标记 * */ public static boolean RouteAutoBoolean(Integer a,Integer b,Integer c,Integer aa,Integer bb,Integer cc,boolean idleOther){ List<Integer> routeCurrent = getRouteIntersection(getRoute(a, c), getRoute(b, c), RouteCollectCountType.DEDUPLICATIONUNION);//并集 List<Integer> routeOther = getRouteIntersection(getRoute(aa, cc), getRoute(bb, cc), RouteCollectCountType.DEDUPLICATIONUNION);// return !getRouteBoolean(routeCurrent, routeOther); //是否有交集 } public static List<Integer> RouteAutoBoolean(Integer a,Integer b,Integer c){ return getRouteIntersection(getRoute(a, c), getRoute(b, c), RouteCollectCountType.DEDUPLICATIONUNION); } public static void main(String[] arge){ List<Integer> routeCurrent = getRoute(104, 119); //获取当前小车路径 List<Integer> routeOther = getRoute(117, 118); //获取其它小车路径 System.out.println("当前小车路径:\t"+routeCurrent); System.out.println("其它小车路径:\t"+routeOther); boolean routeBoolean = getRouteBoolean(routeCurrent, routeOther); //是否有交集 System.out.println("是否有交集:\t"+routeBoolean); List<Integer> routeIntersection = getRouteIntersection(routeCurrent, routeOther, RouteCollectCountType.INTERSECTION);//交集 System.out.println("路径交集:\t"+routeIntersection); List<Integer> routeIntersection1 = getRouteIntersection(routeCurrent, routeOther, RouteCollectCountType.DIFFERENCESET);//差集 System.out.println("路径差集:\t"+routeIntersection1); List<Integer> routeIntersection2 = getRouteIntersection(routeCurrent, routeOther, RouteCollectCountType.UNION);//并集 System.out.println("路径并集:\t"+routeIntersection2); List<Integer> routeIntersection3 = getRouteIntersection(routeCurrent, routeOther, RouteCollectCountType.DEDUPLICATIONUNION);//去重并集 System.out.println("路径去重并集:\t"+routeIntersection3); System.out.println(RouteAutoBoolean(101,104,119,114,116,120,true)); List<Integer> routeDIFF = RouteMapCurrentFar(114, 104, 119, 117); System.out.println("当前路径最大集合:\t"+ routeDIFF); Integer routeFarOther= RouteMapOtherFarStnNo(routeDIFF,117); System.out.println("另一台小车最远站点:\t"+routeFarOther); Integer[] integers = RouteIndexFarArr(114, 104, 119, 101); for (Integer integer:integers){ System.out.println(integer); } } public static short RgvPosSta(Integer rgvId,Short posId){ switch (rgvId){ case 1: return RgvPosStaOne(posId); case 2: return RgvPosStaTwo(posId); default: return 1; } } public static short RgvPosStaOne(Short posId){ switch (posId.intValue()){ case 1: case 2: return 102; case 3: case 4: return 122; case 5: case 6: return 105; case 7: case 8: case 9: return 118; case 10: case 11: return 119; case 12: case 13: case 14: return 110; case 15: return 120; case 16: case 17: case 18: return 111; case 19: return 121; case 20: case 21: case 22: return 113; case 23: case 24: return 123; case 25: return 114; case 26: case 27: return 1142; case 28: return 116; default: return 1142; } } public static short RgvPosStaTwo(Short posId){ switch (posId.intValue()){ case 1: return 116; case 28: case 2: return 1142; case 3: case 4: return 114; case 5: return 123; case 6: case 7: case 8: return 113; case 9: case 10: return 121; case 11: case 12: case 13: case 14: return 120; case 15: case 16: return 110; case 17: case 18: return 119; case 19: return 108; case 20: case 21: case 22: return 107; case 23: case 24: return 105; case 25: case 26: case 27: return 104; default: return 104; } } public static Integer CrnStaEnd(Integer endSta,Integer souSta) { switch (souSta) { case 100: case 103: case 106: case 109: case 112: case 115: return souSta + 1; default: return endSta; } } } src/main/java/com/zy/core/MainProcess.java
@@ -26,6 +26,7 @@ private Thread thread; // 频率 private int i = 0; private int k = 0; /** * =====>> 开始工作 @@ -56,17 +57,28 @@ // 堆垛机异常信息记录 mainService.recCrnErr(); // 入库 ===>> 空栈板初始化入库,叉车入库站放货 // mainService.storeEmptyPlt(); // mainService.outOfDevp(); // 其他 ===>> // 入出库模式切换函数 i++; if (i > 1) { // mainService.ioConvert(); k++; if (i<7) { // RGV ===>> 小车任务作业下发 try{ boolean rgvIoExecuteSign = mainService.rgvIoExecute(i); if (rgvIoExecuteSign){ k = 0; } else if (k>7){ k = 0; mainService.rgvRunWrkMastEmptyStaAvoidance();//避让 } }catch (Exception e){ log.error("RGV ===>> 小车任务作业下发异常"+e); } }else { i = 0; } //完成小车任务 mainService.rgvCompleteWrkMastSta(); } catch (Exception e) { e.printStackTrace(); src/main/java/com/zy/core/cache/OutputQueue.java
@@ -17,4 +17,6 @@ public static ArrayBlockingQueue<JSONObject> BARCODE = new ArrayBlockingQueue<>(32); // 磅秤输出日志 public static ArrayBlockingQueue<JSONObject> SCALE = new ArrayBlockingQueue<>(32); // rgv输出日志 public static ArrayBlockingQueue<String> RGV = new ArrayBlockingQueue<>(32); } src/main/java/com/zy/core/enums/RgvModeType.java
New file @@ -0,0 +1,43 @@ package com.zy.core.enums; public enum RgvModeType { NONE(-1, "离线"), STOP(0, "维修"), HAND(1, "手动"), HALF_AUTO(2, "半自动"), AUTO(3, "自动"), AUTO2(100, "其它"), ; public Integer id; public String desc; RgvModeType(Integer id, String desc) { this.id = id; this.desc = desc; } public static RgvModeType get(Short id) { if (null == id) { return null; } for (RgvModeType type : RgvModeType.values()) { if (type.id.equals(id.intValue())) { return type; } } return null; } public static RgvModeType get(RgvModeType type) { if (null == type) { return null; } for (RgvModeType rgvModeType : RgvModeType.values()) { if (rgvModeType == type) { return rgvModeType; } } return null; } } src/main/java/com/zy/core/enums/RgvStatusType.java
New file @@ -0,0 +1,47 @@ package com.zy.core.enums; public enum RgvStatusType { NONE(-1, "离线"), IDLE(0, "空闲"), WORKING(1, "作业中"), SOS(2, "报警"), FETCHING(11, "取货中"), PUTTING(12, "放货中"), WAITING(90, "任务完成等待WCS确认"), FETCHWAITING(91, "取货任务完成等待WCS确认"), SOS99(99, "报警99"), SOS100(100, "其它100") ; public Integer id; public String desc; RgvStatusType(Integer id, String desc) { this.id = id; this.desc = desc; } public static RgvStatusType get(Short id) { if (null == id) { return null; } for (RgvStatusType type : RgvStatusType.values()) { if (type.id.equals(id.intValue())) { return type; } } return NONE; } public static RgvStatusType get(RgvStatusType type) { if (null == type) { return null; } for (RgvStatusType rgvStatusType : RgvStatusType.values()) { if (rgvStatusType == type) { return rgvStatusType; } } return null; } } src/main/java/com/zy/core/enums/RgvTaskModeType.java
New file @@ -0,0 +1,46 @@ package com.zy.core.enums; public enum RgvTaskModeType { NONE(0), // 无 FETCH(1), // 取货 (空板)单取 PUT(2), // 放货 (空板)单放 FETCH_PUT(3), // 取放货 X_MOVE(4), // 站位移转 FETCH_5(5), // (空板)满取 PUT_6(6), // (空板)满放 // GO_ORIGIN(7), // 回原点 // BACK_ORIGIN(8), // 回反原点 // CLEAR(9), // 清错 ; public Integer id; RgvTaskModeType(Integer id) { this.id = id; } public static RgvTaskModeType get(Short id) { if (null == id) { return null; } for (RgvTaskModeType type : RgvTaskModeType.values()) { if (type.id.equals(id.intValue())) { return type; } } return null; } public static RgvTaskModeType get(RgvTaskModeType type) { if (null == type) { return null; } for (RgvTaskModeType rgvTaskModeType : RgvTaskModeType.values()) { if (rgvTaskModeType == type) { return rgvTaskModeType; } } return null; } } src/main/java/com/zy/core/enums/SlaveType.java
@@ -8,6 +8,7 @@ Led, Scale, Car, Rgv ; public static SlaveType findInstance(String s){ src/main/java/com/zy/core/model/RgvSlave.java
New file @@ -0,0 +1,62 @@ package com.zy.core.model; import com.zy.core.Slave; import lombok.Data; import lombok.EqualsAndHashCode; import java.util.ArrayList; import java.util.List; /** * Created by vincent on 2020/8/10 */ @EqualsAndHashCode(callSuper = true) @Data public class RgvSlave extends Slave { private Integer rack; private Integer slot; private Integer offset; private Boolean demo; private Integer devpPlcId; // RGV入库源站点 private List<RgvStn> rgvInSStn = new ArrayList<>(); // RGV出库源站点 private List<RgvStn> rgvOutSStn = new ArrayList<>(); // RGV叠盘 private List<RgvStn> rgvEmptyInSStn = new ArrayList<>(); // RGV空板入库 private List<RgvStn> rgvEmptyOutSStn = new ArrayList<>(); // RGV出库目标站点 private List<RgvStn> rgvDestStn = new ArrayList<>(); @Data public static class RgvStn { // 输送线plc编号 private Integer devpPlcId; // RGV站点编号 private Integer staNo; // // 排 // private Integer row; // // // 列 // private Integer bay; // // // 层 // private Integer lev; } } src/main/java/com/zy/core/model/command/RgvCommand.java
New file @@ -0,0 +1,129 @@ package com.zy.core.model.command; import com.alibaba.fastjson.annotation.JSONField; import com.zy.core.enums.RgvTaskModeType; import lombok.Data; import java.util.Calendar; import java.util.Date; /** * 堆垛机命令报文 * Created by vincent on 2020/8/11 */ @Data public class RgvCommand { // Rgv编号 private Integer rgvNo = 0; // 工位1任务完成确认位 private Short ackFinish1 = 0; // 工位1任务号 private Short taskNo1 = 0; /** * 任务模式: * 0 = 无 * 1 = 取货 * 2 = 放货 * 3 = 取放货 */ private Short taskMode1 = 0; @JSONField(serialize = false) private RgvTaskModeType taskModeType1; /* 工位1源站 */ private Short sourceStaNo1 = 0; /* 工位1目标站 */ private Short destinationStaNo1 = 0; ////////////////////// 工位2定义 ////////////////////////////////////////////////// // 工位1任务完成确认位 private Short ackFinish2 = 0; // 工位2任务号 private Short taskNo2 = 0; /** * 任务模式: * 0 = 无 * 1 = 取货 * 2 = 放货 * 3 = 取放货 */ private Short taskMode2 = 0; @JSONField(serialize = false) private RgvTaskModeType taskModeType2; /* 工位1源站 */ private Short sourceStaNo2 = 0; /* 工位1目标站 */ private Short destinationStaNo2 = 0; /////////////////////////////////////////////////////////////////////////////////////// /** * 任务模式: * 0 = 未确认 * 1 = 工位1任务确认 * 2 = 工位2任务确认 * 3 = 工位1、2任务同时确认 */ private Short command = 0; public void setTaskMode1(Short taskMode1){ this.taskMode1 = taskMode1; this.taskModeType1 = RgvTaskModeType.get(taskModeType1); } public void setTaskMode1(RgvTaskModeType type1) { this.taskModeType1 = type1; this.taskMode1 = RgvTaskModeType.get(type1).id.shortValue(); } public void setTaskMode2(Short taskMode2){ this.taskMode2 = taskMode2; this.taskModeType2 = RgvTaskModeType.get(taskModeType2); } public void setTaskMode2(RgvTaskModeType type2) { this.taskModeType2 = type2; this.taskMode2 = RgvTaskModeType.get(type2).id.shortValue(); } public static void main(String[] args) { Date date = new Date(); Calendar cal = Calendar.getInstance(); cal.setTime(date); System.out.println(cal.get(Calendar.YEAR)); //默认从0-11 System.out.println(cal.get(Calendar.MONTH)+1); System.out.println(cal.get(Calendar.DATE)); int hour = cal.get(Calendar.HOUR_OF_DAY); System.out.println("时"); System.out.println(hour); int minute = cal.get(Calendar.MINUTE); System.out.println("分"); System.out.println(minute); int second = cal.get(Calendar.SECOND); System.out.println("秒"); System.out.println(second); int mm = cal.get(Calendar.DAY_OF_WEEK) - 1; // 星期:0(日)~6(六) System.out.println("礼拜"); System.out.println(mm); } } src/main/java/com/zy/core/model/protocol/RgvProtocol.java
New file @@ -0,0 +1,210 @@ package com.zy.core.model.protocol; import com.zy.asrs.entity.BasRgv; import com.zy.core.enums.RgvModeType; import com.zy.core.enums.RgvStatusType; import lombok.Data; /** * Created by vincent on 2020/8/7 */ @Data public class RgvProtocol { private Integer RgvNo; /** * 1 = 手动模式 * 2 = 自动模式 * 3 = 电脑模式 */ public Short mode; public RgvModeType modeType; /** * RGV当前状态 * 0:空闲,无任务 * 1:作业中 * 2:报警 */ public Short status; /** * 状态枚举 */ public RgvStatusType statusType; /** * 工位1任务号 */ public Short taskNo1 = 0; /** * RGV工位1当前状态 * 0:空闲,无任务 * 11:取货中 * 12:放货中 * 10:任务完成等待WCS确认 */ public Short status1; /** * 状态枚举 */ public RgvStatusType statusType1; /** * 工位1有物 */ public Short loaded1;//0 无物;1 有物 /** * RGV当前位置 */ public Short RgvPos; /** * 走行在定位 * 0 = 在定位 * 1 = 不在定位 */ public Short walkPos; ////////////////////// 工位2定义 ////////////////////////////////////////////////// /** * 工位2任务号 */ public Short taskNo2 = 0; /** * RGV工位2当前状态 * 0:空闲,无任务 * 11:取货中 * 12:放货中 * 10:任务完成等待WCS确认 */ public Short status2; /** * 状态枚举 */ public RgvStatusType statusType2; /** * 工位2有物 */ public Short loaded2; //0 无物;1 一层无物二层有物(只能拆叠) ;2一层有物二层无物 (只能满放);3 1、2层都有物 4:()只允许拆盘 /////////////////////////////////////////////////////////////////////////////////////// /** * 异常码 */ public Short alarm; /** * 心跳指令 1-2每秒切换一次 */ public Short heart; private Short temp1; private Short temp2; private Short temp3; private Short temp4; private Short temp5; /** * X行走行速度m/min */ private Float xSpeed; /** * 堆垛机累计走行距离km */ public Float xDistance; /** * 堆垛机累计走行时长h */ public Float xDuration; public void setMode(Short mode) { this.mode = mode; this.modeType = RgvModeType.get(mode); } public void setMode(RgvModeType type) { this.modeType = type; this.mode = RgvModeType.get(type).id.shortValue(); } public void setStatus(Short status){ this.status = status; this.statusType = RgvStatusType.get(status); } public void setStatus(RgvStatusType type){ this.statusType = type; this.status = RgvStatusType.get(type).id.shortValue(); } public void setStatus1(Short status1){ this.status1 = status1; this.statusType1 = RgvStatusType.get(status1); } public void setStatus1(RgvStatusType type1){ this.statusType1 = type1; this.status1 = RgvStatusType.get(type1).id.shortValue(); } public void setStatus2(Short status2){ this.status2 = status2; this.statusType2 = RgvStatusType.get(status2); } public void setStatus2(RgvStatusType type2){ this.statusType2 = type2; this.status2 = RgvStatusType.get(type2).id.shortValue(); } /** * 最近一次入出库类型 * I:入库 * O:出库 */ private String lastIo = "I"; public BasRgv toSqlModel(BasRgv basRgv){ if (alarm!=null) { basRgv.setRgvErr(alarm.longValue()); } basRgv.setWrkNo1(taskNo1.intValue()); basRgv.setWrkNo2(taskNo2.intValue()); return basRgv; } public void setxSpeed(Short xSpeed) { this.xSpeed = Float.valueOf(xSpeed); } public void setxDistance(Short xDistance) { this.xDistance = Float.valueOf(xDistance); } public void setxDuration(Short xDuration) { this.xDuration = Float.valueOf(xDuration); } public Integer getRgvPosI(){ //需要根据现场改造 根据读到的值获取对应站点位置 if (RgvPos==null) return 0; return RgvPos.intValue(); } } src/main/java/com/zy/core/thread/RgvThread.java
New file @@ -0,0 +1,465 @@ package com.zy.core.thread; import HslCommunication.Core.Types.OperateResult; import HslCommunication.Core.Types.OperateResultExOne; import HslCommunication.Profinet.Siemens.SiemensPLCS; import HslCommunication.Profinet.Siemens.SiemensS7Net; import com.alibaba.fastjson.JSON; import com.core.common.DateUtils; import com.core.common.SpringUtils; import com.zy.asrs.entity.BasRgv; import com.zy.asrs.entity.BasRgvOpt; import com.zy.asrs.service.BasRgvOptService; import com.zy.asrs.service.BasRgvService; import com.zy.asrs.utils.RouteUtils; import com.zy.core.ThreadHandler; import com.zy.core.cache.MessageQueue; import com.zy.core.cache.OutputQueue; import com.zy.core.enums.RgvStatusType; import com.zy.core.enums.RgvTaskModeType; import com.zy.core.enums.SlaveType; import com.zy.core.model.RgvSlave; import com.zy.core.model.Task; import com.zy.core.model.command.RgvCommand; import com.zy.core.model.protocol.RgvProtocol; import lombok.Data; import lombok.extern.slf4j.Slf4j; import java.text.MessageFormat; import java.util.Date; /** * RGV线程 * Created by vincent on 2022/11/29 */ @Data @Slf4j public class RgvThread implements Runnable, ThreadHandler { private SiemensS7Net siemensNet; private RgvSlave slave; private RgvProtocol rgvProtocol; /** * 工位1复位信号 */ private boolean resetFlag1 = false; /** * 工位2复位信号 */ private boolean resetFlag2 = false; public RgvThread(RgvSlave slave) { this.slave = slave; } @Override @SuppressWarnings("InfiniteLoopStatement") public void run() { this.connect(); while (true) { try { int step = 1; Task task = MessageQueue.poll(SlaveType.Rgv, slave.getId()); if (task != null) { step = task.getStep(); } switch (step) { // 读数据 case 1: readStatus(); break; // 工位1、2写入数据 case 2: write((RgvCommand) task.getData()); break; //工位1写入数据 case 4: write1((RgvCommand) task.getData()); break; //工位2写入数据 case 5: write2((RgvCommand) task.getData()); break; // 复位 case 3: RgvCommand command = (RgvCommand) task.getData(); if (null == command) { command = new RgvCommand(); } command.setRgvNo(slave.getId()); // RGV编号 command.setTaskNo1((short) 0); // 工作号 command.setAckFinish1((short) 1); // 任务完成确认位 command.setTaskMode1(RgvTaskModeType.NONE); // 任务模式 command.setSourceStaNo1((short)0); // 源站 command.setDestinationStaNo1((short)0); // 目标站 command.setTaskNo2((short) 0); // 工作号 command.setAckFinish2((short) 1); // 任务完成确认位 command.setTaskMode2(RgvTaskModeType.NONE); // 任务模式 command.setSourceStaNo2((short)0); // 源站 command.setDestinationStaNo2((short)0); // 目标站 command.setCommand((short)0); write(command); break; // 回原点 避让 case 9: RgvCommand commandAvoidanceXY = (RgvCommand) task.getData(); if (null == commandAvoidanceXY) { commandAvoidanceXY = new RgvCommand(); } commandAvoidanceXY.setRgvNo(slave.getId()); // RGV编号 commandAvoidanceXY.setTaskNo1((short) 32222); // 工作号 commandAvoidanceXY.setAckFinish1((short) 1); // 任务完成确认位 commandAvoidanceXY.setTaskMode1(RgvTaskModeType.X_MOVE); // 任务模式 commandAvoidanceXY.setSourceStaNo1((short)0); // 源站 commandAvoidanceXY.setDestinationStaNo1(slave.getId()==1? (short) 101:(short)116); // 目标站 commandAvoidanceXY.setTaskNo2((short) 0); // 工作号 commandAvoidanceXY.setAckFinish2((short) 1); // 任务完成确认位 commandAvoidanceXY.setTaskMode2(RgvTaskModeType.X_MOVE); // 任务模式 commandAvoidanceXY.setSourceStaNo2((short)0); // 源站 commandAvoidanceXY.setDestinationStaNo2(slave.getId()==1? (short) 101:(short)117); // 目标站 commandAvoidanceXY.setCommand((short)0); write(commandAvoidanceXY); break; default: break; } Thread.sleep(500); } catch (Exception e) { // e.printStackTrace(); } } } /** * 初始化RGV状态 */ private void initRgv() { if (null == rgvProtocol) { rgvProtocol = new RgvProtocol(); } rgvProtocol.setMode((short) -1); rgvProtocol.setStatus((short)-1); rgvProtocol.setTaskNo1((short)0); rgvProtocol.setStatus1((short)-1); rgvProtocol.setLoaded1((short)0); rgvProtocol.setWalkPos((short)0); rgvProtocol.setRgvPos((short)0); rgvProtocol.setTaskNo2((short)0); rgvProtocol.setStatus2((short)-1); rgvProtocol.setLoaded2((short)0); rgvProtocol.setAlarm((short)0); rgvProtocol.setxSpeed((short) 0); rgvProtocol.setxDistance((short) 0); rgvProtocol.setxDuration((short) 0); } @Override public boolean connect() { boolean result = false; siemensNet = new SiemensS7Net(SiemensPLCS.S1200, slave.getIp()); siemensNet.setRack(slave.getRack().byteValue()); siemensNet.setSlot(slave.getSlot().byteValue()); OperateResult connect = siemensNet.ConnectServer(); if(connect.IsSuccess){ result = true; OutputQueue.RGV.offer(MessageFormat.format( "【{0}】RGV plc连接成功 ===>> [id:{1}] [ip:{2}] [port:{3}] [rack:{4}] [slot:{5}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot())); log.info("RGV plc连接成功 ===>> [id:{}] [ip:{}] [port:{}] [rack:{}] [slot:{}]", slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot()); } else { OutputQueue.RGV.offer(MessageFormat.format("【{0}】RGV plc连接失败!!! ===>> [id:{1}] [ip:{2}] [port:{3}] [rack:{4}] [slot:{5}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot())); log.error("RGV plc连接失败!!! ===>> [id:{}] [ip:{}] [port:{}] [rack:{}] [slot:{}]", slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot()); initRgv(); } // siemensNet.ConnectClose(); return result; } /** * 读取状态 */ private void readStatus(){ try { OperateResultExOne<byte[]> result = siemensNet.Read("DB101.0", (short) 34); if (result.IsSuccess) { if (null == rgvProtocol) { rgvProtocol = new RgvProtocol(); rgvProtocol.setRgvNo(slave.getId()); } rgvProtocol.setMode(siemensNet.getByteTransform().TransInt16(result.Content, 0)); rgvProtocol.setStatus(siemensNet.getByteTransform().TransInt16(result.Content, 2)); rgvProtocol.setTaskNo1(siemensNet.getByteTransform().TransInt16(result.Content, 4)); rgvProtocol.setStatus1(siemensNet.getByteTransform().TransInt16(result.Content, 6)); rgvProtocol.setLoaded1(siemensNet.getByteTransform().TransInt16(result.Content, 8)); rgvProtocol.setRgvPos(RouteUtils.RgvPosSta(slave.getId(),siemensNet.getByteTransform().TransInt16(result.Content, 10))); rgvProtocol.setWalkPos(siemensNet.getByteTransform().TransInt16(result.Content, 12)); rgvProtocol.setTaskNo2(siemensNet.getByteTransform().TransInt16(result.Content, 14)); rgvProtocol.setStatus2(siemensNet.getByteTransform().TransInt16(result.Content, 16)); rgvProtocol.setLoaded2(siemensNet.getByteTransform().TransInt16(result.Content, 18)); rgvProtocol.setAlarm(siemensNet.getByteTransform().TransInt16(result.Content, 20)); rgvProtocol.setHeart(siemensNet.getByteTransform().TransInt16(result.Content, 22)); rgvProtocol.setTemp1(siemensNet.getByteTransform().TransInt16(result.Content, 24)); rgvProtocol.setTemp2(siemensNet.getByteTransform().TransInt16(result.Content, 26)); rgvProtocol.setTemp3(siemensNet.getByteTransform().TransInt16(result.Content, 28)); rgvProtocol.setTemp4(siemensNet.getByteTransform().TransInt16(result.Content, 30)); rgvProtocol.setTemp5(siemensNet.getByteTransform().TransInt16(result.Content, 32)); // rgvProtocol.setxSpeed(siemensNet.getByteTransform().TransInt16(result.Content, 28)); // rgvProtocol.setxDistance(siemensNet.getByteTransform().TransInt16(result.Content, 40)); // rgvProtocol.setxDuration(siemensNet.getByteTransform().TransInt16(result.Content, 48)); OutputQueue.RGV.offer(MessageFormat.format("【{0}】[id:{1}] <<<<< 实时数据更新成功",DateUtils.convert(new Date()), slave.getId())); // 工位1复位信号 if (rgvProtocol.getStatusType1().equals(RgvStatusType.WAITING) || rgvProtocol.getStatusType1().equals(RgvStatusType.FETCHWAITING)) { if (resetFlag1) { RgvCommand rgvCommand = new RgvCommand(); rgvCommand.setAckFinish1((short)1); if (write(rgvCommand)) { resetFlag1 = false; } } } // 工位2复位信号 if (rgvProtocol.getStatusType2().equals(RgvStatusType.WAITING) || rgvProtocol.getStatusType2().equals(RgvStatusType.FETCHWAITING)) { if (resetFlag2) { RgvCommand rgvCommand = new RgvCommand(); rgvCommand.setAckFinish2((short)1); if (write(rgvCommand)) { resetFlag2 = false; } } } try { // 根据实时信息更新数据库 BasRgvService basRgvService = SpringUtils.getBean(BasRgvService.class); BasRgv basRgv = new BasRgv(); basRgv.setRgvNo(slave.getId()); basRgv.setRgvSts((int)rgvProtocol.getMode()); basRgv.setLoaded2(rgvProtocol.getLoaded2().intValue()); if (!basRgvService.updateById(rgvProtocol.toSqlModel(basRgv))){ log.error("RGV plc数据库更新失败 ===>> [id:{}] [ip:{}] [port:{}] [rack:{}] [slot:{}]", slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot()); } } catch (Exception ignore){} } else { initRgv(); OutputQueue.RGV.offer(MessageFormat.format("【{0}】读取RGV plc状态信息失败 ===>> [id:{1}] [ip:{2}] [port:{3}] [rack:{4}] [slot:{5}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot())); log.error("读取RGV plc状态信息失败 ===>> [id:{}] [ip:{}] [port:{}] [rack:{}] [slot:{}]", slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot()); } } catch (Exception e) { e.printStackTrace(); OutputQueue.RGV.offer(MessageFormat.format("【{0}】读取RGV plc状态信息失败 ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort())); log.error("读取RGV plc状态信息失败 ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort()); initRgv(); } } /** * 工位1、2同时写入数据 */ private boolean write(RgvCommand command) throws InterruptedException { if (null == command) { log.error("RGV写入命令为空"); return false; } // convertRow(command); command.setRgvNo(slave.getId()); short[] array = new short[11]; array[0] = command.getAckFinish1(); array[1] = command.getTaskNo1(); array[2] = command.getTaskMode1(); array[3] = command.getSourceStaNo1(); array[4] = command.getDestinationStaNo1(); array[5] = command.getAckFinish2(); array[6] = command.getTaskNo2(); array[7] = command.getTaskMode2(); array[8] = command.getSourceStaNo2(); array[9] = command.getDestinationStaNo2(); array[10] = command.getCommand(); OperateResult result = siemensNet.Write("DB100.0", array); if (command.getAckFinish1() == 0 && command.getAckFinish2() == 0) { short commandFinish = 3; //工位1、2任务同时写入 Thread.sleep(100L); result = siemensNet.Write("DB100.20", commandFinish); } try { // 日志记录 BasRgvOptService bean = SpringUtils.getBean(BasRgvOptService.class); BasRgvOpt basRgvOpt = new BasRgvOpt( command.getTaskNo1().intValue(), command.getTaskNo2().intValue(), command.getRgvNo(), new Date(), command.getTaskModeType1().toString(), command.getSourceStaNo1().intValue(), command.getDestinationStaNo1().intValue(), command.getSourceStaNo2().intValue(), command.getDestinationStaNo2().intValue(), null, new Date(), null ); bean.insert(basRgvOpt); } catch (Exception ignore) {} if (result != null && result.IsSuccess) { Thread.sleep(200); this.readStatus(); log.info("RGV 命令下发[id:{}] >>>>> {}", slave.getId(), JSON.toJSON(command)); OutputQueue.RGV.offer(MessageFormat.format("【{0}】[id:{1}] >>>>> 命令下发: {2}", DateUtils.convert(new Date()), slave.getId(), JSON.toJSON(command))); return true; } else { OutputQueue.RGV.offer(MessageFormat.format("【{0}】写入RGV plc数据失败 ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort())); log.error("写入RGV plc数据失败 ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort()); return false; } } /** * 工位1写入数据 */ private boolean write1(RgvCommand command) throws InterruptedException { if (null == command) { log.error("RGV写入命令为空"); return false; } // siemensNet.Write("DB100.20", command.getCommand()); command.setRgvNo(slave.getId()); short[] array = new short[5]; array[0] = command.getAckFinish1(); array[1] = command.getTaskNo1(); array[2] = command.getTaskMode1();//任务模式 array[3] = command.getSourceStaNo1(); array[4] = command.getDestinationStaNo1(); // siemensNet.Write("DB100.20", 0); OperateResult result = siemensNet.Write("DB100.0", array); if (command.getAckFinish1() == 0) { short commandFinish = 1; //工位1任务写入 Thread.sleep(100L); result = siemensNet.Write("DB100.20", commandFinish); } try { // 日志记录 BasRgvOptService bean = SpringUtils.getBean(BasRgvOptService.class); BasRgvOpt basRgvOpt = new BasRgvOpt( command.getTaskNo1().intValue(), command.getTaskNo2().intValue(), command.getRgvNo(), new Date(), command.getTaskModeType1().toString(), command.getSourceStaNo1().intValue(), command.getDestinationStaNo1().intValue(), command.getSourceStaNo2().intValue(), command.getDestinationStaNo2().intValue(), null, new Date(), null ); bean.insert(basRgvOpt); } catch (Exception ignore) {} if (result != null && result.IsSuccess) { Thread.sleep(200); this.readStatus(); log.info("RGV 工位1命令下发[id:{}] >>>>> {}", slave.getId(), JSON.toJSON(command)); OutputQueue.RGV.offer(MessageFormat.format("【{0}】[id:{1}] >>>>> 工位1命令下发: {2}", DateUtils.convert(new Date()), slave.getId(), JSON.toJSON(command))); return true; } else { OutputQueue.RGV.offer(MessageFormat.format("【{0}】写入RGV plc工位1数据失败 ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort())); log.error("写入RGV plc工位1数据失败 ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort()); return false; } } /** * 工位2写入数据 */ private boolean write2(RgvCommand command) throws InterruptedException { if (null == command) { log.error("RGV写入命令为空"); return false; } command.setRgvNo(slave.getId()); short[] array = new short[6]; array[0] = command.getAckFinish2();//任务完成确认位 array[1] = command.getTaskNo2();//任务号 array[2] = command.getTaskMode2();//任务模式 array[3] = command.getSourceStaNo2();//源站 array[4] = command.getDestinationStaNo2();//目标站 array[5] = command.getCommand();//任务下发确认 OperateResult result = siemensNet.Write("DB100.10", array); if (command.getAckFinish2() == 0) { short commandFinish = 2; //工位2任务写入 Thread.sleep(100L); result = siemensNet.Write("DB100.20", commandFinish); } try { // 日志记录 BasRgvOptService bean = SpringUtils.getBean(BasRgvOptService.class); BasRgvOpt basRgvOpt = new BasRgvOpt( command.getTaskNo1().intValue(), command.getTaskNo2().intValue(), command.getRgvNo(), new Date(), command.getTaskModeType1().toString(), command.getSourceStaNo1().intValue(), command.getDestinationStaNo1().intValue(), command.getSourceStaNo2().intValue(), command.getDestinationStaNo2().intValue(), null, new Date(), null ); bean.insert(basRgvOpt); } catch (Exception ignore) {} if (result != null && result.IsSuccess) { Thread.sleep(200); this.readStatus(); log.info("RGV 工位2命令下发[id:{}] >>>>> {}", slave.getId(), JSON.toJSON(command)); OutputQueue.RGV.offer(MessageFormat.format("【{0}】[id:{1}] >>>>> 工位2命令下发: {2}", DateUtils.convert(new Date()), slave.getId(), JSON.toJSON(command))); return true; } else { OutputQueue.RGV.offer(MessageFormat.format("【{0}】写入RGV plc工位2数据失败 ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort())); log.error("写入RGV plc工位2数据失败 ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort()); return false; } } @Override public void close() { siemensNet.ConnectClose(); } /******************************************************************************************/ /**************************************** 测试专用 *****************************************/ /*****************************************************************************************/ public static void main(String[] args) throws InterruptedException { RgvSlave slave = new RgvSlave(); slave.setId(1); slave.setIp("192.168.6.9"); slave.setRack(0); slave.setSlot(0); RgvThread rgvThread = new RgvThread(slave); rgvThread.connect(); rgvThread.readStatus(); System.out.println(JSON.toJSONString(rgvThread.rgvProtocol)); Thread.sleep(3000L); } } src/main/resources/mapper/BasRgvMapMapper.xml
New file @@ -0,0 +1,17 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.zy.asrs.mapper.BasRgvMapMapper"> <!-- 通用查询映射结果 --> <resultMap id="BaseResultMap" type="com.zy.asrs.entity.BasRgvMap"> <result column="RGV_NO" property="rgvNo" /> <result column="START_ROUTE" property="startRoute" /> <result column="END_ROUTE" property="endRoute" /> <result column="NOW_ROUTE" property="nowRoute" /> <result column="RGV_STATUS" property="rgvStatus" /> <result column="LOCK_START_ROUTE" property="lockStartRoute" /> <result column="LOCK_END_ROUTE" property="lockEndRoute" /> </resultMap> </mapper> src/main/resources/mapper/BasRgvMapper.xml
New file @@ -0,0 +1,25 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.zy.asrs.mapper.BasRgvMapper"> <!-- 通用查询映射结果 --> <resultMap id="BaseResultMap" type="com.zy.asrs.entity.BasRgv"> <result column="RGV_NO" property="rgvNo" /> <result column="IN_ENABLE" property="inEnable" /> <result column="OUT_ENABLE" property="outEnable" /> <result column="RGV_STS" property="rgvSts" /> <result column="WRK_NO1" property="wrkNo1" /> <result column="WRK_NO2" property="wrkNo2" /> <result column="RGV_ERR" property="rgvErr" /> <result column="PAK_MK" property="pakMk" /> <result column="STATUS" property="status" /> <result column="CREATE_BY" property="createBy" /> <result column="CREATE_TIME" property="createTime" /> <result column="UPDATE_BY" property="updateBy" /> <result column="UPDATE_TIME" property="updateTime" /> <result column="MEMO" property="memo" /> <result column="LOADED2" property="loaded2" /> </resultMap> </mapper> src/main/resources/mapper/BasRgvOptMapper.xml
New file @@ -0,0 +1,27 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.zy.asrs.mapper.BasRgvOptMapper"> <!-- 通用查询映射结果 --> <resultMap id="BaseResultMap" type="com.zy.asrs.entity.BasRgvOpt"> <result column="ID" property="id" /> <result column="WRK_NO" property="wrkNo" /> <result column="RGV_NO" property="rgvNo" /> <result column="SEND_TIME" property="sendTime" /> <result column="MODE" property="mode" /> <result column="SOURCE_ROW" property="sourceRow" /> <result column="SOURCE_BAY" property="sourceBay" /> <result column="SOURCE_LEV" property="sourceLev" /> <result column="SOURCE_STA" property="sourceSta" /> <result column="POS_ROW" property="posRow" /> <result column="POS_BAY" property="posBay" /> <result column="POS_LEV" property="posLev" /> <result column="POS_STA" property="posSta" /> <result column="RESPONSE" property="response" /> <result column="UPDATE_TIME" property="updateTime" /> <result column="UPDATE_BY" property="updateBy" /> <result column="MEMO" property="memo" /> </resultMap> </mapper> src/main/resources/mapper/WrkMastStaMapper.xml
New file @@ -0,0 +1,126 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.zy.asrs.mapper.WrkMastStaMapper"> <!-- 通用查询映射结果 --> <resultMap id="BaseResultMap" type="com.zy.asrs.entity.WrkMastSta"> <id column="ID" property="id" /> <result column="WRK_NO" property="wrkNo" /> <result column="WRK_START" property="wrkStart" /> <result column="WRK_END" property="wrkEnd" /> <result column="STA_START" property="staStart" /> <result column="STA_END" property="staEnd" /> <result column="CREATE_TIME" property="createTime" /> <result column="UPDATE_TIME" property="updateTime" /> <result column="TYPE" property="type" /> <result column="WRK_STS" property="wrkSts" /> <result column="LINE_NUMBER" property="lineNumber" /> <result column="WRK_TYPE" property="wrkType" /> <result column="BIGN_TIME" property="bignTime" /> </resultMap> <select id="selectAllWrkMastStaList" resultMap="BaseResultMap"> select * from asr_wrk_mast_sta where 1=1 and wrk_sts=0 <if test="type!=null"> and type = #{type} </if> order by line_number,id </select> <select id="selectByWrkNo" resultMap="BaseResultMap"> select top 1 * from asr_wrk_mast_sta where 1=1 and wrk_no = #{workNo} </select> <select id="selectNoInterfere" resultMap="BaseResultMap"> select top 1 * from asr_wrk_mast_sta where 1=1 and (sta_start in <foreach item="item" collection="staStarts" index="index" separator="," open="(" close=")"> #{item} </foreach> or sta_start = 0 ) and (sta_end in <foreach item="item" collection="staEnds" index="index" separator="," open="(" close=")"> #{item} </foreach> or sta_end = 0 ) and wrk_sts=0 order by line_number,id </select> <select id="selectNoInterfereList" resultMap="BaseResultMap"> select * from asr_wrk_mast_sta where 1=1 and (sta_start in <foreach item="item" collection="staStarts" index="index" separator="," open="(" close=")"> #{item} </foreach> or sta_start = 0 ) and (sta_end in <foreach item="item" collection="staEnds" index="index" separator="," open="(" close=")"> #{item} </foreach> or sta_end = 0 ) and wrk_sts=0 order by line_number,id </select> <select id="selectAllWrkCount" resultType="Integer"> select count(1) from asr_wrk_mast_sta where 1=1 <if test="type!=null"> and type = #{type} </if> </select> <select id="selectAllWrkCount108" resultType="Integer"> select count(1) from asr_wrk_mast_sta where 1=1 and type = 1 and (sta_end = 108 or sta_start = 108) </select> <select id="selectAllWrkCount108Y" resultType="Integer"> select count(1) from asr_wrk_mast_sta where 1=1 -- and type = 1 and ((sta_end <= 108 or sta_start <= 108) or (sta_end = 118 or sta_start = 118) or (sta_end = 122 or sta_start = 122)) </select> <select id="selectAllWrkStsCount" resultType="Integer"> select count(1) from asr_wrk_mast_sta where 1=1 <if test="type!=null"> and type = #{type} </if> <if test="wrkSts!=null"> and wrk_sts = #{wrkSts} </if> </select> <select id="selectAllWrkStsCountWrkMastSta" resultMap="BaseResultMap"> select top 1 * from asr_wrk_mast_sta where 1=1 <if test="type!=null"> and type = #{type} </if> <if test="wrkSts!=null"> and wrk_sts = #{wrkSts} </if> </select> </mapper>