增加视觉连接

测试球机
滁州-烟草
LAPTOP-S9HJSOEB\昊天 2 years ago
parent 18245aaf00
commit f7cc36c4ff

@ -44,6 +44,10 @@ public class ConfigProperties {
*/
private Integer serverPort;
private boolean inventorySimulationFollow = false;
private Long queueSpanTime = 5000L;
@Data
public static class CameraConfig{

@ -12,6 +12,8 @@ import java.time.LocalDateTime;
@Data
public class CheckLog {
@TableId(type = IdType.AUTO)
private Integer id;
private Integer streetId;
@ -33,8 +35,13 @@ public class CheckLog {
private String wmsCode;
private String category;
private String taskId;
private Integer count;
private Integer wmsCount;
private String wmsCategory;
private int statusVision = 0;
private String checkNum;
@ -44,10 +51,6 @@ public class CheckLog {
@ApiModelProperty("扫描出的托盘码")
private String trayCode;
private Integer status;
private String pic;
private String lotnum;
@ -56,5 +59,10 @@ public class CheckLog {
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss")
private LocalDateTime createTime;
private Integer status;
private String pic;
@TableField(exist=false)
private String[] pics;
}

@ -25,6 +25,7 @@ public class Stock {
@ApiModelProperty("随行任务号")
private String orderNum;
private int statusVision =0;
@ApiModelProperty("盘点任务号")
private String checkNum;
@ -91,4 +92,5 @@ public class Stock {
private String streetName;
private String pcd;//点位文件路径
}

@ -108,6 +108,7 @@ public interface CameraControlModule {
boolean ptzControlIrisDecEnd(Integer cameraId, int nChannelID);
boolean pic(Integer cameraId, int channel, String realPath);
boolean pic(int cameraId, int channel, String realPath);
void downloadMp4(Integer cameraId, String path, LocalDateTime start, LocalDateTime end);

@ -30,10 +30,19 @@ public class CameraDelayTask implements Delayed {
private long executeTime;
private String cameraPlcId;
private long delayTime;
private Integer ptzId;
public CameraDelayTask(String cameraPlcId, String command, long delayTime,TransmissionPojo transmissionPojo) {
this.cameraPlcId = cameraPlcId;
this.command = command;
this.executeTime = System.currentTimeMillis()+delayTime;
this.delayTime = delayTime;
this.transmissionPojo = transmissionPojo;
}
public CameraDelayTask(Integer cameraId, LocalDateTime startTime, LocalDateTime endTime, String path, Integer type, long delayTime) {
this.cameraId = cameraId;
this.startTime = startTime;

@ -289,7 +289,19 @@ public class HikCameraControlModuleImpl implements CameraControlModule {
return picResult;
}
public boolean pic(int cameraId, int nChannelID, String path)
{
int lUserId = cameraId;
short wPicSize = 3;
short wPicQuality = 0;
HCNetSDK.NET_DVR_JPEGPARA jpegpara = new HCNetSDK.NET_DVR_JPEGPARA(wPicSize, wPicQuality);
boolean picResult = HikLoginModuleImpl.hcNetsdk.NET_DVR_CaptureJPEGPicture(lUserId, 1, jpegpara, path);
if (!picResult) {
log.error("pic error:{},cameraId:{}", HikLoginModuleImpl.hcNetsdk.NET_DVR_GetLastError(),cameraId);
}
return picResult;
}
public void downloadMp4(Integer cameraId, String path, LocalDateTime start, LocalDateTime end) {
PathUtil.checkDirc(path);

@ -10,15 +10,22 @@ public class HikExceptionCallBack implements HCNetSDK.FExceptionCallBack {
@Override
public void invoke(int dwType, int lUserID, int lHandle, Pointer pUser) {
Integer cameraId =CameraConnMap.getCameraIdByLoginId(new NetSDKLib.LLong(lUserID));
if(dwType == 32768){
NetSDKLib.LLong lLong = new NetSDKLib.LLong(lUserID);
Integer cameraId =CameraConnMap.getCameraIdByLoginId(lLong);
if(dwType == 0x8000){
if(cameraId != null) {
log.error("hik disconnect,cameraId:{}", cameraId);
log.error("hik disconnect,cameraId:{}", cameraId);
}else if(dwType == 32791){
}
}else if(dwType == 0x8017){
log.info("hik reconnect,cameraId:{}", CameraConnMap.getCameraIdByLoginId(new NetSDKLib.LLong(lUserID)));
}
log.info("hik reconnect,cameraId:{}", cameraId);
if(!lLong.equals(CameraConnMap.getConnId(cameraId))) {
log.error("hik reconnect,cameraId:{},lUserId:{}", cameraId,lLong);
CameraConnMap.conn(cameraId, new NetSDKLib.LLong(lUserID));
}
}
}
}

@ -277,6 +277,11 @@ public class JoywareCameraControlModuleImpl implements CameraControlModule {
return ok;
}
@Override
public boolean pic(int cameraId, int channel, String realPath) {
return false;
}
public void downloadMp4(Integer cameraId, String path, LocalDateTime start, LocalDateTime end) {
PathUtil.checkDirc(path);

@ -12,6 +12,8 @@ import com.zhehekeji.web.entity.CameraIOConfig;
import com.zhehekeji.web.lib.CameraConnMap;
import com.zhehekeji.web.lib.CameraControlLoginModule;
import com.zhehekeji.web.lib.CameraControlModule;
import com.zhehekeji.web.lib.TaskDelayExecutor;
import com.zhehekeji.web.lib.hik.HikCameraControlModuleImpl;
import com.zhehekeji.web.lib.hik.HikLoginModuleImpl;
import com.zhehekeji.web.lib.joyware.JoywareLoginModuleImpl;
import com.zhehekeji.web.lib.joyware.NetSDKLib;
@ -24,6 +26,7 @@ import com.zhehekeji.web.pojo.camera.IOImport;
import com.zhehekeji.web.pojo.street.StreetSearch;
import io.swagger.models.auth.In;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.formula.functions.T;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.dao.DuplicateKeyException;
@ -36,6 +39,7 @@ import java.io.IOException;
import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.List;
import java.util.UUID;
import java.util.concurrent.CountDownLatch;
import java.util.stream.Collectors;
@ -348,6 +352,50 @@ public class CameraService {
}
}
public static void main(String[] args) {
Camera camera = new Camera();
camera.setIp("192.168.1.64");
camera.setPort(8000);
camera.setUser("admin");
camera.setPassword("a1234567");
CameraControlLoginModule cameraControlLoginModule = new HikLoginModuleImpl();
CameraControlModule cameraControlModule = new HikCameraControlModuleImpl();
//
NetSDKLib.LLong lLong = cameraControlLoginModule.login(camera.getIp(),camera.getPort(),camera.getUser(),camera.getPassword());
NetSDKLib.LLong lLong1 = cameraControlLoginModule.login(camera.getIp(),camera.getPort(),camera.getUser(),camera.getPassword());
NetSDKLib.LLong lLong2 = cameraControlLoginModule.login(camera.getIp(),camera.getPort(),camera.getUser(),camera.getPassword());
NetSDKLib.LLong lLong3 = cameraControlLoginModule.login(camera.getIp(),camera.getPort(),camera.getUser(),camera.getPassword());
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
cameraControlModule.pic(lLong.intValue(),0 ,"E:/"+ UUID.randomUUID() +".jpg");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
cameraControlModule.pic(lLong1.intValue(),0 ,"E:/"+ UUID.randomUUID() +".jpg");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
cameraControlModule.pic(lLong2.intValue(),0 ,"E:/"+ UUID.randomUUID() +".jpg");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
cameraControlModule.pic(lLong3.intValue(),0 ,"E:/"+ UUID.randomUUID() +".jpg");
}
public void cameraLogin(Camera camera){
NetSDKLib.LLong lLong = cameraControlLoginModule.login(camera.getIp(),camera.getPort(),camera.getUser(),camera.getPassword());
if(lLong != null){

@ -13,6 +13,7 @@ import com.zhehekeji.web.lib.joyware.NetSDKLib;
import com.zhehekeji.web.mapper.CameraMapper;
import com.zhehekeji.web.mapper.SensorGunMapper;
import com.zhehekeji.web.mapper.StreetMapper;
import com.zhehekeji.web.service.client.GetPhotoDelayExecutor;
import com.zhehekeji.web.service.client.NettyServer;
import com.zhehekeji.web.service.ksec.KsecNettyClient;
import com.zhehekeji.web.service.robotic.NettyClient;
@ -87,6 +88,8 @@ public class InitService implements ApplicationRunner {
//球机登录
List<Camera> cameras = cameraMapper.selectByMap(new HashMap<>(0));
List<Street> streets = streetMapper.selectByMap(new HashMap<>());
cameras.forEach(camera -> {
LoginThread loginThread = new LoginThread(camera);
loginThread.start();
@ -96,7 +99,6 @@ public class InitService implements ApplicationRunner {
if(configProperties.getServerMode() == 0){
log.info("PLC TCP MODE");
//plc 连接状态初始化
List<Street> streets = streetMapper.selectByMap(new HashMap<>(0));
streets.forEach(street -> {
StreetConn.init(street.getId(),street.getPlcId());
@ -123,6 +125,7 @@ public class InitService implements ApplicationRunner {
}
}
TaskDelayExecutor.runMp4DownloadExecutor();
GetPhotoDelayExecutor.runExecutor(streets);
}
class LoginThread extends Thread{

@ -69,6 +69,8 @@ public class PlcCmdInfo {
private Integer times;
private String code;
private String lotnum;
private Integer streetId;

@ -11,6 +11,7 @@ import com.zhehekeji.web.lib.*;
import com.zhehekeji.web.mapper.*;
import com.zhehekeji.web.pojo.CameraPtzPojo;
import com.zhehekeji.web.pojo.OrderVO;
import com.zhehekeji.web.pojo.stock.StockStatus;
import com.zhehekeji.web.service.RFID.RFIDMap;
import com.zhehekeji.web.service.RFID.RFIDSocket;
import com.zhehekeji.web.service.RFID.RFIDSocketFactory;
@ -41,6 +42,7 @@ import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
import java.util.stream.Collectors;
import static org.aspectj.weaver.tools.cache.SimpleCacheFactory.path;
@ -652,7 +654,26 @@ 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());
//开始盘点具体货位
CheckLog checkLog = new CheckLog();
checkLog.setStreetId(street.getId());
checkLog.setLotnum(plcCmdInfo.getLotnum());
checkLog.setDirection(plcCmdInfo.getLeftRight1());
checkLog.setSide(plcCmdInfo.getSide1());
checkLog.setRow(plcCmdInfo.getRow1());
checkLog.setColumn(plcCmdInfo.getColumn1());
checkLog.setWmsCode(plcCmdInfo.getCode());
checkLog.setTaskId((plcCmdInfo.getTaskId()));
//默认未盘点
checkLog.setStatus(StockStatus.PENDING.getStatus());
checkLog.setCreateTime(LocalDateTime.now());
checkLog.setWmsCategory(plcCmdInfo.getTypeNum());
checkLog.setWmsCount(plcCmdInfo.getQuantity());
CronTab.putTime(street.getId());
List<LightSource> lightSources = lightSourceMapper.selectList(new QueryWrapper<LightSource>().eq("street_id",street.getId()));
lightSources.forEach(lightSource -> {
@ -680,76 +701,26 @@ public class PlcService {
String path = PathUtil.createFileNameByRowColumn("jpg", cameraId, plcCmdInfo.getRow1(), plcCmdInfo.getColumn1());
try {
cameraCapture(cameraId, false, null, path);
} catch (NullPointerException e) {
log.error("相机{}未连接无法拍照", cameraId);
}
checkLog.setPic(path);
checkLogMapper.insert(checkLog);
//托盘码
String trayCode = null;
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<String> tags = new HashSet<>();
try {
RFIDCheck(plcCmdInfo, true);
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;
trayCheck = scan(configProperties.getScanCodeMode().getTray(),street,plcCmdInfo,checkLog,trayCode);
} else {
trayCode = trayCode+ "扫码枪识别异常";
trayCheck = Boolean.FALSE;
log.warn("rfid error:{}", trayCode);
}
}
Boolean trayGoodCheck = Boolean.TRUE;
String trayGoodCode = null;
Boolean trayGoodCheck = scan(configProperties.getScanCodeMode().getGoods(),street,plcCmdInfo,checkLog,trayGoodCode);
OrderInfo orderInfo = new OrderInfo(street, plcCmdInfo, 1, cmdCode);
//扫货物
@ -786,7 +757,8 @@ public class PlcService {
}
}
}
}else if(configProperties.getScanCodeMode().getGoods() == 3){
}else
if(configProperties.getScanCodeMode().getGoods() == 3){
Set<String> tags = new HashSet<>();
try {
RFIDCheck(plcCmdInfo, true);
@ -809,31 +781,49 @@ public class PlcService {
log.warn("rfid error:{}", trayCode);
}
}else if (configProperties.getScanCodeMode().getGoods() == 4){
//开始盘点
String goodLocation = orderInfo.getStreetId().toString()+"_"+ plcCmdInfo.getLeftRight1().toString()+"_"+ orderInfo.getSeparation().toString()+"_"+ orderInfo.getRow().toString()+"_"+ orderInfo.getColumn();
SCTransmission scTransmission = new SCTransmission(street.getPlcId(),plcCmdInfo.getTaskId(),goodLocation,plcCmdInfo.getTypeNum(), plcCmdInfo.getQuantity(), "N");
String scTransmissionStr = scTransmission.toString();
ClientChanel.write(scTransmissionStr,street.getPlcId());
}else
if (configProperties.getScanCodeMode().getGoods() == 4){
TransmissionPojo transmissionPojo = new TransmissionPojo(checkLog, street);
if (ClientChanel.get(plcCmdInfo.getPlcId()) != null) {
ClientChanel.get(plcCmdInfo.getPlcId()).writeAndFlush(transmissionPojo.toString(TransmissionType.ST));
} else {
log.error("未找到对应plc" + transmissionPojo.toString());
}
//取货完成进行拍照
try {
Thread.sleep(500);
Thread.sleep(50L);
//不为其他状态进入队列
if (lock.tryLock()) {
//队列中没有任务,发送取图指令
//只采用队列,队列中有数据则自动发送
//模拟随行
if (configProperties.isInventorySimulationFollow() ) {
TransmissionPojo transmissionPojoFollow = new TransmissionPojo(street, transmissionPojo.getRow(),transmissionPojo.getColumn(),transmissionPojo.getDirection(), "");
String s = (transmissionPojoFollow).toString(TransmissionType.GPS);
//放置到队列中,等待取图返回后删除
GetPhotoDelayExecutor.addCameraDelayTask(street.getPlcId(), s, configProperties.getQueueSpanTime(),transmissionPojoFollow);
}
//放置到队列中,等待取图返回后删除
GetPhotoDelayExecutor.addCameraDelayTask(street.getPlcId(), transmissionPojo.toString(TransmissionType.GPS), configProperties.getQueueSpanTime(),transmissionPojo);
}
} catch (InterruptedException e) {
throw new RuntimeException(e);
log.error("取图命令 error", e);
} finally {
lock.unlock();
log.info("盘点完成");
}
//滁州开始盘点即取货到位
SCTransmission scTransmission2 = new SCTransmission(street.getPlcId(),plcCmdInfo.getTaskId());
String scTransmissionStr2 = scTransmission2.toSC02String();
ClientChanel.write(scTransmissionStr2,street.getPlcId());
}
Stock stock = stockMapper.getByStreetAndDirectionAndSideAndRowColumn(orderInfo.getStreetId(), plcCmdInfo.getLeftRight1(), orderInfo.getSeparation(), orderInfo.getRow(), orderInfo.getColumn());
String scanCode = null;
//货物使用球机扫码
checkLog.setTrayCode(trayCode);
log.info("code:{}", scanCode);
//核对异常
Integer status = 1;
@ -841,6 +831,8 @@ public class PlcService {
if (trayCheck && trayGoodCheck ) {
status = 2;
}
checkLog.setStatus(status);
checkLogMapper.updateById(checkLog);
if (stock == null) {
stock = Stock.builder()
.checkNum(plcCmdInfo.getOrderNum())
@ -872,47 +864,115 @@ public class PlcService {
}
// 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);
TransmissionPojo transmissionPojo = new TransmissionPojo(checkLog, street);
if (ClientChanel.get(dataInfo.getSRMNumber()) != null) {
ClientChanel.get(dataInfo.getSRMNumber()).writeAndFlush(transmissionPojo.toString(TransmissionType.ST));
} else {
log.error("未找到对应plc" + transmissionPojo.toString());
}
//取货完成进行拍照
try {
Thread.sleep(50L);
//不为其他状态进入队列
if (lock.tryLock()) {
//队列中没有任务,发送取图指令
//只采用队列,队列中有数据则自动发送
//模拟随行
if (configProperties.isInventorySimulationFollow() ) {
TransmissionPojo transmissionPojoFollow = new TransmissionPojo(street, transmissionPojo.getRow(),transmissionPojo.getColumn(),transmissionPojo.getDirection(), "");
String s = (transmissionPojoFollow).toString(TransmissionType.GPS);
long timeLong = end - startTime;
log.info("time:{}millisecond", timeLong);
//放置到队列中,等待取图返回后删除
GetPhotoDelayExecutor.addCameraDelayTask(street.getPlcId(), s, configProperties.getQueueSpanTime(),transmissionPojoFollow);
return true;
}
Boolean scan(int type ,Street street, PlcCmdInfo plcCmdInfo,CheckLog checkLog ,String trayCode){
Boolean checkBoolean = true;
if(type == 2) {
checkBoolean = Boolean.FALSE;
log.info("扫码类型:" + configProperties.getScanCodeMode().getTray());
//托盘使用sick扫码枪
SensorGun sensorGun = sensorService.getSensorByPlc(street.getId(), plcCmdInfo.getLeftRight1());
if (sensorGun == null) {
trayCode = "扫码枪识别异常";
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(plcCmdInfo.getCode())) {
//托盘码为空,无货物
//只要扫码枪未识别出条码,即认为盘点正确
if (StringUtils.isEmpty(trayCode) || trayCode.equals("NoRead")) {
trayCode = "";
checkBoolean = Boolean.TRUE;
} else {
trayCode = "扫码枪识别异常";
checkBoolean = Boolean.FALSE;
log.warn("sick ocr error:{}", trayCode);
}
} else {
if (StringUtils.isEmpty(trayCode) || trayCode.equals("NoRead")) {
trayCode = "扫码枪识别异常";
checkBoolean = Boolean.FALSE;
log.warn("sick ocr error:{}", trayCode);
} else {
//扫到就认为正常
checkBoolean = Boolean.TRUE;
}
}
//放置到队列中,等待取图返回后删除
GetPhotoDelayExecutor.addCameraDelayTask(street.getPlcId(), transmissionPojo.toString(TransmissionType.GPS), configProperties.getQueueSpanTime(),transmissionPojo);
}
}else
if(type == 3){
Set<String> tags = new HashSet<>();
try {
RFIDCheck(plcCmdInfo, true);
Thread.sleep(1000 * configProperties.getRfid().getScanTime());
} catch (Exception e) {
e.printStackTrace();
} finally {
tags = RFIDStop(plcCmdInfo);
log.info("盘点rfid扫描结果" + tags);
}
if (tags !=null && tags.contains(plcCmdInfo.getCode())) {
//托盘码为空,无货物
//只要扫码枪未识别出条码,即认为盘点正确
trayCode = plcCmdInfo.getCode();
checkBoolean = Boolean.TRUE;
} else {
trayCode = trayCode+ "扫码枪识别异常";
checkBoolean = Boolean.FALSE;
log.warn("rfid error:{}", trayCode);
}
}else
if (type == 4){
TransmissionPojo transmissionPojo = new TransmissionPojo(checkLog, street);
if (ClientChanel.get(plcCmdInfo.getPlcId()) != null) {
ClientChanel.get(plcCmdInfo.getPlcId()).writeAndFlush(transmissionPojo.toString(TransmissionType.ST));
} else {
log.error("未找到对应plc" + transmissionPojo.toString());
}
//取货完成进行拍照
try {
Thread.sleep(50L);
//不为其他状态进入队列
if (lock.tryLock()) {
//队列中没有任务,发送取图指令
//只采用队列,队列中有数据则自动发送
//模拟随行
if (configProperties.isInventorySimulationFollow() ) {
TransmissionPojo transmissionPojoFollow = new TransmissionPojo(street, transmissionPojo.getRow(),transmissionPojo.getColumn(),transmissionPojo.getDirection(), "");
String s = (transmissionPojoFollow).toString(TransmissionType.GPS);
} catch (InterruptedException e) {
log.error("取图命令 error", e);
} finally {
lock.unlock();
log.info("盘点完成");
//放置到队列中,等待取图返回后删除
GetPhotoDelayExecutor.addCameraDelayTask(street.getPlcId(), s, configProperties.getQueueSpanTime(),transmissionPojoFollow);
}
//放置到队列中,等待取图返回后删除
GetPhotoDelayExecutor.addCameraDelayTask(street.getPlcId(), transmissionPojo.toString(TransmissionType.GPS), configProperties.getQueueSpanTime(),transmissionPojo);
}
} catch (InterruptedException e) {
log.error("取图命令 error", e);
} finally {
lock.unlock();
log.info("盘点完成");
}
}
return true;
}
return checkBoolean;
}
public KsecInfo getKsecDataInfo(TransmissionPojo transmissionPojo, String type) {
KsecDataInfo ksecDataInfo = new KsecDataInfo();
CheckLog checkLog = checkLogMapper.selectById(transmissionPojo.getCheckId());
@ -1042,4 +1102,37 @@ public class PlcService {
}
checkLog(stock);
}
public void visualCalculationResults(TransmissionPojo transmissionPojo) {
CheckLog checkLog = checkLogMapper.selectById(transmissionPojo.getCheckId());
Stock stock = stockMapper.selectOne(new QueryWrapper<Stock>().eq("check_Num", checkLog.getId()));
Street street = streetService.getStreetByPlcId(transmissionPojo.getStreetNumber());
if (transmissionPojo.getResult() != null && transmissionPojo.getResult() == 1) {
checkLog.setStatusVision(StockStatus.SUCCESS.getStatus());
stock.setStatusVision(StockStatus.SUCCESS.getStatus());
} else {
checkLog.setStatusVision(StockStatus.ERROR.getStatus());
stock.setStatusVision(StockStatus.ERROR.getStatus());
stock.setCount(transmissionPojo.getCount());
stock.setCategory(transmissionPojo.getCategory());
}
if (transmissionPojo.getPcd() != null && !"".equals(transmissionPojo.getPcd())) {
stock.setPcd("http://" + street.getPlcIp() + ":8007" + transmissionPojo.getPcd());
}
if (transmissionPojo.getPicsPath() != null && transmissionPojo.getPicsPath().size() > 0) {
String pics = transmissionPojo.getPicsPath().stream().map(v -> {
return "http://" + street.getPlcIp() + ":8007" + v;
}).collect(Collectors.joining(";"));
checkLog.setPic(pics);
stock.setCheckPic(pics);
}
checkLogMapper.updateById(checkLog);
stockMapper.updateById(stock);
}
public void saveFollowPhoto(TransmissionPojo transmissionPojo) {
}
}

@ -1,11 +1,9 @@
package com.zhehekeji.web.service.client;
import com.zhehekeji.web.lib.CameraDelayTask;
import com.zhehekeji.web.service.EmptyCheckService;
import com.zhehekeji.web.service.PlcService;
import com.zhehekeji.web.service.ksec.KsecInfo;
import com.zhehekeji.web.service.ksec.KsecNettyClient;
import com.zhehekeji.web.service.putian.*;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerContext;
@ -43,16 +41,15 @@ public class Decoder extends DelimiterBasedFrameDecoder {
private static ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(5,15,30, TimeUnit.MILLISECONDS,new ArrayBlockingQueue<>(20000));
private EmptyCheckService emptyCheckService;
private PlcService plcService;
public Decoder(PlcService plcService,EmptyCheckService emptyCheckService) {
public Decoder(PlcService plcService) {
super(20000,true,false, Unpooled.copiedBuffer(">".getBytes()),
Unpooled.copiedBuffer("$".getBytes()));
this.plcService = plcService;
this.emptyCheckService = emptyCheckService;
}
@Override
@ -63,7 +60,7 @@ public class Decoder extends DelimiterBasedFrameDecoder {
log.debug("no data");
return null;
}
ClientRunnable clientRunnable = new ClientRunnable(in,ctx,plcService,emptyCheckService);
ClientRunnable clientRunnable = new ClientRunnable(in,ctx,plcService);
threadPoolExecutor.execute(clientRunnable);
return null;
}
@ -76,13 +73,11 @@ public class Decoder extends DelimiterBasedFrameDecoder {
private PlcService plcService;
private EmptyCheckService emptyCheckService;
public ClientRunnable(ByteBuf in,ChannelHandlerContext ctx,PlcService plcService,EmptyCheckService emptyCheckService){
public ClientRunnable(ByteBuf in,ChannelHandlerContext ctx,PlcService plcService){
this.ctx = ctx;
this.in = in;
this.plcService = plcService;
this.emptyCheckService = emptyCheckService;
}
@Override

@ -52,6 +52,7 @@ public class GetPhotoDelayExecutor {
cameraDelayTaskMap.put(plcId,new DelayQueue<>());
cameraDelayTaskMap.get(plcId).add(cameraDelayTask);
}
delayTasks.add(cameraDelayTask);
}

@ -1,6 +1,5 @@
package com.zhehekeji.web.service.client;
import com.zhehekeji.web.service.EmptyCheckService;
import com.zhehekeji.web.service.PlcService;
import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelFuture;
@ -20,8 +19,6 @@ public class NettyServer {
@Resource
private PlcService plcService;
@Resource
private EmptyCheckService emptyCheckService;
public void CreateNettyServer(int port) throws InterruptedException {
Thread thread = new Thread(new Runnable() {
@ -42,7 +39,7 @@ public class NettyServer {
@Override
public void initChannel(SocketChannel ch) {
ch.pipeline().addLast(new NettyConnectHandler());
ch.pipeline().addLast(new Decoder(plcService,emptyCheckService));
ch.pipeline().addLast(new Decoder(plcService));
ch.pipeline().addLast(new Encoder());
}}); // 子处理器用于处理workerGroup

@ -35,9 +35,9 @@ public class TransmissionPojo {
this.row = checkLog.getRow();
this.column = checkLog.getColumn();
this.direction = checkLog.getDirection();
this.count = checkLog.getCount();
this.count = checkLog.getWmsCount();
if(checkLog.getCategory() != null && checkLog.getCategory().contains("/")) {
this.category = checkLog.getCategory().split("/")[0];
this.category = checkLog.getWmsCategory().split("/")[0];
}else {
this.category = checkLog.getCategory();
}

@ -103,6 +103,12 @@ public class KsecDecoder extends DelimiterBasedFrameDecoder {
plcCmdInfo.setQuantity(dataInfo.getQuantity());
srmNumber = dataInfo.getSRMNumber();
cmdName = dataInfo.getCmdName();
if(dataInfo.getCode()!=null && !"".equals(dataInfo.getCode())){
plcCmdInfo.setCode(dataInfo.getCode());
}else if(dataInfo.getTrayCode()!=null && !"".equals(dataInfo.getTrayCode())){
plcCmdInfo.setCode(dataInfo.getTrayCode());
}
}
if (Cmd.A.name().equals(ksecInfo.getType())) {
//心跳
@ -193,7 +199,7 @@ public class KsecDecoder extends DelimiterBasedFrameDecoder {
plcCmdInfo.setTimes(1);
ksecInfoMap.put(dataInfo.getTaskId(),dataInfo);
Boolean ok = plcService.check(plcCmdInfo,ksecInfo.getData().getCmdName(), dataInfo.getCode(), dataInfo.getTrayCode(), dataInfo.getLotnum());
Boolean ok = plcService.check(plcCmdInfo,ksecInfo.getData().getCmdName(), plcCmdInfo.getCode(), plcCmdInfo.getCode(), dataInfo.getLotnum());
// Boolean ok = true;
if(ok){
ksecInfo.getData().setAckStatus(1);

@ -19,7 +19,7 @@ spring:
validationQuery: SELECT 1 FROM DUAL
# --------本服务端口号
server:
port: 8099
port: 8098
#--------------
# ------用户中心地址
userUrl: http://115.236.65.98:11001
@ -31,7 +31,6 @@ cameraConfig:
cameraPassword: a1234567
cameraUser: admin
cameraPort: 8000
videoServer: 127.0.0.1:8083
#相机抓图延迟 毫秒,这个延迟是等待球机球机转动到位,然后拍照的
delayCaptureTime: 3500
#随行模式下的相机抓图延迟 毫秒,这个延迟是等待球机球机转动到位,然后拍照的
@ -87,7 +86,7 @@ lightSource:
# -----goods 货物
# 扫码模式 0:此处不盘点 1球机扫码 2sick扫码枪 3:南北达RFID 4.南京视觉客户端(只支持货物盘点)
scanCodeMode:
tray: 3
tray: 2
goods: 4
goodsCodeTypes:
- 14

Loading…
Cancel
Save