1
4 天以前 82374fe4b32d58956810f445b7889f1a370f1ab9
src/main/java/com/zy/core/thread/RgvThread.java
@@ -5,18 +5,13 @@
import HslCommunication.Profinet.Siemens.SiemensPLCS;
import HslCommunication.Profinet.Siemens.SiemensS7Net;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.core.common.Cools;
import com.core.common.DateUtils;
import com.core.common.SpringUtils;
import com.core.exception.CoolException;
import com.zy.asrs.entity.BasDevp;
import com.zy.asrs.entity.BasRgv;
import com.zy.asrs.entity.BasRgvMap;
import com.zy.asrs.entity.BasRgvOpt;
import com.zy.asrs.service.BasDevpService;
import com.zy.asrs.service.BasRgvMapService;
import com.zy.asrs.service.BasRgvOptService;
import com.zy.asrs.service.BasRgvService;
import com.zy.asrs.entity.*;
import com.zy.asrs.service.*;
import com.zy.common.utils.News;
import com.zy.core.RgvThread2;
import com.zy.core.ThreadHandler;
@@ -35,6 +30,7 @@
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import java.sql.Wrapper;
import java.text.MessageFormat;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
@@ -64,13 +60,17 @@
    //锁定标记
    private boolean PakMk = true;
    //入库标记
    private boolean PakIn = true;
    //出库标记
    private boolean PakOut = true;
    //根据距离跳过取货
    private boolean PakRgv = true;
    //接驳标记
    private boolean PakToCrn = true;
//    private boolean PakIn = true;
//    //出库标记
//    private boolean PakOut = true;
//    //根据距离跳过取货
//    private boolean PakRgv  = true;
//    //接驳标记
//    private boolean PakToCrn = true;
    // 任务锁定
    private boolean Paking  = true;
