New file |
| | |
| | | package com.zy.asrs.entity; |
| | | |
| | | import com.core.common.Cools;import com.baomidou.mybatisplus.annotations.TableId; |
| | | import com.baomidou.mybatisplus.enums.IdType; |
| | | import com.baomidou.mybatisplus.annotations.TableField; |
| | | import java.text.SimpleDateFormat; |
| | | import java.util.Date; |
| | | import org.springframework.format.annotation.DateTimeFormat; |
| | | import java.text.SimpleDateFormat; |
| | | import java.util.Date; |
| | | |
| | | import io.swagger.annotations.ApiModelProperty; |
| | | import lombok.Data; |
| | | import com.baomidou.mybatisplus.annotations.TableName; |
| | | import java.io.Serializable; |
| | | |
| | | @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= "模式") |
| | | private Integer mode; |
| | | |
| | | /** |
| | | * 状态 |
| | | */ |
| | | @ApiModelProperty(value= "状态") |
| | | private Integer status; |
| | | |
| | | /** |
| | | * 工位1工作号 |
| | | */ |
| | | @ApiModelProperty(value= "工位1工作号") |
| | | @TableField("task_no1") |
| | | private Integer taskNo1; |
| | | |
| | | /** |
| | | * 工位1有物信号 |
| | | */ |
| | | @ApiModelProperty(value= "工位1有物信号") |
| | | private Integer loaded1; |
| | | |
| | | /** |
| | | * RGV当前位置 |
| | | */ |
| | | @ApiModelProperty(value= "RGV当前位置") |
| | | @TableField("rgv_pos") |
| | | private Integer rgvPos; |
| | | |
| | | /** |
| | | * 走行在定位 |
| | | */ |
| | | @ApiModelProperty(value= "走行在定位") |
| | | @TableField("walk_pos") |
| | | private Integer walkPos; |
| | | |
| | | /** |
| | | * 工位2工作号 |
| | | */ |
| | | @ApiModelProperty(value= "工位2工作号") |
| | | @TableField("task_no2") |
| | | private Integer taskNo2; |
| | | |
| | | /** |
| | | * 工位2有物信号 |
| | | */ |
| | | @ApiModelProperty(value= "工位2有物信号") |
| | | private Integer loaded2; |
| | | |
| | | /** |
| | | * 工位1任务完成信号 |
| | | */ |
| | | @ApiModelProperty(value= "工位1任务完成信号") |
| | | @TableField("task_finish1") |
| | | private Integer taskFinish1; |
| | | |
| | | /** |
| | | * 工位2任务完成信号 |
| | | */ |
| | | @ApiModelProperty(value= "工位2任务完成信号") |
| | | @TableField("task_finish2") |
| | | private Integer taskFinish2; |
| | | |
| | | /** |
| | | * 异常码 |
| | | */ |
| | | @ApiModelProperty(value= "异常码") |
| | | private Integer alarm; |
| | | |
| | | /** |
| | | * 心跳 |
| | | */ |
| | | @ApiModelProperty(value= "心跳") |
| | | private Integer heart; |
| | | |
| | | /** |
| | | * 备用1 |
| | | */ |
| | | @ApiModelProperty(value= "备用1") |
| | | private Integer temp1; |
| | | |
| | | /** |
| | | * 备用2 |
| | | */ |
| | | @ApiModelProperty(value= "备用2") |
| | | private Integer temp2; |
| | | |
| | | /** |
| | | * 备用3 |
| | | */ |
| | | @ApiModelProperty(value= "备用3") |
| | | private Integer temp3; |
| | | |
| | | /** |
| | | * 备用4 |
| | | */ |
| | | @ApiModelProperty(value= "备用4") |
| | | private Integer temp4; |
| | | |
| | | /** |
| | | * 备用5 |
| | | */ |
| | | @ApiModelProperty(value= "备用5") |
| | | private Integer temp5; |
| | | |
| | | /** |
| | | * 创建时间 |
| | | */ |
| | | @ApiModelProperty(value= "创建时间") |
| | | @TableField("create_time") |
| | | @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") |
| | | private Date createTime; |
| | | |
| | | /** |
| | | * 创建人员 |
| | | */ |
| | | @ApiModelProperty(value= "创建人员") |
| | | @TableField("create_by") |
| | | private Long createBy; |
| | | |
| | | /** |
| | | * 更新时间 |
| | | */ |
| | | @ApiModelProperty(value= "更新时间") |
| | | @TableField("update_time") |
| | | @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") |
| | | private Date updateTime; |
| | | |
| | | /** |
| | | * 更新人员 |
| | | */ |
| | | @ApiModelProperty(value= "更新人员") |
| | | @TableField("update_by") |
| | | private Long updateBy; |
| | | |
| | | public BasRgv() {} |
| | | |
| | | public BasRgv(Integer rgvNo,Integer mode,Integer status,Integer taskNo1,Integer loaded1,Integer rgvPos,Integer walkPos,Integer taskNo2,Integer loaded2,Integer taskFinish1,Integer taskFinish2,Integer alarm,Integer heart,Integer temp1,Integer temp2,Integer temp3,Integer temp4,Integer temp5,Date createTime,Long createBy,Date updateTime,Long updateBy) { |
| | | this.rgvNo = rgvNo; |
| | | this.mode = mode; |
| | | this.status = status; |
| | | this.taskNo1 = taskNo1; |
| | | this.loaded1 = loaded1; |
| | | this.rgvPos = rgvPos; |
| | | this.walkPos = walkPos; |
| | | this.taskNo2 = taskNo2; |
| | | this.loaded2 = loaded2; |
| | | this.taskFinish1 = taskFinish1; |
| | | this.taskFinish2 = taskFinish2; |
| | | this.alarm = alarm; |
| | | this.heart = heart; |
| | | this.temp1 = temp1; |
| | | this.temp2 = temp2; |
| | | this.temp3 = temp3; |
| | | this.temp4 = temp4; |
| | | this.temp5 = temp5; |
| | | this.createTime = createTime; |
| | | this.createBy = createBy; |
| | | this.updateTime = updateTime; |
| | | this.updateBy = updateBy; |
| | | } |
| | | |
| | | // BasRgv basRgv = new BasRgv( |
| | | // null, // RGV编号[非空] |
| | | // null, // 模式 |
| | | // null, // 状态 |
| | | // null, // 工位1工作号 |
| | | // null, // 工位1有物信号 |
| | | // null, // RGV当前位置 |
| | | // null, // 走行在定位 |
| | | // null, // 工位2工作号 |
| | | // null, // 工位2有物信号 |
| | | // null, // 工位1任务完成信号 |
| | | // null, // 工位2任务完成信号 |
| | | // null, // 异常码 |
| | | // null, // 心跳 |
| | | // null, // 备用1 |
| | | // null, // 备用2 |
| | | // null, // 备用3 |
| | | // null, // 备用4 |
| | | // null, // 备用5 |
| | | // null, // 创建时间 |
| | | // 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); |
| | | } |
| | | |
| | | |
| | | } |
New file |
| | |
| | | package com.zy.asrs.entity; |
| | | |
| | | import com.core.common.Cools;import com.baomidou.mybatisplus.annotations.TableId; |
| | | import com.baomidou.mybatisplus.enums.IdType; |
| | | import com.baomidou.mybatisplus.annotations.TableField; |
| | | import java.text.SimpleDateFormat; |
| | | import java.util.Date; |
| | | import org.springframework.format.annotation.DateTimeFormat; |
| | | import java.text.SimpleDateFormat; |
| | | import java.util.Date; |
| | | |
| | | import io.swagger.annotations.ApiModelProperty; |
| | | import lombok.Data; |
| | | import com.baomidou.mybatisplus.annotations.TableName; |
| | | import java.io.Serializable; |
| | | |
| | | @Data |
| | | @TableName("asr_bas_rgv_opt") |
| | | public class BasRgvOpt implements Serializable { |
| | | |
| | | private static final long serialVersionUID = 1L; |
| | | |
| | | @ApiModelProperty(value= "") |
| | | @TableId(value = "id", type = IdType.INPUT) |
| | | private Long id; |
| | | |
| | | /** |
| | | * RGV编号 |
| | | */ |
| | | @ApiModelProperty(value= "RGV编号") |
| | | @TableField("rgv_no") |
| | | private Integer rgvNo; |
| | | |
| | | /** |
| | | * 任务完成确认位 |
| | | */ |
| | | @ApiModelProperty(value= "任务完成确认位") |
| | | @TableField("ack_finish") |
| | | private Integer ackFinish; |
| | | |
| | | /** |
| | | * 工位1工作号 |
| | | */ |
| | | @ApiModelProperty(value= "工位1工作号") |
| | | @TableField("task_no1") |
| | | private Integer taskNo1; |
| | | |
| | | /** |
| | | * 工位1模式 |
| | | */ |
| | | @ApiModelProperty(value= "工位1模式") |
| | | @TableField("task_mode1") |
| | | private Integer taskMode1; |
| | | |
| | | /** |
| | | * 工位1源站 |
| | | */ |
| | | @ApiModelProperty(value= "工位1源站") |
| | | @TableField("source_sta_no1") |
| | | private Integer sourceStaNo1; |
| | | |
| | | /** |
| | | * 工位1目标站 |
| | | */ |
| | | @ApiModelProperty(value= "工位1目标站") |
| | | @TableField("destination_sta_no_1") |
| | | private Integer destinationStaNo1; |
| | | |
| | | /** |
| | | * 工位2工作号 |
| | | */ |
| | | @ApiModelProperty(value= "工位2工作号") |
| | | @TableField("task_no2") |
| | | private Integer taskNo2; |
| | | |
| | | /** |
| | | * 工位2模式 |
| | | */ |
| | | @ApiModelProperty(value= "工位2模式") |
| | | @TableField("task_mode2") |
| | | private Integer taskMode2; |
| | | |
| | | /** |
| | | * 工位2源站 |
| | | */ |
| | | @ApiModelProperty(value= "工位2源站") |
| | | @TableField("source_sta_no2") |
| | | private Integer sourceStaNo2; |
| | | |
| | | /** |
| | | * 工位2目标站 |
| | | */ |
| | | @ApiModelProperty(value= "工位2目标站") |
| | | @TableField("destination_sta_no2") |
| | | private Integer destinationStaNo2; |
| | | |
| | | /** |
| | | * 任务确认 |
| | | */ |
| | | @ApiModelProperty(value= "任务确认") |
| | | private Integer command; |
| | | |
| | | /** |
| | | * 创建时间 |
| | | */ |
| | | @ApiModelProperty(value= "创建时间") |
| | | @TableField("create_time") |
| | | @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") |
| | | private Date createTime; |
| | | |
| | | /** |
| | | * 创建人员 |
| | | */ |
| | | @ApiModelProperty(value= "创建人员") |
| | | @TableField("create_by") |
| | | private Long createBy; |
| | | |
| | | /** |
| | | * 更新时间 |
| | | */ |
| | | @ApiModelProperty(value= "更新时间") |
| | | @TableField("update_time") |
| | | @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") |
| | | private Date updateTime; |
| | | |
| | | /** |
| | | * 更新人员 |
| | | */ |
| | | @ApiModelProperty(value= "更新人员") |
| | | @TableField("update_by") |
| | | private Long updateBy; |
| | | |
| | | /** |
| | | * 响应结果 1: 正常 0: 失败 |
| | | */ |
| | | @ApiModelProperty(value= "响应结果 1: 正常 0: 失败 ") |
| | | private Integer response; |
| | | |
| | | public BasRgvOpt() {} |
| | | |
| | | public BasRgvOpt(Integer rgvNo,Integer ackFinish,Integer taskNo1,Integer taskMode1,Integer sourceStaNo1,Integer destinationStaNo1,Integer taskNo2,Integer taskMode2,Integer sourceStaNo2,Integer destinationStaNo2,Integer command,Date createTime,Long createBy,Date updateTime,Long updateBy,Integer response) { |
| | | this.rgvNo = rgvNo; |
| | | this.ackFinish = ackFinish; |
| | | this.taskNo1 = taskNo1; |
| | | this.taskMode1 = taskMode1; |
| | | this.sourceStaNo1 = sourceStaNo1; |
| | | this.destinationStaNo1 = destinationStaNo1; |
| | | this.taskNo2 = taskNo2; |
| | | this.taskMode2 = taskMode2; |
| | | this.sourceStaNo2 = sourceStaNo2; |
| | | this.destinationStaNo2 = destinationStaNo2; |
| | | this.command = command; |
| | | this.createTime = createTime; |
| | | this.createBy = createBy; |
| | | this.updateTime = updateTime; |
| | | this.updateBy = updateBy; |
| | | this.response = response; |
| | | } |
| | | |
| | | // BasRgvOpt basRgvOpt = new BasRgvOpt( |
| | | // null, // [非空] |
| | | // null, // RGV编号 |
| | | // null, // 任务完成确认位 |
| | | // null, // 工位1工作号 |
| | | // null, // 工位1模式 |
| | | // null, // 工位1源站 |
| | | // null, // 工位1目标站 |
| | | // null, // 工位2工作号 |
| | | // null, // 工位2模式 |
| | | // null, // 工位2源站 |
| | | // null, // 工位2目标站 |
| | | // null, // 任务确认 |
| | | // null, // 创建时间 |
| | | // null, // 创建人员 |
| | | // 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 getResponse$(){ |
| | | if (null == this.response){ return null; } |
| | | switch (this.response){ |
| | | case 1: |
| | | return "正常"; |
| | | case 0: |
| | | return "失败"; |
| | | default: |
| | | return String.valueOf(this.response); |
| | | } |
| | | } |
| | | |
| | | |
| | | } |
New file |
| | |
| | | package com.zy.asrs.mapper; |
| | | |
| | | import com.zy.asrs.entity.BasRgv; |
| | | import com.baomidou.mybatisplus.mapper.BaseMapper; |
| | | import org.apache.ibatis.annotations.Mapper; |
| | | import org.springframework.stereotype.Repository; |
| | | |
| | | @Mapper |
| | | @Repository |
| | | public interface BasRgvMapper extends BaseMapper<BasRgv> { |
| | | |
| | | } |
New file |
| | |
| | | package com.zy.asrs.mapper; |
| | | |
| | | import com.zy.asrs.entity.BasRgvOpt; |
| | | import com.baomidou.mybatisplus.mapper.BaseMapper; |
| | | import org.apache.ibatis.annotations.Mapper; |
| | | import org.springframework.stereotype.Repository; |
| | | |
| | | @Mapper |
| | | @Repository |
| | | public interface BasRgvOptMapper extends BaseMapper<BasRgvOpt> { |
| | | |
| | | } |
| | |
| | | List<WrkMast> selectLaneWrkMastIn();//查询入库任务 |
| | | |
| | | List<WrkMast> selectLaneWrkMastOut();//查询出库任务 |
| | | |
| | | WrkMast selectByWrkNo(Integer wrkNo); |
| | | |
| | | } |
New file |
| | |
| | | package com.zy.asrs.service; |
| | | |
| | | import com.zy.asrs.entity.BasRgvOpt; |
| | | import com.baomidou.mybatisplus.service.IService; |
| | | |
| | | public interface BasRgvOptService extends IService<BasRgvOpt> { |
| | | |
| | | } |
New file |
| | |
| | | package com.zy.asrs.service; |
| | | |
| | | import com.zy.asrs.entity.BasRgv; |
| | | import com.baomidou.mybatisplus.service.IService; |
| | | |
| | | public interface BasRgvService extends IService<BasRgv> { |
| | | |
| | | } |
New file |
| | |
| | | package com.zy.asrs.service.impl; |
| | | |
| | | import com.zy.asrs.mapper.BasRgvOptMapper; |
| | | import com.zy.asrs.entity.BasRgvOpt; |
| | | import com.zy.asrs.service.BasRgvOptService; |
| | | import com.baomidou.mybatisplus.service.impl.ServiceImpl; |
| | | import org.springframework.stereotype.Service; |
| | | |
| | | @Service("basRgvOptService") |
| | | public class BasRgvOptServiceImpl extends ServiceImpl<BasRgvOptMapper, BasRgvOpt> implements BasRgvOptService { |
| | | |
| | | } |
New file |
| | |
| | | package com.zy.asrs.service.impl; |
| | | |
| | | import com.zy.asrs.mapper.BasRgvMapper; |
| | | import com.zy.asrs.entity.BasRgv; |
| | | import com.zy.asrs.service.BasRgvService; |
| | | import com.baomidou.mybatisplus.service.impl.ServiceImpl; |
| | | import org.springframework.stereotype.Service; |
| | | |
| | | @Service("basRgvService") |
| | | public class BasRgvServiceImpl extends ServiceImpl<BasRgvMapper, BasRgv> implements BasRgvService { |
| | | |
| | | } |
| | |
| | | import com.zy.core.cache.MessageQueue; |
| | | import com.zy.core.cache.SlaveConnection; |
| | | import com.zy.core.enums.*; |
| | | import com.zy.core.model.CrnSlave; |
| | | import com.zy.core.model.DevpSlave; |
| | | import com.zy.core.model.LedSlave; |
| | | import com.zy.core.model.Task; |
| | | import com.zy.core.model.*; |
| | | import com.zy.core.model.command.CrnCommand; |
| | | import com.zy.core.model.command.LedCommand; |
| | | import com.zy.core.model.command.RgvCommand; |
| | | import com.zy.core.model.protocol.CrnProtocol; |
| | | import com.zy.core.model.protocol.RgvProtocol; |
| | | import com.zy.core.model.protocol.StaProtocol; |
| | | import com.zy.core.properties.SlaveProperties; |
| | | import com.zy.core.thread.BarcodeThread; |
| | | import com.zy.core.thread.LedThread; |
| | | import com.zy.core.thread.SiemensDevpThread; |
| | | import com.zy.core.thread.ZyRgvThread; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.beans.factory.annotation.Value; |
| | |
| | | continue; |
| | | } |
| | | |
| | | // 更新工作档状态为14失败 |
| | | wrkMast.setWrkSts(14L); |
| | | if (crnStn.getStaNo() == 1016 || crnStn.getStaNo() == 1019) { |
| | | // 更新工作档状态为13.RGV搬运中 |
| | | wrkMast.setWrkSts(13L); |
| | | }else { |
| | | // 更新工作档状态为14 |
| | | wrkMast.setWrkSts(14L); |
| | | } |
| | | wrkMast.setCrnEndTime(new Date()); |
| | | if (wrkMastMapper.updateById(wrkMast) != 0) { |
| | | // 复位堆垛机 |
| | |
| | | |
| | | } |
| | | |
| | | public synchronized void outOfDevp() { |
| | | List<WrkMast> wrkMasts = wrkMastMapper.selectPick(); |
| | | for (WrkMast wrkMast : wrkMasts) { |
| | | if (basDevpService.selectCount(new EntityWrapper<BasDevp>().eq("wrk_no", wrkMast.getWrkNo())) == 0) { |
| | | wrkMast.setCtnNo("Y"); |
| | | if (wrkMastMapper.updateById(wrkMast) == 0) { |
| | | log.error("修改{}工作档失败,ctn_no", wrkMast.getWrkNo()); |
| | | //RGV搬运 |
| | | public synchronized void rgvIoExecute() { |
| | | for (RgvSlave slave : slaveProperties.getRgv()) { |
| | | ZyRgvThread rgvThread = (ZyRgvThread) SlaveConnection.get(SlaveType.Rgv, slave.getId()); |
| | | if (rgvThread == null) { |
| | | return; |
| | | } |
| | | |
| | | RgvProtocol rgvProtocol = rgvThread.getRgvProtocol(); |
| | | if (rgvProtocol == null) { |
| | | return; |
| | | } |
| | | |
| | | // 判断RGV是否空闲 |
| | | if (rgvProtocol.getModeType() == RgvModeType.COMPUTER |
| | | && rgvProtocol.getStatusType() == RgvStatusType.IDLE) { |
| | | // 如果最近一次是入库模式,则优先扫描出库站点 |
| | | if (rgvProtocol.getLastIo().equals("I")) { |
| | | this.rgvOutExecute(rgvThread, rgvProtocol);//出库 |
| | | rgvProtocol.setLastIo("O"); |
| | | }else { |
| | | this.rgvInExecute(rgvThread, rgvProtocol);//入库 |
| | | rgvProtocol.setLastIo("I"); |
| | | } |
| | | |
| | | //检查是否存在工位1任务超时没下发 |
| | | if (rgvProtocol.getTaskNo1() > 0 && rgvProtocol.getTaskNo2() == 0) { |
| | | if (System.currentTimeMillis() - rgvProtocol.getTask1SendTime() > (1000*60)) { |
| | | //工位1下发时间超过60s |
| | | RgvCommand rgvCommand = new RgvCommand(); |
| | | rgvCommand.setRgvNo(rgvProtocol.getRgvNo());//RGV编号 |
| | | rgvCommand.setCommand((short) 1);//工位1确认 |
| | | if (!MessageQueue.offer(SlaveType.Rgv, rgvCommand.getRgvNo(), new Task(4, rgvCommand))) { |
| | | log.error("RGV确认命令下发失败,RGV号={},任务数据={}", rgvProtocol.getRgvNo(), JSON.toJSON(rgvCommand)); |
| | | return; |
| | | } |
| | | log.error("RGV确认命令下发成功,RGV号={},任务数据={}", rgvProtocol.getRgvNo(), JSON.toJSON(rgvCommand)); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | //rgv入库 |
| | | public synchronized void rgvInExecute(ZyRgvThread rgvThread, RgvProtocol rgvProtocol) { |
| | | for (RgvSlave.Sta sta : rgvThread.getSlave().getInStn()) { |
| | | if (rgvProtocol.getTaskNo1() > 0) { |
| | | //检测rgv工位1是否为入库任务 |
| | | WrkMast wrkMast1 = wrkMastMapper.selectByWrkNo(rgvProtocol.getTaskNo1().intValue()); |
| | | if (wrkMast1.getWrkSts() > 100) { |
| | | continue;//出库任务跳过 |
| | | } |
| | | } |
| | | |
| | | SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, sta.getDevpPlcId()); |
| | | StaProtocol staProtocol = devpThread.getStation().get(sta.getSourceStaNo()); |
| | | //判断输送线是否自动、有物、可入、有工作号 |
| | | if (!(staProtocol.isAutoing() && staProtocol.isLoading() && staProtocol.isOutEnable() && (staProtocol.getWorkNo() > 0))) { |
| | | continue; |
| | | } |
| | | |
| | | //搜索工作档 |
| | | WrkMast wrkMast = wrkMastMapper.selectByWrkNo(staProtocol.getWorkNo().intValue()); |
| | | if (wrkMast == null) { |
| | | continue;//工作档不存在 |
| | | } |
| | | |
| | | //获取RGV放货站点 |
| | | Integer staNo = Utils.getRgvStaNo(rgvProtocol.getRgvNo(), sta.getSourceStaNo(), staProtocol.getStaNo().intValue(), true); |
| | | if (staNo == null) { |
| | | continue;//RGV放货站点不存在 |
| | | } |
| | | |
| | | //判断目标站是否自动、可入、无物、无工作号 |
| | | StaProtocol staProtocol1 = devpThread.getStation().get(staNo); |
| | | if (!(staProtocol1.isAutoing() && staProtocol1.isInEnable() && !staProtocol1.isLoading() && (staProtocol1.getWorkNo() == 0))) { |
| | | continue; |
| | | } |
| | | |
| | | // 命令下发区 -------------------------------------------------------------------------- |
| | | RgvCommand rgvCommand = new RgvCommand(); |
| | | rgvCommand.setRgvNo(rgvProtocol.getRgvNo());//RGV编号 |
| | | rgvCommand.setAckFinish((short) 0); |
| | | |
| | | //判断rgv工位1是否可用 |
| | | if (rgvProtocol.getTaskNo1() == 0) { |
| | | rgvCommand.setTaskNo1(wrkMast.getWrkNo().shortValue());//工作号 |
| | | rgvCommand.setTaskMode1(RgvTaskModeType.PICK_RELEASE);//工作模式 取放货 |
| | | rgvCommand.setSourceStaNo1(staProtocol.getStaNo());//源站 |
| | | rgvCommand.setDestinationStaNo1(staNo.shortValue());//目标站 |
| | | rgvCommand.setCommand((short) 0);//工位1暂不确认 |
| | | } else if (rgvProtocol.getTaskNo2() == 0) {//判断rgv工位2是否可用 |
| | | rgvCommand.setTaskNo2(wrkMast.getWrkNo().shortValue());//工作号 |
| | | rgvCommand.setTaskMode2(RgvTaskModeType.PICK_RELEASE);//工作模式 取放货 |
| | | rgvCommand.setSourceStaNo2(staProtocol.getStaNo());//源站 |
| | | rgvCommand.setDestinationStaNo2(staNo.shortValue());//目标站 |
| | | rgvCommand.setCommand((short) 1);//工位2确认 |
| | | }else { |
| | | continue;//没有可用RGV工位 |
| | | } |
| | | |
| | | if (!MessageQueue.offer(SlaveType.Rgv, rgvCommand.getRgvNo(), new Task(2, rgvCommand))) { |
| | | log.error("RGV命令下发失败,RGV号={},任务数据={}", rgvProtocol.getRgvNo(), JSON.toJSON(rgvCommand)); |
| | | continue; |
| | | } |
| | | |
| | | log.error("RGV命令下发成功,RGV号={},任务数据={}", rgvProtocol.getRgvNo(), JSON.toJSON(rgvCommand)); |
| | | } |
| | | } |
| | | |
| | | //rgv出库 |
| | | public synchronized void rgvOutExecute(ZyRgvThread rgvThread, RgvProtocol rgvProtocol) { |
| | | for (RgvSlave.Sta sta : rgvThread.getSlave().getOutStn()) { |
| | | if (rgvProtocol.getTaskNo1() > 0) { |
| | | //检测rgv工位1是否为出库任务 |
| | | WrkMast wrkMast1 = wrkMastMapper.selectByWrkNo(rgvProtocol.getTaskNo1().intValue()); |
| | | if (wrkMast1.getWrkSts() < 100) { |
| | | continue;//入库任务跳过 |
| | | } |
| | | } |
| | | |
| | | SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, sta.getDevpPlcId()); |
| | | StaProtocol staProtocol = devpThread.getStation().get(sta.getSourceStaNo()); |
| | | //判断输送线是否自动、有物、可出、有工作号 |
| | | if (!(staProtocol.isAutoing() && staProtocol.isLoading() && staProtocol.isOutEnable() && (staProtocol.getWorkNo() > 0))) { |
| | | continue; |
| | | } |
| | | |
| | | //搜索工作档 |
| | | WrkMast wrkMast = wrkMastMapper.selectByWrkNo(staProtocol.getWorkNo().intValue()); |
| | | if (wrkMast == null) { |
| | | continue;//工作档不存在 |
| | | } |
| | | |
| | | //获取RGV放货站点 |
| | | Integer staNo = Utils.getRgvStaNo(rgvProtocol.getRgvNo(), sta.getSourceStaNo(), staProtocol.getStaNo().intValue(), false); |
| | | if (staNo == null) { |
| | | continue;//RGV放货站点不存在 |
| | | } |
| | | |
| | | //判断目标站是否自动、可出、无物、无工作号 |
| | | StaProtocol staProtocol1 = devpThread.getStation().get(staNo); |
| | | if (!(staProtocol1.isAutoing() && staProtocol1.isOutEnable() && !staProtocol1.isLoading() && (staProtocol1.getWorkNo() == 0))) { |
| | | continue; |
| | | } |
| | | |
| | | // 命令下发区 -------------------------------------------------------------------------- |
| | | RgvCommand rgvCommand = new RgvCommand(); |
| | | rgvCommand.setRgvNo(rgvProtocol.getRgvNo());//RGV编号 |
| | | rgvCommand.setAckFinish((short) 0); |
| | | |
| | | //判断rgv工位1是否可用 |
| | | if (rgvProtocol.getTaskNo1() == 0) { |
| | | rgvCommand.setTaskNo1(wrkMast.getWrkNo().shortValue());//工作号 |
| | | rgvCommand.setTaskMode1(RgvTaskModeType.PICK_RELEASE);//工作模式 取放货 |
| | | rgvCommand.setSourceStaNo1(staProtocol.getStaNo());//源站 |
| | | rgvCommand.setDestinationStaNo1(staNo.shortValue());//目标站 |
| | | rgvCommand.setCommand((short) 0);//工位1暂不确认 |
| | | } else if (rgvProtocol.getTaskNo2() == 0) {//判断rgv工位2是否可用 |
| | | rgvCommand.setTaskNo2(wrkMast.getWrkNo().shortValue());//工作号 |
| | | rgvCommand.setTaskMode2(RgvTaskModeType.PICK_RELEASE);//工作模式 取放货 |
| | | rgvCommand.setSourceStaNo2(staProtocol.getStaNo());//源站 |
| | | rgvCommand.setDestinationStaNo2(staNo.shortValue());//目标站 |
| | | rgvCommand.setCommand((short) 1);//工位2确认 |
| | | }else { |
| | | continue;//没有可用RGV工位 |
| | | } |
| | | |
| | | if (!MessageQueue.offer(SlaveType.Rgv, rgvCommand.getRgvNo(), new Task(2, rgvCommand))) { |
| | | log.error("RGV命令下发失败,RGV号={},任务数据={}", rgvProtocol.getRgvNo(), JSON.toJSON(rgvCommand)); |
| | | continue; |
| | | } |
| | | |
| | | log.error("RGV命令下发成功,RGV号={},任务数据={}", rgvProtocol.getRgvNo(), JSON.toJSON(rgvCommand)); |
| | | } |
| | | } |
| | | |
| | | //RGV工作完成 |
| | | public synchronized void rgvFinished() { |
| | | SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, 1); |
| | | for (RgvSlave slave : slaveProperties.getRgv()) { |
| | | ZyRgvThread rgvThread = (ZyRgvThread) SlaveConnection.get(SlaveType.Rgv, slave.getId()); |
| | | if (rgvThread == null) { |
| | | return; |
| | | } |
| | | |
| | | RgvProtocol rgvProtocol = rgvThread.getRgvProtocol(); |
| | | if (rgvProtocol == null) { |
| | | return; |
| | | } |
| | | |
| | | // 状态:等待确认 |
| | | if (rgvProtocol.getStatusType() == RgvStatusType.WAITING) { |
| | | if (rgvProtocol.getTaskNo1() == 9999) { |
| | | // RGV复位 |
| | | rgvThread.setResetFlag1(true); |
| | | }else { |
| | | // 获取待确认工作档 |
| | | WrkMast wrkMast = wrkMastMapper.selectPakInStep3(rgvProtocol.getTaskNo1().intValue()); |
| | | if (wrkMast == null) { |
| | | log.error("RGV处于等待确认且任务完成状态,但未找到工作档。RGV号={},工作号={}", rgvProtocol.getRgvNo(), rgvProtocol.getTaskNo1()); |
| | | continue; |
| | | } |
| | | |
| | | if (rgvProtocol.getTaskNo1() > 0 && rgvProtocol.getTaskFinish1() == 1) { |
| | | //工位1任务完成 |
| | | // RGV复位 |
| | | rgvThread.setResetFlag1(true); |
| | | |
| | | //给目标站输送线写入数据 |
| | | Short destinationPos1 = rgvProtocol.getDestinationPos1();//获取工位1目标站 |
| | | StaProtocol staProtocol = devpThread.getStation().get(destinationPos1.intValue()).clone(); |
| | | staProtocol.setWorkNo(wrkMast.getWrkNo().shortValue());//写入工作号 |
| | | staProtocol.setStaNo(wrkMast.getStaNo().shortValue());//写入目标站 |
| | | if (!MessageQueue.offer(SlaveType.Devp, 1, new Task(2, staProtocol))) { |
| | | log.info("{}任务,RGV搬运成功,写入输送数据失败{}", wrkMast.getWrkNo(), JSON.toJSONString(staProtocol)); |
| | | } |
| | | |
| | | //2号RGV和3号RGV工作完成后需要更新工作档状态 |
| | | if (rgvProtocol.getRgvNo() == 2 || rgvProtocol.getRgvNo() == 3) { |
| | | if (wrkMast.getWrkSts() == 13) {//13.RGV搬运中 => 14.已出库 |
| | | wrkMast.setWrkSts(14L); |
| | | wrkMast.setModiTime(new Date()); |
| | | wrkMastMapper.updateById(wrkMast); |
| | | } |
| | | } |
| | | } |
| | | |
| | | if (rgvProtocol.getTaskNo2() > 0 && rgvProtocol.getTaskFinish2() == 1) { |
| | | //工位2任务完成 |
| | | // RGV复位 |
| | | rgvThread.setResetFlag2(true); |
| | | |
| | | //给目标站输送线写入数据 |
| | | Short destinationPos2 = rgvProtocol.getDestinationPos2();//获取工位2目标站 |
| | | StaProtocol staProtocol = devpThread.getStation().get(destinationPos2.intValue()).clone(); |
| | | staProtocol.setWorkNo(wrkMast.getWrkNo().shortValue());//写入工作号 |
| | | staProtocol.setStaNo(wrkMast.getStaNo().shortValue());//写入目标站 |
| | | if (!MessageQueue.offer(SlaveType.Devp, 1, new Task(2, staProtocol))) { |
| | | log.info("{}任务,RGV搬运成功,写入输送数据失败{}", wrkMast.getWrkNo(), JSON.toJSONString(staProtocol)); |
| | | } |
| | | |
| | | //2号RGV和3号RGV工作完成后需要更新工作档状态 |
| | | if (rgvProtocol.getRgvNo() == 2 || rgvProtocol.getRgvNo() == 3) { |
| | | if (wrkMast.getWrkSts() == 13) {//13.RGV搬运中 => 14.已出库 |
| | | wrkMast.setWrkSts(14L); |
| | | wrkMast.setModiTime(new Date()); |
| | | wrkMastMapper.updateById(wrkMast); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | |
| | | |
| | | import java.text.DecimalFormat; |
| | | import java.util.ArrayList; |
| | | import java.util.HashMap; |
| | | import java.util.List; |
| | | |
| | | /** |
| | |
| | | return 0; |
| | | } |
| | | |
| | | //获取RGV放货站点 |
| | | public static Integer getRgvStaNo(Integer rgvNo, Integer sourceStaNo, Integer staNo, Boolean pakIn) { |
| | | if (pakIn) { |
| | | return getRgvStaNoPakIn(rgvNo, sourceStaNo, staNo); |
| | | } else { |
| | | return getRgvStaNoPakOut(rgvNo, sourceStaNo, staNo); |
| | | } |
| | | } |
| | | |
| | | private static Integer getRgvStaNoPakIn(Integer rgvNo, Integer sourceStaNo, Integer staNo) { |
| | | //获取RGV放货站点 |
| | | Integer rgvStaNo = null; |
| | | if (rgvNo == 1) { |
| | | switch (staNo) { |
| | | case 1022: |
| | | rgvStaNo = 1020; |
| | | break; |
| | | case 1025: |
| | | rgvStaNo = 1023; |
| | | break; |
| | | } |
| | | } else if (rgvNo == 2) { |
| | | rgvStaNo = 2402; |
| | | } else if (rgvNo == 3) { |
| | | if (sourceStaNo == 2102) { |
| | | rgvStaNo = 2103; |
| | | } else if (sourceStaNo == 4007 || sourceStaNo == 4016) { |
| | | rgvStaNo = 2301; |
| | | } |
| | | } |
| | | |
| | | return rgvStaNo; |
| | | } |
| | | |
| | | private static Integer getRgvStaNoPakOut(Integer rgvNo, Integer sourceStaNo, Integer staNo) { |
| | | //获取RGV放货站点 |
| | | Integer rgvStaNo = null; |
| | | if (rgvNo == 1) { |
| | | if (staNo == 3007 || staNo == 3012) { |
| | | rgvStaNo = 2401; |
| | | }else { |
| | | rgvStaNo = 2013; |
| | | } |
| | | } else if (rgvNo == 2) { |
| | | rgvStaNo = 3001; |
| | | } else if (rgvNo == 3) { |
| | | if (sourceStaNo == 2003 && staNo == 2001) { |
| | | rgvStaNo = 2002; |
| | | } else if (sourceStaNo == 2003 && staNo == 4001) { |
| | | rgvStaNo = 4001; |
| | | } else if (sourceStaNo == 2003 && staNo == 4010) { |
| | | rgvStaNo = 4010; |
| | | } |
| | | } |
| | | return rgvStaNo; |
| | | } |
| | | |
| | | public static void main(String[] args) { |
| | | SlaveProperties slaveProperties = new SlaveProperties(); |
| | | slaveProperties.setDoubleDeep(true); |
| | |
| | | package com.zy.common; |
| | | |
| | | import com.core.generators.CoolGenerator; |
| | | import com.core.generators.constant.SqlOsType; |
| | | |
| | | /** |
| | | * Created by vincent on 2019-06-04 |
| | |
| | | // generator.password="xltys1995"; |
| | | // generator.table="sys_host"; |
| | | // sqlserver |
| | | generator.url="192.168.3.208:1433;databasename=cool"; |
| | | generator.sqlOsType = SqlOsType.SQL_SERVER; |
| | | generator.url="192.168.4.15:1433;databasename=mdqdasrs"; |
| | | generator.username="sa"; |
| | | generator.password="sa@123"; |
| | | generator.table="asr_wrk_detl"; |
| | | generator.table="asr_bas_rgv_opt"; |
| | | generator.packagePath="com.zy.asrs"; |
| | | generator.html = false; |
| | | generator.htmlDetail = false; |
| | | generator.js = false; |
| | | generator.sql = false; |
| | | generator.controller = false; |
| | | generator.build(); |
| | | } |
| | | |
| | |
| | | mainService.crnIoExecute(); |
| | | // 入库 ===>> 执行对工作档的完成操作 |
| | | mainService.storeFinished(); |
| | | |
| | | //RGV搬运 |
| | | mainService.rgvIoExecute(); |
| | | //RGV工作完成 |
| | | mainService.rgvFinished(); |
| | | |
| | | // 堆垛机异常信息记录 |
| | | mainService.recCrnErr(); |
| | | // 入库 ===>> 空栈板初始化入库,叉车入库站放货 |
| | |
| | | mainService.ledExecute(); |
| | | // 其他 ===>> LED显示器复位,显示默认信息 |
| | | mainService.ledReset(); |
| | | // mainService.outOfDevp(); |
| | | |
| | | } catch (Exception e) { |
| | | e.printStackTrace(); |
New file |
| | |
| | | package com.zy.core; |
| | | |
| | | public interface RgvThread extends ThreadHandler { |
| | | |
| | | void setResetFlag1(boolean flag); |
| | | |
| | | void setResetFlag2(boolean flag); |
| | | |
| | | } |
| | |
| | | import com.zy.core.model.CrnSlave; |
| | | import com.zy.core.model.DevpSlave; |
| | | import com.zy.core.model.LedSlave; |
| | | import com.zy.core.model.RgvSlave; |
| | | import com.zy.core.properties.SlaveProperties; |
| | | import com.zy.core.thread.*; |
| | | import lombok.extern.slf4j.Slf4j; |
| | |
| | | for (Slave crn : slaveProperties.getCrn()) { |
| | | MessageQueue.init(SlaveType.Crn, crn); |
| | | } |
| | | // 初始化RGVmq |
| | | for (Slave rgv : slaveProperties.getRgv()) { |
| | | MessageQueue.init(SlaveType.Rgv, rgv); |
| | | } |
| | | // 初始化输送线mq |
| | | for (Slave devp : slaveProperties.getDevp()) { |
| | | MessageQueue.init(SlaveType.Devp, devp); |
| | |
| | | new Thread((Runnable) crnThread).start(); |
| | | SlaveConnection.put(SlaveType.Crn, crn.getId(), crnThread); |
| | | } |
| | | log.info("初始化RGV线程..................................................."); |
| | | for (RgvSlave rgv : slaveProperties.getRgv()) { |
| | | RgvThread rgvThread = new ZyRgvThread(rgv); |
| | | new Thread((Runnable) rgvThread).start(); |
| | | SlaveConnection.put(SlaveType.Rgv, rgv.getId(), rgvThread); |
| | | } |
| | | // 初始化输送线线程 |
| | | log.info("初始化输送线线程..................................................."); |
| | | for (DevpSlave devp : slaveProperties.getDevp()) { |
New file |
| | |
| | | package com.zy.core.enums; |
| | | |
| | | /** |
| | | * RGV模式枚举 |
| | | */ |
| | | public enum RgvModeType { |
| | | |
| | | STOP((short) 0, "停机模式"), |
| | | MANUAL((short) 1, "手动模式"), |
| | | AUTO((short) 2, "自动模式"), |
| | | COMPUTER((short) 3, "电脑模式"), |
| | | ; |
| | | |
| | | public Short id; |
| | | public String desc; |
| | | |
| | | RgvModeType(Short 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)) { |
| | | return type; |
| | | } |
| | | } |
| | | return null; |
| | | } |
| | | |
| | | public static RgvModeType get(RgvModeType type) { |
| | | if (null == type) { |
| | | return null; |
| | | } |
| | | for (RgvModeType type1 : RgvModeType.values()) { |
| | | if (type1 == type) { |
| | | return type1; |
| | | } |
| | | } |
| | | return null; |
| | | } |
| | | } |
New file |
| | |
| | | package com.zy.core.enums; |
| | | |
| | | /** |
| | | * RGV状态枚举 |
| | | */ |
| | | public enum RgvStatusType { |
| | | |
| | | OFFLINE((short) -1, "离线"), |
| | | IDLE((short) 0, "空闲"), |
| | | PICK_WALK((short) 1, "取货走行"), |
| | | PICK_WAIT((short) 2, "取货等待"), |
| | | PICK_WORKING((short) 3, "取货中"), |
| | | RELEASE_WALK((short) 4, "放货走行"), |
| | | RELEASE_WAIT((short) 5, "放货等待"), |
| | | RELEASE_WORKING((short) 6, "放货中"), |
| | | WALKING((short) 9, "走行中"), |
| | | WAITING((short) 90, "任务完成等待WCS确认"), |
| | | ALARM((short) 99, "报警"), |
| | | OTHER((short) 100, "其他"), |
| | | ; |
| | | public Short id; |
| | | public String desc; |
| | | |
| | | RgvStatusType(Short 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)) { |
| | | return type; |
| | | } |
| | | } |
| | | return null; |
| | | } |
| | | |
| | | public static RgvStatusType get(RgvStatusType type) { |
| | | if (null == type) { |
| | | return null; |
| | | } |
| | | for (RgvStatusType type1 : RgvStatusType.values()) { |
| | | if (type1 == type) { |
| | | return type1; |
| | | } |
| | | } |
| | | return null; |
| | | } |
| | | } |
New file |
| | |
| | | package com.zy.core.enums; |
| | | |
| | | public enum RgvTaskModeType { |
| | | |
| | | NONE((short) 0, "无"), |
| | | PICK((short) 1, "取货"), |
| | | RELEASE((short) 2, "放货"), |
| | | PICK_RELEASE((short) 3, "取放货"), |
| | | MOVE((short) 4, "移动(发工位1任务即可)"), |
| | | ; |
| | | public Short id; |
| | | public String desc; |
| | | |
| | | RgvTaskModeType(Short id, String desc) { |
| | | this.id = id; |
| | | this.desc = desc; |
| | | } |
| | | |
| | | public static RgvTaskModeType get(Short id) { |
| | | if (null == id) { |
| | | return null; |
| | | } |
| | | for (RgvTaskModeType type : RgvTaskModeType.values()) { |
| | | if (type.id.equals(id)) { |
| | | return type; |
| | | } |
| | | } |
| | | return null; |
| | | } |
| | | |
| | | public static RgvTaskModeType get(RgvTaskModeType type) { |
| | | if (null == type) { |
| | | return null; |
| | | } |
| | | for (RgvTaskModeType type1 : RgvTaskModeType.values()) { |
| | | if (type1 == type) { |
| | | return type1; |
| | | } |
| | | } |
| | | return null; |
| | | } |
| | | } |
New file |
| | |
| | | package com.zy.core.enums; |
| | | |
| | | /** |
| | | * RGV走行定位枚举 |
| | | */ |
| | | public enum RgvWalkPosType { |
| | | |
| | | POSITION((short) 0, "在定位"), |
| | | NONE((short) 1, "不在定位"), |
| | | ; |
| | | |
| | | public Short id; |
| | | public String desc; |
| | | |
| | | RgvWalkPosType(Short id, String desc) { |
| | | this.id = id; |
| | | this.desc = desc; |
| | | } |
| | | |
| | | public static RgvWalkPosType get(Short id) { |
| | | if (null == id) { |
| | | return null; |
| | | } |
| | | for (RgvWalkPosType type : RgvWalkPosType.values()) { |
| | | if (type.id.equals(id)) { |
| | | return type; |
| | | } |
| | | } |
| | | return null; |
| | | } |
| | | |
| | | public static RgvWalkPosType get(RgvWalkPosType type) { |
| | | if (null == type) { |
| | | return null; |
| | | } |
| | | for (RgvWalkPosType type1 : RgvWalkPosType.values()) { |
| | | if (type1 == type) { |
| | | return type1; |
| | | } |
| | | } |
| | | return null; |
| | | } |
| | | |
| | | } |
| | |
| | | Led, |
| | | Scale, |
| | | Car, |
| | | Rgv, |
| | | ; |
| | | |
| | | public static SlaveType findInstance(String s){ |
New file |
| | |
| | | package com.zy.core.model; |
| | | |
| | | import com.zy.core.Slave; |
| | | import lombok.Data; |
| | | import lombok.EqualsAndHashCode; |
| | | |
| | | import java.util.ArrayList; |
| | | import java.util.List; |
| | | |
| | | @EqualsAndHashCode(callSuper = true) |
| | | @Data |
| | | public class RgvSlave extends Slave { |
| | | |
| | | private Integer rack; |
| | | |
| | | private Integer slot; |
| | | |
| | | private List<Sta> inStn = new ArrayList<>(); |
| | | |
| | | private List<Sta> outStn = new ArrayList<>(); |
| | | |
| | | @Data |
| | | public static class Sta { |
| | | |
| | | private Integer staNo;//目标站 |
| | | |
| | | private Integer sourceStaNo;//源站 |
| | | |
| | | private Integer devpPlcId; |
| | | |
| | | } |
| | | |
| | | } |
New file |
| | |
| | | package com.zy.core.model.command; |
| | | |
| | | import com.alibaba.fastjson.annotation.JSONField; |
| | | import com.zy.core.enums.RgvTaskModeType; |
| | | import lombok.Data; |
| | | |
| | | /** |
| | | * RGV命令报文 |
| | | */ |
| | | @Data |
| | | public class RgvCommand { |
| | | |
| | | // RGV编号 |
| | | private Integer rgvNo = 0; |
| | | |
| | | // 任务完成确认位 |
| | | private Short ackFinish = 0; |
| | | |
| | | //**************工位1************** |
| | | |
| | | // 工位1工作号 |
| | | private Short taskNo1 = 0; |
| | | |
| | | /** |
| | | * 任务模式: |
| | | * 0 = 无 |
| | | * 1 = 取货 |
| | | * 2 = 放货 |
| | | * 3 = 取放货 |
| | | * 4 = 移动(发工位1任务即可) |
| | | */ |
| | | private Short taskMode1 = 0; |
| | | |
| | | @JSONField(serialize = false) |
| | | private RgvTaskModeType taskModeType1; |
| | | |
| | | // 工位1源站 |
| | | private Short sourceStaNo1 = 0; |
| | | |
| | | // 工位1目标站 |
| | | private Short destinationStaNo1 = 0; |
| | | |
| | | //**************工位1************** |
| | | |
| | | |
| | | //**************工位2************** |
| | | |
| | | // 工位2工作号 |
| | | private Short taskNo2 = 0; |
| | | |
| | | /** |
| | | * 任务模式: |
| | | * 0 = 无 |
| | | * 1 = 取货 |
| | | * 2 = 放货 |
| | | * 3 = 取放货 |
| | | * 4 = 移动(发工位1任务即可) |
| | | */ |
| | | private Short taskMode2 = 0; |
| | | |
| | | @JSONField(serialize = false) |
| | | private RgvTaskModeType taskModeType2; |
| | | |
| | | // 工位1源站 |
| | | private Short sourceStaNo2 = 0; |
| | | |
| | | // 工位1目标站 |
| | | private Short destinationStaNo2 = 0; |
| | | |
| | | //**************工位2************** |
| | | |
| | | // 任务确认 0:未确认 1:已确认 |
| | | private Short command = 0; |
| | | |
| | | public void setTaskMode1(Short taskMode){ |
| | | this.taskMode1 = taskMode; |
| | | this.taskModeType1 = RgvTaskModeType.get(taskMode); |
| | | } |
| | | |
| | | public void setTaskMode1(RgvTaskModeType type) { |
| | | this.taskModeType1 = type; |
| | | this.taskMode1 = RgvTaskModeType.get(type).id; |
| | | } |
| | | |
| | | public void setTaskMode2(Short taskMode){ |
| | | this.taskMode2 = taskMode; |
| | | this.taskModeType2 = RgvTaskModeType.get(taskMode); |
| | | } |
| | | |
| | | public void setTaskMode2(RgvTaskModeType type) { |
| | | this.taskModeType2 = type; |
| | | this.taskMode2 = RgvTaskModeType.get(type).id; |
| | | } |
| | | |
| | | } |
New file |
| | |
| | | package com.zy.core.model.protocol; |
| | | |
| | | import com.zy.core.enums.RgvModeType; |
| | | import com.zy.core.enums.RgvStatusType; |
| | | import com.zy.core.enums.RgvWalkPosType; |
| | | import lombok.Data; |
| | | |
| | | import java.util.Date; |
| | | |
| | | @Data |
| | | public class RgvProtocol { |
| | | |
| | | //RGV编号 |
| | | private Integer rgvNo; |
| | | |
| | | //模式 |
| | | private Short mode; |
| | | |
| | | //RGV模式枚举 |
| | | private RgvModeType modeType; |
| | | |
| | | //RGV状态 |
| | | private Short status; |
| | | |
| | | //RGV状态枚举 |
| | | private RgvStatusType statusType; |
| | | |
| | | //工位1工作号 |
| | | private Short taskNo1; |
| | | |
| | | //工位1有物信号 |
| | | private Short loaded1; |
| | | |
| | | //RGV当前位置 |
| | | private Short rgvPos; |
| | | |
| | | //走行在定位 0:在定位,1:不在定位 |
| | | private Short walkPos; |
| | | |
| | | //RGV走行枚举 |
| | | private RgvWalkPosType walkPosType; |
| | | |
| | | //工位2工作号 |
| | | private Short taskNo2; |
| | | |
| | | //工位2有物信号 |
| | | private Short loaded2; |
| | | |
| | | //工位1任务完成信号 |
| | | private Short taskFinish1; |
| | | |
| | | //工位2任务完成信号 |
| | | private Short taskFinish2; |
| | | |
| | | //异常码 |
| | | private Short alarm; |
| | | |
| | | //心跳 |
| | | private Short heart; |
| | | |
| | | //备用1 |
| | | private Short temp1; |
| | | |
| | | //备用2 |
| | | private Short temp2; |
| | | |
| | | //备用3 |
| | | private Short temp3; |
| | | |
| | | //备用4 |
| | | private Short temp4; |
| | | |
| | | //备用5 |
| | | private Short temp5; |
| | | |
| | | //工位1任务模式 |
| | | private Short taskMode1; |
| | | |
| | | //工位1源站 |
| | | private Short sourceStn1; |
| | | |
| | | //工位1目标站 |
| | | private Short destinationPos1; |
| | | |
| | | //工位2任务模式 |
| | | private Short taskMode2; |
| | | |
| | | //工位2源站 |
| | | private Short sourceStn2; |
| | | |
| | | //工位2目标站 |
| | | private Short destinationPos2; |
| | | |
| | | //工位1下发时间 |
| | | private Long task1SendTime; |
| | | |
| | | /** |
| | | * 最近一次入出库类型 |
| | | * I:入库 |
| | | * O:出库 |
| | | */ |
| | | private String lastIo = "I"; |
| | | |
| | | public void setMode(Short mode) { |
| | | this.mode = mode; |
| | | this.modeType = RgvModeType.get(mode); |
| | | } |
| | | |
| | | public void setMode(RgvModeType type) { |
| | | this.mode = type.id; |
| | | this.modeType = type; |
| | | } |
| | | |
| | | public void setStatus(Short status) { |
| | | this.status = status; |
| | | this.statusType = RgvStatusType.get(status); |
| | | } |
| | | |
| | | public void setStatus(RgvStatusType type) { |
| | | this.status = type.id; |
| | | this.statusType = type; |
| | | } |
| | | |
| | | public void setWalkPos(Short walkPos) { |
| | | this.walkPos = walkPos; |
| | | this.walkPosType = RgvWalkPosType.get(walkPos); |
| | | } |
| | | |
| | | public void setWalkPos(RgvWalkPosType type) { |
| | | this.walkPos = type.id; |
| | | this.walkPosType = type; |
| | | } |
| | | |
| | | } |
| | |
| | | import com.zy.core.model.CrnSlave; |
| | | import com.zy.core.model.DevpSlave; |
| | | import com.zy.core.model.LedSlave; |
| | | import com.zy.core.model.RgvSlave; |
| | | import lombok.Data; |
| | | import org.springframework.boot.context.properties.ConfigurationProperties; |
| | | import org.springframework.context.annotation.Configuration; |
| | |
| | | |
| | | private List<Slave> car = new ArrayList<>(); |
| | | |
| | | private List<RgvSlave> rgv = new ArrayList<>(); |
| | | |
| | | } |
New file |
| | |
| | | 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.core.RgvThread; |
| | | 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线程 |
| | | */ |
| | | @Data |
| | | @Slf4j |
| | | public class ZyRgvThread implements Runnable, RgvThread { |
| | | |
| | | private SiemensS7Net siemensNet; |
| | | private RgvSlave slave; |
| | | private RgvProtocol rgvProtocol; |
| | | private boolean resetFlag1 = false;//工位1复位信号 |
| | | private boolean resetFlag2 = false;//工位2复位信号 |
| | | |
| | | public ZyRgvThread(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; |
| | | // 写入数据 |
| | | case 2: |
| | | write((RgvCommand) task.getData()); |
| | | break; |
| | | // 复位 |
| | | case 3: |
| | | RgvCommand command = (RgvCommand) task.getData(); |
| | | if (null == command) { |
| | | command = new RgvCommand(); |
| | | } |
| | | command.setRgvNo(slave.getId()); // 堆垛机编号 |
| | | command.setTaskNo1((short) 0); // 工作号 |
| | | command.setTaskMode1(RgvTaskModeType.NONE); // 任务模式 |
| | | command.setSourceStaNo1((short) 0);//源站 |
| | | command.setDestinationStaNo1((short) 0);//目标站 |
| | | command.setTaskNo2((short) 0); // 工作号 |
| | | command.setTaskMode2(RgvTaskModeType.NONE); // 任务模式 |
| | | command.setSourceStaNo2((short) 0);//源站 |
| | | command.setDestinationStaNo2((short) 0);//目标站 |
| | | command.setAckFinish((short) 1); // 任务完成确认位 |
| | | write(command); |
| | | break; |
| | | //写入数据确认命令 |
| | | case 4: |
| | | writeCommand((RgvCommand) task.getData()); |
| | | break; |
| | | default: |
| | | break; |
| | | } |
| | | Thread.sleep(500); |
| | | } catch (Exception e) { |
| | | // e.printStackTrace(); |
| | | } |
| | | |
| | | } |
| | | } |
| | | |
| | | @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.CRN.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.CRN.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(); |
| | | } |
| | | 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));//RGV状态 |
| | | rgvProtocol.setTaskNo1(siemensNet.getByteTransform().TransInt16(result.Content, 4));//工位1工作号 |
| | | rgvProtocol.setLoaded1(siemensNet.getByteTransform().TransInt16(result.Content, 6));//工位1有物 |
| | | rgvProtocol.setRgvPos(siemensNet.getByteTransform().TransInt16(result.Content, 8));//RGV当前位置 |
| | | rgvProtocol.setWalkPos(siemensNet.getByteTransform().TransInt16(result.Content, 10));//走行在定位 |
| | | rgvProtocol.setTaskNo2(siemensNet.getByteTransform().TransInt16(result.Content, 12));//工位2工作号 |
| | | rgvProtocol.setLoaded2(siemensNet.getByteTransform().TransInt16(result.Content, 14));//工位2有物 |
| | | rgvProtocol.setTaskFinish1(siemensNet.getByteTransform().TransInt16(result.Content, 16));//工位1任务完成 |
| | | rgvProtocol.setTaskFinish2(siemensNet.getByteTransform().TransInt16(result.Content, 18));//工位2任务完成 |
| | | rgvProtocol.setAlarm(siemensNet.getByteTransform().TransInt16(result.Content, 20));//异常码 |
| | | rgvProtocol.setHeart(siemensNet.getByteTransform().TransInt16(result.Content, 22));//RGV心跳信号 |
| | | rgvProtocol.setTemp1(siemensNet.getByteTransform().TransInt16(result.Content, 24));//备用1 |
| | | rgvProtocol.setTemp2(siemensNet.getByteTransform().TransInt16(result.Content, 26));//备用2 |
| | | rgvProtocol.setTemp3(siemensNet.getByteTransform().TransInt16(result.Content, 28));//备用3 |
| | | rgvProtocol.setTemp4(siemensNet.getByteTransform().TransInt16(result.Content, 30));//备用4 |
| | | rgvProtocol.setTemp5(siemensNet.getByteTransform().TransInt16(result.Content, 32));//备用5 |
| | | |
| | | OperateResultExOne<byte[]> result2 = siemensNet.Read("DB100.0", (short) 22); |
| | | if (result2.IsSuccess) { |
| | | rgvProtocol.setTaskMode1(siemensNet.getByteTransform().TransInt16(result.Content, 4));//工位1任务模式 |
| | | rgvProtocol.setSourceStn1(siemensNet.getByteTransform().TransInt16(result.Content, 6));//工位1源站 |
| | | rgvProtocol.setDestinationPos1(siemensNet.getByteTransform().TransInt16(result.Content, 8));//工位1目标站 |
| | | rgvProtocol.setTaskMode2(siemensNet.getByteTransform().TransInt16(result.Content, 14));//工位2任务模式 |
| | | rgvProtocol.setSourceStn2(siemensNet.getByteTransform().TransInt16(result.Content, 16));//工位2源站 |
| | | rgvProtocol.setDestinationPos2(siemensNet.getByteTransform().TransInt16(result.Content, 18));//工位2目标站 |
| | | } |
| | | |
| | | OutputQueue.CRN.offer(MessageFormat.format("【{0}】[id:{1}] <<<<< 实时数据更新成功",DateUtils.convert(new Date()), slave.getId())); |
| | | |
| | | // 复位信号 |
| | | if (rgvProtocol.getStatusType().equals(RgvStatusType.WAITING)) { |
| | | if (resetFlag1) { |
| | | RgvCommand rgvCommand = new RgvCommand(); |
| | | rgvCommand.setAckFinish((short) 2);//工位1任务结束已接收 |
| | | if (write(rgvCommand)) { |
| | | resetFlag1 = false; |
| | | } |
| | | } |
| | | |
| | | if (resetFlag2) { |
| | | RgvCommand rgvCommand = new RgvCommand(); |
| | | rgvCommand.setAckFinish((short) 3);//工位2任务结束已接收 |
| | | if (write(rgvCommand)) { |
| | | resetFlag2 = false; |
| | | } |
| | | } |
| | | } |
| | | |
| | | try { |
| | | // 根据实时信息更新数据库 |
| | | BasRgvService basRgvService = SpringUtils.getBean(BasRgvService.class); |
| | | BasRgv basRgv = new BasRgv(); |
| | | basRgv.setRgvNo(slave.getId()); |
| | | basRgv.setMode(rgvProtocol.getMode().intValue()); |
| | | basRgv.setStatus(rgvProtocol.getStatus().intValue()); |
| | | basRgv.setTaskNo1(rgvProtocol.getTaskNo1().intValue()); |
| | | basRgv.setLoaded1(rgvProtocol.getLoaded1().intValue()); |
| | | basRgv.setRgvPos(rgvProtocol.getRgvPos().intValue()); |
| | | basRgv.setWalkPos(rgvProtocol.getWalkPos().intValue()); |
| | | basRgv.setTaskNo2(rgvProtocol.getTaskNo2().intValue()); |
| | | basRgv.setLoaded2(rgvProtocol.getLoaded2().intValue()); |
| | | basRgv.setTaskFinish1(rgvProtocol.getTaskFinish1().intValue()); |
| | | basRgv.setTaskFinish2(rgvProtocol.getTaskFinish2().intValue()); |
| | | basRgv.setAlarm(rgvProtocol.getAlarm().intValue()); |
| | | basRgv.setHeart(rgvProtocol.getHeart().intValue()); |
| | | basRgv.setTemp1(rgvProtocol.getTemp1().intValue()); |
| | | basRgv.setTemp2(rgvProtocol.getTemp2().intValue()); |
| | | basRgv.setTemp3(rgvProtocol.getTemp3().intValue()); |
| | | basRgv.setTemp4(rgvProtocol.getTemp4().intValue()); |
| | | basRgv.setTemp5(rgvProtocol.getTemp5().intValue()); |
| | | if (!basRgvService.updateById(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.CRN.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.CRN.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(); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 写入数据 |
| | | */ |
| | | private boolean write(RgvCommand command) throws InterruptedException { |
| | | if (null == command) { |
| | | log.error("RGV写入命令为空"); |
| | | return false; |
| | | } |
| | | command.setRgvNo(slave.getId()); |
| | | OperateResult result = null; |
| | | if (command.getTaskNo1() > 0 && command.getTaskNo2() == 0) { |
| | | //只有工位1存在任务且任务没有被确认,工位1开始计时 |
| | | if (command.getCommand() == 0) { |
| | | rgvProtocol.setTask1SendTime(System.currentTimeMillis()); |
| | | } |
| | | short[] array = new short[10]; |
| | | array[0] = command.getAckFinish(); // 任务完成确认位 |
| | | array[1] = command.getTaskNo1(); // 工位1任务号 |
| | | array[2] = command.getTaskMode1(); // 工位1模式 |
| | | array[3] = command.getSourceStaNo1(); // 工位1源站 |
| | | array[4] = command.getDestinationStaNo1(); // 工位1目标站 |
| | | array[5] = 0; // 工位2任务号 |
| | | array[6] = 0; // 工位2模式 |
| | | array[7] = 0; // 工位2源站 |
| | | array[8] = 0; // 工位2目标站 |
| | | array[9] = command.getCommand();// 任务确认位 |
| | | result = siemensNet.Write("DB100.0", array); |
| | | log.info("RGV命令下发[id:{}] >>>>> {}", slave.getId(), array); |
| | | } else if (command.getTaskNo2() > 0 && command.getTaskNo1() == 0) { |
| | | //只有工位2存在任务 |
| | | short[] array = new short[5]; |
| | | array[0] = command.getTaskNo2(); // 工位2任务号 |
| | | array[1] = command.getTaskMode2(); // 工位2模式 |
| | | array[2] = command.getSourceStaNo2(); // 工位2源站 |
| | | array[3] = command.getDestinationStaNo2(); // 工位2目标站 |
| | | array[4] = command.getCommand();// 任务确认位 |
| | | result = siemensNet.Write("DB100.12", array); |
| | | log.info("RGV命令下发[id:{}] >>>>> {}", slave.getId(), array); |
| | | }else { |
| | | //工位1和工位2任务 |
| | | short[] array = new short[10]; |
| | | array[0] = command.getAckFinish(); // 任务完成确认位 |
| | | array[1] = command.getTaskNo1(); // 工位1任务号 |
| | | array[2] = command.getTaskMode1(); // 工位1模式 |
| | | array[3] = command.getSourceStaNo1(); // 工位1源站 |
| | | array[4] = command.getDestinationStaNo1(); // 工位1目标站 |
| | | array[5] = command.getTaskNo2(); // 工位2任务号 |
| | | array[6] = command.getTaskMode2(); // 工位2模式 |
| | | array[7] = command.getSourceStaNo2(); // 工位2源站 |
| | | array[8] = command.getDestinationStaNo2(); // 工位2目标站 |
| | | array[9] = command.getCommand();// 任务确认位 |
| | | result = siemensNet.Write("DB100.0", array); |
| | | log.info("RGV命令下发[id:{}] >>>>> {}", slave.getId(), array); |
| | | } |
| | | |
| | | if (command.getCommand() == 1) { |
| | | //任务被确认 |
| | | rgvProtocol.setTask1SendTime(0L);//重置工位1下发时间 |
| | | } |
| | | |
| | | if(!result.IsSuccess){ |
| | | log.error("写入RGV plc数据失败,重新添加任务到队列 ===>> [id:{}],{}", slave.getId(), JSON.toJSON(command)); |
| | | MessageQueue.offer(SlaveType.Rgv, slave.getId(), new Task(2, command)); |
| | | Thread.sleep(100); |
| | | readStatus(); |
| | | return false; |
| | | } |
| | | |
| | | try { |
| | | // 日志记录 |
| | | BasRgvOptService bean = SpringUtils.getBean(BasRgvOptService.class); |
| | | Date now = new Date(); |
| | | BasRgvOpt basRgvOpt = new BasRgvOpt( |
| | | command.getRgvNo(), // RGV[非空] |
| | | command.getAckFinish().intValue(), // 任务完成确认位 |
| | | command.getTaskNo1().intValue(), // 任务号 |
| | | command.getTaskMode1().intValue(), // 模式 |
| | | command.getSourceStaNo1().intValue(), // 源站 |
| | | command.getDestinationStaNo1().intValue(), // 目标站 |
| | | command.getTaskNo2().intValue(), // 任务号 |
| | | command.getTaskMode2().intValue(), // 模式 |
| | | command.getSourceStaNo2().intValue(), // 源站 |
| | | command.getDestinationStaNo2().intValue(), // 目标站 |
| | | command.getCommand().intValue(), |
| | | now, // 下发时间 |
| | | null, // 下发人员 |
| | | now, // 修改时间 |
| | | null, // 修改人员 |
| | | null //响应 |
| | | ); |
| | | bean.insert(basRgvOpt); |
| | | } catch (Exception ignore) {} |
| | | |
| | | if (result != null && result.IsSuccess) { |
| | | Thread.sleep(200); |
| | | this.readStatus(); |
| | | log.info("堆垛机命令下发[id:{}] >>>>> {}", slave.getId(), JSON.toJSON(command)); |
| | | OutputQueue.CRN.offer(MessageFormat.format("【{0}】[id:{1}] >>>>> 命令下发: {2}", DateUtils.convert(new Date()), slave.getId(), JSON.toJSON(command))); |
| | | return true; |
| | | } else { |
| | | OutputQueue.CRN.offer(MessageFormat.format("【{0}】写入堆垛机plc数据失败 ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort())); |
| | | log.error("写入堆垛机plc数据失败 ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort()); |
| | | return false; |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 写入数据确认命令 |
| | | */ |
| | | private boolean writeCommand(RgvCommand command) throws InterruptedException { |
| | | if (null == command) { |
| | | log.error("RGV写入命令为空"); |
| | | return false; |
| | | } |
| | | |
| | | command.setRgvNo(slave.getId()); |
| | | short[] array = new short[1]; |
| | | array[0] = command.getCommand();// 任务确认位 |
| | | OperateResult result = siemensNet.Write("DB100.20", array); |
| | | log.info("RGV命令下发[id:{}] >>>>> {}", slave.getId(), array); |
| | | |
| | | if(!result.IsSuccess){ |
| | | log.error("写入RGV plc数据失败,重新添加任务到队列 ===>> [id:{}],{}", slave.getId(), JSON.toJSON(command)); |
| | | MessageQueue.offer(SlaveType.Rgv, slave.getId(), new Task(2, command)); |
| | | Thread.sleep(100); |
| | | readStatus(); |
| | | return false; |
| | | } |
| | | |
| | | try { |
| | | // 日志记录 |
| | | BasRgvOptService bean = SpringUtils.getBean(BasRgvOptService.class); |
| | | Date now = new Date(); |
| | | BasRgvOpt basRgvOpt = new BasRgvOpt( |
| | | command.getRgvNo(), // RGV[非空] |
| | | command.getAckFinish().intValue(), // 任务完成确认位 |
| | | command.getTaskNo1().intValue(), // 任务号 |
| | | command.getTaskMode1().intValue(), // 模式 |
| | | command.getSourceStaNo1().intValue(), // 源站 |
| | | command.getDestinationStaNo1().intValue(), // 目标站 |
| | | command.getTaskNo2().intValue(), // 任务号 |
| | | command.getTaskMode2().intValue(), // 模式 |
| | | command.getSourceStaNo2().intValue(), // 源站 |
| | | command.getDestinationStaNo2().intValue(), // 目标站 |
| | | command.getCommand().intValue(), |
| | | now, // 下发时间 |
| | | null, // 下发人员 |
| | | now, // 修改时间 |
| | | null, // 修改人员 |
| | | null //响应 |
| | | ); |
| | | bean.insert(basRgvOpt); |
| | | } catch (Exception ignore) {} |
| | | |
| | | if (result != null && result.IsSuccess) { |
| | | Thread.sleep(200); |
| | | this.readStatus(); |
| | | log.info("堆垛机命令下发[id:{}] >>>>> {}", slave.getId(), JSON.toJSON(command)); |
| | | OutputQueue.CRN.offer(MessageFormat.format("【{0}】[id:{1}] >>>>> 命令下发: {2}", DateUtils.convert(new Date()), slave.getId(), JSON.toJSON(command))); |
| | | return true; |
| | | } else { |
| | | OutputQueue.CRN.offer(MessageFormat.format("【{0}】写入堆垛机plc数据失败 ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort())); |
| | | log.error("写入堆垛机plc数据失败 ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort()); |
| | | return false; |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 初始化堆垛机状态 |
| | | */ |
| | | private void initRgv() { |
| | | if (null == rgvProtocol) { |
| | | rgvProtocol = new RgvProtocol(); |
| | | } |
| | | rgvProtocol.setMode((short) 0); |
| | | rgvProtocol.setStatus((short) -1); |
| | | rgvProtocol.setWalkPos((short) 1); |
| | | } |
| | | |
| | | @Override |
| | | public void close() { |
| | | siemensNet.ConnectClose(); |
| | | } |
| | | } |
| | |
| | | row: 2 |
| | | bay: 1 |
| | | lev: 1 |
| | | # 堆垛机入库站2 |
| | | crnInStn[1]: |
| | | devpPlcId: ${wcs-slave.devp[0].id} |
| | | staNo: 1022 |
| | | row: 3 |
| | | bay: 1 |
| | | lev: 3 |
| | | # 堆垛机出库站点1 |
| | | crnOutStn[0]: |
| | | devpPlcId: ${wcs-slave.devp[0].id} |
| | |
| | | row: 3 |
| | | bay: 1 |
| | | lev: 1 |
| | | # 堆垛机出库站点2 |
| | | crnOutStn[1]: |
| | | devpPlcId: ${wcs-slave.devp[0].id} |
| | | staNo: 1016 |
| | | row: 3 |
| | | bay: 1 |
| | | lev: 3 |
| | | # 堆垛机2 |
| | | crn[1]: |
| | | id: 2 |
| | |
| | | row: 7 |
| | | bay: 1 |
| | | lev: 1 |
| | | # 堆垛机入库站2 |
| | | crnInStn[1]: |
| | | devpPlcId: ${wcs-slave.devp[0].id} |
| | | staNo: 1025 |
| | | row: 6 |
| | | bay: 1 |
| | | lev: 3 |
| | | # 堆垛机出库站点1 |
| | | crnOutStn[0]: |
| | | devpPlcId: ${wcs-slave.devp[0].id} |
| | |
| | | row: 6 |
| | | bay: 1 |
| | | lev: 1 |
| | | # 堆垛机出库站点2 |
| | | crnOutStn[1]: |
| | | devpPlcId: ${wcs-slave.devp[0].id} |
| | | staNo: 1019 |
| | | row: 6 |
| | | bay: 1 |
| | | lev: 3 |
| | | # 输送线1 |
| | | devp[0]: |
| | | id: 1 |
| | |
| | | barcode: ${wcs-slave.barcode[1].id} |
| | | backSta: 1011 |
| | | led: ${wcs-slave.led[3].id} |
| | | # 入库口3 |
| | | inSta[2]: |
| | | staNo: 3007 |
| | | barcode: ${wcs-slave.barcode[2].id} |
| | | backSta: 3007 |
| | | led: ${wcs-slave.led[4].id} |
| | | # 入库口4 |
| | | inSta[3]: |
| | | staNo: 3012 |
| | | barcode: ${wcs-slave.barcode[2].id} |
| | | backSta: 3012 |
| | | led: ${wcs-slave.led[5].id} |
| | | # 空板入库口1 |
| | | emptyInSta[0]: |
| | | staNo: 102 |
| | | # 出库口1 |
| | | outSta[0]: |
| | | staNo: 101 |
| | | # 拣料入库口1 |
| | | pickSta[0]: |
| | | staNo: 102 |
| | | staNo: 1003 |
| | | barcode: ${wcs-slave.barcode[0].id} |
| | | backSta: 102 |
| | | backSta: 1001 |
| | | led: ${wcs-slave.led[0].id} |
| | | # 拣料入库口2 |
| | | pickSta[1]: |
| | | staNo: 1013 |
| | | barcode: ${wcs-slave.barcode[1].id} |
| | | backSta: 1011 |
| | | led: ${wcs-slave.led[3].id} |
| | | # 拣料入库口3 |
| | | pickSta[2]: |
| | | staNo: 3007 |
| | | barcode: ${wcs-slave.barcode[2].id} |
| | | backSta: 3007 |
| | | led: ${wcs-slave.led[4].id} |
| | | # 拣料入库口4 |
| | | pickSta[3]: |
| | | staNo: 3012 |
| | | barcode: ${wcs-slave.barcode[2].id} |
| | | backSta: 3012 |
| | | led: ${wcs-slave.led[5].id} |
| | | |
| | | # RGV1 |
| | | rgv[0]: |
| | | id: 1 |
| | | ip: 10.10.10.120 |
| | | port: 102 |
| | | rack: 0 |
| | | slot: 0 |
| | | inStn[0]: |
| | | devpPlcId: ${wcs-slave.devp[0].id} |
| | | sourceStaNo: 2401 |
| | | inStn[1]: |
| | | devpPlcId: ${wcs-slave.devp[0].id} |
| | | sourceStaNo: 2114 |
| | | outStn[0]: |
| | | devpPlcId: ${wcs-slave.devp[0].id} |
| | | sourceStaNo: 1014 |
| | | outStn[1]: |
| | | devpPlcId: ${wcs-slave.devp[0].id} |
| | | sourceStaNo: 1017 |
| | | # RGV2 |
| | | rgv[1]: |
| | | id: 2 |
| | | ip: 10.10.10.121 |
| | | port: 102 |
| | | rack: 0 |
| | | slot: 0 |
| | | inStn[0]: |
| | | devpPlcId: ${wcs-slave.devp[0].id} |
| | | sourceStaNo: 3001 |
| | | outStn[0]: |
| | | devpPlcId: ${wcs-slave.devp[0].id} |
| | | sourceStaNo: 2402 |
| | | # RGV1 |
| | | rgv[2]: |
| | | id: 3 |
| | | ip: 10.10.10.122 |
| | | port: 102 |
| | | rack: 0 |
| | | slot: 0 |
| | | inStn[0]: |
| | | devpPlcId: ${wcs-slave.devp[0].id} |
| | | sourceStaNo: 2102 |
| | | inStn[1]: |
| | | devpPlcId: ${wcs-slave.devp[0].id} |
| | | sourceStaNo: 4007 |
| | | inStn[2]: |
| | | devpPlcId: ${wcs-slave.devp[0].id} |
| | | sourceStaNo: 4016 |
| | | outStn[0]: |
| | | devpPlcId: ${wcs-slave.devp[0].id} |
| | | sourceStaNo: 2003 |
| | | |
| | | # 条码扫描仪1 |
| | | barcode[0]: |
| | |
| | | # 条码扫描仪2 |
| | | barcode[1]: |
| | | id: 2 |
| | | ip: 10.10.10.3 |
| | | port: 51236 |
| | | # 条码扫描仪3 |
| | | barcode[2]: |
| | | id: 3 |
| | | ip: 10.10.10.3 |
| | | port: 51236 |
| | | # 条码扫描仪4 |
| | | barcode[3]: |
| | | id: 4 |
| | | ip: 10.10.10.3 |
| | | port: 51236 |
| | | |
| | |
| | | ip: 10.10.10.206 |
| | | port: 5005 |
| | | devpPlcId: ${wcs-slave.devp[0].id} |
| | | staArr: 1013 |
| | | staArr: 1013 |
| | | # LED5 |
| | | led[4]: |
| | | id: 5 |
| | | ip: 10.10.10.206 |
| | | port: 5005 |
| | | devpPlcId: ${wcs-slave.devp[0].id} |
| | | staArr: 3007 |
| | | # LED6 |
| | | led[5]: |
| | | id: 6 |
| | | ip: 10.10.10.206 |
| | | port: 5005 |
| | | devpPlcId: ${wcs-slave.devp[0].id} |
| | | staArr: 3012 |
New file |
| | |
| | | <?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="mode" property="mode" /> |
| | | <result column="status" property="status" /> |
| | | <result column="task_no1" property="taskNo1" /> |
| | | <result column="loaded1" property="loaded1" /> |
| | | <result column="rgv_pos" property="rgvPos" /> |
| | | <result column="walk_pos" property="walkPos" /> |
| | | <result column="task_no2" property="taskNo2" /> |
| | | <result column="loaded2" property="loaded2" /> |
| | | <result column="task_finish1" property="taskFinish1" /> |
| | | <result column="task_finish2" property="taskFinish2" /> |
| | | <result column="alarm" property="alarm" /> |
| | | <result column="heart" property="heart" /> |
| | | <result column="temp1" property="temp1" /> |
| | | <result column="temp2" property="temp2" /> |
| | | <result column="temp3" property="temp3" /> |
| | | <result column="temp4" property="temp4" /> |
| | | <result column="temp5" property="temp5" /> |
| | | <result column="create_time" property="createTime" /> |
| | | <result column="create_by" property="createBy" /> |
| | | <result column="update_time" property="updateTime" /> |
| | | <result column="update_by" property="updateBy" /> |
| | | |
| | | </resultMap> |
| | | |
| | | </mapper> |
New file |
| | |
| | | <?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="rgv_no" property="rgvNo" /> |
| | | <result column="ack_finish" property="ackFinish" /> |
| | | <result column="task_no1" property="taskNo1" /> |
| | | <result column="task_mode1" property="taskMode1" /> |
| | | <result column="source_sta_no1" property="sourceStaNo1" /> |
| | | <result column="destination_sta_no_1" property="destinationStaNo1" /> |
| | | <result column="task_no2" property="taskNo2" /> |
| | | <result column="task_mode2" property="taskMode2" /> |
| | | <result column="source_sta_no2" property="sourceStaNo2" /> |
| | | <result column="destination_sta_no2" property="destinationStaNo2" /> |
| | | <result column="command" property="command" /> |
| | | <result column="create_time" property="createTime" /> |
| | | <result column="create_by" property="createBy" /> |
| | | <result column="update_time" property="updateTime" /> |
| | | <result column="update_by" property="updateBy" /> |
| | | <result column="response" property="response" /> |
| | | |
| | | </resultMap> |
| | | |
| | | </mapper> |
| | |
| | | <select id="selectLaneWrkMastOut" resultMap="BaseResultMap"> |
| | | select * from dbo.asr_wrk_mast where wrk_sts in (11,12,13,14) and io_type>100 order by io_pri desc,io_time,wrk_no asc |
| | | </select> |
| | | |
| | | <select id="selectByWrkNo" resultMap="BaseResultMap"> |
| | | select top 1 * from dbo.asr_wrk_mast where wrk_no = #{wrkNo} order by io_pri desc,io_time,wrk_no asc |
| | | </select> |
| | | </mapper> |