From 5c9194b9a3948d78023b4ba5a7cc7733b96b814a Mon Sep 17 00:00:00 2001 From: yiming Date: Thu, 23 Jun 2022 10:48:23 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E7=9B=98=E7=82=B9=E6=89=93?= =?UTF-8?q?=E5=BC=80=E5=85=89=E6=BA=90=EF=BC=8C10=E5=88=86=E9=92=9F?= =?UTF-8?q?=E4=B9=8B=E5=86=85=E6=97=A0=E7=9B=98=E7=82=B9=E5=88=99=E5=85=B3?= =?UTF-8?q?=E9=97=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../web/config/ConfigProperties.java | 11 ++++ .../com/zhehekeji/web/service/CronTab.java | 52 +++++++++++++++ .../com/zhehekeji/web/service/PlcService.java | 54 +++++++++++----- .../web/service/StockCheckRunnable.java | 35 +++-------- .../web/service/ksec/KescFilter.java | 2 +- .../web/service/ksec/KsecDecoder.java | 63 +++++++++++++------ .../web/service/robotic/ProtocolDecoder.java | 13 ++-- web/src/main/resources/application-prod.yml | 17 ++++- 8 files changed, 182 insertions(+), 65 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 a5e34c9..2c919dd 100644 --- a/web/src/main/java/com/zhehekeji/web/config/ConfigProperties.java +++ b/web/src/main/java/com/zhehekeji/web/config/ConfigProperties.java @@ -51,6 +51,17 @@ public class ConfigProperties { private Long delayCaptureTime; + private Long runningDelayCaptureTime; + + private Long C1DelayCaptureTime; + private Long C2DelayCaptureTime; + private Long C2OutDelayCaptureTime; + private Long C3DelayCaptureTime; + private Long C4DelayCaptureTime; + private Long C4OutDelayCaptureTime; + private Long B2DelayTime; + private Long B2OutDelayTime; + private Long delayDownloadMp4; } diff --git a/web/src/main/java/com/zhehekeji/web/service/CronTab.java b/web/src/main/java/com/zhehekeji/web/service/CronTab.java index e96f7f7..eb0a591 100644 --- a/web/src/main/java/com/zhehekeji/web/service/CronTab.java +++ b/web/src/main/java/com/zhehekeji/web/service/CronTab.java @@ -1,7 +1,15 @@ package com.zhehekeji.web.service; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.zhehekeji.web.config.ConfigProperties; +import com.zhehekeji.web.entity.LightSource; +import com.zhehekeji.web.mapper.LightSourceMapper; +import com.zhehekeji.web.service.damLightSource.JYDAMEquip; +import com.zhehekeji.web.service.damLightSource.JYDamHelper; +import com.zhehekeji.web.service.hikLightSource.HikControlSocket; +import io.swagger.models.auth.In; import lombok.extern.slf4j.Slf4j; +import net.sf.cglib.core.Local; import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; @@ -9,10 +17,15 @@ import org.springframework.stereotype.Component; import javax.annotation.Resource; import java.io.File; import java.io.IOException; +import java.math.BigInteger; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.attribute.BasicFileAttributes; import java.time.*; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; @Component @EnableScheduling @@ -21,9 +34,16 @@ public class CronTab { @Resource private ConfigProperties configProperties; + @Resource + private LightSourceMapper lightSourceMapper; private static LocalDateTime now; + private static Map lightTimeMap = new HashMap<>(); + + //10分钟 + private static BigInteger timeDIff = BigInteger.valueOf(10*60*1000); + @Scheduled(cron = "0 0 0 * * ?") //@Scheduled(cron = "0 0/1 * * * *") public void file() { @@ -35,6 +55,38 @@ public class CronTab { checkFileTime(dir2,configProperties.getDeleteFileDays()); } + public static void putTime(Integer streetId){ + lightTimeMap.put(streetId,System.currentTimeMillis()); + } + + @Scheduled(cron = "0 0/1 * * * ?") + public void lightStatus() { + log.debug(" lightStatus"); + long timeStamp = System.currentTimeMillis(); + + Iterator> it = lightTimeMap.entrySet().iterator(); + while (it.hasNext()){ + Map.Entry entry = it.next(); + if((BigInteger.valueOf(timeStamp).subtract(BigInteger.valueOf(entry.getValue()))).compareTo(timeDIff) > 0){ + List lightSources = lightSourceMapper.selectList(new QueryWrapper().eq("street_id",entry.getKey())); + lightSources.forEach(lightSource -> { + if(configProperties.getLightSource().getType() == 1){ + + JYDAMEquip equip = JYDamHelper.Connect(lightSource.getIp(),lightSource.getPort()); + JYDamHelper.closeDO(equip,configProperties.getLightSource().getIndex()); + Integer status = JYDamHelper.ReadStatus(equip,configProperties.getLightSource().getNum(),configProperties.getLightSource().getIndex()); + log.info("ip:{},status:{}",lightSource.getIp(),status); + equip.DisConnect(); + }else if(configProperties.getLightSource().getType() == 2){ + HikControlSocket.openLight(lightSource.getIp(),lightSource.getPort(),configProperties.getLightSource().getIndex(),0); + } + }); + it.remove(); + } + } + } + + public static void checkFileTime(File dir,int days) { if(!dir.exists()){ return; 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 f20df27..fc42855 100644 --- a/web/src/main/java/com/zhehekeji/web/service/PlcService.java +++ b/web/src/main/java/com/zhehekeji/web/service/PlcService.java @@ -201,7 +201,7 @@ public class PlcService { * @param plcCmdInfo * @param times */ - public void action(PlcCmdInfo plcCmdInfo, Integer times, String code) { + public void action(PlcCmdInfo plcCmdInfo, Integer times, String code) throws InterruptedException { Street street = streetService.getStreetByPlcId(plcCmdInfo.getPlcId()); if (street == null) { log.error("street not found ,plcId :{}", plcCmdInfo.getPlcId()); @@ -209,9 +209,7 @@ public class PlcService { } OrderInfo orderInfo = new OrderInfo(street, plcCmdInfo, times, code); String path = null; - /** - * 拍照是C2 C4拍照(取货完成、放货完成) - */ + Boolean needCapture = doNeedCaptureByCode(orderInfo.getCmdCode()); /*** * 判断该巷道有几个相机 @@ -223,22 +221,43 @@ public class PlcService { Integer cameraId = getCameraByPlcCmd(plcCmdInfo,orderInfo.getLeftRight()); gyrateCameraByCode(cameraId,orderInfo.getCmdCode()); if(needCapture){ - Boolean delay = false; - if(code.startsWith("C1") || code.startsWith("C3")){ - delay = true; - } + Boolean delay = true; Integer row = 0; Integer column = 0; + Integer sep = 0; if(times<=2){ row = plcCmdInfo.getRow1(); column = plcCmdInfo.getColumn1(); + sep = plcCmdInfo.getSeparation1(); }else { row = plcCmdInfo.getRow2(); column = plcCmdInfo.getColumn2(); + sep = plcCmdInfo.getSeparation2(); } - path = PathUtil.createFileNameByRowColumn("jpg",cameraId,row,column); + long delayTime = 0; + + if(code.startsWith("C1")){ + + delayTime = configProperties.getCameraConfig().getC1DelayCaptureTime(); + }else if(code.startsWith("C2")){ + if(sep == 1){ + delayTime = configProperties.getCameraConfig().getC2DelayCaptureTime(); + }else { + delayTime = configProperties.getCameraConfig().getC2OutDelayCaptureTime(); + } + + }else if(code.startsWith("C3")){ + delayTime = configProperties.getCameraConfig().getC3DelayCaptureTime(); - path = cameraCapture(cameraId,delay,configProperties.getCameraConfig().getDelayCaptureTime(),path); + }else if(code.startsWith("C4")){ + if(sep == 1){ + delayTime = configProperties.getCameraConfig().getC4DelayCaptureTime(); + }else { + delayTime = configProperties.getCameraConfig().getC4OutDelayCaptureTime(); + } + } + path = PathUtil.createFileNameByRowColumn("jpg",cameraId,row,column); + path = cameraCapture(cameraId,delay,delayTime,path); } //update order info after capture if (path != null && needCapture) { @@ -248,10 +267,10 @@ public class PlcService { if(times == 2){ if(street.getCamera2Id() != null){ - gyrateCameraByCodeTimeLater(street.getCamera2Id(),"C5",configProperties.getCameraConfig().getDelayCaptureTime()+100); + gyrateCameraByCodeTimeLater(street.getCamera2Id(),"C5",configProperties.getCameraConfig().getC2OutDelayCaptureTime()+500); } if(street.getCamera1Id() != null){ - gyrateCameraByCodeTimeLater(street.getCamera1Id(),"C5",configProperties.getCameraConfig().getDelayCaptureTime()+100); + gyrateCameraByCodeTimeLater(street.getCamera1Id(),"C5",configProperties.getCameraConfig().getC2OutDelayCaptureTime()+500); } } } @@ -558,6 +577,7 @@ public class PlcService { long startTime = System.currentTimeMillis(); Street street = streetService.getStreetByPlcId(plcCmdInfo.getPlcId()); + CronTab.putTime(street.getId()); Integer cameraId = getCameraByPlcCmd(plcCmdInfo,plcCmdInfo.getLeftRight1()); gyrateCameraByCode(cameraId, cmdCode); try { @@ -572,10 +592,10 @@ public class PlcService { Boolean trayCheck = Boolean.TRUE; //如果是用扫码枪 扫 托盘码,就直接扫 //if(configProperties.getScanCodeMode().getTray() == 2){ - + SensorGun sensorGun = sensorService.getSensorByPlc(street.getId(),plcCmdInfo.getLeftRight1()); if(plcCmdInfo.getSeparation1() == 1 && configProperties.getScanCodeMode().getTray() == 2){ //托盘使用sick扫码枪 - SensorGun sensorGun = sensorService.getSensorByPlc(street.getId(),plcCmdInfo.getLeftRight1()); + if(sensorGun == null){ trayCode = "识别异常"; trayCheck = Boolean.FALSE; @@ -610,7 +630,7 @@ public class PlcService { //RFID RFID rfid = rfidService.getRFIDByPlc(street.getId()); } - StockCheckRunnable stockCheckRunnable = new StockCheckRunnable(street,plcCmdInfo,cmdCode,stockMapper,path,checkLogMapper,configProperties.getScanCodeMode().getGoods(),wmsCode,wmsTrayCode,trayCode,trayCheck,configProperties); + StockCheckRunnable stockCheckRunnable = new StockCheckRunnable(street,plcCmdInfo,cmdCode,stockMapper,path,checkLogMapper,configProperties.getScanCodeMode().getGoods(),wmsCode,wmsTrayCode,trayCode,trayCheck,configProperties,sensorGun); threadPoolExecutor.execute(stockCheckRunnable); long end = System.currentTimeMillis(); @@ -623,4 +643,8 @@ public class PlcService { stockMapper.truncate(); } + public ConfigProperties getConfigProperties(){ + return configProperties; + } + } diff --git a/web/src/main/java/com/zhehekeji/web/service/StockCheckRunnable.java b/web/src/main/java/com/zhehekeji/web/service/StockCheckRunnable.java index 31f551a..80eee13 100644 --- a/web/src/main/java/com/zhehekeji/web/service/StockCheckRunnable.java +++ b/web/src/main/java/com/zhehekeji/web/service/StockCheckRunnable.java @@ -3,11 +3,13 @@ package com.zhehekeji.web.service; import codeDetector.BarcodeDetector; import com.zhehekeji.web.config.ConfigProperties; import com.zhehekeji.web.entity.CheckLog; +import com.zhehekeji.web.entity.SensorGun; import com.zhehekeji.web.entity.Stock; import com.zhehekeji.web.entity.Street; import com.zhehekeji.web.lib.OrderInfo; import com.zhehekeji.web.mapper.CheckLogMapper; import com.zhehekeji.web.mapper.StockMapper; +import com.zhehekeji.web.service.sick.SickSocket; import lombok.extern.slf4j.Slf4j; import org.springframework.util.StringUtils; @@ -33,8 +35,10 @@ public class StockCheckRunnable implements Runnable { private ConfigProperties configProperties; + private SensorGun sensorGun; - public StockCheckRunnable(Street street, PlcCmdInfo plcCmdInfo, String cmdCode, StockMapper stockMapper,String path,CheckLogMapper checkLogMapper,Integer goodsActionTimes,String wmsCode,String wmsTrayCode,String trayCode,Boolean trayCheck,ConfigProperties configProperties){ + + public StockCheckRunnable(Street street, PlcCmdInfo plcCmdInfo, String cmdCode, StockMapper stockMapper, String path, CheckLogMapper checkLogMapper, Integer goodsActionTimes, String wmsCode, String wmsTrayCode, String trayCode, Boolean trayCheck, ConfigProperties configProperties, SensorGun sensorGun){ this.street = street; this.plcCmdInfo = plcCmdInfo; this.cmdCode = cmdCode; @@ -47,7 +51,7 @@ public class StockCheckRunnable implements Runnable { this.trayCode = trayCode; this.trayCheck = trayCheck; this.configProperties = configProperties; - + this.sensorGun = sensorGun; } @Override @@ -58,29 +62,7 @@ public class StockCheckRunnable implements Runnable { Boolean codeCheck = Boolean.TRUE; Boolean trayCodeCheck = Boolean.TRUE; //货物使用球机扫码 - /*if(configProperties.getScanCodeMode().getGoods() == 1){ - if("".equals(wmsCode)){ - //空货物的处理 - //如果系统货物为空,则只要扫码识别未出结果,就认为无货物 - scanCode = BarcodeDetector.detectBestCodeUntilOK(configProperties.getSavePath().getMediaPath()+path,configProperties.getScanCodeMode().getGoodsCodeTypes()); - if(StringUtils.isEmpty(scanCode)|| scanCode.equals("Unrecognized")){ - codeCheck = Boolean.TRUE; - scanCode = ""; - }else { - codeCheck = wmsCode.equals(scanCode); - } - }else { - scanCode = BarcodeDetector.detectBestCodeUntilOK(configProperties.getSavePath().getMediaPath()+path,configProperties.getScanCodeMode().getGoodsCodeTypes()); - if(StringUtils.isEmpty(scanCode)){ - log.error("row:{},cloumn:{}",plcCmdInfo.getRow1(),plcCmdInfo.getColumn1()); - log.error("detectBestBarCode:{}",scanCode); - scanCode = "识别异常"; - codeCheck = Boolean.FALSE; - }else { - codeCheck = wmsCode.equals(scanCode); - } - } - }*/ + if(configProperties.getScanCodeMode().getTray() == 2 && plcCmdInfo.getSeparation1() == 2){ //托盘使用球机扫码 if("".equals(wmsTrayCode)){ @@ -102,9 +84,10 @@ public class StockCheckRunnable implements Runnable { trayCode = "识别异常"; trayCheck = Boolean.FALSE; }else { - trayCheck = wmsCode.equals(trayCode); + trayCheck = wmsTrayCode.equals(trayCode); } } + } log.info("code:{}",scanCode); //核对异常 diff --git a/web/src/main/java/com/zhehekeji/web/service/ksec/KescFilter.java b/web/src/main/java/com/zhehekeji/web/service/ksec/KescFilter.java index c6223eb..57a8aca 100644 --- a/web/src/main/java/com/zhehekeji/web/service/ksec/KescFilter.java +++ b/web/src/main/java/com/zhehekeji/web/service/ksec/KescFilter.java @@ -37,7 +37,7 @@ public class KescFilter extends ChannelInitializer { //4秒发一次心跳 ph.addLast(new IdleStateHandler(0, 4, 0, TimeUnit.SECONDS)); ByteBuf byteBuf = Unpooled.copiedBuffer(">".getBytes()); - ph.addLast(new KsecDecoder(1000,byteBuf,plcService)); + ph.addLast(new KsecDecoder(10000,byteBuf,plcService)); ph.addLast(new KescEncoder()); ph.addLast(new KescNettyHandler(ksecInfo,nettyClient)); } 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 8fd8c98..2c2c5db 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 @@ -41,7 +41,7 @@ public class KsecDecoder extends DelimiterBasedFrameDecoder { protected Object decode(ChannelHandlerContext ctx, ByteBuf in) throws Exception { in = (ByteBuf) super.decode(ctx, in); if(in == null){ - log.info("no data"); + log.debug("no data"); return null; } String body = in.toString(Charset.forName("UTF-8")); @@ -49,13 +49,29 @@ public class KsecDecoder extends DelimiterBasedFrameDecoder { // 去掉首尾标识符 body = body.substring(1, body.length()); KsecInfo ksecInfo = JSONObject.parseObject(body, KsecInfo.class); + if (Cmd.A.name().equals(ksecInfo.getType())) { + in.release(); + return null; + } KsecDataInfo dataInfo = ksecInfo.getData(); String lotnum = dataInfo.getLotnum(); PlcCmdInfo plcCmdInfo = null; String srmNumber = null; String cmdName = null; if(dataInfo != null){ + //左右换过来 + if(dataInfo.getFromDirection() == 1){ + dataInfo.setFromDirection(2); + }else { + dataInfo.setFromDirection(1); + } + if(dataInfo.getToDirection() != null && dataInfo.getToDirection() == 1){ + dataInfo.setToDirection(2); + }else { + dataInfo.setToDirection(1); + } plcCmdInfo = new PlcCmdInfo(dataInfo.getSRMNumber(), dataInfo.getTaskId(), dataInfo.getFromSide(), dataInfo.getFromDirection(), dataInfo.getFromColumn(), dataInfo.getFromRow(), dataInfo.getFromSeparation(),dataInfo.getToSide(), dataInfo.getToDirection(), dataInfo.getToColumn(), dataInfo.getToRow(),dataInfo.getToSeparation(),lotnum); + srmNumber = dataInfo.getSRMNumber(); cmdName = dataInfo.getCmdName(); } @@ -77,6 +93,16 @@ public class KsecDecoder extends DelimiterBasedFrameDecoder { } } else if (Cmd.B2.name().equals(cmdName)) { + //B2 C4 一起发的,需要停止等B2 + + //这里判断是不是双伸 + if(plcCmdInfo.getSeparation2() == 2){ + //深测货架延迟 + Thread.sleep(plcService.getConfigProperties().getCameraConfig().getB2OutDelayTime()); + }else { + //浅侧延迟 + Thread.sleep(plcService.getConfigProperties().getCameraConfig().getB2DelayTime()); + } plcService.gyrateCamera(plcCmdInfo,Cmd.C5.name()); plcService.orderStop(plcCmdInfo); } @@ -97,22 +123,23 @@ public class KsecDecoder extends DelimiterBasedFrameDecoder { } } else if (Cmd.D.name().equals(ksecInfo.getType())) { tcpLogger.info("info:{}",body); - String code = dataInfo.getCmdName(); - if(code.equals(Cmd.D1.name())){ - log.info("plcId:{},warn start",plcCmdInfo.getPlcId()); - //根据告警code转动camera - String warnCode = dataInfo.getWarnCode(); - if(!StringUtils.isEmpty(warnCode)){ - String warnCode0 = Cmd.D1.name()+"-"+warnCode.split(",")[0]; - plcService.warnAction(plcCmdInfo,warnCode0); - } - plcService.warnStart(plcCmdInfo.getPlcId(),dataInfo.getWarnCode()); - }else if(code.equals(Cmd.D2.name())){ - log.info("plcId:{},warn stop",plcCmdInfo.getPlcId()); - plcService.warnStop(plcCmdInfo.getPlcId()); - }else { - log.info("other D code :{}",code); - } + //柳州去掉告警 +// String code = dataInfo.getCmdName(); +// if(code.equals(Cmd.D1.name())){ +// log.info("plcId:{},warn start",plcCmdInfo.getPlcId()); +// //根据告警code转动camera +// String warnCode = dataInfo.getWarnCode(); +// if(!StringUtils.isEmpty(warnCode)){ +// String warnCode0 = Cmd.D1.name()+"-"+warnCode.split(",")[0]; +// plcService.warnAction(plcCmdInfo,warnCode0); +// } +// plcService.warnStart(plcCmdInfo.getPlcId(),dataInfo.getWarnCode()); +// }else if(code.equals(Cmd.D2.name())){ +// log.info("plcId:{},warn stop",plcCmdInfo.getPlcId()); +// plcService.warnStop(plcCmdInfo.getPlcId()); +// }else { +// log.info("other D code :{}",code); +// } } else if (Cmd.E.name().equals(ksecInfo.getType())) { tcpLogger.info("info:{}",body); //盘点 @@ -133,7 +160,7 @@ public class KsecDecoder extends DelimiterBasedFrameDecoder { ksecInfo.getData().setAckStatus(0); } ctx.channel().writeAndFlush(ksecInfo); - } + } //找到该货位的最后一张照片与现在的照片比照 //plcService.recordStock(plcCmdInfo, dataInfo.getCode(), 0, 0); } diff --git a/web/src/main/java/com/zhehekeji/web/service/robotic/ProtocolDecoder.java b/web/src/main/java/com/zhehekeji/web/service/robotic/ProtocolDecoder.java index 6906b22..46b416c 100644 --- a/web/src/main/java/com/zhehekeji/web/service/robotic/ProtocolDecoder.java +++ b/web/src/main/java/com/zhehekeji/web/service/robotic/ProtocolDecoder.java @@ -52,11 +52,16 @@ public class ProtocolDecoder extends FixedLengthFrameDecoder { //不是包头 丢 return null; } - CharSequence plc = in.readCharSequence(6, Charset.defaultCharset()); - String plcId = plc.toString(); + ByteBuf plc = in.readBytes(6); + String plcId = plc.toString(Charset.defaultCharset()); + //CharSequence plc = in.readBytes(6, Charset.defaultCharset()); + //String plcId = plc.toString(); + // OA=心跳 OB=工单 OC=任务 OD=告警 - CharSequence typeChar = in.readCharSequence(2, Charset.defaultCharset()); - String type = typeChar.toString(); +// CharSequence typeChar = in.readCharSequence(2, Charset.defaultCharset()); +// String type = typeChar.toString(); + ByteBuf typeChar = in.readBytes(2); + String type = typeChar.toString(Charset.defaultCharset()); int taskId = in.readInt(); short short1 = in.readShort(); short short2 = in.readShort(); diff --git a/web/src/main/resources/application-prod.yml b/web/src/main/resources/application-prod.yml index c4683ce..874fd2c 100644 --- a/web/src/main/resources/application-prod.yml +++ b/web/src/main/resources/application-prod.yml @@ -14,7 +14,7 @@ spring: testWhileIdle: false timeBetweenEvictionRunsMillis: 60000 type: com.alibaba.druid.pool.DruidDataSource - url: jdbc:mysql://127.0.0.1:3306/lia_duoji?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8 + url: jdbc:mysql://172.16.0.70:3306/lia_duoji?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8 username: root validationQuery: SELECT 1 FROM DUAL # --------本服务端口号 @@ -34,6 +34,21 @@ cameraConfig: videoServer: 127.0.0.1:8083 #相机抓图延迟 毫秒,这个延迟是等待球机球机转动到位,然后拍照的 delayCaptureTime: 3500 + #随行模式下的相机抓图延迟 毫秒,这个延迟是等待球机球机转动到位,然后拍照的 + # 发了C1之后多久拍照 + C1DelayCaptureTime: 1500 + # 内侧货架 发了C2 之后多久拍照 + C2DelayCaptureTime: 1500 + # 外侧货架 发了C2 之后多久拍照 + C2OutDelayCaptureTime: 2500 + # 发了C3之后多久拍照 + C3DelayCaptureTime: 1500 + C4DelayCaptureTime: 1500 + C4OutDelayCaptureTime: 1500 + # 发了B2之后多久转原点位 + B2DelayTime: 2000 + # 外侧货架发了B2多久转原点位 + B2OutDelayTime: 2000 # 下载mp4延迟 海康的下载mp4需要2分钟 # 利珀延迟10s就可 # 单位毫秒