//    //连续任务下发
//    private boolean PakAll = true;
    public RgvThread(RgvSlave slave) {
        this.slave = slave;
@@ -121,9 +121,10 @@
        }
    }
    private static final Set<Integer> specialSites = new HashSet<>(
            Arrays.asList(1004,1014,1018,1028,1035));
            Arrays.asList(1004,1014,1018,1028,1035,2006,2012,2018,2024,2030));
    public static final Map<Integer, Integer> StaPosition = new HashMap<Integer, Integer>() {{
        put(1004, 1001);put(1014, 1011);put(1018, 1015);put(1028, 1025);put(1035, 1032);
        put(2006, 2004);put(2012, 2010);put(2018, 2016);put(2024, 2022);put(2030, 2028);
    }};
    public static final ArrayList<Integer> staNos1 = new ArrayList<Integer>() {{
@@ -232,15 +233,48 @@
            buffer[byteIndex] &= ~(1 << bitIndex); // 清零
        }
    }
    private void updateFlagInDb(String field, boolean value) {
        try {
            BasRgvService basRgvService = SpringUtils.getBean(BasRgvService.class);
            EntityWrapper<BasRgv> wrapper = new EntityWrapper<>();
            wrapper.eq("rgv_no", slave.getId());
            BasRgv entity = new BasRgv();
            switch (field) {
                case "pak_mk":    entity.setPakMk(value ? "1" : "0"); break;
                case "pak_in":    entity.setPakIn(value ? "1" : "0"); break;
                case "pak_out":   entity.setPakOut(value ? "1" : "0"); break;
                case "pak_rgv":   entity.setPakRgv(value ? "1" : "0"); break;
                case "pak_to_crn":entity.setPakToCrn(value ? "1" : "0"); break;
                case "paking":entity.setPaking(value ? "1" : "0"); break;
                case "pak_all":entity.setPakAll(value ? "1" : "0"); break;
                default:
                    log.warn("未知标志位字段: {}", field);
                    return;
            }
            basRgvService.update(entity, wrapper);
//            log.info("RGV标志位更新成功 [rgv_no:{}] {}={}", slave.getId(), field, value ? "1" : "0");
        } catch (Exception e) {
            log.error("更新RGV标志位异常 [rgv_no:{}] {}={} 错误:{}", slave.getId(), field, value, e.getMessage());
        }
    }
    public void setPakMk(boolean pakMk) {
        this.PakMk = pakMk;
        updateFlagInDb("pak_mk", pakMk);
    }
    /**
     * 读取状态
     */
    private void readStatus(){
        try {
            ArrayList<Integer> staNos = getStaNo();
            OperateResultExOne<byte[]> result = siemensNet.Read("DB101.0", (short) 38);
            OperateResultExOne<byte[]> result = siemensNet.Read("DB101.0", (short) 42);
            if (result.IsSuccess) {
                if (null == rgvProtocol) {
                    rgvProtocol = new RgvProtocol();
@@ -272,9 +306,54 @@
                rgvProtocol.setErr10(status3[1]);
                rgvProtocol.setErr11(status3[2]);
                rgvProtocol.setErr12(status3[3]);
                BasRgvMapService basRgvMapService = SpringUtils.getBean(BasRgvMapService.class);
                boolean[] statusErr = siemensNet.getByteTransform().TransBool(result.Content, 36, 6);
                rgvProtocol.setEmergencyStop(statusErr[0]);       // 急停触发
                rgvProtocol.setSlot1EmptyNoData(statusErr[1]);   // 1号位有物无资料
                rgvProtocol.setSlot2EmptyNoData(statusErr[2]);   // 2号位有物无资料
                rgvProtocol.setCommandErrorChainConflict(statusErr[3]); // 命令错误走链条冲突
                rgvProtocol.setTargetPositionIssue(statusErr[4]); // 目标位下发错误
                rgvProtocol.setTravelInverterError(statusErr[5]); // 走行变频器异常
                rgvProtocol.setPhotoelectric1Error(statusErr[6]); // 1号光电异常
                rgvProtocol.setPhotoelectric2Error(statusErr[7]); // 2号光电异常
                rgvProtocol.setTimeoutConnectionWithLine(statusErr[8]); // 与输线时接超时
                rgvProtocol.setLeftRollerTimeout(statusErr[9]);    // 左侧滚筒运行超时
                rgvProtocol.setRightRollerTimeout(statusErr[10]);   // 右侧滚筒运行超时
                rgvProtocol.setRgvRunTimeout(statusErr[11]);        // rgv运行超时
                rgvProtocol.setPosition1ChainInverterError(statusErr[12]); // 1号工位链条变频器异常
                rgvProtocol.setPosition2ChainInverterError(statusErr[13]); // 2号工位链条变频器异常
                rgvProtocol.setFrontRearLimit(statusErr[14]);      // 前后极限位
                rgvProtocol.setEmergencyButton(statusErr[15]);     // 急停按钮
                rgvProtocol.setForwardButton(statusErr[16]);       // 前进按钮
                rgvProtocol.setReverseButton(statusErr[17]);       // 后退按钮
                rgvProtocol.setLocalRemote(statusErr[18]);         // 本地/远程
                rgvProtocol.setReset(statusErr[19]);               // 复位
                rgvProtocol.setTravelBrakeSwitch(statusErr[20]);   // 走行抱闸开关钮
                rgvProtocol.setTravelSpeedLimitPhotoelectric(statusErr[21]); // 走行强制减速光电
                rgvProtocol.setLeftOverlimit1(statusErr[22]);      // 左超限 1
                rgvProtocol.setRightOverlimit1(statusErr[23]);     // 右超限 1
                rgvProtocol.setLeftAtPosition1(statusErr[24]);     // 左到位 1
                rgvProtocol.setRightAtPosition1(statusErr[25]);    // 右到位 1
                rgvProtocol.setChainForward1(statusErr[26]);       // 链条前进 1
                rgvProtocol.setChainReverse1(statusErr[27]);       // 链条后退 1
                rgvProtocol.setInverterAlarm(statusErr[28]);       // 变频器报警
                rgvProtocol.setLeftOverlimit2(statusErr[29]);      // 左超限 2
                rgvProtocol.setRightOverlimit2(statusErr[30]);     // 右超限 2
                rgvProtocol.setLeftAtPosition2(statusErr[31]);     // 左到位 2
                rgvProtocol.setRightAtPosition2(statusErr[32]);    // 右到位 2
                rgvProtocol.setCargoSpeedReduction(statusErr[33]); // 货物减速
                rgvProtocol.setConveyorInverterAlarm2(statusErr[34]); // 输送变频器报警 2
                rgvProtocol.setRightConveyor2(statusErr[35]);      // 右输送 2
                rgvProtocol.setLeftConveyor2(statusErr[36]);       // 左输送 2
                if(rgvProtocol.getStatus() == 99){
                    rgvProtocol.setErrorMk(true);//若存在异常触发写入
                }else{
                    rgvProtocol.setWriteMk(true);//无异常后才能继续写入
                    rgvProtocol.setErrorMk(false);
                }
//                BasRgvMapService basRgvMapService = SpringUtils.getBean(BasRgvMapService.class);
                OutputQueue.RGV.offer(MessageFormat.format("【{0}】[id:{1}] <<<<< 实时数据更新成功", DateUtils.convert(new Date()), slave.getId()));
                try {
                    // 根据实时信息更新数据库
@@ -282,6 +361,18 @@
                    BasRgv basRgv = new BasRgv();
                    basRgv.setRgvNo(slave.getId());
                    basRgv.setRgvSts((int)rgvProtocol.getMode());
                    if(rgvProtocol.isWriteMk() && rgvProtocol.isErrorMk()){
                        try {
                            // 日志记录异常情况
                            BasRgvErrorLog basRgvErrorLogs;
                            basRgvErrorLogs = rgvProtocol.toSqlModelError();
                            BasRgvErrorLogService basRgvErrorLogService = SpringUtils.getBean(BasRgvErrorLogService.class);
                            basRgvErrorLogService.insert(basRgvErrorLogs);
                            rgvProtocol.setWriteMk(false);
                        } catch (Exception ignore) {
                            log.error(ignore.getMessage());
                        }
                    }
                    if (!basRgvService.updateById(rgvProtocol.toSqlModel(basRgv))){
                        log.error("RGV plc数据库更新失败 ===>> [id:{}] [ip:{}] [port:{}] [rack:{}] [slot:{}]", slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot());
                    }