pjb
2025-07-06 8dad82eb9bc7f51e0d22f6e92106733d4386627c
读取更新罐装线要桶数量
6个文件已修改
137 ■■■■ 已修改文件
src/main/java/com/zy/common/model/SearchLocParam.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/controller/SiteController.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/model/protocol/StaProtocol.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/SiemensDevpThread.java 68 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/service/impl/MainServiceImpl.java 56 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/pipeline.html 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/model/SearchLocParam.java
@@ -41,6 +41,8 @@
    public static class WantBucket{
        private int site;
        private int bucketType;
        // 罐装线罐装数量(拖)
        private int wantBucketCount;
    }
    public static void main(String[] args) {
src/main/java/com/zy/controller/SiteController.java
@@ -78,8 +78,8 @@
            vo.setLoading(staProtocol.isLoading()?"Y":"N");     // 有物
            vo.setInEnable(staProtocol.isInEnable()?"Y":"N");   // 可入
            vo.setOutEnable(staProtocol.isOutEnable()?"Y":"N"); // 可出
            vo.setPakMk(staProtocol.isPakMk()?"Y":"N");       // 入库标记
            vo.setEmptyMk(staProtocol.isEmptyMk()?"Y":"N");     // 空板信号
            vo.setPakMk(String.valueOf(staProtocol.getWantBucketFlag()));       // 入库标记 -> 要桶信号
            vo.setEmptyMk(String.valueOf(staProtocol.getWantBucketCount()));     // 空板信号 -> 要桶数
            vo.setStaNo(staProtocol.getStaNo());                // 目标站
            vo.setWorkNo(staProtocol.getWorkNo());
//            vo.setLocType1(staProtocol.isHigh() != staProtocol.isLow() && staProtocol.isLow() ? "低" : "高");     //高低库位
src/main/java/com/zy/core/model/protocol/StaProtocol.java
@@ -85,6 +85,9 @@
    // 要桶型-------------------------------------------------------------------------
    private int wantBucketFlag = 0;
    // 罐装线罐装数量(拖)
    private int wantBucketCount = 0;
    // 出罐装线 罐装线反馈给wcs----------------------------------------------------------
    // 任务号
src/main/java/com/zy/core/thread/SiemensDevpThread.java
@@ -156,6 +156,10 @@
                    case 5:
                        writeGzxkc((StaProtocol)task.getData());
                        break;
                    // 给罐装线写罐装数量
                    case 6:
                        writeGzsl((StaProtocol)task.getData());
                        break;
                    default:
                        break;
                }
