jiazx0107@163.com
2023-08-28 664bb4d0b7799328667ffc47e39da711a77ddbfa
更新MODBUS-TCP协议,调整配置2
已修改9个文件
已添加1个文件
426 ■■■■ 文件已修改
igds-protocol-modbus/src/main/java/com/ld/igds/modbus/GasModbus.view.xml 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-protocol-modbus/src/main/java/com/ld/igds/modbus/GasModbusPR.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-protocol-modbus/src/main/java/com/ld/igds/modbus/service/HModbusService.java 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/ModbusUtil2.java 80 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/ServerUtil.java 19 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/command/AnalysisService.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/command/RemoteControlServiceImpl.java 51 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/command/RemoteGasServiceImpl.java 142 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/data/ModbusGasResult.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/data/ModbusTcp.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-protocol-modbus/src/main/java/com/ld/igds/modbus/GasModbus.view.xml
@@ -118,11 +118,11 @@
    <DataType name="dtGas">
      <Property name="creationType">com.ld.igds.models.GasModbus</Property>
      <PropertyDef name="id">
        <Property/>
        <Property></Property>
        <Property name="label">ID</Property>
      </PropertyDef>
      <PropertyDef name="depotId">
        <Property/>
        <Property></Property>
        <Property name="label">所属仓库</Property>
      </PropertyDef>
      <PropertyDef name="passcode">
@@ -130,27 +130,27 @@
        <Property name="label">通道</Property>
      </PropertyDef>
      <PropertyDef name="co2">
        <Property/>
        <Property></Property>
        <Property name="label">二氧化碳</Property>
      </PropertyDef>
      <PropertyDef name="co2Fun">
        <Property/>
        <Property></Property>
        <Property name="label">功能号</Property>
      </PropertyDef>
      <PropertyDef name="o2">
        <Property/>
        <Property></Property>
        <Property name="label">氧气</Property>
      </PropertyDef>
      <PropertyDef name="o2Fun">
        <Property/>
        <Property></Property>
        <Property name="label">功能号</Property>
      </PropertyDef>
      <PropertyDef name="ph3">
        <Property/>
        <Property></Property>
        <Property name="label">磷化氢</Property>
      </PropertyDef>
      <PropertyDef name="ph3Fun">
        <Property/>
        <Property></Property>
        <Property name="label">功能号</Property>
      </PropertyDef>
    </DataType>
@@ -199,12 +199,6 @@
        <Property name="caption">删除通道</Property>
        <Property name="exClassName">btn-warn</Property>
        <Property name="iconClass">fa fa-minus</Property>
      </Button>
      <Button layoutConstraint="left">
        <Property name="caption">刷新缓存</Property>
        <Property name="exClassName">btn-default</Property>
        <Property name="iconClass">fa fa-refresh</Property>
        <Property name="action">ajaxFlushCache</Property>
      </Button>
    </Container>
    <Container layout="regionPadding:10" layoutConstraint="center">
@@ -364,10 +358,6 @@
    <AjaxAction id="ajaxDel">
      <Property name="service">gasModbusPR#delData</Property>
      <Property name="confirmMessage">确定要删除么?</Property>
    </AjaxAction>
    <AjaxAction id="ajaxFlushCache">
      <Property name="service">gasModbusPR#flushCache</Property>
      <Property name="successMessage">缓存更新成功</Property>
    </AjaxAction>
  </View>
