From 64e65d1f25ac08a0890326d8b9065e6b7705f795 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?LAPTOP-S9HJSOEB=5C=E6=98=8A=E5=A4=A9?= Date: Fri, 14 Jun 2024 12:11:24 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=99=AE=E9=80=9A=E7=9B=98?= =?UTF-8?q?=E7=82=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../web/config/ConfigProperties.java | 7 + .../java/com/zhehekeji/web/entity/Stock.java | 2 + .../main/java/com/zhehekeji/web/pojo/Cmd.java | 6 +- .../com/zhehekeji/web/service/PlcService.java | 219 ++++++++++++++++++ .../web/service/ksec/KsecDecoder.java | 25 +- 5 files changed, 252 insertions(+), 7 deletions(-) diff --git a/web/src/main/java/com/zhehekeji/web/config/ConfigProperties.java b/web/src/main/java/com/zhehekeji/web/config/ConfigProperties.java index 64eb2c7..08e4522 100644 --- a/web/src/main/java/com/zhehekeji/web/config/ConfigProperties.java +++ b/web/src/main/java/com/zhehekeji/web/config/ConfigProperties.java @@ -48,6 +48,13 @@ public class ConfigProperties { private Integer serverPort; + private Rfid rfid; + + @Data + public static class Rfid { + + private Long scanTime = 5L; + } @Data public static class CameraConfig{ diff --git a/web/src/main/java/com/zhehekeji/web/entity/Stock.java b/web/src/main/java/com/zhehekeji/web/entity/Stock.java index 3370f6e..166c329 100644 --- a/web/src/main/java/com/zhehekeji/web/entity/Stock.java +++ b/web/src/main/java/com/zhehekeji/web/entity/Stock.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModelProperty; import lombok.AllArgsConstructor; +import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; @@ -13,6 +14,7 @@ import java.time.LocalDateTime; @TableName("`stock`") @NoArgsConstructor @AllArgsConstructor +@Builder public class Stock { @TableId(type = IdType.AUTO) diff --git a/web/src/main/java/com/zhehekeji/web/pojo/Cmd.java b/web/src/main/java/com/zhehekeji/web/pojo/Cmd.java index acdeeea..b38aa53 100644 --- a/web/src/main/java/com/zhehekeji/web/pojo/Cmd.java +++ b/web/src/main/java/com/zhehekeji/web/pojo/Cmd.java @@ -24,7 +24,11 @@ public enum Cmd { D2, E, E1, - + SC, + SC01, + SC02, + SC03, + SC04 ; public static Boolean isBaseAction(String code){ return code.equals(C1.name()) || code.equals(C2.name()) || code.equals(C3.name()) || code.equals(C4.name()); diff --git a/web/src/main/java/com/zhehekeji/web/service/PlcService.java b/web/src/main/java/com/zhehekeji/web/service/PlcService.java index 65954c6..3d6e205 100644 --- a/web/src/main/java/com/zhehekeji/web/service/PlcService.java +++ b/web/src/main/java/com/zhehekeji/web/service/PlcService.java @@ -15,6 +15,8 @@ import com.zhehekeji.web.service.client.ClientChanel; import com.zhehekeji.web.service.client.ECResultMessage; import com.zhehekeji.web.service.client.SCTransmission; import com.zhehekeji.web.entity.EmptyCheckPic; +import com.zhehekeji.web.service.hikLightSource.HikControlSocket; +import com.zhehekeji.web.service.sick.SickSocket; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; @@ -254,6 +256,223 @@ public class PlcService { } } + public Boolean check(PlcCmdInfo plcCmdInfo,String cmdCode,String wmsCode,String wmsTrayCode,String wmsCatagary){ + + long startTime = System.currentTimeMillis(); + Street street = streetService.getStreetByPlcId(plcCmdInfo.getPlcId()); + CronTab.putTime(street.getId()); + List lightSources = lightSourceMapper.selectList(new QueryWrapper().eq("street_id",street.getId())); + lightSources.forEach(lightSource -> { + HikControlSocket.openLight(lightSource.getIp(),lightSource.getPort(),configProperties.getLightSource().getIndex(),1); + }); + Integer cameraId = getCameraByPlcCmd(plcCmdInfo,plcCmdInfo.getLeftRight1()); + + //蜜雪冰城拍摄货物顶部时用同侧相机 + Integer leftRightTop = plcCmdInfo.getLeftRight1() == 1 ? 2 : 1; + Integer cameraIdTop = getCameraByPlcCmd(plcCmdInfo, leftRightTop); + if(plcCmdInfo.getSeparation1() == 1 && configProperties.getScanCodeMode().getTray() == 2){ + //内测 + String c = cmdCode + "-" + plcCmdInfo.getLeftRightStr(1) + "-IN"; + log.info("camera ptz"+c); + gyrateCameraByCode(cameraIdTop, c); + }else { + log.info("camera ptz"+cmdCode); + gyrateCameraByCode(cameraIdTop, cmdCode); + try { + Thread.sleep(configProperties.getCameraConfig().getDelayCaptureTime()); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + + + String path = PathUtil.createFileNameByRowColumn("jpg", cameraId, plcCmdInfo.getRow1(), plcCmdInfo.getColumn1()); + try { + + cameraCapture(cameraId, false, null, path); + } catch (NullPointerException e) { + log.error("相机{}未连接无法拍照", cameraId); + } + //托盘码 + String trayCode = ""; + Boolean trayCheck = Boolean.TRUE; + //扫托盘码 + if(configProperties.getScanCodeMode().getTray() == 2) { + log.info("扫码类型:" + configProperties.getScanCodeMode().getTray()); + //托盘使用sick扫码枪 + SensorGun sensorGun = sensorService.getSensorByPlc(street.getId(), plcCmdInfo.getLeftRight1()); + if (sensorGun == null) { + trayCode = "扫码枪未配置"; + trayCheck = Boolean.FALSE; + log.error("no sensor gun config in database ,street id:{},direction:{}", street.getId(), plcCmdInfo.getLeftRight1()); + } else { + trayCode = SickSocket.readOCR(sensorGun.getIp(), sensorGun.getPort()); + log.info("sensor tray code:{}", trayCode); + if ("".equals(wmsTrayCode)) { + //托盘码为空,无货物 + //只要扫码枪未识别出条码,即认为盘点正确 + if (StringUtils.isEmpty(trayCode) || trayCode.equals("NoRead")) { + trayCode = "无货物"; + trayCheck = Boolean.TRUE; + } else { + trayCode = "扫码枪识别异常"; + trayCheck = Boolean.FALSE; + log.warn("sick ocr error:{}", trayCode); + } + } else { + if (StringUtils.isEmpty(trayCode) || trayCode.equals("NoRead")) { + trayCode = "扫码枪识别异常"; + trayCheck = Boolean.FALSE; + log.warn("sick ocr error:{}", trayCode); + } else { + //扫到就认为正常 + trayCheck = Boolean.TRUE; + } + } + } + }else + if(configProperties.getScanCodeMode().getTray() == 3){ + //扫到的码 + Set tags = new HashSet<>(); + try { + RFIDCheck(plcCmdInfo); + Thread.sleep(1000 * configProperties.getRfid().getScanTime()); + } catch (Exception e) { + e.printStackTrace(); + } finally { + tags = RFIDStop(plcCmdInfo); + log.info("盘点rfid扫描结果:" + tags); + } + if (tags !=null && tags.contains(wmsTrayCode)) { + //托盘码为空,无货物 + //只要扫码枪未识别出条码,即认为盘点正确 + trayCode = wmsTrayCode; + trayCheck = Boolean.TRUE; + + } else { + trayCode = trayCode+ "扫码枪识别异常"; + trayCheck = Boolean.FALSE; + log.warn("rfid error:{}", trayCode); + + } + + } + Boolean trayGoodCheck = Boolean.TRUE; + + //扫货物 + if(configProperties.getScanCodeMode().getGoods() == 2) { + log.info("扫码类型:" + configProperties.getScanCodeMode().getTray()); + //托盘使用sick扫码枪 + SensorGun sensorGun = sensorService.getSensorByPlc(street.getId(), plcCmdInfo.getLeftRight1()); + if (sensorGun == null) { + trayCode = "扫码枪识别异常"; + trayGoodCheck = Boolean.FALSE; + log.error("no sensor gun config in database ,street id:{},direction:{}", street.getId(), plcCmdInfo.getLeftRight1()); + } else { + trayCode = SickSocket.readOCR(sensorGun.getIp(), sensorGun.getPort()); + log.info("sensor tray code:{}", trayCode); + if ("".equals(wmsTrayCode)) { + //托盘码为空,无货物 + //只要扫码枪未识别出条码,即认为盘点正确 + if (StringUtils.isEmpty(trayCode) || trayCode.equals("NoRead")) { + trayCode = ""; + trayGoodCheck = Boolean.TRUE; + } else { + trayCode = "扫码枪识别异常"; + trayGoodCheck = Boolean.FALSE; + log.warn("sick ocr error:{}", trayCode); + } + } else { + if (StringUtils.isEmpty(trayCode) || trayCode.equals("NoRead")) { + trayCode = "扫码枪识别异常"; + trayGoodCheck = Boolean.FALSE; + log.warn("sick ocr error:{}", trayCode); + } else { + //扫到就认为正常 + trayGoodCheck = Boolean.TRUE; + } + } + } + }else if(configProperties.getScanCodeMode().getGoods() == 3){ + Set tags = new HashSet<>(); + try { + RFIDCheck(plcCmdInfo); + Thread.sleep(1000 * configProperties.getRfid().getScanTime()); + } catch (Exception e) { + e.printStackTrace(); + } finally { + tags = RFIDStop(plcCmdInfo); + log.info("盘点rfid扫描结果:" + tags); + } + if (tags !=null && tags.contains(wmsTrayCode)) { + //托盘码为空,无货物 + //只要扫码枪未识别出条码,即认为盘点正确 + trayCode = wmsTrayCode; + trayGoodCheck = Boolean.TRUE; + + } else { + trayCode = trayCode+ "扫码枪识别异常"; + trayGoodCheck = Boolean.FALSE; + log.warn("rfid error:{}", trayCode); + + } + } + + + OrderInfo orderInfo = new OrderInfo(street, plcCmdInfo, 1, cmdCode); + Stock stock = stockMapper.getByStreetAndDirectionAndSideAndRowColumn(orderInfo.getStreetId(), plcCmdInfo.getLeftRight1(), orderInfo.getSeparation(), orderInfo.getRow(), orderInfo.getColumn()); + String scanCode = null; + + //货物使用球机扫码 + + log.info("code:{}", scanCode); + //核对异常 + Integer status = 1; + //托盘和货物都正确 + if (trayCheck && trayGoodCheck ) { + status = 2; + } + if (stock == null) { + stock = Stock.builder() + .checkNum(plcCmdInfo.getOrderNum()) + .lotnum(plcCmdInfo.getLotnum()) + .code(scanCode) + .wmsCode(wmsCode) + .wmsTrayCode(wmsTrayCode) + .trayCode(trayCode) + .streetId(orderInfo.getStreetId()) + .direction(plcCmdInfo.getLeftRight1()) + .side(orderInfo.getSeparation()) + .row(orderInfo.getRow()) + .column(orderInfo.getColumn()) + .status(status) + .checkPic(path) + .exportTime(LocalDateTime.now()).build(); + stockMapper.insert(stock); + } else { + stock.setStatus(status); + stock.setLotnum(plcCmdInfo.getLotnum()); + stock.setExportTime(LocalDateTime.now()); + stock.setCheckPic(path); + stock.setCheckNum(plcCmdInfo.getOrderNum()); + stock.setTrayCode(trayCode); + stock.setWmsTrayCode(wmsTrayCode); + stock.setCode(scanCode); + stock.setWmsCode(wmsCode); + stockMapper.updateById(stock); + } + checkLog(stock); +// StockCheckRunnable stockCheckRunnable = new StockCheckRunnable(street,plcCmdInfo,cmdCode,stockMapper,path,checkLogMapper,configProperties.getScanCodeMode().getGoods(),wmsCode,wmsTrayCode,trayCode,trayCheck,configProperties,sensorGun); +// threadPoolExecutor.execute(stockCheckRunnable); + //还原相机 + gyrateCameraByCode(cameraId, "C5"); + long end = System.currentTimeMillis(); + long s = end - startTime; + log.info("time:{}millisecond", s); + + return true; + } + public void gyrateCamera(PlcCmdInfo plcCmdInfo,String code){ Street street = streetService.getStreetByPlcId(plcCmdInfo.getPlcId()); if(street == null){ diff --git a/web/src/main/java/com/zhehekeji/web/service/ksec/KsecDecoder.java b/web/src/main/java/com/zhehekeji/web/service/ksec/KsecDecoder.java index 625ee81..3533245 100644 --- a/web/src/main/java/com/zhehekeji/web/service/ksec/KsecDecoder.java +++ b/web/src/main/java/com/zhehekeji/web/service/ksec/KsecDecoder.java @@ -148,7 +148,7 @@ public class KsecDecoder extends DelimiterBasedFrameDecoder { log.info("action code,{},orderInfo:{}", code, plcCmdInfo.toString()); if (Cmd.isBaseAction(code)) { //执行动作,需要保存执行到第几步了 - Integer times = GoodsActionTimes.put(plcCmdInfo.getOrderNum()); + Integer times = Integer.parseInt(code.substring(1)); plcCmdInfo.setTimes(times); code = code + "-" + plcCmdInfo.getLeftRightStr(times) + plcCmdInfo.getInOutStr(times); //执行动作 @@ -199,14 +199,22 @@ public class KsecDecoder extends DelimiterBasedFrameDecoder { // ksecInfo.getData().setAckStatus(0); // } // ctx.channel().writeAndFlush(ksecInfo); - //rfid的逻辑 - String code = dataInfo.getCmdName(); - if("E1".equals(code)){ - plcService.RFIDCheck(plcCmdInfo); + + //转球机到盘点位 然后拍照 + plcCmdInfo.setTimes(1); + //成都蜜雪冰城 将lotnum当成托盘条码描述 + Boolean ok = plcService.check(plcCmdInfo,ksecInfo.getData().getCmdName(), dataInfo.getCode(), dataInfo.getTrayCode(), dataInfo.getLotnum()); +// Boolean ok = true; + if(ok){ + ksecInfo.getData().setAckStatus(1); }else { - plcService.RFIDStop(plcCmdInfo); + ksecInfo.getData().setAckStatus(0); } + ctx.channel().writeAndFlush(ksecInfo); + log.info("盘点结束:"+ksecInfo.getData().toString()); + }else if (Cmd.SC.name().equals(ksecInfo.getType())) { + //plcService.checkVision(); } //找到该货位的最后一张照片与现在的照片比照 //plcService.recordStock(plcCmdInfo, dataInfo.getCode(), 0, 0); @@ -214,4 +222,9 @@ public class KsecDecoder extends DelimiterBasedFrameDecoder { in.release(); } } + + public static void main(String[] args) { + System.out.println(Integer.parseInt("C2".substring(1))); + ; + } }