jiazx0107@163.com
2023-08-28 d6f1c42e4f06494557f6253b4f946cc477145375
更新MODBUS-TCP协议,协议解析3
已修改5个文件
169 ■■■■ 文件已修改
igds-protocol-fzzy3/src/main/java/com/ld/igds/protocol/fzzy/analysis/AnalysisGas.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/ModbusUtil2.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/ServerUtil.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/command/AnalysisService.java 87 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/command/RemoteGasServiceImpl.java 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-protocol-fzzy3/src/main/java/com/ld/igds/protocol/fzzy/analysis/AnalysisGas.java
@@ -48,8 +48,6 @@
    private CoreGasService gasService;
    @Autowired
    private CoreCommonService commonService;
    @Autowired
    private ExeOrderService exeOrderService;
    @Autowired
    private NotifyWebInvoker notifyInvoker;
igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/ModbusUtil2.java
@@ -56,7 +56,7 @@
            modbusMaster.init();
            //初始化之后等待,避免出现连接未创建
            Thread.sleep(2000);
            Thread.sleep(2500);
            masterMap.put(key, modbusMaster);
@@ -164,34 +164,6 @@
        WriteCoilResponse coilResponse = (WriteCoilResponse) getMaster(ip, port).send(coilRequest);
        return !coilResponse.isException();
    }
    /**
     * 写线圈开关状态数据  0x05
     *
     * @param offset
     * @param status
     * @return
     * @throws ModbusTransportException
     * @throws ModbusInitException
    public static Boolean writeCoilStatus(String ip, int port, int offset, boolean status) throws ModbusTransportException, ModbusInitException, InterruptedException {
    //        boolean coilValue = status;
    //        WriteCoilRequest coilRequest = new WriteCoilRequest(slaveId, offset, coilValue);
    //        WriteCoilResponse coilResponse = (WriteCoilResponse) getMaster(ip, port).send(coilRequest);
    //        return !coilResponse.isException();
    WriteCoilRequest coilRequest = new WriteCoilRequest(slaveId, offset, status);
    // Thread.sleep(3000);
    WriteCoilResponse coilResponse = (WriteCoilResponse) getMaster(ip, port).send(coilRequest);
    //发送清除命令
    WriteCoilRequest coilRequest1 = new WriteCoilRequest(slaveId, offset, !status);
    getMaster(ip, port).send(coilRequest1);
    return !coilResponse.isException();
    }
     */
    /**
igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/ServerUtil.java
@@ -13,6 +13,10 @@
    public static  final String RUN_TAG = "RUN_TAG";
    /**
     * 设备状态返回的结果 KEY= companyId + serId + deviceCode value = 结果状态
     */
igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/command/AnalysisService.java
@@ -1,17 +1,24 @@
package com.ld.igds.protocol.modbus.command;
import com.ld.igds.common.CoreDeviceService;
import com.ld.igds.constant.BizType;
import com.ld.igds.gas.CoreGasService;
import com.ld.igds.io.constant.OrderRespEnum;
import com.ld.igds.io.notify.NotifyWebInvoker;
import com.ld.igds.io.request.CheckGasRequest;
import com.ld.igds.io.request.DeviceControlRequest;
import com.ld.igds.models.Gas;
import com.ld.igds.protocol.modbus.ServerUtil;
import com.ld.igds.protocol.modbus.data.ModbusGasResult;
import com.ld.igds.util.ContextUtil;
import com.ld.igds.util.NumberUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.Date;
import java.util.List;
/**
@@ -25,6 +32,8 @@
    private CoreDeviceService coreDeviceService;
    @Resource
    private NotifyWebInvoker notifyInvoker;
    @Autowired
    private CoreGasService gasService;
    /**
@@ -58,5 +67,83 @@
     * @param results
     */
    public void analysisGas(CheckGasRequest request, List<ModbusGasResult> results) {
        log.debug("----------开始执行气体结果解析----{}", request.getDepotId());
        String batchId = ContextUtil.getDefaultBatchId();
        //主体信息
        Gas gas = new Gas(batchId, request.getCompanyId(), request.getDepotId(), new Date());
        gas.setCheckNum(results.size());
        gas.setGasEnd(results.size());
        gas.setGasStart(1);
        gas.setReceiveDate(new Date());
        int sumNum = results.size();
        double co2, o2, ph3, n2;
        double sumO2 = 0.0, sumCo2 = 0.0, sumPh3 = 0.0, sumN2 = 0.0;
        StringBuffer sb = new StringBuffer();
        for (ModbusGasResult gasResult : results) {
            co2 = gasResult.getCo2().doubleValue();
            o2 = gasResult.getO2().doubleValue();
            ph3 = gasResult.getPh3().doubleValue();
            n2 = -100;
            //TODO >>>>> 根据返回值进行判断和转换
            if (gas.getPerCo2Max() < co2) {
                gas.setPerCo2Max(co2);
            }
            if (gas.getPerCo2Min() > co2) {
                gas.setPerCo2Min(co2);
            }
            if (gas.getPerO2Max() < o2) {
                gas.setPerO2Max(o2);
            }
            if (gas.getPerO2Min() > o2) {
                gas.setPerO2Min(o2);
            }
            if (gas.getPerPh3Max() < ph3) {
                gas.setPerPh3Max(ph3);
            }
            if (gas.getPerPh3Min() > ph3) {
                gas.setPerPh3Min(ph3);
            }
            if (gas.getPerN2Max() < n2) {
                gas.setPerN2Max(n2);
            }
            if (gas.getPerN2Min() > n2) {
                gas.setPerN2Min(n2);
            }
            //固定为:passCode,co2,o2,ph3,n2;passCode,co2,o2,ph3,n2;"
            sb.append(gasResult.getPasscode());
            sb.append(",");
            sb.append(co2);
            sb.append(",");
            sb.append(o2);
            sb.append(",");
            sb.append(ph3);
            sb.append(",");
            sb.append(n2);
            sb.append(";");
            sumCo2 += co2;
            sumO2 += o2;
            sumPh3 += ph3;
            sumN2 += n2;
        }
        gas.setPoints(sb.toString());
        gas.setPerCo2(NumberUtil.keepPrecision(sumCo2 / sumNum, 2));
        gas.setPerO2(NumberUtil.keepPrecision(sumO2 / sumNum, 2));
        gas.setPerN2(NumberUtil.keepPrecision(sumN2 / sumNum, 2));
        gas.setPerPh3(NumberUtil.keepPrecision(sumPh3 / sumNum, 2));
        gasService.saveOrUpdateData(gas);
        // 调用通知前端
        notifyInvoker.notifyWeb(gas.getCompanyId(), OrderRespEnum.MSG_SUCCESS, BizType.GAS, request.getDepotId() + " 气体检测:结果返回成功.");
        log.info("控制柜----->>>平台:气体解析完成-仓库={}", request.getDepotId());
    }
}
igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/command/RemoteGasServiceImpl.java
@@ -1,6 +1,7 @@
package com.ld.igds.protocol.modbus.command;
import com.ld.igds.constant.BizType;
import com.ld.igds.constant.RedisConst;
import com.ld.igds.io.RemoteGasService;
import com.ld.igds.io.constant.OrderRespEnum;
import com.ld.igds.io.constant.ProtocolEnum;
@@ -14,6 +15,7 @@
import com.ld.igds.protocol.modbus.ServerUtil;
import com.ld.igds.protocol.modbus.data.ModbusGasResult;
import com.ld.igds.protocol.modbus.data.ModbusTcp;
import com.ld.igds.util.RedisUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
@@ -39,6 +41,9 @@
    private HModbusService modbusService;
    @Resource
    private AnalysisService analysisService;
    @Resource
    private RedisUtil redisUtil;
    @Override
    public String getProtocol() {
@@ -47,6 +52,12 @@
    @Override
    public GasResponse checkGas(CheckGasRequest request) {
        boolean isRun = isRun(request);
        if (isRun) {
            return new GasResponse(OrderRespEnum.ORDER_ERROR.getCode(), "提醒:当前仓正在执行检测");
        }
        String passCode = request.getDepotId();
        try {
@@ -64,6 +75,8 @@
            boolean exeResult = ModbusUtil2.writeCoilStatus(modbusTcp.getIp(), modbusTcp.getPort(), modbusTcp.getAddrExe(), true);
            if (exeResult) {
                addRun(request);
                //调用异步获取结果
                progressGasResult(request, modbusTcp);
                log.debug("--------启动测气---{}-{}", modbusTcp.getSerId(), modbusTcp.getBizCode());
@@ -76,6 +89,27 @@
        return new GasResponse(OrderRespEnum.ORDER_SUCCESS);
    }
    private void addRun(CheckGasRequest request) {
        String key = RedisConst.buildKey(request.getCompanyId(), ServerUtil.RUN_TAG, request.getDepotId());
        redisUtil.set(key, request, 6 * 60);
    }
    private void delRun(CheckGasRequest request) {
        String key = RedisConst.buildKey(request.getCompanyId(), ServerUtil.RUN_TAG, request.getDepotId());
        redisUtil.del(key);
    }
    private boolean isRun(CheckGasRequest request) {
        String key = RedisConst.buildKey(request.getCompanyId(), ServerUtil.RUN_TAG, request.getDepotId());
        Object obj = redisUtil.get(key);
        if (null == obj) return false;
        return true;
    }
    /**
     * 异步执行进度查询
     *
@@ -83,6 +117,7 @@
     */
    @Async
    public void progressGasResult(CheckGasRequest request, ModbusTcp modbusTcp) {
        log.debug("--------------异步执行气体检测记过获取-------------");
@@ -97,6 +132,12 @@
            //根据通道数量线程等待,每个通道等待50秒
            Thread.sleep(list.size() * 50 * 1000);
            log.debug("--------------等待时间完成,开始获取检测结果-------------{}", modbusTcp.getBizCode());
            boolean isRun = isRun(request);
            if (!isRun) {
                log.info("--------------当前仓库检测已经停止,取消结果查询-------------{}", modbusTcp.getBizCode());
                return;
            }
            ModbusTcp modbusTcpTemp = modbusTcp;
            List<ModbusGasResult> results = new ArrayList<>();
@@ -124,16 +165,18 @@
                results.add(gasResult);
            }
            //删除运行标记
            delRun(request);
            log.debug("----获取的气体检测结果---{}--{}", request.getDepotId(), results.toString());
            //通知解析
            analysisService.analysisGas(request, results);
        } catch (Exception e) {
            log.error("------------更新气体检测结果进度失败,执行异常-----{}--{}", modbusTcp.getBizCode(), e.getMessage());
        }
    }
    @Override
    public GasResponse checkGasByPoint(CheckGasRequest request) {
@@ -162,6 +205,7 @@
                log.debug("--------关闭测气---{}-{}", modbusTcp.getSerId(), modbusTcp.getBizCode());
                //通知异步结束结果采集
                delRun(request);
            }
        } catch (Exception e) {