</ViewConfig>
igds-protocol-modbus/src/main/java/com/ld/igds/modbus/GasModbusPR.java
@@ -70,17 +70,6 @@
    }
    /**
     * gasModbusPR#flushCache
     *
     * @return
     */
    @Expose
    public void flushCache() {
        String companyId = ContextUtil.getCompanyId();
        modbusService.flushCacheGas(companyId);
    }
    /**
     * deviceModbusPR#delData
     *
     * @return
igds-protocol-modbus/src/main/java/com/ld/igds/modbus/service/HModbusService.java
@@ -18,7 +18,6 @@
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@Component
@@ -49,13 +48,26 @@
        for (DeviceModbus hibDevice : listAll) {
            entityDevice = new DeviceModbus();
            BeanUtils.copyProperties(hibDevice, entityDevice);
            key = RedisConst.buildKey(companyId, ModbusConstant.MODBUS_DEVICE_CACHE, hibDevice.getDeviceCode());
            if (null == hibDevice.getBizType()) hibDevice.setBizType(BizType.AREATION.getCode());
            if (BizType.AREATION.getCode().equals(hibDevice.getBizType())) {
                key = RedisConst.buildKey(companyId, ModbusConstant.MODBUS_DEVICE_CACHE, hibDevice.getDeviceCode());
            } else {
                key = RedisConst.buildKey(companyId, ModbusConstant.MODBUS_DEVICE_CACHE, hibDevice.getDeviceCode(), hibDevice.getBizType());
            }
            redisUtil.set(key, entityDevice);
        }
    }
    public DeviceModbus getCacheDeviceModbus(String companyId, String deviceCode) {
        return getCacheDeviceModbus(companyId, deviceCode, null);
    }
    public DeviceModbus getCacheDeviceModbus(String companyId, String deviceCode, String bizType) {
        String key = RedisConst.buildKey(companyId, ModbusConstant.MODBUS_DEVICE_CACHE, deviceCode);
        if (null != bizType && !BizType.AREATION.equals(bizType)) {
            key = RedisConst.buildKey(companyId, ModbusConstant.MODBUS_DEVICE_CACHE, deviceCode, bizType);
        }
        return (DeviceModbus) redisUtil.get(key);
    }
@@ -194,32 +206,6 @@
                session.update(gas);
            }
        }
        flushCacheGas(null);
    }
    public void flushCacheGas(String companyId) {
        List<GasModbus> listAll = this.listGasModBus(null);
        if (null == listAll || listAll.isEmpty()) return;
        if (null == companyId) companyId = ContextUtil.getDefaultCompanyId();
        Map<String, List<GasModbus>> collect = listAll.stream().collect(Collectors.groupingBy(GasModbus::getDepotId));
        String key;
        for (String depotId : collect.keySet()) {
            key = RedisConst.buildKey(companyId, ModbusConstant.MODBUS_GAS_CACHE_LIST, depotId);
            redisUtil.set(key, key);
        }
    }
    public List<GasModbus> getCacheGasModbus(String companyId, String depotId) {
        if (null == companyId) companyId = ContextUtil.getDefaultCompanyId();
        String key = RedisConst.buildKey(companyId, ModbusConstant.MODBUS_GAS_CACHE_LIST, depotId);
        return (List<GasModbus>) redisUtil.get(key);
    }
@@ -227,8 +213,6 @@
        Session session = this.getSessionFactory().openSession();
        try {
            session.delete(data);
            flushCacheGas(null);
        } catch (Exception e) {
        } finally {
            session.flush();
igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/ModbusUtil2.java
@@ -2,6 +2,7 @@
import com.serotonin.modbus4j.ModbusFactory;
import com.serotonin.modbus4j.ModbusMaster;
import com.serotonin.modbus4j.code.DataType;
import com.serotonin.modbus4j.exception.ErrorResponseException;
import com.serotonin.modbus4j.exception.ModbusInitException;
import com.serotonin.modbus4j.exception.ModbusTransportException;
@@ -44,7 +45,7 @@
     *
     * @return
     */
    public static ModbusMaster getMaster(String ip, int port) throws ModbusInitException {
    public static ModbusMaster getMaster(String ip, int port) throws ModbusInitException, InterruptedException {
        String key = ip;
        ModbusMaster modbusMaster = masterMap.get(key);
        if (modbusMaster == null || !modbusMaster.isConnected()) {
@@ -53,7 +54,12 @@
            ipParameters.setPort(port);
            modbusMaster = modbusFactory.createTcpMaster(ipParameters, true);
            modbusMaster.init();
            //初始化之后等待,避免出现连接未创建
            Thread.sleep(2000);
            masterMap.put(key, modbusMaster);
            return modbusMaster;
        }
        return modbusMaster;
@@ -69,7 +75,7 @@
     * @throws ModbusTransportException
     * @throws ErrorResponseException
     */
    public static Boolean readCoilStatus(String ip, int port, int offset) throws ModbusInitException, ModbusTransportException, ErrorResponseException {
    public static Boolean readCoilStatus(String ip, int port, int offset) throws ModbusInitException, ModbusTransportException, ErrorResponseException, InterruptedException {
        BaseLocator<Boolean> coilStatus = BaseLocator.coilStatus(slaveId, offset);
        Boolean res = getMaster(ip, port).getValue(coilStatus);
        return res;
@@ -87,7 +93,7 @@
    public static Boolean readInputStatus(String ip, int port, int offset) throws ModbusInitException, ModbusTransportException, ErrorResponseException, InterruptedException {
        BaseLocator<Boolean> inputStatus = BaseLocator.inputStatus(slaveId, offset);
        Thread.sleep(3000);
        // Thread.sleep(3000);
        Boolean res = getMaster(ip, port).getValue(inputStatus);
        return res;
    }
@@ -102,10 +108,15 @@
     * @throws ModbusTransportException
     * @throws ErrorResponseException
     */
    public static Number readHoldingRegister(String ip, int port, int offset, int dataType) throws ModbusInitException, ModbusTransportException, ErrorResponseException {
    public static Number readHoldingRegister(String ip, int port, int offset, int dataType) throws ModbusInitException, ModbusTransportException, ErrorResponseException, InterruptedException {
        BaseLocator<Number> holdingRegister = BaseLocator.holdingRegister(slaveId, offset, dataType);
        Number value = getMaster(ip, port).getValue(holdingRegister);
        return value;
    }
    public static Number readHoldingRegister(String ip, int port, int offset) throws ModbusInitException, ModbusTransportException, ErrorResponseException, InterruptedException {
        int dataType = DataType.TWO_BYTE_INT_SIGNED;
        return readHoldingRegister(ip, port, offset, dataType);
    }
    /**
@@ -118,10 +129,24 @@
     * @throws ModbusTransportException
     * @throws ErrorResponseException
     */
    public static Number readInputRegister(String ip, int port, int offset, int dataType) throws ModbusInitException, ModbusTransportException, ErrorResponseException {
    public static Number readInputRegister(String ip, int port, int offset, int dataType) throws ModbusInitException, ModbusTransportException, ErrorResponseException, InterruptedException {
        BaseLocator<Number> inputRegister = BaseLocator.inputRegister(slaveId, offset, dataType);
        Number value = getMaster(ip, port).getValue(inputRegister);
        return value;
    }
    /**
     * è¯»è¾“入寄存器数据   0x04
     *
     * @param offset
     * @return
     * @throws ModbusInitException
     * @throws ModbusTransportException
     * @throws ErrorResponseException
     */
    public static Number readInputRegister(String ip, int port, int offset) throws ModbusInitException, ModbusTransportException, ErrorResponseException, InterruptedException {
        int dataType = DataType.TWO_BYTE_INT_SIGNED;
        return readInputRegister(ip, port, offset, dataType);
    }
@@ -135,21 +160,38 @@
     * @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();
    }
    /**
     * å†™çº¿åœˆå¼€å…³çŠ¶æ€æ•°æ®  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();
    }
     */
    /**
@@ -161,7 +203,7 @@
     * @throws ModbusTransportException
     * @throws ModbusInitException
     */
    public static Boolean writeRegister(String ip, int port, int offset, int value) throws ModbusTransportException, ModbusInitException {
    public static Boolean writeRegister(String ip, int port, int offset, int value) throws ModbusTransportException, ModbusInitException, InterruptedException {
        WriteRegisterRequest registerRequest = new WriteRegisterRequest(slaveId, offset, value);
        WriteRegisterResponse registerResponse = (WriteRegisterResponse) getMaster(ip, port).send(registerRequest);
        return !registerResponse.isException();
@@ -177,7 +219,7 @@
     * @throws ModbusTransportException
     * @throws ModbusInitException
     */
    public static Boolean writeCoils(String ip, int port, int offset, boolean[] booleans) throws ModbusTransportException, ModbusInitException {
    public static Boolean writeCoils(String ip, int port, int offset, boolean[] booleans) throws ModbusTransportException, ModbusInitException, InterruptedException {
        WriteCoilsRequest writeCoils = new WriteCoilsRequest(slaveId, offset, booleans);
        WriteCoilsResponse coilsResponse = (WriteCoilsResponse) getMaster(ip, port).send(writeCoils);
        return !coilsResponse.isException();
@@ -193,7 +235,7 @@
     * @throws ModbusTransportException
     * @throws ModbusInitException
     */
    public static Boolean writeRegisters(String ip, int port, int offset, short[] nums) throws ModbusTransportException, ModbusInitException {
    public static Boolean writeRegisters(String ip, int port, int offset, short[] nums) throws ModbusTransportException, ModbusInitException, InterruptedException {
        WriteRegistersRequest writeRegisters = new WriteRegistersRequest(slaveId, offset, nums);
        WriteRegistersResponse registersResponse = (WriteRegistersResponse) getMaster(ip, port).send(writeRegisters);
        return !registersResponse.isException();
igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/ServerUtil.java
@@ -1,5 +1,6 @@
package com.ld.igds.protocol.modbus;
import com.ld.igds.constant.Constant;
import com.ld.igds.util.ContextUtil;
import java.util.HashMap;
@@ -10,11 +11,6 @@
 */
public class ServerUtil {
    /**
     * ç”¨æ¥ç¼“存,TCP设备执行时间记录key = TCP唯一标志,value = å½“前执行时间
     */
    public static Map<String, Long> contextExeModbusTcp = new HashMap<>();
    /**
@@ -38,4 +34,17 @@
        return contextStatusMap;
    }
    public static int getAddrExe(String temp) {
        if (Constant.YN_N.equals(temp)) return 65535;
        if (temp.length() > 4) {
            temp = temp.substring(temp.length() - 4);
        }
        return Integer.valueOf(temp) - 1;
    }
}
igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/command/AnalysisService.java
@@ -3,13 +3,16 @@
import com.ld.igds.common.CoreDeviceService;
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.protocol.modbus.ServerUtil;
import com.ld.igds.protocol.modbus.data.ModbusGasResult;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.List;
/**
 * è§£æž
@@ -46,4 +49,14 @@
            log.error("---MODBUS-TCP-状态解析异常{}", e);
        }
    }
    /**
     * è§£æžæ°”体检测结果
     *
     * @param request
     * @param results
     */
    public void analysisGas(CheckGasRequest request, List<ModbusGasResult> results) {
    }
}
igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/command/RemoteControlServiceImpl.java
@@ -74,7 +74,7 @@
                modbusTcp = new ModbusTcp(deviceModbus);
                modbusTcp.setIp(request.getIp());
                modbusTcp.setPort(request.getPort());
                modbusTcp.setDeviceCode(exeDevice.getPassCode() + "");
                modbusTcp.setBizCode(exeDevice.getPassCode() + "");
                modbusTcp.setSerId(request.getSerId());
                modbusTcp.setCompanyId(request.getCompanyId());
@@ -89,7 +89,7 @@
                if (StringUtils.isBlank(exeDevice.getLink()) || "null".equals(exeDevice.getLink())) {
                    //根据设备目标状态,调用MODBUS执行
                    modbusTcp.setAddrExe(this.getAddrExe(temp));
                    modbusTcp.setAddrExe(ServerUtil.getAddrExe(temp));
                    doWriteExe(modbusTcp, exeDevice.getTargetStatus());
                    continue;
@@ -101,7 +101,7 @@
                modbusTcpLink = new ModbusTcp(deviceModbus);
                modbusTcpLink.setIp(request.getIp());
                modbusTcpLink.setPort(request.getPort());
                modbusTcpLink.setDeviceCode(exeDevice.getLink());
                modbusTcpLink.setBizCode(exeDevice.getLink());
                modbusTcpLink.setSerId(request.getSerId());
                modbusTcpLink.setCompanyId(request.getCompanyId());
@@ -111,7 +111,7 @@
                    //先开窗口
                    temp = modbusTcp.getDeviceModbus().getOpen();
                    modbusTcp.setAddrExe(this.getAddrExe(temp));
                    modbusTcp.setAddrExe(ServerUtil.getAddrExe(temp));
                    doWriteExe(modbusTcp, DeviceStatus.OPEN.getCode());
@@ -120,7 +120,7 @@
                    //再开风机
                    temp = modbusTcpLink.getDeviceModbus().getOpen();
                    modbusTcpLink.setAddrExe(this.getAddrExe(temp));
                    modbusTcpLink.setAddrExe(ServerUtil.getAddrExe(temp));
                    doWriteExe(modbusTcpLink, DeviceStatus.OPEN.getCode());
                }
@@ -128,7 +128,7 @@
                //如果关风机
                if (DeviceStatus.F_CLOSE.getCode().equals(exeDevice.getTargetStatus())) {
                    temp = modbusTcpLink.getDeviceModbus().getStop();
                    modbusTcpLink.setAddrExe(this.getAddrExe(temp));
                    modbusTcpLink.setAddrExe(ServerUtil.getAddrExe(temp));
                    doWriteExe(modbusTcpLink, DeviceStatus.CLOSE.getCode());
                }
@@ -137,7 +137,7 @@
                //如果开窗
                if (DeviceStatus.W_OPEN.getCode().equals(exeDevice.getTargetStatus())) {
                    temp = modbusTcp.getDeviceModbus().getOpen();
                    modbusTcp.setAddrExe(this.getAddrExe(temp));
                    modbusTcp.setAddrExe(ServerUtil.getAddrExe(temp));
                    doWriteExe(modbusTcp, exeDevice.getTargetStatus());
                }
@@ -147,14 +147,14 @@
                    //先关风机
                    temp = modbusTcpLink.getDeviceModbus().getStop();
                    modbusTcpLink.setAddrExe(this.getAddrExe(temp));
                    modbusTcpLink.setAddrExe(ServerUtil.getAddrExe(temp));
                    doWriteExe(modbusTcpLink, DeviceStatus.CLOSE.getCode());
                    Thread.sleep(300);
                    //在关窗户
                    temp = modbusTcp.getDeviceModbus().getOpen();
                    modbusTcp.setAddrExe(this.getAddrExe(temp));
                    modbusTcp.setAddrExe(ServerUtil.getAddrExe(temp));
                    doWriteExe(modbusTcp, DeviceStatus.CLOSE.getCode());
                }
@@ -168,19 +168,14 @@
        return new DeviceControlResponse(OrderRespEnum.ORDER_SUCCESS);
    }
    private int getAddrExe(String temp) {
        if (Constant.YN_N.equals(temp)) return 65535;
        if (temp.length() > 4) {
            temp = temp.substring(temp.length() - 4);
        }
        return Integer.valueOf(temp) - 1;
    }
    private void doWriteExe(ModbusTcp modbusTcp, String targetStatus) throws Exception {
        boolean exeResult = ModbusUtil2.writeCoilStatus(modbusTcp.getIp(), modbusTcp.getPort(), modbusTcp.getAddrExe(), true);
        if (exeResult) {
            log.debug("--------写入值---{}-{}-{}", modbusTcp.getSerId(), modbusTcp.getDeviceCode(), targetStatus);
            ServerUtil.add2StatusMap(modbusTcp.getCompanyId(), modbusTcp.getSerId(), modbusTcp.getDeviceCode(), targetStatus);
            //根据Modbus-TCP,将写过的值,恢复原来的值
            ModbusUtil2.writeCoilStatus(modbusTcp.getIp(), modbusTcp.getPort(), modbusTcp.getAddrExe(), false);
            log.debug("--------写入值---{}-{}-{}", modbusTcp.getSerId(), modbusTcp.getBizCode(), targetStatus);
            ServerUtil.add2StatusMap(modbusTcp.getCompanyId(), modbusTcp.getSerId(), modbusTcp.getBizCode(), targetStatus);
        }
    }
@@ -214,7 +209,7 @@
                modbusTcp = new ModbusTcp(deviceModbus);
                modbusTcp.setIp(request.getIp());
                modbusTcp.setPort(request.getPort());
                modbusTcp.setDeviceCode(device.getPassCode() + "");
                modbusTcp.setBizCode(device.getPassCode() + "");
                modbusTcp.setSerId(device.getSerId());
                modbusTcp.setCompanyId(device.getCompanyId());
@@ -232,10 +227,10 @@
                modbusTcpLink.setIp(request.getIp());
                modbusTcpLink.setPort(request.getPort());
                modbusTcpLink.setSerId(device.getSerId());
                modbusTcpLink.setDeviceCode(device.getLink());
                modbusTcpLink.setBizCode(device.getLink());
                modbusTcpLink.setCompanyId(device.getCompanyId());
                modbusTcpLink.setAddrExe(this.getAddrExe(modbusTcp.getDeviceModbus().getOpenEnd()));
                modbusTcpLink.setAddrExe(ServerUtil.getAddrExe(modbusTcp.getDeviceModbus().getOpenEnd()));
                doReadStatus(modbusTcpLink);
            }
@@ -260,22 +255,22 @@
        if (Constant.YN_N.equals(modbusTcp.getDeviceModbus().getOpen())) return;
        int addrExe = getAddrExe(modbusTcp.getDeviceModbus().getOpenEnd());
        int addrExe = ServerUtil.getAddrExe(modbusTcp.getDeviceModbus().getOpenEnd());
        boolean result = ModbusUtil2.readInputStatus(modbusTcp.getIp(), modbusTcp.getPort(), addrExe);
        log.debug("---------读开到位状态------{}-{}-{}", modbusTcp.getDeviceCode(), addrExe, result);
        log.debug("---------读开到位状态------{}-{}-{}", modbusTcp.getBizCode(), addrExe, result);
        if (result) {
            ServerUtil.add2StatusMap(modbusTcp.getCompanyId(), modbusTcp.getSerId(), modbusTcp.getDeviceCode(), DeviceStatus.OPEN.getCode());
            ServerUtil.add2StatusMap(modbusTcp.getCompanyId(), modbusTcp.getSerId(), modbusTcp.getBizCode(), DeviceStatus.OPEN.getCode());
        }
        addrExe = getAddrExe(modbusTcp.getDeviceModbus().getCloseEnd());
        addrExe = ServerUtil.getAddrExe(modbusTcp.getDeviceModbus().getCloseEnd());
        result = ModbusUtil2.readInputStatus(modbusTcp.getIp(), modbusTcp.getPort(), addrExe);
        log.debug("---------读关到位状态------{}-{}-{}", modbusTcp.getDeviceCode(), addrExe, result);
        log.debug("---------读关到位状态------{}-{}-{}", modbusTcp.getBizCode(), addrExe, result);
        if (result) {
            ServerUtil.add2StatusMap(modbusTcp.getCompanyId(), modbusTcp.getSerId(), modbusTcp.getDeviceCode(), DeviceStatus.CLOSE.getCode());
            ServerUtil.add2StatusMap(modbusTcp.getCompanyId(), modbusTcp.getSerId(), modbusTcp.getBizCode(), DeviceStatus.CLOSE.getCode());
        }
    }
igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/command/RemoteGasServiceImpl.java
@@ -1,10 +1,26 @@
package com.ld.igds.protocol.modbus.command;
import com.ld.igds.constant.BizType;
import com.ld.igds.io.RemoteGasService;
import com.ld.igds.io.constant.OrderRespEnum;
import com.ld.igds.io.constant.ProtocolEnum;
import com.ld.igds.io.request.CheckGasRequest;
import com.ld.igds.io.response.DeviceControlResponse;
import com.ld.igds.io.response.GasResponse;
import com.ld.igds.modbus.service.HModbusService;
import com.ld.igds.models.DeviceModbus;
import com.ld.igds.models.GasModbus;
import com.ld.igds.protocol.modbus.ModbusUtil2;
import com.ld.igds.protocol.modbus.ServerUtil;
import com.ld.igds.protocol.modbus.data.ModbusGasResult;
import com.ld.igds.protocol.modbus.data.ModbusTcp;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
/**
 * å½“前协议针对标准Modbus-TCP协议
@@ -19,23 +35,141 @@
    public static final String BEAN_ID = "modbus.remoteGasService";
    @Resource
    private HModbusService modbusService;
    @Resource
    private AnalysisService analysisService;
    @Override
    public String getProtocol() {
        return null;
        return ProtocolEnum.TCP_MODBUS.getCode();
    }
    @Override
    public GasResponse checkGas(CheckGasRequest request) {
        return null;
        String passCode = request.getDepotId();
        try {
            //获取需要执行的设备配置
            DeviceModbus deviceModbus = modbusService.getCacheDeviceModbus(request.getCompanyId(), passCode, BizType.GAS.getCode());
            ModbusTcp modbusTcp = new ModbusTcp(deviceModbus);
            modbusTcp.setIp(request.getIp());
            modbusTcp.setPort(request.getPort());
            modbusTcp.setBizCode(passCode);
            modbusTcp.setSerId(request.getSerId());
            modbusTcp.setCompanyId(request.getCompanyId());
            modbusTcp.setAddrExe(ServerUtil.getAddrExe(deviceModbus.getOpen()));
            boolean exeResult = ModbusUtil2.writeCoilStatus(modbusTcp.getIp(), modbusTcp.getPort(), modbusTcp.getAddrExe(), true);
            if (exeResult) {
                //调用异步获取结果
                progressGasResult(request, modbusTcp);
                log.debug("--------启动测气---{}-{}", modbusTcp.getSerId(), modbusTcp.getBizCode());
            }
        } catch (Exception e) {
            return new GasResponse(OrderRespEnum.ORDER_ERROR.getCode(), "后台执行异常:" + e.getLocalizedMessage());
        }
        return new GasResponse(OrderRespEnum.ORDER_SUCCESS);
    }
    /**
     * å¼‚步执行进度查询
     *
     * @param modbusTcp
     */
    @Async
    public void progressGasResult(CheckGasRequest request, ModbusTcp modbusTcp) {
        log.debug("--------------异步执行气体检测记过获取-------------");
        try {
            List<GasModbus> list = modbusService.listGasModBus(modbusTcp.getBizCode());
            if (null == list || list.isEmpty()) {
                log.error("------------更新气体检测结果进度失败,没有获取到检测通道配置信息-----{}", modbusTcp.getBizCode());
                return;
            }
            //根据通道数量线程等待,每个通道等待50秒
            Thread.sleep(list.size() * 50 * 1000);
            log.debug("--------------等待时间完成,开始获取检测结果-------------{}", modbusTcp.getBizCode());
            ModbusTcp modbusTcpTemp = modbusTcp;
            List<ModbusGasResult> results = new ArrayList<>();
            ModbusGasResult gasResult;
            Number check;
            for (GasModbus gasModbus : list) {
                gasResult = new ModbusGasResult();
                gasResult.setPasscode(gasModbus.getPasscode());
                //二氧化碳
                modbusTcpTemp.setAddrExe(ServerUtil.getAddrExe(gasModbus.getCo2()));
                check = ModbusUtil2.readHoldingRegister(modbusTcpTemp.getIp(), modbusTcpTemp.getPort(), modbusTcpTemp.getAddrExe());
                gasResult.setCo2(check);
                //氧气
                modbusTcpTemp.setAddrExe(ServerUtil.getAddrExe(gasModbus.getO2()));
                check = ModbusUtil2.readHoldingRegister(modbusTcpTemp.getIp(), modbusTcpTemp.getPort(), modbusTcpTemp.getAddrExe());
                gasResult.setO2(check);
                //磷化氢
                modbusTcpTemp.setAddrExe(ServerUtil.getAddrExe(gasModbus.getPh3()));
                check = ModbusUtil2.readHoldingRegister(modbusTcpTemp.getIp(), modbusTcpTemp.getPort(), modbusTcpTemp.getAddrExe());
                gasResult.setPh3(check);
                results.add(gasResult);
            }
            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) {
        return null;
        return new GasResponse(OrderRespEnum.ORDER_ERROR.getCode(), "当前控制柜不支持选择点位采集");
    }
    @Override
    public GasResponse stopCheckGas(CheckGasRequest request) {
        return null;
        String passCode = request.getDepotId();
        try {
            //获取需要执行的设备配置
            DeviceModbus deviceModbus = modbusService.getCacheDeviceModbus(request.getCompanyId(), passCode, BizType.GAS.getCode());
            ModbusTcp modbusTcp = new ModbusTcp(deviceModbus);
            modbusTcp.setIp(request.getIp());
            modbusTcp.setPort(request.getPort());
            modbusTcp.setBizCode(passCode);
            modbusTcp.setSerId(request.getSerId());
            modbusTcp.setCompanyId(request.getCompanyId());
            modbusTcp.setAddrExe(ServerUtil.getAddrExe(deviceModbus.getStop()));
            boolean exeResult = ModbusUtil2.writeCoilStatus(modbusTcp.getIp(), modbusTcp.getPort(), modbusTcp.getAddrExe(), true);
            if (exeResult) {
                log.debug("--------关闭测气---{}-{}", modbusTcp.getSerId(), modbusTcp.getBizCode());
                //通知异步结束结果采集
            }
        } catch (Exception e) {
            return new GasResponse(OrderRespEnum.ORDER_ERROR.getCode(), "后台执行异常:" + e.getLocalizedMessage());
        }
        return new GasResponse(OrderRespEnum.ORDER_SUCCESS);
    }
}
igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/data/ModbusGasResult.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,31 @@
package com.ld.igds.protocol.modbus.data;
import lombok.Data;
/**
 * @Desc: ç”¨äºŽå°è£…ModBUsTCP的信息
 * @author: andy.jia
 * @update-time: 2023/8/12 15:29
 */
@Data
public class ModbusGasResult {
    private int passcode;
    private Number co2;
    private Number o2;
    private Number ph3;
    @Override
    public String toString() {
        return "GasResult{" +
                "passcode=" + passcode +
                ", co2=" + co2 +
                ", o2=" + o2 +
                ", ph3=" + ph3 +
                '}';
    }
}
igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/data/ModbusTcp.java
@@ -13,8 +13,9 @@
    private String companyId;
    private String deviceCode;
    //业务相关编码
    private String bizCode;
    private String serId;
@@ -34,9 +35,9 @@
        this.deviceModbus = deviceModbus;
    }
    public ModbusTcp(String companyId, String deviceCode, String serId, String ip, int port, DeviceModbus deviceModbus) {
    public ModbusTcp(String companyId, String bizCode, String serId, String ip, int port, DeviceModbus deviceModbus) {
        this.companyId = companyId;
        this.deviceCode = deviceCode;
        this.bizCode = bizCode;
        this.serId = serId;
        this.ip = ip;
        this.port = port;