@@ -227,19 +231,26 @@
            OperateResultExOne<byte[]> read = siemensS7Net.Read("DB101.0", (short) 64);
            if (read.IsSuccess) {
                // 15秒打印一下日志
                if (System.currentTimeMillis() - lastLogTime >= 15000) {
                    OperateResultExOne<byte[]> readKc = siemensS7Net.Read("DB100.6", (short) 2);
                    if(readKc.IsSuccess){
                        short i = siemensS7Net.getByteTransform().TransInt16(readKc.Content, 0);
                        log.info("读{}号罐装线可出信号成功,值:{}", slave.getId() -3, i);
                    }
                    lastLogTime = System.currentTimeMillis();
                }
//                if (System.currentTimeMillis() - lastLogTime >= 30000) {
//                    OperateResultExOne<byte[]> readKc = siemensS7Net.Read("DB100.6", (short) 4);
//                    if(readKc.IsSuccess){
//                        short i = siemensS7Net.getByteTransform().TransInt16(readKc.Content, 0);
//                        short wantBucketCount = siemensS7Net.getByteTransform().TransInt16(readKc.Content, 2);
//                        log.info("读{}号罐装线可出信号成功,值:{},剩余要桶数量:{}", slave.getId() -3, i, wantBucketCount);
//                    }
//                    lastLogTime = System.currentTimeMillis();
//                }
                // 成品信息反馈到罐装线出口站点
                DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, 2);
                StaProtocol staProtocol = devpThread.getStation().get(gzxResultSite.get(slave.getId()-4));
                if (staProtocol != null) {
                    staProtocol.setWantBucketFlag(siemensS7Net.getByteTransform().TransInt16(read.Content, 0));// 罐装线要桶型信号
                    OperateResultExOne<byte[]> read2 = siemensS7Net.Read("DB100.8", (short) 2); // 罐装线罐装数量(拖)
                    if(read2.IsSuccess){
                        staProtocol.setWantBucketCount(siemensS7Net.getByteTransform().TransInt16(read2.Content, 0));
                    } else {
                        log.error("读{}号罐装线要拖数量失败", slave.getId() -3);
                    }
                    staProtocol.setWrkNo(siemensS7Net.getByteTransform().TransInt16(read.Content, 2));
                    double weight208l1 = siemensS7Net.getByteTransform().TransSingle(read.Content, 4); // 200L桶1净重
                    double weight208l2 = siemensS7Net.getByteTransform().TransSingle(read.Content, 8); // 200L桶2净重
@@ -575,6 +586,47 @@
    }
    /**
     * 给罐装线写罐装数量
     */
    private void writeGzsl(StaProtocol staProtocol) throws InterruptedException {
        if (null == staProtocol) {
            return;
        }
        short[] common = new short[1];
        common[0] = (short) staProtocol.getWantBucketCount();
        OperateResult write;
        //任务下发次数
        int writeCount = 0;
        do {
            write = siemensS7Net.Write("DB100.8", common);
            Thread.sleep(200);
            OperateResultExOne<byte[]> read = siemensS7Net.Read("DB100.8", (short) 2);
            if(write.IsSuccess && read.IsSuccess){
                short i = siemensS7Net.getByteTransform().TransInt16(read.Content, 0);
                if ( i != common[0]) {
                    writeCount++;
                    log.error("给罐装线写罐装数量成功,但回读失败:读取值:{},输送线plc编号={},写入次数={}", i, slave.getId(), writeCount);
                    continue;
                }
                break;
            }
            else {
                writeCount++;
                log.error("给罐装线写罐装数量:{}失败。输送线plc编号={},写入次数={}", common[0], slave.getId(), writeCount);
            }
        }while (writeCount<5);
        if (!write.IsSuccess) {
            OutputQueue.DEVP.offer(MessageFormat.format("【{0}】给给罐装线写罐装数量失败。输送线plc编号={1},站点数据={2}", slave.getId(), staProtocol.getWantBucketCount()));
            News.error("给罐装线写罐装数量失败。输送线plc编号={},站点数据={}", slave.getId(), staProtocol.getWantBucketCount());
        } else {
            OutputQueue.DEVP.offer(MessageFormat.format("【{0}】 给罐装线写罐装数量命令下发成功 [id:{1}] >>>>> {2}", DateUtils.convert(new Date()), slave.getId(), staProtocol.getWantBucketCount()));
            News.info("给罐装线写罐装数量号命令下发成功 [id:{}] >>>>> 命令下发: {}",  slave.getId(), staProtocol.getWantBucketCount());
        }
    }
    /**
     * 心跳
     */
    private void heartbeat(){
src/main/java/com/zy/service/impl/MainServiceImpl.java
@@ -265,6 +265,9 @@
                            barcodeThread.setBarcode("");
                            staProtocol.setWorkNo(dto.getWorkNo());
                            staProtocol.setStaNo(dto.getStaNo().shortValue());
                            if (dto.getStaNo() == 1071 || dto.getStaNo() == 1064 || dto.getStaNo() == 1078) {
                                decreaseWantBucketCount(dto.getStaNo(),1);
                            }
                            devpThread.setPakMk(staProtocol.getSiteId(), false);
                            boolean result = MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
                            log.info("输送线下发2:"+dto.getWorkNo()+","+dto.getStaNo());
@@ -302,10 +305,47 @@
        StaProtocol staProtocol1084 = devpThread.getStation().get(1084);
        StaProtocol staProtocol1087 = devpThread.getStation().get(1087);
        List<SearchLocParam.WantBucket> wantBucketList = new ArrayList<>();
        wantBucketList.add(new SearchLocParam.WantBucket(1064,staProtocol1084.getWantBucketFlag()));
        wantBucketList.add(new SearchLocParam.WantBucket(1071,staProtocol1081.getWantBucketFlag()));
        wantBucketList.add(new SearchLocParam.WantBucket(1078,staProtocol1087.getWantBucketFlag()));
        wantBucketList.add(new SearchLocParam.WantBucket(1064,staProtocol1084.getWantBucketFlag(),staProtocol1084.getWantBucketCount()));
        wantBucketList.add(new SearchLocParam.WantBucket(1071,staProtocol1081.getWantBucketFlag(),staProtocol1081.getWantBucketCount()));
        wantBucketList.add(new SearchLocParam.WantBucket(1078,staProtocol1087.getWantBucketFlag(),staProtocol1087.getWantBucketCount()));
        return wantBucketList;
    }
    /**
     * 罐装线要桶数量减少
     */
    private void decreaseWantBucketCount(int site, int decrease) {
        int siteNew;
        switch (site) {
            case 1071: siteNew = 1081;break;
            case 1064: siteNew = 1084;break;
            case 1078: siteNew = 1087;break;
            default:
                return;
        }
        SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, 2);
        StaProtocol staProtocol = devpThread.getStation().get(siteNew);
        int count = staProtocol.getWantBucketCount();
        int remaining = count - decrease;
        if ( remaining < 0) {
            log.error("自动出空桶减少罐装线要桶数异常,站点:{},减少前:{},减少数:{},剩余要桶数:{}", site, count, decrease, remaining);
            return;
        }
        staProtocol.setWantBucketCount(remaining); // 设置剩余要桶数
        boolean offer = MessageQueue.offer(SlaveType.Devp, inGzxSiteList.indexOf(site) + 4, new Task(6, staProtocol));
        if (offer) {
            log.info("自动出空桶减少罐装线要桶数命令推送队列成功:站点:{},剩余要桶数:{}" ,site, remaining);
        } else {
            log.error("自动出空桶减少罐装线要桶数命令推送队列失败:站点:{},剩余要桶数:{}" ,site, remaining);
        }
        log.info("自动出空桶减少罐装线要桶数成功,站点:{},减少前:{},减少数:{},剩余要桶数:{}", site, count, decrease, remaining);
    }
    /**
@@ -1144,9 +1184,6 @@
            // 获取堆垛机信息
            CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, crn.getId());
            CrnProtocol crnProtocol = crnThread.getCrnProtocol();
            if (crnProtocol == null) {
                continue;
            }
            if (crnProtocol.getStatusType() == CrnStatusType.IDLE && crnProtocol.getTaskNo() == 0 && crnProtocol.getModeType() == CrnModeType.AUTO
                    && crnProtocol.getLoaded() == 0 && crnProtocol.getForkPos() == 0) {
                // 判断是不是已在原点
@@ -1178,6 +1215,8 @@
                if (!MessageQueue.offer(SlaveType.Crn, crn.getId(), new Task(2, crnCommand))) {
                    News.error("回原点任务下发失败", crn.getId(), JSON.toJSON(crnCommand));
                } else {
                    basCrnp.setModiTime(new Date());
                    basCrnpService.updateById(basCrnp); // 设置更新时间,避免重复下发回原点
                    log.info("{}号堆垛机回原点任务下发成功:{}", crn.getId(), JSON.toJSON(crnCommand));
                }
            }
@@ -1962,7 +2001,7 @@
        String[] split = config.getValue().split("=");
        for (SearchLocParam.WantBucket wantBucket : getWantBucketFlag()) {
            if (wantBucket.getBucketType() != 0) { // 罐装线有要桶信号
            if (wantBucket.getBucketType() != 0 && wantBucket.getWantBucketCount() >= 2) { // 罐装线有要桶信号
                boolean flag = true; // 是否需要自动补,true不需要,false需要
                for(String item: split) {
                    if(String.valueOf(wantBucket.getSite()).equals(item)) {
@@ -2038,10 +2077,11 @@
                                    log.info("自动出空桶请求wms原始返回:" + response);
                                    JSONObject jsonObject = JSON.parseObject(response);
                                    if (jsonObject.getInteger("code").equals(200)) {
                                        decreaseWantBucketCount(wantBucket.getSite(),2);
                                        log.info("自动出空桶成功:{}",wantBucket.getSite());
                                        return;
                                    } else {
                                        News.error("自动空桶出库" + ":请求接口失败!!!url:{};request:{};response:{}", wmsUrl + "/rpc/pakin/loc/v1", JSON.toJSONString(param), response);
                                        News.error("自动空桶出库" + ":请求接口失败!!!url:{};request:{};response:{}", wmsUrl + "/rpc/autoOutEmptyBucket", JSON.toJSONString(param), response);
                                    }
                                } catch (Exception e) {
                                    e.printStackTrace();
src/main/webapp/views/pipeline.html
@@ -112,8 +112,8 @@
                        <th>有物</th>
                        <th>可入</th>
                        <th>可出</th>
                        <th>入库标记</th>
                        <th>空板信号</th>
                        <th>要桶信号</th>
                        <th>要桶数</th>
                        <th>目标站</th>
                        <th>高低库位</th>
                    </tr>