#
zjj
2025-03-31 e826b2ba77a95a0412ae6bb5c8a9c1e37afca291
#
7个文件已修改
1个文件已添加
529 ■■■■■ 已修改文件
zy-asrs-flow/src/config/setting.ts 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/kernel/KernelService.java 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/service/impl/MainServiceImpl.java 23 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/model/protocol/StaProtocol.java 27 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/thread/impl/FyxcDevpThread.java 383 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/thread/impl/NyLiftThread.java 65 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/thread/impl/NyShuttleThread.java 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-wcs/src/main/resources/application.yml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-flow/src/config/setting.ts
@@ -1,5 +1,5 @@
// 接口地址
export const IP: string = '10.0.100.140';
export const IP: string = '127.0.0.1';
export const PORT: number = 8088;
export const API_BASE_URL: string = 'http://' + IP + ':' + PORT + '/wcs';
zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/kernel/KernelService.java
@@ -65,11 +65,11 @@
            motion.setMotionCtg(MotionCtgType.LIFT_MOVE.val());
            if (null != origin) {
                motion.setOrigin(String.valueOf(liftDispatcher.getLiftLevOffset(target.getLiftNo(), origin.getLev())));
            }
            motion.setTarget(String.valueOf(liftDispatcher.getLiftLevOffset(target.getLiftNo(), target.getLev())));
//            if (null != origin) {
//                motion.setOrigin(String.valueOf(liftDispatcher.getLiftLevOffset(target.getLiftNo(), origin.getLev())));
//            }
//            motion.setTarget(String.valueOf(liftDispatcher.getLiftLevOffset(target.getLiftNo(), target.getLev())));
            motion.setTarget(target.getLev().toString());
            if (target.getSync() != null) {
                motion.setSync(target.getSync());
            }
zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/service/impl/MainServiceImpl.java
@@ -185,20 +185,6 @@
                        if (!Cools.isEmpty(barcode)) {
                            News.info("{}号条码扫描器检测条码信息:{}", deviceBarcode.getId(), barcode);
                            if ("NG".endsWith(barcode) || "NoRead".equals(barcode) || "empty".equals(barcode) || "00000000".equals(barcode)) {
                                staProtocol.setWorkNo((short) 32002);
                                staProtocol.setStaNo(inSta.getBackSta().shortValue());
                                devpThread.setPakMk(staProtocol.getSiteId(), false);
                                devpThread.writeWorkSta(staProtocol.getSiteId(), (short) 32002, inSta.getBackSta().shortValue());
                                // led 异常显示
                                LedThread ledThread = (LedThread) SlaveConnection.get(SlaveType.Led, inSta.getLed());
                                if (ledThread != null) {
                                    String errorMsg = "扫码失败,请重试";
                                    ledThread.error(errorMsg);
                                }
                                continue;
                            }
                        }
                        // 判断重复工作档
@@ -246,14 +232,13 @@
                                int row = Integer.parseInt(wmsLocNo.substring(0, 2));
                                int bay = Integer.parseInt(wmsLocNo.substring(2, 5));
                                int lev = Integer.parseInt(wmsLocNo.substring(5, 7));
                                row -= 16;
                                String wcsLocNo = Utils.getLocNo(row, bay, lev);
                                CreateInTaskParam createInTaskParam = new CreateInTaskParam();
                                createInTaskParam.setTaskNo(String.valueOf(dto.getWorkNo()));
                                createInTaskParam.setDestLoc(wcsLocNo);
                                createInTaskParam.setOriginSite("31002");
                                createInTaskParam.setDestSite("31004");
                                createInTaskParam.setOriginSite(dto.getSourceStaNo().toString());
                                createInTaskParam.setDestSite(dto.getStaNo().toString());
                                createInTaskParam.setPriority(11);
                                createInTaskParam.setBarcode(barcode);
