1.增加宽恕rfid扫描的个数

2.363000开头的将去除末尾00
3.增加扫码枪扫描时间判断
jiangxi-dianli
LAPTOP-S9HJSOEB\昊天 2 years ago
parent d7dd1ef2c0
commit 47ce47146b

@ -58,6 +58,7 @@ public class ConfigProperties {
public static class Rfid { public static class Rfid {
private Long scanTime = 5L; private Long scanTime = 5L;
private int graceNumber = 5;
} }

@ -37,10 +37,7 @@ import java.io.IOException;
import java.time.Duration; import java.time.Duration;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.*; import java.util.*;
import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.*;
import java.util.concurrent.BlockingDeque;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors; import java.util.stream.Collectors;
/** /**
@ -98,6 +95,8 @@ public class PlcService {
@Resource @Resource
private RfidLiveService rfidLiveService; private RfidLiveService rfidLiveService;
ExecutorService executor = Executors.newFixedThreadPool(20);
public static Map<String, Set<String>> wmsTrayCodeMapByTask = new HashMap<>(); public static Map<String, Set<String>> wmsTrayCodeMapByTask = new HashMap<>();
private static ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1, 8, 200, TimeUnit.MINUTES, new ArrayBlockingQueue<>(100000)); private static ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1, 8, 200, TimeUnit.MINUTES, new ArrayBlockingQueue<>(100000));
@ -633,10 +632,11 @@ public class PlcService {
Street street = streetService.getStreetByPlcId(plcCmdInfo.getPlcId()); Street street = streetService.getStreetByPlcId(plcCmdInfo.getPlcId());
CronTab.putTime(street.getId()); CronTab.putTime(street.getId());
plcCmdInfo.setStreetName(street.getName()); plcCmdInfo.setStreetName(street.getName());
List<LightSource> lightSources = lightSourceMapper.selectList(new QueryWrapper<LightSource>().eq("street_id", street.getId())); //暂时不使用光源
/*List<LightSource> lightSources = lightSourceMapper.selectList(new QueryWrapper<LightSource>().eq("street_id", street.getId()));
lightSources.forEach(lightSource -> { lightSources.forEach(lightSource -> {
HikControlSocket.openLight(lightSource.getIp(), lightSource.getPort(), configProperties.getLightSource().getIndex(), 1); HikControlSocket.openLight(lightSource.getIp(), lightSource.getPort(), configProperties.getLightSource().getIndex(), 1);
}); });*/
log.info("盘点摄像头变化参数:" + plcCmdInfo.toString()); log.info("盘点摄像头变化参数:" + plcCmdInfo.toString());
Integer cameraId = getCameraByPlcCmdE(plcCmdInfo, plcCmdInfo.getLeftRight1()); Integer cameraId = getCameraByPlcCmdE(plcCmdInfo, plcCmdInfo.getLeftRight1());
@ -664,47 +664,67 @@ public class PlcService {
} }
//托盘码 //托盘码
String trayCode = null; String trayCode = null;
Boolean trayCheck = Boolean.TRUE; Boolean trayCheck = Boolean.FALSE;
//如果是用扫码枪 扫 托盘码,就直接扫 //如果是用扫码枪 扫 托盘码,就直接扫
//if(configProperties.getScanCodeMode().getTray() == 2){ //if(configProperties.getScanCodeMode().getTray() == 2){
log.info("扫码类型:" + configProperties.getScanCodeMode().getTray()); log.info("扫码类型:" + configProperties.getScanCodeMode().getTray());
//托盘使用sick扫码枪 //托盘使用sick扫码枪
// SensorGun sensorGun = sensorService.getSensorByPlc(street.getId(), plcCmdInfo.getLeftRight1());
SensorGun sensorGun = sensorService.getSensorByPlc(street.getId(), plcCmdInfo.getLeftRight1()); SensorGun sensorGun = sensorService.getSensorByPlc(street.getId(), plcCmdInfo.getLeftRight1());
Future<String> sickFuture = executor.submit(() -> {
long startsickTime = System.currentTimeMillis();
String code = "";
if (sensorGun == null) { if (sensorGun == null) {
trayCode = "扫码枪识别异常"; code = "扫码枪未配置";
trayCheck = Boolean.FALSE;
log.error("no sensor gun config in database ,street id:{},direction:{}", street.getId(), plcCmdInfo.getLeftRight1()); log.error("no sensor gun config in database ,street id:{},direction:{}", street.getId(), plcCmdInfo.getLeftRight1());
} else { } else {
trayCode = SickSocket.readOCR(sensorGun.getIp(), sensorGun.getPort(),configProperties.getScanCodeMode().getSickScanTime()); try {
log.info("sensor tray code:{}", trayCode); code = SickSocket.readOCR(sensorGun.getIp(), sensorGun.getPort(), configProperties.getScanCodeMode().getSickScanTime());
} catch (Exception e) {
}
log.info("sensor tray code:{}", code);
if ("".equals(wmsTrayCode)) { if ("".equals(wmsTrayCode)) {
//托盘码为空,无货物 //托盘码为空,无货物
//只要扫码枪未识别出条码,即认为盘点正确 //只要扫码枪未识别出条码,即认为盘点正确
if (StringUtils.isEmpty(trayCode) || trayCode.equals("NoRead")) { if (StringUtils.isEmpty(code) || code.equals("NoRead")) {
trayCode = ""; code = "";
trayCheck = Boolean.TRUE;
} else { } else {
trayCode = "扫码枪识别异常"; code = "扫码枪识别异常";
trayCheck = Boolean.FALSE; log.warn("sick ocr error:{}", code);
log.warn("sick ocr error:{}", trayCode);
} }
} else { } else {
if (StringUtils.isEmpty(trayCode) || trayCode.equals("NoRead")) { if (StringUtils.isEmpty(code) || code.equals("NoRead")) {
trayCode = "扫码枪识别异常"; code = "扫码枪识别异常";
trayCheck = Boolean.FALSE; log.warn("sick ocr error:{}", code);
log.warn("sick ocr error:{}", trayCode);
} else { } else {
log.info("sick ocr:{}", code);
//扫到就认为正常 //扫到就认为正常
trayCheck = Boolean.TRUE; code = "";
} }
} }
} }
long endsickTime = System.currentTimeMillis();
log.info("sick time:{}millisecond", startsickTime - endsickTime);
return code;
});
// RFID // RFID
// RFID rfid = rfidService.getRFIDByPlc(street.getId(),plcCmdInfo.getLeftRight1()); // RFID rfid = rfidService.getRFIDByPlc(street.getId(),plcCmdInfo.getLeftRight1());
Boolean trayRFIDCheck = Boolean.FALSE; Boolean trayRFIDCheck = Boolean.FALSE;
Future<String> rfidFuture = executor.submit(() -> {
long startRfidTime = System.currentTimeMillis();
String code = "";
Set<String> tags = new HashSet<>(); Set<String> tags = new HashSet<>();
try { try {
RFIDCheck(plcCmdInfo, true); RFIDCheck(plcCmdInfo, true);
@ -719,19 +739,24 @@ public class PlcService {
if (wmsTrayCodeMapByTask.get(plcCmdInfo.getOrderNum()) != null if (wmsTrayCodeMapByTask.get(plcCmdInfo.getOrderNum()) != null
&& tags.containsAll(wmsTrayCodeMapByTask.get(plcCmdInfo.getOrderNum()))) { && tags.containsAll(wmsTrayCodeMapByTask.get(plcCmdInfo.getOrderNum()))) {
trayRFIDCheck = Boolean.TRUE; log.info("扫描成功");
} else { } else {
if(trayCheck){
trayCode = "RFID扫描失败";
}else
trayCode += ";RFID扫描失败";
if (wmsTrayCodeMapByTask.get(plcCmdInfo.getOrderNum()) != null) { if (wmsTrayCodeMapByTask.get(plcCmdInfo.getOrderNum()) != null) {
wmsTrayCodeMapByTask.get(plcCmdInfo.getOrderNum()).removeAll(tags); wmsTrayCodeMapByTask.get(plcCmdInfo.getOrderNum()).removeAll(tags);
log.info("未扫到数据为:{}", wmsTrayCodeMapByTask.get(plcCmdInfo.getOrderNum())); log.info("未扫到数据为:{}", wmsTrayCodeMapByTask.get(plcCmdInfo.getOrderNum()));
for (String str : wmsTrayCodeMapByTask.get(plcCmdInfo.getOrderNum())) {
if (str.length() == 14) {
code = "RFID扫描失败";
log.info("未扫描到箱体" + str);
}
}
if (wmsTrayCodeMapByTask.get(plcCmdInfo.getOrderNum()).size() > configProperties.getRfid().getGraceNumber()) {
code = "RFID扫描失败";
}
} }
trayRFIDCheck = Boolean.FALSE;
} }
wmsTrayCodeMapByTask.remove(plcCmdInfo.getOrderNum());
RFID rfid = rfidMapper.selectOne(new QueryWrapper<RFID>().eq("street_id", street.getId())); RFID rfid = rfidMapper.selectOne(new QueryWrapper<RFID>().eq("street_id", street.getId()));
if (!rfidLiveService.getRfidLive(plcCmdInfo, street, wmsTrayCode)) { if (!rfidLiveService.getRfidLive(plcCmdInfo, street, wmsTrayCode)) {
rfidLiveService.rfidRemoveLive(plcCmdInfo, street, rfid); rfidLiveService.rfidRemoveLive(plcCmdInfo, street, rfid);
@ -739,6 +764,35 @@ public class PlcService {
rfidLiveService.rfidSave(plcCmdInfo, String.join(",", tags), street, rfid); rfidLiveService.rfidSave(plcCmdInfo, String.join(",", tags), street, rfid);
} }
long endRfidTime = System.currentTimeMillis();
log.info("rfid time:{}millisecond", startRfidTime - endRfidTime);
return code;
});
try {
String sickCode = sickFuture.get(); // get()会阻塞直到结果可用
String rfid = rfidFuture.get(); // get()会阻塞直到结果可用
log.info("sickCode:{}", sickCode);
log.info("rfid:{}", rfid);
trayCode = sickCode;
if (sickCode != null && !"".equals(sickCode)) {
trayCode = trayCode + ";";
} else {
trayCheck = Boolean.TRUE;
}
if (rfid == null || "".equals(rfid)) {
trayRFIDCheck = Boolean.TRUE;
}
trayCode += rfid;
if ("".equals(trayCode)) {
trayCode = "盘点正确";
}
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
OrderInfo orderInfo = new OrderInfo(street, plcCmdInfo, 1, cmdCode); OrderInfo orderInfo = new OrderInfo(street, plcCmdInfo, 1, cmdCode);
Stock stock = stockMapper.getByStreetAndDirectionAndSideAndRowColumn(orderInfo.getStreetId(), plcCmdInfo.getFromDirection(), orderInfo.getSeparation(), orderInfo.getRow(), orderInfo.getColumn()); Stock stock = stockMapper.getByStreetAndDirectionAndSideAndRowColumn(orderInfo.getStreetId(), plcCmdInfo.getFromDirection(), orderInfo.getSeparation(), orderInfo.getRow(), orderInfo.getColumn());
String scanCode = null; String scanCode = null;

@ -25,6 +25,13 @@ public class RFIDSocket {
private Map<String, Integer> tagsCount = new ConcurrentHashMap<>(); private Map<String, Integer> tagsCount = new ConcurrentHashMap<>();
public static void main(String[] args) {
String tagStr = "363000145224505289907900";
if(tagStr.startsWith("363000") &&tagStr.endsWith("00")){
tagStr = tagStr.substring(0, tagStr.length() - 2);
}
System.out.println(tagStr);
}
public Set<String> getTags() { public Set<String> getTags() {
return tags; return tags;
} }
@ -80,7 +87,12 @@ public class RFIDSocket {
System.out.println("reader1 inventory tag :" + tag.getEpc()); System.out.println("reader1 inventory tag :" + tag.getEpc());
String tagStr = tag.getEpc().replace(" ",""); String tagStr = tag.getEpc().replace(" ","");
System.out.println("tag: " + tag.getEpc()); System.out.println("tag: " + tag.getEpc());
// 去除头为0
tagStr = tagStr.replace("0000000000",""); tagStr = tagStr.replace("0000000000","");
//去除尾巴为0
if(tagStr.startsWith("363000") &&tagStr.endsWith("00")){
tagStr = tagStr.substring(0, tagStr.length() - 2);
}
tags.add(tagStr); tags.add(tagStr);
if (ToolUtil.isNotEmpty(tagsCount.get(tagStr))) { if (ToolUtil.isNotEmpty(tagsCount.get(tagStr))) {
tagsCount.put(tagStr, tagsCount.get(tagStr) + 1); tagsCount.put(tagStr, tagsCount.get(tagStr) + 1);

@ -22,4 +22,10 @@ public class SensorService {
} }
return null; return null;
} }
public List<SensorGun> getSensorByPlc(Integer streetId){
return sensorGunMapper.selectList(new QueryWrapper<SensorGun>().eq("street_id",streetId));
}
} }

@ -21,7 +21,7 @@ public class SickSocket {
private static final Logger tcpLogger = LoggerFactory.getLogger("sick"); private static final Logger tcpLogger = LoggerFactory.getLogger("sick");
public static void main(String[] args) { public static void main(String[] args) {
String code = readOCR("127.0.0.1", 3000,30000); String code = readOCR("127.0.0.1", 3001,5000);
System.out.println(code); System.out.println(code);
} }
@ -50,11 +50,14 @@ public class SickSocket {
os = socket.getOutputStream(); os = socket.getOutputStream();
// 获取socket的输入流对象 // 获取socket的输入流对象
is = socket.getInputStream(); is = socket.getInputStream();
long start = System.currentTimeMillis();
// 定义变量i并赋值为0 // 定义变量i并赋值为0
int i = 0; int i = 0;
// 当code等于"NoRead"且i小于等于4且socket未关闭时执行以下循环 // 当code等于"NoRead"且i小于等于4且socket未关闭时执行以下循环
while ("NoRead".equals(code) && !socket.isClosed()) { while ("NoRead".equals(code) && !socket.isClosed()) {
sleep(300); if( System.currentTimeMillis() - start > timeout){
break;
}
// 调用writeCmd方法将数据写入socket的输出流 // 调用writeCmd方法将数据写入socket的输出流
writeCmd(os); writeCmd(os);
// 从socket的输入流中读取数据并赋值给code // 从socket的输入流中读取数据并赋值给code

Loading…
Cancel
Save