src/main/java/com/zy/asrs/controller/ConsoleController.java
@@ -28,14 +28,12 @@ import com.zy.core.enums.SlaveType; import com.zy.core.model.CrnSlave; import com.zy.core.model.DevpSlave; import com.zy.core.model.RgvSlave; import com.zy.core.model.protocol.CrnProtocol; import com.zy.core.model.protocol.StaProtocol; import com.zy.core.properties.SlaveProperties; import com.zy.core.properties.SystemProperties; import com.zy.core.thread.BarcodeThread; import com.zy.core.thread.MelsecCrnThread; import com.zy.core.thread.ScaleThread; import com.zy.core.thread.SiemensCrnThread; import com.zy.core.thread.*; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -102,6 +100,13 @@ stations.putAll(devpThread.getStation()); } } for (RgvSlave rgv : slaveProperties.getRgv()) { RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, rgv.getId()); if (null != rgvThread) { // stations.putAll(rgvThread.getStation()); } } for (Map.Entry<Integer, StaProtocol> entry : stations.entrySet()) { SiteLatestDataVo vo = new SiteLatestDataVo(); StaProtocol staProtocol = entry.getValue(); src/main/java/com/zy/asrs/entity/BasRgvErrLog.java
@@ -18,7 +18,7 @@ private static final long serialVersionUID = 1L; @ApiModelProperty(value= "") @TableId(value = "id", type = IdType.INPUT) @TableId(value = "id", type = IdType.AUTO) private Long id; /** src/main/java/com/zy/asrs/entity/WrkMastSta.java
@@ -100,7 +100,7 @@ /** * 工作类型 */ @ApiModelProperty(value= "工作类型 1:取(叠盘) 2:放 3:取放 4:拆盘") @ApiModelProperty(value= "工作类型 1:取(叠盘) 2:拆盘 5:满取 6:满放") @TableField("wrk_type") private Integer wrkType; src/main/java/com/zy/asrs/mapper/WrkMastStaMapper.java
@@ -27,7 +27,7 @@ /* * 查询指定工作号任务 * */ WrkMastSta selectByWrkNo(@Param("workNo") Integer workNo); WrkMastSta selectByWrkNo(@Param("workNo") Long workNo); /* * 查询不干涉的可执行任务 src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -119,7 +119,7 @@ String barcode = barcodeThread.getBarcode(); if (!Cools.isEmpty(barcode)) { log.info("{}号条码扫描器检测条码信息:{}", inSta.getBarcode(), barcode); // log.info("{}号条码扫描器检测条码信息:{}", inSta.getBarcode(), barcode); if ("NG".endsWith(barcode) || "NoRead".equals(barcode)) { continue; } @@ -322,7 +322,7 @@ if (staProtocol.isAutoing() && staProtocol.isLoading() && staProtocol.isInEnable() && staProtocol.isPakMk()) { // WrkMast wrkMast = wrkMastMapper.selectPickStep(barcode); WrkMast wrkMast = wrkMastMapper.selectPakInStep3(staProtocol.getWorkNo().intValue()); WrkMast wrkMast = wrkMastMapper.selectPakInStep3(staProtocol.getWorkNo()); if (wrkMast == null) { // 无拣料数据 continue; @@ -449,7 +449,7 @@ // 下发站点信息 staProtocol.setWorkNo(wrkMast.getWrkNo()); staProtocol.setStaNo(wrkMast.getStaNo()); staProtocol.setStaNo(RouteUtils.CrnStaEnd(wrkMast.getStaNo(),wrkMast.getSourceStaNo())); if (!MessageQueue.offer(SlaveType.Devp, crnStn.getDevpPlcId(), new Task(2, staProtocol))) { continue; } @@ -1393,7 +1393,7 @@ CrnSlave.CrnStn crnStn = null; for (CrnSlave.CrnStn crnStn1 : slave.getCrnInStn()){ if(crnStn1.getStaNo() == wrkMast.getStaNo()){ if(crnStn1.getStaNo().equals(wrkMast.getStaNo())){ crnStn = crnStn1; break; } else { @@ -1665,7 +1665,7 @@ CrnSlave.CrnStn crnStn = null; for (CrnSlave.CrnStn crnStn1 : slave.getCrnOutStn()){ if(crnStn1.getStaNo() == wrkMast.getSourceStaNo()){ if(crnStn1.getStaNo().equals(wrkMast.getSourceStaNo())){ crnStn = crnStn1; break; } else { @@ -3838,11 +3838,12 @@ } // 只有当RGV等待WCS确认、自动 if (rgvProtocol.getStatusType() == RgvStatusType.WAITING if (rgvProtocol.getStatusType() == RgvStatusType.WORKING && rgvProtocol.getModeType() == RgvModeType.AUTO && (rgvProtocol.getStatusType1()==RgvStatusType.WAITING || rgvProtocol.getStatusType2()==RgvStatusType.WAITING ) ) { log.info("{}号小车等待wcs确认,状态{},参数{}",rgvProtocol.getRgvNo(),rgvProtocol.getStatusType(),rgvProtocol); if (rgvProtocol.getTaskNo1()!=0){ if (rgvProtocol.getTaskNo1()!=0&&rgvProtocol.getStatusType1()==RgvStatusType.WAITING){ if (rgvProtocol.getTaskNo1()==9999){ boolean rgvComplete = rgvComplete(rgvProtocol.getRgvNo()); if (!rgvComplete){ @@ -3853,7 +3854,7 @@ rgvMapUpdate(basRgvMap,basRgvMap.getStartRoute(),basRgvMap.getStartRoute()); break; } WrkMastSta wrkMastSta = wrkMastStaMapper.selectByWrkNo(rgvProtocol.getTaskNo1().intValue()); WrkMastSta wrkMastSta = wrkMastStaMapper.selectByWrkNo(rgvProtocol.getTaskNo1().longValue()); if (Cools.isEmpty(wrkMastSta) || wrkMastSta.getType()!=1 || wrkMastSta.getWrkSts()!=1){ log.error("未查到小车执行任务或者执行任务状态不符合!"+wrkMastSta); continue; @@ -3868,7 +3869,7 @@ BasRgvMap basRgvMap = basRgvMapMapper.selectById(rgvProtocol.getRgvNo()); basRgvMap.setNowRoute(rgvProtocol.getRgvPosI()); rgvMapUpdate(basRgvMap,basRgvMap.getStartRoute(),basRgvMap.getStartRoute()); }else if (rgvProtocol.getTaskNo2()!=0){ }else if (rgvProtocol.getTaskNo2()!=0 && rgvProtocol.getStatusType2()==RgvStatusType.WAITING){ if (rgvProtocol.getTaskNo2()==9999){ boolean rgvComplete = rgvComplete(rgvProtocol.getRgvNo()); if (!rgvComplete){ @@ -3879,7 +3880,7 @@ rgvMapUpdate(basRgvMap,basRgvMap.getStartRoute(),basRgvMap.getStartRoute()); break; } WrkMastSta wrkMastSta = wrkMastStaMapper.selectByWrkNo(rgvProtocol.getTaskNo2().intValue()); WrkMastSta wrkMastSta = wrkMastStaMapper.selectByWrkNo(rgvProtocol.getTaskNo2().longValue()); if (Cools.isEmpty(wrkMastSta) || wrkMastSta.getType()!=2){ log.error("未查到小车执行任务或者执行任务状态不符合!"+wrkMastSta); continue; @@ -3966,7 +3967,7 @@ /** * 执行小车搬运任务 */ public synchronized void rgvRunWrkMastEmptyStaPut() {//放 public synchronized void rgvRunWrkMastEmptyStaPut() {//拆盘 try{ for (RgvSlave rgvSlave:slaveProperties.getRgv()) { RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, rgvSlave.getId()); @@ -3983,7 +3984,7 @@ // 只有当RGV空闲、自动,工位二有物//rgv可用 if (rgvProtocol.getStatusType() == RgvStatusType.IDLE && rgvProtocol.getModeType() == RgvModeType.AUTO && rgvProtocol.getLoaded2()==1 //现场修改:叠盘机,不满都算无物,怎么判断需要跟电控对接 && (rgvProtocol.getLoaded2()==3 || rgvProtocol.getLoaded2()==1 )////0 无物;1 一层无物二层有物 (只能拆叠) ;2一层有物二层无物 ;3 1、2层都有物 ) { BasRgvMap basRgvMap = basRgvMapMapper.selectById(rgvProtocol.getRgvNo()); if (basRgvMap == null) { @@ -3994,12 +3995,12 @@ 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 && wrkMastSta.getWrkType()!=4)){// 2:空板 2:放 4:拆盘 if (wrkMastSta.getType()!=2 || wrkMastSta.getWrkType()!=2){// 2:空板 || 工作类型 1:取(叠盘) 2:拆盘 5:满取 6:满放 continue; } boolean sign = false; if (wrkMastSta.getStaStart()==0 && wrkMastSta.getStaEnd()!=0){//放 sign = rgvPutEmpty(rgvProtocol.getRgvNo(),wrkMastSta); sign = rgvPutEmpty(rgvProtocol.getRgvNo(),wrkMastSta);//拆盘 }else { continue; } @@ -4029,7 +4030,73 @@ } } public synchronized void rgvRunWrkMastEmptyStaTake() {//取 /** * 执行小车搬运任务 */ public synchronized void rgvRunWrkMastEmptyStaPutFull() {//满放 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.getLoaded2()==2 || rgvProtocol.getLoaded2()==3 ) ////0 无物;1 一层无物二层有物 ;2一层有物二层无物 (只能满放);3 1、2层都有物 ) { BasRgvMap basRgvMap = basRgvMapMapper.selectById(rgvProtocol.getRgvNo()); if (basRgvMap == null) { log.error("{}号RGV尚未在数据库地图中进行维护!", rgvProtocol.getRgvNo()); continue; } 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:满放 continue; } boolean sign = false; if (wrkMastSta.getStaStart()==0 && wrkMastSta.getStaEnd()!=0){//满放 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; }else { log.error("3857行,货物搬运任务:工作号{}所属任务下发后地图同步失败",wrkMastSta.getWrkNo()); } }else { log.error("工作号{}所属任务下发失败",wrkMastSta.getWrkNo()); } break; } } } }catch (Exception e){ log.error("3933行执行小车放空板任务下发失败"); log.error("3933行"+e); } } public synchronized void rgvRunWrkMastEmptyStaTake() {//叠盘 try{ for (RgvSlave rgvSlave:slaveProperties.getRgv()) { RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, rgvSlave.getId()); @@ -4046,7 +4113,7 @@ // 只有当RGV空闲、自动,工位二无物//rgv可用 if (rgvProtocol.getStatusType() == RgvStatusType.IDLE && rgvProtocol.getModeType() == RgvModeType.AUTO && rgvProtocol.getLoaded2()==0 //现场修改:叠盘机,不满都算无物,怎么判断需要跟电控对接 && (rgvProtocol.getLoaded2()==0 || rgvProtocol.getLoaded2()==1 ) //现场修改:叠盘机,////0 无物;1 一层无物二层有物(只能拆叠) ;2一层有物二层无物 (只能满放);3 1、2层都有物 ) { BasRgvMap basRgvMap = basRgvMapMapper.selectById(rgvProtocol.getRgvNo()); if (basRgvMap == null) { @@ -4057,12 +4124,75 @@ basRgvMap.setNowRoute(rgvProtocol.getRgvPosI()); //更新小车当前位置站点号 List<WrkMastSta> wrkMastStaList = wrkMastStaMapper.selectNoInterfereList(route, route); for (WrkMastSta wrkMastSta : wrkMastStaList){ if (wrkMastSta.getType()!=2 || wrkMastSta.getWrkType()!=1){// 2:空板 1:取 if (wrkMastSta.getType()!=2 || wrkMastSta.getWrkType()!=1){// 2:空板 || 工作类型 1:取(叠盘) 2:拆盘 5:满取 6:满放 continue; } boolean sign = false; if (wrkMastSta.getStaEnd()==0 && wrkMastSta.getStaStart()!=0){//取 sign = rgvTakeEmpty(rgvProtocol.getRgvNo(),wrkMastSta); 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; }else { log.error("3879行,货物搬运任务:工作号{}所属任务下发后地图同步失败",wrkMastSta.getWrkNo()); } }else { log.error("工作号{}所属任务下发失败",wrkMastSta.getWrkNo()); } break; } } } }catch (Exception e){ log.error("3989行执行小车取空板任务下发失败"); log.error("3989行"+e); } } public synchronized void rgvRunWrkMastEmptyStaTakeFull() {//满取 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.getLoaded2()==0 //现场修改:叠盘机,////0 无物;1 一层无物二层有物(只能拆叠) ;2一层有物二层无物 (只能满放);3 1、2层都有物 ) { BasRgvMap basRgvMap = basRgvMapMapper.selectById(rgvProtocol.getRgvNo()); if (basRgvMap == null) { log.error("{}号RGV尚未在数据库地图中进行维护!", rgvProtocol.getRgvNo()); continue; } 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()!=5){// 2:空板 || 工作类型 1:取(叠盘) 2:拆盘 5:满取 6:满放 continue; } boolean sign = false; if (wrkMastSta.getStaEnd()==0 && wrkMastSta.getStaStart()!=0){//取 sign = rgvTakeEmptyFull(rgvProtocol.getRgvNo(),wrkMastSta); }else { continue; } @@ -4174,14 +4304,16 @@ * */ public synchronized boolean rgvAvoidanceXY(Integer rgvId){ try{ BasRgvMap basRgvMap = basRgvMapMapper.selectById(rgvId); // 命令下发区 -------------------------------------------------------------------------- RgvCommand rgvCommand = new RgvCommand(); rgvCommand.setRgvNo(rgvId); // RGV编号 rgvCommand.setAckFinish1((short) 0); // 工位1任务完成确认位 rgvCommand.setTaskNo1((short)9999); // 工位1工作号 rgvCommand.setTaskMode1(RgvTaskModeType.GO_ORIGIN); // 工位1任务模式: 回原点 rgvCommand.setTaskMode1(RgvTaskModeType.X_MOVE); // 工位1任务模式: 回原点 rgvCommand.setDestinationStaNo1(basRgvMap.getLockStartRoute().shortValue()); rgvCommand.setCommand((short) 1); //工位1任务确认 if (!MessageQueue.offer(SlaveType.Crn, rgvId, new Task(9, rgvCommand))) { if (!MessageQueue.offer(SlaveType.Rgv, rgvId, new Task(9, rgvCommand))) { //step=2,工位1、2写任务; step=4,工位1写任务; step=5,工位2写任务 step=9,回原点 9999任务号 log.error("RGV命令下发失败,RGV号={},任务数据={}", rgvId, JSON.toJSON(rgvCommand)); return false; @@ -4209,7 +4341,7 @@ rgvCommand.setSourceStaNo1(wrkMastSta.getStaStart().shortValue()); //工位1起点 rgvCommand.setDestinationStaNo1(wrkMastSta.getStaEnd().shortValue()); //工位1目标站点 rgvCommand.setCommand((short) 1); //工位1任务确认 if (!MessageQueue.offer(SlaveType.Crn, rgvId, new Task(4, rgvCommand))) { 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; @@ -4234,7 +4366,7 @@ rgvCommand.setTaskMode1(RgvTaskModeType.FETCH); // 工位1任务模式: 取货 rgvCommand.setSourceStaNo1(wrkMastSta.getStaStart().shortValue()); //工位1起点 rgvCommand.setCommand((short) 1); //工位1任务确认 if (!MessageQueue.offer(SlaveType.Crn, rgvId, new Task(4, rgvCommand))) { 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; @@ -4259,7 +4391,7 @@ rgvCommand.setTaskMode1(RgvTaskModeType.PUT); // 工位1任务模式: 放货 rgvCommand.setDestinationStaNo1(wrkMastSta.getStaEnd().shortValue()); //工位1目标站点 rgvCommand.setCommand((short) 1); //工位1任务确认 if (!MessageQueue.offer(SlaveType.Crn, rgvId, new Task(4, rgvCommand))) { 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; @@ -4272,7 +4404,7 @@ } /* * 小车取空板至工位任务 * 小车取空板至工位任务 叠盘 * */ public synchronized boolean rgvTakeEmpty(Integer rgvId,WrkMastSta wrkMastSta){ try{ @@ -4284,7 +4416,7 @@ rgvCommand.setTaskMode2(RgvTaskModeType.FETCH); // 工位2任务模式: 取货 rgvCommand.setSourceStaNo2(wrkMastSta.getStaStart().shortValue()); //工位2起点 rgvCommand.setCommand((short) 2); //工位2任务确认 if (!MessageQueue.offer(SlaveType.Crn, rgvId, new Task(5, rgvCommand))) { 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; @@ -4297,7 +4429,7 @@ } /* * 小车放空板至输送线任务 * 小车放空板至输送线任务 //拆盘 * */ public synchronized boolean rgvPutEmpty(Integer rgvId,WrkMastSta wrkMastSta){ try{ @@ -4309,7 +4441,57 @@ rgvCommand.setTaskMode2(RgvTaskModeType.PUT); // 工位2任务模式: 放货 rgvCommand.setDestinationStaNo2(wrkMastSta.getStaEnd().shortValue()); //工位2目标站点 rgvCommand.setCommand((short) 2); //工位2任务确认 if (!MessageQueue.offer(SlaveType.Crn, rgvId, new Task(5, rgvCommand))) { 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; @@ -4359,7 +4541,7 @@ BasRgvMap basRgvMapOther = basRgvMapMapper.selectById(rgvNoOther); List<Integer> integers = RouteUtils.RouteMapCurrentFar(fallMerge, basRgvMapCurrent.getLockStartRoute()); Integer lockEndRoute = RouteUtils.RouteMapOtherFarStnNo(integers, basRgvMapCurrent.getLockStartRoute());//另一台小车可活动最远位置 basRgvMapOther.setStartRoute(lockEndRoute); basRgvMapOther.setEndRoute(lockEndRoute); basRgvMapMapper.updateById(basRgvMapOther); return true; }catch (Exception e){ src/main/java/com/zy/asrs/utils/RouteUtils.java
@@ -29,11 +29,11 @@ // 正序 public static final List<Integer> TRACK_POSITION_POSITIVE_SEQUENCE = new ArrayList<Integer>() {{ add(101);add(102);add(104);add(105);add(107);add(118);add(108);add(119);add(110);add(120);add(111);add(121);add(113);add(114);add(116);add(117); 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(116);add(117); }}; // 反序 public static final List<Integer> TRACK_POSITION_REVERSE_SEQUENCE = new ArrayList<Integer>() {{ add(117);add(116);add(114);add(113);add(121);add(111);add(120);add(110);add(119);add(108);add(118);add(107);add(105);add(104);add(102);add(101); add(117);add(116);add(114);add(113);add(123);add(121);add(111);add(120);add(110);add(119);add(108);add(107);add(118);add(105);add(104);add(122);add(102);add(101); }}; public static String zerofill(String msg, Integer count){ @@ -268,4 +268,77 @@ } } 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){ return 1; } public static short RgvPosStaTwo(Short posId){ switch (posId.intValue()){ case 1: case 2: return 116; 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: return 110; case 16: 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: return 104; default: return 0; } } 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/enums/RgvStatusType.java
@@ -10,6 +10,8 @@ PUTTING(12, "放货中"), WAITING(90, "任务完成等待WCS确认"), FETCHWAITING(91, "取货任务完成等待WCS确认"), SOS99(99, "报警99"), SOS100(100, "报警100") ; public Integer id; src/main/java/com/zy/core/enums/RgvTaskModeType.java
@@ -3,13 +3,13 @@ public enum RgvTaskModeType { NONE(0), // 无 FETCH(1), // 取货 PUT(2), // 放货 FETCH(1), // 取货 (空板)单取 PUT(2), // 放货 (空板)单放 FETCH_PUT(3), // 取放货 // X_MOVE(4), // 站位移转 // Y_MOVE(5), // 站位移转 // XY_MOVE(6), // 站位移转 GO_ORIGIN(7), // 回原点 X_MOVE(4), // 站位移转 FETCH_5(5), // (空板)满取 PUT_6(6), // (空板)满放 // GO_ORIGIN(7), // 回原点 // BACK_ORIGIN(8), // 回反原点 // CLEAR(9), // 清错 ; src/main/java/com/zy/core/model/protocol/RgvProtocol.java
@@ -57,7 +57,7 @@ /** * 工位1有物 */ public Short loaded1; public Short loaded1;//0 无物;1 有物 /** * RGV当前位置 @@ -94,7 +94,7 @@ /** * 工位2有物 */ public Short loaded2; public Short loaded2; //0 无物;1 一层无物二层有物(只能拆叠) ;2一层有物二层无物 (只能满放);3 1、2层都有物 /////////////////////////////////////////////////////////////////////////////////////// /** src/main/java/com/zy/core/thread/BarcodeThread.java
@@ -34,7 +34,7 @@ this.barcode.delete(0, this.barcode.length()); this.barcode.append(barcode); if(!Cools.isEmpty(barcode)) { log.info("{}号条码器,检索数据:{}", slave.getId(), this.barcode); // log.info("{}号条码器,检索数据:{}", slave.getId(), this.barcode); JSONObject jsonObject = new JSONObject(); jsonObject.put("time", DateUtils.convert(new Date(), DateUtils.yyyyMMddHHmmss_F)); jsonObject.put("barcode", barcode); src/main/java/com/zy/core/thread/RgvThread.java
@@ -11,6 +11,7 @@ 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; @@ -108,14 +109,14 @@ commandAvoidanceXY.setRgvNo(slave.getId()); // RGV编号 commandAvoidanceXY.setTaskNo1((short) 9999); // 工作号 commandAvoidanceXY.setAckFinish1((short) 1); // 任务完成确认位 commandAvoidanceXY.setTaskMode1(RgvTaskModeType.GO_ORIGIN); // 任务模式 commandAvoidanceXY.setTaskMode1(RgvTaskModeType.X_MOVE); // 任务模式 commandAvoidanceXY.setSourceStaNo1((short)0); // 源站 commandAvoidanceXY.setDestinationStaNo1((short)0); // 目标站 commandAvoidanceXY.setDestinationStaNo1(slave.getId()==1? (short) 101:(short)117); // 目标站 commandAvoidanceXY.setTaskNo2((short) 0); // 工作号 commandAvoidanceXY.setAckFinish2((short) 1); // 任务完成确认位 commandAvoidanceXY.setTaskMode2(RgvTaskModeType.GO_ORIGIN); // 任务模式 commandAvoidanceXY.setTaskMode2(RgvTaskModeType.X_MOVE); // 任务模式 commandAvoidanceXY.setSourceStaNo2((short)0); // 源站 commandAvoidanceXY.setDestinationStaNo2((short)0); // 目标站 commandAvoidanceXY.setDestinationStaNo2(slave.getId()==1? (short) 101:(short)117); // 目标站 commandAvoidanceXY.setCommand((short)0); write(commandAvoidanceXY); break; @@ -178,7 +179,7 @@ */ private void readStatus(){ try { OperateResultExOne<byte[]> result = siemensNet.Read("DB1.0", (short) 34); OperateResultExOne<byte[]> result = siemensNet.Read("DB101.0", (short) 34); if (result.IsSuccess) { if (null == rgvProtocol) { rgvProtocol = new RgvProtocol(); @@ -189,7 +190,7 @@ 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(siemensNet.getByteTransform().TransInt16(result.Content, 10)); 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)); @@ -333,10 +334,10 @@ short[] array = new short[5]; array[0] = command.getAckFinish1(); array[1] = command.getTaskNo1(); array[2] = command.getTaskMode1(); array[2] = command.getTaskMode1();//任务模式 array[3] = command.getSourceStaNo1(); array[4] = command.getDestinationStaNo1(); siemensNet.Write("DB100.20", command.getCommand()); // siemensNet.Write("DB100.20", 0); OperateResult result = siemensNet.Write("DB100.0", array); @@ -390,12 +391,12 @@ 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(); 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); src/main/java/com/zy/core/thread/SiemensDevpThread.java
@@ -49,7 +49,7 @@ add(112);add(113);add(114);add(115); add(116);add(117);add(118);add(119); add(120);add(121);add(122);add(123); add(124);add(125);add(126);add(127); // add(124);add(125);add(126);add(127); add(130);add(131); add(132);add(133);add(134);add(135); add(136);add(137);add(138);add(139); @@ -65,7 +65,7 @@ add(212); add(213);add(214);add(215);add(216); add(217);add(218);add(219);add(220); add(221);add(222); add(221);add(222);add(2000); }}; /** @@ -121,6 +121,10 @@ case 2: write((StaProtocol)task.getData()); break; // 写数据 ID+目标站 码垛完成 给输送线写任务完成 case 3: write3((StaProtocol)task.getData()); break; default: break; } @@ -173,7 +177,7 @@ } staProtocol.setWorkNo(siemensS7Net.getByteTransform().TransInt32(result.Content, i*8)); // 工作号 staProtocol.setStaNo(siemensS7Net.getByteTransform().TransInt32(result.Content, i*8 + 4)); // 目标站 staProtocol.setStaNo((int)siemensS7Net.getByteTransform().TransInt16(result.Content, i*8 + 4)); // 目标站 boolean[] status = siemensS7Net.getByteTransform().TransBool(result.Content, i*8 + 6, 2); staProtocol.setAutoing(status[0]); // 自动 @@ -231,7 +235,7 @@ OperateResultExOne<byte[]> result2 = siemensS7Net.Read("DB101.102",(short)(barcodeSize*10)); if (result2.IsSuccess) { for (int i = 0; i < barcodeSize; i++) { String barcode = siemensS7Net.getByteTransform().TransString(result2.Content,i*10,10, "UTF-8"); String barcode = siemensS7Net.getByteTransform().TransString(result2.Content,i*10,6, "UTF-8"); BarcodeThread barcodeThread = (BarcodeThread) SlaveConnection.get(SlaveType.Barcode, i + 1); if(!Cools.isEmpty(barcodeThread) && !barcodeThread.getBarcode().equals(barcode)) { barcodeThread.setBarcode(barcode); @@ -292,14 +296,63 @@ } ArrayList<Integer> staNos = getStaNo(); int index = staNos.indexOf(staProtocol.getSiteId()); int[] array = new int[2]; array[0] = staProtocol.getWorkNo(); array[1] = staProtocol.getStaNo(); OperateResult write = siemensS7Net.Write("DB100." + index*8, array); // int[] array = new int[2]; // array[0] = staProtocol.getWorkNo(); // array[1] = staProtocol.getStaNo(); // OperateResult write = siemensS7Net.Write("DB100." + index*8, array); // OperateResult write = siemensS7Net.Write("DB100." + index*2, staProtocol.getWorkNo()); // 工作号 // Thread.sleep(500); // OperateResult write1 = siemensS7Net.Write("DB101." + index*2, staProtocol.getStaNo()); // 目标站 OperateResult write = null; OperateResult write1 = null; //任务下发次数 int writeCount = 0; do { write = siemensS7Net.Write("DB100." + index*6, staProtocol.getWorkNo()); // 工作号 Thread.sleep(500); write1 = siemensS7Net.Write("DB100." + (index*6+4), staProtocol.getStaNo().shortValue()); // 目标站 if(write.IsSuccess || write1.IsSuccess){ writeCount=6; }else { writeCount++; log.error("写入输送线命令后读取失败。输送线plc编号={},站点数据={},写入次数={}", slave.getId(), JSON.toJSON(staProtocol), writeCount); } }while (writeCount<5); if (!write.IsSuccess || !write1.IsSuccess) { staProtocol = station.get(staProtocol.getSiteId()); if (staProtocol.getWorkNo() == 0 && staProtocol.getStaNo() ==0) { staProtocol.setPakMk(true); } OutputQueue.DEVP.offer(MessageFormat.format("【{0}】写入输送线站点数据失败。输送线plc编号={1},站点数据={2}", slave.getId(), JSON.toJSON(staProtocol))); log.error("写入输送线站点数据失败。输送线plc编号={},站点数据={}", slave.getId(), JSON.toJSON(staProtocol)); } else { OutputQueue.DEVP.offer(MessageFormat.format("【{0}】 输送线命令下发 [id:{1}] >>>>> {2}", DateUtils.convert(new Date()), slave.getId(), JSON.toJSON(staProtocol))); log.info("输送线命令下发 [id:{}] >>>>> 命令下发: {}", slave.getId(), JSON.toJSON(staProtocol)); } } /** * 写入 ID+目标站 =====> 单站点写入 码垛完成 给输送线写任务完成 */ private void write3(StaProtocol staProtocol) throws InterruptedException { if (null == staProtocol) { return; } ArrayList<Integer> staNos = getStaNo(); int index = staNos.indexOf(staProtocol.getSiteId()); OperateResult write = null; //任务下发次数 int writeCount = 0; do { write = siemensS7Net.Write("DB100." + index*6, (short)1); // 工作号 if(write.IsSuccess){ writeCount=6; }else { writeCount++; log.error("写入输送线命令后读取失败。输送线plc编号={},站点数据={},写入次数={}", slave.getId(), JSON.toJSON(staProtocol), writeCount); } }while (writeCount<5); if (!write.IsSuccess) { staProtocol = station.get(staProtocol.getSiteId()); @@ -313,7 +366,6 @@ log.info("输送线命令下发 [id:{}] >>>>> 命令下发: {}", slave.getId(), JSON.toJSON(staProtocol)); } } // 更新入出库模式 private void updateIoMode() throws InterruptedException { if (this.ioModeOf2F != IoModeType.NONE) { src/main/resources/application.yml
@@ -8,7 +8,7 @@ name: @pom.build.finalName@ datasource: driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver url: jdbc:sqlserver://192.168.4.15:1433;databasename=srjtasrs url: jdbc:sqlserver://127.0.0.1:1433;databasename=srjtasrs username: sa password: sa@123 mvc: @@ -49,7 +49,7 @@ # 堆垛机1 crn[0]: id: 1 ip: 192.168.4.250 ip: 192.168.18.13 port: 102 rack: 0 slot: 0 @@ -59,21 +59,35 @@ # 堆垛机入库站点 crnInStn[0]: devpPlcId: ${wcs-slave.devp[0].id} staNo: 007 staNo: 102 row: 3 bay: 1 lev: 1 # 堆垛机入库站点 crnInStn[1]: devpPlcId: ${wcs-slave.devp[1].id} staNo: 201 row: 3 bay: 1 lev: 2 # 堆垛机出库站点 crnOutStn[0]: devpPlcId: ${wcs-slave.devp[0].id} staNo: 008 staNo: 100 row: 2 bay: 1 lev: 1 # 堆垛机出库站点 crnOutStn[1]: devpPlcId: ${wcs-slave.devp[1].id} staNo: 200 row: 2 bay: 1 lev: 2 # 堆垛机2 crn[1]: id: 2 ip: 192.168.4.250 ip: 192.168.18.21 port: 102 rack: 0 slot: 0 @@ -83,21 +97,35 @@ # 堆垛机入库站点 crnInStn[0]: devpPlcId: ${wcs-slave.devp[0].id} staNo: 005 staNo: 105 row: 7 bay: 1 lev: 1 # 堆垛机入库站点 crnInStn[1]: devpPlcId: ${wcs-slave.devp[1].id} staNo: 203 row: 7 bay: 1 lev: 2 # 堆垛机出库站点 crnOutStn[0]: devpPlcId: ${wcs-slave.devp[0].id} staNo: 006 staNo: 103 row: 6 bay: 1 lev: 1 # 堆垛机出库站点 crnOutStn[1]: devpPlcId: ${wcs-slave.devp[1].id} staNo: 202 row: 6 bay: 1 lev: 1 # 堆垛机3 crn[2]: id: 3 ip: 192.168.4.250 ip: 192.168.18.29 port: 102 rack: 0 slot: 0 @@ -107,21 +135,35 @@ # 堆垛机入库站点 crnInStn[0]: devpPlcId: ${wcs-slave.devp[0].id} staNo: 003 staNo: 108 row: 11 bay: 1 lev: 1 # 堆垛机入库站点 crnInStn[1]: devpPlcId: ${wcs-slave.devp[1].id} staNo: 205 row: 11 bay: 1 lev: 2 # 堆垛机出库站点 crnOutStn[0]: devpPlcId: ${wcs-slave.devp[0].id} staNo: 004 staNo: 106 row: 10 bay: 1 lev: 1 # 堆垛机出库站点 crnOutStn[1]: devpPlcId: ${wcs-slave.devp[1].id} staNo: 204 row: 10 bay: 1 lev: 2 # 堆垛机4 crn[3]: id: 4 ip: 192.168.4.250 ip: 192.168.18.37 port: 102 rack: 0 slot: 0 @@ -131,21 +173,35 @@ # 堆垛机入库站点 crnInStn[0]: devpPlcId: ${wcs-slave.devp[0].id} staNo: 001 staNo: 111 row: 15 bay: 1 lev: 1 # 堆垛机入库站点 crnInStn[1]: devpPlcId: ${wcs-slave.devp[1].id} staNo: 207 row: 15 bay: 1 lev: 2 # 堆垛机出库站点 crnOutStn[0]: devpPlcId: ${wcs-slave.devp[0].id} staNo: 002 staNo: 109 row: 14 bay: 1 lev: 1 # 堆垛机出库站点 crnOutStn[1]: devpPlcId: ${wcs-slave.devp[1].id} staNo: 206 row: 14 bay: 1 lev: 2 # 堆垛机5 crn[4]: id: 5 ip: 192.168.4.250 ip: 192.168.18.45 port: 102 rack: 0 slot: 0 @@ -155,21 +211,35 @@ # 堆垛机入库站点 crnInStn[0]: devpPlcId: ${wcs-slave.devp[0].id} staNo: 001 row: 15 staNo: 114 row: 19 bay: 1 lev: 1 # 堆垛机入库站点 crnInStn[1]: devpPlcId: ${wcs-slave.devp[1].id} staNo: 209 row: 19 bay: 1 lev: 2 # 堆垛机出库站点 crnOutStn[0]: devpPlcId: ${wcs-slave.devp[0].id} staNo: 002 row: 14 staNo: 112 row: 18 bay: 1 lev: 1 # 堆垛机出库站点 crnOutStn[1]: devpPlcId: ${wcs-slave.devp[1].id} staNo: 208 row: 18 bay: 1 lev: 2 # 堆垛机6 crn[5]: id: 6 ip: 192.168.4.250 ip: 192.168.18.53 port: 102 rack: 0 slot: 0 @@ -179,22 +249,36 @@ # 堆垛机入库站点 crnInStn[0]: devpPlcId: ${wcs-slave.devp[0].id} staNo: 001 row: 15 staNo: 117 row: 23 bay: 1 lev: 1 # 堆垛机入库站点 crnInStn[1]: devpPlcId: ${wcs-slave.devp[1].id} staNo: 211 row: 23 bay: 1 lev: 2 # 堆垛机出库站点 crnOutStn[0]: devpPlcId: ${wcs-slave.devp[0].id} staNo: 002 row: 14 staNo: 115 row: 22 bay: 1 lev: 1 # 堆垛机出库站点 crnOutStn[1]: devpPlcId: ${wcs-slave.devp[1].id} staNo: 210 row: 22 bay: 1 lev: 2 # RGV穿梭车1 rgv[0]: id: 1 ip: 10.10.10.40 ip: 192.168.18.77 port: 502 rack: 0 slot: 0 @@ -222,7 +306,7 @@ # RGV穿梭车2 rgv[1]: id: 2 ip: 192.168.4.15 ip: 192.168.18.79 port: 502 rack: 0 slot: 0 @@ -251,7 +335,7 @@ # 输送线 devp[0]: id: 1 ip: 192.168.4.250 ip: 192.168.18.71 port: 102 rack: 0 slot: 0 @@ -309,23 +393,30 @@ # 输送线 devp[1]: id: 2 ip: 192.168.4.250 ip: 192.168.18.81 port: 102 rack: 0 slot: 0 # 入库口1 inSta[0]: staNo: 15 staNo: 217 barcode: ${wcs-slave.barcode[0].id} # 入库口1 inSta[1]: staNo: 221 barcode: ${wcs-slave.barcode[1].id} # 空板入库口1 emptyInSta[0]: staNo: 12 staNo: 212 # 出库口1 outSta[0]: staNo: 11 staNo: 212 # 出库口1 outSta[1]: staNo: 213 # 拣料入库口1 pickSta[0]: staNo: 11 staNo: 212 barcode: ${wcs-slave.barcode[0].id} # 条码扫描仪 src/main/resources/mapper/WrkMastStaMapper.xml
@@ -33,7 +33,7 @@ <select id="selectByWrkNo" resultMap="BaseResultMap"> select top 1 * from asr_wrk_mast_sta where 1=1 and wrk_no = #{wrkNo} and wrk_no = #{workNo} </select> <select id="selectNoInterfere" resultMap="BaseResultMap"> src/main/webapp/static/js/console.map.js
@@ -533,7 +533,7 @@ "type": "stn", "id": "site-130", "text": "130", "top": 380, "top": 297, "left": 266, "width": 100, "height": 20 @@ -541,15 +541,15 @@ "type": "stn", "id": "site-131", "text": "131", "top": 402, "top": 319, "left": 266, "width": 100, "height": 20 "height": 34 }, { "type": "stn", "id": "site-132", "text": "132", "top": 424, "top": 355, "left": 266, "width": 100, "height": 20 @@ -557,15 +557,15 @@ "type": "stn", "id": "site-133", "text": "133", "top": 446, "top": 377, "left": 266, "width": 100, "height": 20 "height": 42 }, { "type": "stn", "id": "site-134", "text": "134", "top": 468, "top": 421, "left": 266, "width": 100, "height": 20 @@ -573,26 +573,26 @@ "type": "stn", "id": "site-135", "text": "135", "top": 490, "top": 443, "left": 266, "width": 100, "height": 20 "height": 34 }, { "type": "stn", "id": "site-136", "text": "136", "top": 512, "top": 479, "left": 266, "width": 100, "height": 20 "height": 39 }, { "type": "stn", "id": "site-137", "text": "137", "top": 534, "top": 520, "left": 266, "width": 100, "height": 20 "height": 34 }, { "type": "stn", "id": "site-138", @@ -653,7 +653,7 @@ "type": "stn", "id": "site-118", "text": "118", "top": 380, "top": 297, "left": 368, "width": 100, "height": 20 @@ -661,7 +661,7 @@ "type": "stn", "id": "site-119", "text": "119", "top": 424, "top": 355, "left": 368, "width": 100, "height": 20 @@ -669,7 +669,7 @@ "type": "stn", "id": "site-120", "text": "120", "top": 468, "top": 421, "left": 368, "width": 100, "height": 20 @@ -677,7 +677,7 @@ "type": "stn", "id": "site-121", "text": "121", "top": 512, "top": 479, "left": 368, "width": 100, "height": 20 @@ -685,7 +685,7 @@ "type": "stn", "id": "site-122", "text": "122", "top": 534, "top": 183, "left": 368, "width": 100, "height": 20 @@ -710,7 +710,7 @@ "type": "stn", "id": "site-130", "text": "130", "top": 380, "top": 297, "left": 266, "width": 100, "height": 20 @@ -885,8 +885,8 @@ "height": 684 }, { "type": "stn", "id": "site-3", "text": "3", "id": "site-2000", "text": "2000", "top": 457, "left": 469, "width": 69, version/BarcodeThread1.java
@@ -47,7 +47,7 @@ String s = new String(read); if (!Cools.isEmpty(s)) { barcode = new String(read); log.info("{}号条码器,检索数据:{}", slave.getId(), this.barcode); // log.info("{}号条码器,检索数据:{}", slave.getId(), this.barcode); JSONObject jsonObject = new JSONObject(); jsonObject.put("time", DateUtils.convert(new Date(), DateUtils.yyyyMMddHHmmss_F)); jsonObject.put("barcode", barcode); version/BarcodeThread2.java
@@ -32,7 +32,7 @@ public void setBarcode(String barcode) { this.barcode.delete(0, this.barcode.length()); this.barcode.append(barcode); log.info("{}号条码器,检索数据:{}", slave.getId(), this.barcode); // log.info("{}号条码器,检索数据:{}", slave.getId(), this.barcode); JSONObject jsonObject = new JSONObject(); jsonObject.put("time", DateUtils.convert(new Date(), DateUtils.yyyyMMddHHmmss_F)); jsonObject.put("barcode", barcode);