@@ -263,7 +248,7 @@
                                    String msg = "";
                                    HashMap<String, String> hashMap = new HashMap<>();
                                    hashMap.put("msg", msg);
                                    hashMap.put("sta", "31001");
                                    hashMap.put("sta", inSta.getStaNo().toString());
                                    new HttpHandler.Builder()
                                            .setUri(wmsUrl)
                                            .setPath("/rpc/led/getError")
@@ -278,7 +263,7 @@
                                String msg = jsonObject.getString("msg");
                                HashMap<String, String> hashMap = new HashMap<>();
                                hashMap.put("msg", msg);
                                hashMap.put("sta", "31001");
                                hashMap.put("sta", inSta.getStaNo().toString());
                                new HttpHandler.Builder()
                                        .setUri(wmsUrl)
                                        .setPath("/rpc/led/getError")
zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/model/protocol/StaProtocol.java
@@ -21,6 +21,17 @@
    private Short staNo;
    // ----------------------------------------------------------------
    //已完成工作号
    private Short finishWorkNo = 0;
    //空闲
    private boolean idle;
    //条码
    private String barcode;
    //重量
    private Integer weight;
    // 自动
    private boolean autoing;
@@ -100,12 +111,18 @@
    }
    public Integer getLocType1() {
        if (this.low) {
            return 1;//低
        }else {
            return 2;//高
        if (!this.low  && !this.high){
            return 0;
        }
        if (this.low && !this.high) {
            return 1;
        }else if (this.high && !this.low) {
            return 2;
        }else if (this.high && this.low) {
            return 2;
        }
        return 0;
    }
}
zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/thread/impl/FyxcDevpThread.java
New file
@@ -0,0 +1,383 @@
package com.zy.asrs.wcs.rcs.thread.impl;
import HslCommunication.Core.Types.OperateResult;
import HslCommunication.Core.Types.OperateResultExOne;
import HslCommunication.Profinet.Siemens.SiemensPLCS;
import HslCommunication.Profinet.Siemens.SiemensS7Net;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.zy.asrs.framework.common.Cools;
import com.zy.asrs.framework.common.DateUtils;
import com.zy.asrs.framework.common.SpringUtils;
import com.zy.asrs.wcs.core.entity.BasConveyor;
import com.zy.asrs.wcs.core.entity.BasConveyorSta;
import com.zy.asrs.wcs.core.entity.DeviceBarcode;
import com.zy.asrs.wcs.core.service.BasConveyorService;
import com.zy.asrs.wcs.core.service.BasConveyorStaService;
import com.zy.asrs.wcs.core.service.DeviceBarcodeService;
import com.zy.asrs.wcs.core.utils.RedisUtil;
import com.zy.asrs.wcs.rcs.News;
import com.zy.asrs.wcs.rcs.cache.OutputQueue;
import com.zy.asrs.wcs.rcs.cache.SlaveConnection;
import com.zy.asrs.wcs.rcs.entity.Device;
import com.zy.asrs.wcs.rcs.model.dto.WorkModeTypeDto;
import com.zy.asrs.wcs.rcs.model.enums.SlaveType;
import com.zy.asrs.wcs.rcs.model.enums.WorkModeType;
import com.zy.asrs.wcs.rcs.model.protocol.StaProtocol;
import com.zy.asrs.wcs.rcs.thread.BarcodeThread;
import com.zy.asrs.wcs.rcs.thread.DevpThread;
import lombok.extern.slf4j.Slf4j;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
@Slf4j
public class FyxcDevpThread implements DevpThread, Runnable {
    private Device device;
    private RedisUtil redisUtil;
    private SiemensS7Net siemensS7Net;
    private Map<Integer, StaProtocol> station = new ConcurrentHashMap<>();
    public static ArrayList<BasConveyorSta> stationList = new ArrayList<>();
    public static final ArrayList<Integer> staNos1 = new ArrayList<Integer>() {{
        add(1012);add(1014);add(1015);add(1022);
        add(1023);add(1025);add(1026);add(1031);
        add(1032);
    }};
    /**
     * 条码数量
     */
    private int barcodeSize = 2;
    /**
     * 入出库模式
     * 0:未知
     * 1:入库启动中
     * 2.入库模式
     * 3.出库启动中 (不能生成入库工作档)
     * 4.出库模式
     */
    private Map<Integer, WorkModeTypeDto> workModeTypes = new ConcurrentHashMap<>();
    public FyxcDevpThread(Device device, RedisUtil redisUtil) {
        this.device = device;
        this.redisUtil = redisUtil;
//        workModeTypes.put(101, new WorkModeTypeDto(101, WorkModeType.NONE, "DB1001.120"));
    }
    private ArrayList<BasConveyorSta> getStaNo() {
        try {
            if (stationList.isEmpty()) {
                BasConveyorService basConveyorService = SpringUtils.getBean(BasConveyorService.class);
                BasConveyorStaService basConveyorStaService = SpringUtils.getBean(BasConveyorStaService.class);
                BasConveyor basConveyor = basConveyorService.getOne(new LambdaQueryWrapper<BasConveyor>()
                        .eq(BasConveyor::getDeviceId, device.getId())
                        .eq(BasConveyor::getHostId, device.getHostId()));
                if(basConveyor != null) {
                    List<BasConveyorSta> stations = basConveyorStaService.list(new LambdaQueryWrapper<BasConveyorSta>()
                            .eq(BasConveyorSta::getConveyorId, basConveyor.getId())
                            .eq(BasConveyorSta::getHostId, device.getHostId()));
                    stationList.addAll(stations);
                }
            }
            return stationList;
        } catch (Exception e) {
            return stationList;
        }
    }
    @Override
    @SuppressWarnings("InfiniteLoopStatement")
    public void run() {
        News.info("{}号输送线线程启动", device.getDeviceNo());
        this.connect();
        while (true) {
            try {
                read();
                Thread.sleep(500);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    private void read() throws InterruptedException {
        updateWorkMode();
        ArrayList<BasConveyorSta> staNos = getStaNo();
        int staNoSize = staNos.size();
        OperateResultExOne<byte[]> result = siemensS7Net.Read("DB82.14", (short) (staNoSize * 26));
        if (result.IsSuccess) {
            for (int i = 0; i < staNoSize; i++) {
                BasConveyorSta siteStation = staNos.get(i);
                int siteId = siteStation.getSiteNo();// 站点编号
                StaProtocol staProtocol = station.get(siteId);
                if (null == staProtocol) {
                    staProtocol = new StaProtocol();
                    staProtocol.setSiteId(siteId);
                    station.put(siteId, staProtocol);
                }
                Thread.sleep(300);
                boolean[] status = siemensS7Net.getByteTransform().TransBool(result.Content, i*26, 2);
                staProtocol.setAutoing(status[0]);  // 自动
                staProtocol.setIdle(status[1]); //空闲
                staProtocol.setLoading(status[2]);  // 有物
                staProtocol.setBackErr(status[5]);
                staProtocol.setLeftErr(status[6]);
                staProtocol.setRightErr(status[7]);
                staProtocol.setHighErr(status[8]);
                staProtocol.setWeightErr(status[9]);
                staProtocol.setLow(status[10]);
                staProtocol.setHigh(status[11]);
                staProtocol.setInEnable(status[13]); // 可入
                staProtocol.setOutEnable(status[14]);// 可出
                staProtocol.setWorkNo(siemensS7Net.getByteTransform().TransInt16(result.Content, i*26+2));     // 工作号
                staProtocol.setFinishWorkNo(siemensS7Net.getByteTransform().TransInt16(result.Content, i*26+6)); //已完成工作号
                staProtocol.setBarcode(siemensS7Net.getByteTransform().TransString(result.Content,i*26+10,12, "UTF-8").trim()); //条码
                staProtocol.setWeight(siemensS7Net.getByteTransform().TransInt32(result.Content, i*26+22)); //重量
//                staProtocol.setWorkMode((int) siemensS7Net.getByteTransform().TransInt16(result.Content, i * 40 + 8));// 工作模式
                staProtocol.setWorkNo((short) siemensS7Net.getByteTransform().TransInt32(result.Content, i * 18 + 10));     // 工作号
                staProtocol.setStaNo((short) siemensS7Net.getByteTransform().TransInt32(result.Content, i * 18 + 14));   // 目标站
                if (!staProtocol.isPakMk() && !staProtocol.isLoading()) {
                    staProtocol.setPakMk(true);
                }
            }
        }
        OperateResultExOne<byte[]> resultBarcode = siemensS7Net.Read("DB100.166", (short) 9);
        if (resultBarcode.IsSuccess) {
            //条码数据
            String barcode = siemensS7Net.getByteTransform().TransString(resultBarcode.Content,0,9, "UTF-8");// 条码
            BasConveyorStaService basConveyorStaService = SpringUtils.getBean(BasConveyorStaService.class);
            DeviceBarcodeService deviceBarcodeService = SpringUtils.getBean(DeviceBarcodeService.class);
            BasConveyorSta basConveyorSta = basConveyorStaService.getOne(new LambdaQueryWrapper<BasConveyorSta>().eq(BasConveyorSta::getSiteNo, 31002));
            if (basConveyorSta != null) {
                DeviceBarcode deviceBarcode = deviceBarcodeService.getById(basConveyorSta.getBarcodeId());
                if (deviceBarcode != null) {
                    BarcodeThread barcodeThread = (BarcodeThread) SlaveConnection.get(SlaveType.Barcode, Integer.parseInt(deviceBarcode.getDeviceId()));
                    if (barcodeThread != null) {
                        barcodeThread.setBarcode(barcode);
                    }
                }
            }
        }
        if (!Cools.isEmpty(result) && result.IsSuccess) {
            OutputQueue.DEVP.offer(MessageFormat.format("【{0}】[id:{1}] <<<<< 实时数据更新成功",DateUtils.convert(new Date()), device.getId()));
            // 根据实时信息更新数据库
            try {
                List<BasConveyorSta> stations = new ArrayList<>();
                for (BasConveyorSta sta : getStaNo()) {
                    StaProtocol staProtocol = station.get(sta.getSiteNo());
                    BasConveyorSta sqlModel = staProtocol.toSqlModel(sta);
                    stations.add(sqlModel);
                }
                if (!stations.isEmpty()) {
                    BasConveyorStaService basConveyorStaService = SpringUtils.getBean(BasConveyorStaService.class);
                    if (null != basConveyorStaService && !basConveyorStaService.updateBatchById(stations)) {
                        throw new Exception("更新数据库数据失败");
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
                OutputQueue.DEVP.offer(MessageFormat.format("【{0}】更新数据库数据失败 ===>> [id:{1}] [ip:{2}] [port:{3}] [rack:{4}] [slot:{5}]", DateUtils.convert(new Date()), device.getId(), device.getIp(), device.getPort(), device.getRack(), device.getSlot()));
                News.error("更新数据库数据失败 ===>> [id:{}] [ip:{}] [port:{}] [rack:{}] [slot:{}]", device.getId(), device.getIp(), device.getPort(), device.getRack(), device.getSlot());
            }
        } else {
            OutputQueue.DEVP.offer(MessageFormat.format("【{0}】读取输送线plc状态信息失败 ===>> [id:{1}] [ip:{2}] [port:{3}] [rack:{4}] [slot:{5}]", DateUtils.convert(new Date()), device.getId(), device.getIp(), device.getPort(), device.getRack(), device.getSlot()));
//            log.error("读取输送线plc状态信息失败 ===>> [id:{}] [ip:{}] [port:{}] [rack:{}] [slot:{}]", device.getId(), device.getIp(), device.getPort(), device.getRack(), device.getSlot());
        }
    }
    @Override
    public boolean connect() {
        boolean result = false;
        siemensS7Net = new SiemensS7Net(SiemensPLCS.S1500, device.getIp());
        siemensS7Net.setRack(device.getRack().byteValue());
        siemensS7Net.setSlot(device.getSlot().byteValue());
        OperateResult connect = siemensS7Net.ConnectServer();
        if(connect.IsSuccess){
            result = true;
            OutputQueue.DEVP.offer(MessageFormat.format( "【{0}】输送线plc连接成功 ===>> [id:{1}] [ip:{2}] [port:{3}] [rack:{4}] [slot:{5}]", DateUtils.convert(new Date()), device.getId(), device.getIp(), device.getPort(), device.getRack(), device.getSlot()));
            News.info("输送线plc连接成功 ===>> [id:{}] [ip:{}] [port:{}]", device.getId(), device.getIp(), device.getPort());
        } else {
            OutputQueue.DEVP.offer(MessageFormat.format( "【{0}】输送线plc连接失败!!! ===>> [id:{1}] [ip:{2}] [port:{3}]  [rack:{4}] [slot:{5}]", DateUtils.convert(new Date()), device.getId(), device.getIp(), device.getPort(), device.getRack(), device.getSlot()));
            News.error("输送线plc连接失败!!! ===>> [id:{}] [ip:{}] [port:{}]", device.getId(), device.getIp(), device.getPort());
        }
        // siemensS7Net.ConnectClose();
        return result;
    }
    @Override
    public void close() {
    }
    @Override
    public boolean writeWorkNo(int siteId, short workNo) {
        int index = staNos1.indexOf(siteId);
        OperateResult write = siemensS7Net.Write("DB83." + (index *8+6),(int) workNo);    // 工作号
        if (!write.IsSuccess) {
            StaProtocol staProtocol = station.get(siteId);
            if (staProtocol.getWorkNo() == 0 && staProtocol.getStaNo() ==0) {
                staProtocol.setPakMk(true);
            }
            OutputQueue.DEVP.offer(MessageFormat.format("【{0}】写入输送线站点数据失败。输送线plc编号={1},站点数据={2}", device.getId(), JSON.toJSON(staProtocol)));
            log.error("写入输送线站点数据失败。输送线plc编号={},站点数据={}", device.getId(), JSON.toJSON(staProtocol));
        } else {
            OutputQueue.DEVP.offer(MessageFormat.format("【{0}】 输送线命令下发 [id:{1}] >>>>> {2}", DateUtils.convert(new Date()), device.getId(), JSON.toJSON(workNo)));
            log.info("输送线命令下发 [id:{}] >>>>> 命令下发: {}",  device.getId(), JSON.toJSON(workNo));
            return true;
        }
        return false;
    }
    @Override
    public boolean writeStaNo(int siteId,short staNo) {
        int index = staNos1.indexOf(siteId);
        OperateResult write = siemensS7Net.Write("DB101." + (index * 8 + 4),(int) staNo);    // 目标站
        if (!write.IsSuccess) {
            StaProtocol staProtocol = station.get(siteId);
            if (staProtocol.getWorkNo() == 0 && staProtocol.getStaNo() ==0) {
                staProtocol.setPakMk(true);
            }
            OutputQueue.DEVP.offer(MessageFormat.format("【{0}】写入输送线站点数据失败。输送线plc编号={1},站点数据={2}", device.getId(), JSON.toJSON(staProtocol)));
            log.error("写入输送线站点数据失败。输送线plc编号={},站点数据={}", device.getId(), JSON.toJSON(staProtocol));
        } else {
            OutputQueue.DEVP.offer(MessageFormat.format("【{0}】 输送线命令下发 [id:{1}] >>>>> {2}", DateUtils.convert(new Date()), device.getId(), JSON.toJSON(staNo)));
            log.info("输送线命令下发 [id:{}] >>>>> 命令下发: {}",  device.getId(), JSON.toJSON(staNo));
            return true;
        }
        return false;
    }
    @Override
    public boolean writeWorkSta(int siteId, short workNo, short staNo) {
        int index = staNos1.indexOf(siteId);
        short[] array = new short[2];
        array[0] = workNo;
        array[1] = staNo;
        String workNoAddress = "DB101." + (index * 8 + 6);
        String staNoAddress = "DB101." + (index * 8 + 4);
        OperateResult write1 = null;    // 工作号
        OperateResult write2 = null;     // 目标站
        //任务下发次数
        int writeCount = 0;
        do {
            write1 = siemensS7Net.Write(workNoAddress, (int) workNo);    // 工作号
            write2 = siemensS7Net.Write(staNoAddress, (int) staNo);
            if ((write1.IsSuccess && write2.IsSuccess)) {
                OperateResultExOne<byte[]> readResult = siemensS7Net.Read(staNoAddress, (short) 8);
                if (readResult.IsSuccess) {
                    int staNo2 = siemensS7Net.getByteTransform().TransInt32(readResult.Content, 0);
                    int workNo2 = siemensS7Net.getByteTransform().TransInt32(readResult.Content, 4);
                    if (workNo == workNo2 && staNo == staNo2) {
                        //任务命令写入成功
                        log.info("写入输送线命令后返回成功,并且回读成功。输送线plc编号={},{},{},写入次数={}", siteId, JSON.toJSON(workNo), JSON.toJSON(staNo), writeCount);
                        return true;
                    } else {//返回结果是成功了,但是真实值不相同
                        writeCount++;
                        log.error("写入输送线命令后返回成功,但是读取任务值不一致。输送线plc编号={},{},{},写入次数={}", siteId, JSON.toJSON(workNo), JSON.toJSON(staNo), writeCount);
                    }
                } else {
                    writeCount++;
                    log.error("写入输送线命令后读取失败。输送线plc编号={},站点数据={},{},写入次数={}", siteId, JSON.toJSON(workNo), JSON.toJSON(staNo), writeCount);
                }
            }else {
                writeCount++;
            }
        }while (writeCount < 5) ;
//        StaProtocol staProtocol = station.get(siteId);
//        if (staProtocol.getWorkNo() == 0 && staProtocol.getStaNo() ==0) {
//            staProtocol.setPakMk(true);
//        }
        OutputQueue.DEVP.offer(MessageFormat.format("【{0}】写入输送线站点数据失败。输送线plc编号={1},站点数据={2}", device.getId(), JSON.toJSON(array)));
        log.error("写入输送线站点数据失败。输送线plc编号={},站点数据={}", device.getId(), JSON.toJSON(array));
        return false;
    }
    @Override
    public Map<Integer, StaProtocol> getStation() {
        return this.station;
    }
    private int findStaNosIndex(int siteId) {
        ArrayList<BasConveyorSta> staNos = getStaNo();
        int index = -1;
        for (int i = 0; i < staNos.size(); i++) {
            BasConveyorSta sta = staNos.get(i);
            if (sta.getSiteNo() == siteId) {
                index = i;
                break;
            }
        }
        return index;
    }
    /**
     * 设置入库标记
     */
    @Override
    public void setPakMk(Integer siteId, boolean pakMk) {
        StaProtocol staProtocol = station.get(siteId);
        if (null != staProtocol) {
            staProtocol.setPakMk(pakMk);
        }
    }
    private void updateWorkMode() {
        for (Map.Entry<Integer, WorkModeTypeDto> entry : workModeTypes.entrySet()) {
            WorkModeTypeDto workModeTypeDto = entry.getValue();
            WorkModeType workModeType = workModeTypeDto.getWorkModeType();
            if (workModeType != WorkModeType.NONE) {
                if (!siemensS7Net.Write(workModeTypeDto.getAddress(), workModeType.id).IsSuccess) {
                    OutputQueue.DEVP.offer(MessageFormat.format("写入输送线{}入出库模式失败。输送线编号={}", workModeTypeDto.getSiteId(), device.getId()));
                    log.error("写入输送线{}入出库模式失败。输送线编号={}", workModeTypeDto.getSiteId(), device.getId());
                }
            }
        }
    }
    @Override
    public boolean switchWorkMode(int siteId, int workMode) {
        WorkModeTypeDto workModeTypeDto = workModeTypes.get(siteId);
        if(workModeTypeDto == null) {
            return false;
        }
        workModeTypeDto.setWorkModeType(WorkModeType.get((short) workMode));
        workModeTypes.put(siteId, workModeTypeDto);
        return true;
    }
}
zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/thread/impl/NyLiftThread.java
@@ -16,6 +16,7 @@
import com.zy.asrs.wcs.core.model.enums.LiftCommandModeType;
import com.zy.asrs.wcs.core.model.enums.MotionCtgType;
import com.zy.asrs.wcs.core.service.BasLiftService;
import com.zy.asrs.wcs.core.utils.LiftDispatcher;
import com.zy.asrs.wcs.core.utils.RedisUtil;
import com.zy.asrs.wcs.core.utils.Utils;
import com.zy.asrs.wcs.rcs.News;
@@ -47,22 +48,6 @@
    public NyLiftThread(Device device, RedisUtil redisUtil) {
        this.device = device;
        this.redisUtil = redisUtil;
        //初始化站点
        BasLiftService basLiftService = SpringUtils.getBean(BasLiftService.class);
        BasLift basLift = basLiftService.getOne(new LambdaQueryWrapper<BasLift>()
                .eq(BasLift::getDeviceId, device.getId()));
        List<BasLiftStaDto> staList = JSON.parseArray(basLift.getSta(), BasLiftStaDto.class);
        this.staList = staList;
        for (BasLiftStaDto sta : staList) {
            LiftStaProtocol liftStaProtocol = new LiftStaProtocol();
            liftStaProtocol.setStaNo(sta.getStaNo());//站点号
            liftStaProtocol.setLev(sta.getLev());//站点楼层
            String locNo = Utils.getLocNo(sta.getRow(), sta.getBay(), sta.getLev());
            liftStaProtocol.setLocNo(locNo);//站点库位号
            liftStaProtocol.setLiftNo(basLift.getLiftNo());//提升机号
            liftStaProtocols.add(liftStaProtocol);
        }
    }
    @Override
@@ -94,6 +79,24 @@
    private void readStatus() {
        try {
            if (liftStaProtocols.isEmpty()) {
                //初始化站点
                BasLiftService basLiftService = SpringUtils.getBean(BasLiftService.class);
                BasLift basLift = basLiftService.getOne(new LambdaQueryWrapper<BasLift>()
                        .eq(BasLift::getDeviceId, device.getId()));
                List<BasLiftStaDto> staList = JSON.parseArray(basLift.getSta(), BasLiftStaDto.class);
                this.staList = staList;
                for (BasLiftStaDto sta : staList) {
                    LiftStaProtocol liftStaProtocol = new LiftStaProtocol();
                    liftStaProtocol.setStaNo(sta.getStaNo());//站点号
                    liftStaProtocol.setLev(sta.getLev());//站点楼层
                    String locNo = Utils.getLocNo(sta.getRow(), sta.getBay(), sta.getLev());
                    liftStaProtocol.setLocNo(locNo);//站点库位号
                    liftStaProtocol.setLiftNo(basLift.getLiftNo());//提升机号
                    liftStaProtocols.add(liftStaProtocol);
                }
            }
            //获取提升机数据
            OperateResultExOne<byte[]> result1 = siemensS7Net.Read("DB82.4.0", (short) 10);
            if (result1.IsSuccess) {
@@ -133,7 +136,7 @@
                //有小车
                liftProtocol.setHasCar(status2[6]);
                //设备故障
                liftProtocol.setErrorCode(String.valueOf(status2[7]));
                liftProtocol.setErrorCode(status2[7]?"1":"0");
                //目的地址
                liftProtocol.setDistAddress(siemensS7Net.getByteTransform().TransInt16(result1.Content, 4));
                //已完成任务号
@@ -147,6 +150,12 @@
                //任务号
                liftExtend.setLiftTaskNo(String.valueOf(siemensS7Net.getByteTransform().TransInt16(result1.Content, 2)));
                liftProtocol.setExtend(liftExtend);
                boolean ready = true;
                if (!liftProtocol.getModel() || liftProtocol.getRun()) {
                    ready = false;
                }
                liftProtocol.setReady(ready);//就绪状态
            }else {
@@ -276,6 +285,22 @@
            array[i] = shorts.get(i);
        }
        LiftDispatcher liftDispatcher = SpringUtils.getBean(LiftDispatcher.class);
        Integer lev = liftDispatcher.getLiftLevOffset(this.device.getId().intValue(), liftProtocol.getLev());
        if (null == lev){
            News.error("提升机获取当前层为空");
            response.setMessage("提升机获取当前层为空");
            return response;
        }
        array[1] = lev.shortValue();
        Integer targetLev = liftDispatcher.getLiftLevOffset(this.device.getId().intValue(), command.getTargetLev());
        if (null == targetLev){
            News.error("提升机获取目标层为空");
            response.setMessage("提升机获取目标层为空");
            return response;
        }
        array[2] = targetLev.shortValue();
        OperateResult result = siemensS7Net.Write("DB83.0", array);
        if (result != null && result.IsSuccess) {
            liftProtocol.setSendTime(System.currentTimeMillis());//指令下发时间
@@ -375,8 +400,14 @@
    @Override
    public int generateDeviceTaskNo(int taskNo, MotionCtgType motionCtgType) {
        int deviceTaskNo = taskNo;
        try {
            deviceTaskNo = Utils.getTaskNo("LIFT_TASK_NO");
        } catch (Exception e) {
        return taskNo;
    }
        return deviceTaskNo;
    }
    @Override
    public List<LiftCommand> getMoveCommand(Integer taskNo, Integer sourceLev, Integer targetLev, LiftCommandModeType mode) {
zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/thread/impl/NyShuttleThread.java
@@ -232,7 +232,7 @@
        }
    }
    public JSONObject getRequestBody(String type) {
    public JSONObject getRequestBody(String type, String taskId) {
        try {
            // 获取服务器响应
            JSONObject result = null;
@@ -255,7 +255,14 @@
                }
                if (!responseType.equals(type)) {
                    continue;//响应类型与请求类型不一致,不在调试模式下
                }
                if (taskId != null) {
                    String responseTaskId = resultBody.get("taskId").toString();
                    if (!responseTaskId.equals(taskId)) {
                    continue;//响应ID与请求ID不一致,不在调试模式下
                    }
                }
                result = socketResult;
@@ -279,6 +286,7 @@
                this.connect();
            }
            readStatus();
            Thread.sleep(200);
        } catch (Exception e) {
            e.printStackTrace();
            OutputQueue.SHUTTLE.offer(MessageFormat.format("【{0}】读取四向穿梭车状态信息失败 ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), device.getId(), device.getIp(), device.getPort()));
@@ -1076,17 +1084,20 @@
//            System.out.println("Sent message to server: " + JSON.toJSONString(httpCommand));
        String requestType = null;
        String taskId = null;
        try {
            requestType = httpCommand.getRequest().getBody().get("requestType").toString();
            taskId = httpCommand.getRequest().getBody().get("taskId").toString();
        } catch (Exception e) {
            return null;
//            return null;
            //taskId可能取空,不报错,正常情况
        }
        // 获取服务器响应
        // 尝试10次
        JSONObject result = null;
        for (int i = 0; i < 10; i++) {
            result = getRequestBody(requestType);
            result = getRequestBody(requestType,taskId);
            if (result == null) {
                try {
                    Thread.sleep(100);
zy-asrs-wcs/src/main/resources/application.yml
@@ -18,7 +18,7 @@
#    url: jdbc:mysql://47.97.1.152:3306/asrs?useUnicode=trKue&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai
#    username: root
#    password: zy@123
    url: jdbc:mysql://127.0.0.1:3306/jxgtasrs?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai
    url: jdbc:mysql://127.0.0.1:3306/fyxcasrs?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
    username: root
    password: root
#    driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver