CZT
2023-08-30 178c71496d5508dae69110f4d988cf128723d740
配置Modbus协议:增加能耗信息
已修改8个文件
185 ■■■■ 文件已修改
igds-es/src/main/java/com/ld/igds/es/manager/EsManager.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-protocol-modbus/src/main/java/com/ld/igds/modbus/DeviceModbus.view.xml 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-protocol-modbus/src/main/java/com/ld/igds/modbus/service/HModbusService.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-protocol-modbus/src/main/java/com/ld/igds/models/DeviceModbus.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/ModbusUtil2.java 28 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/command/AnalysisService.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/command/RemoteControlServiceImpl.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/command/RemoteEsServiceImpl.java 65 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-es/src/main/java/com/ld/igds/es/manager/EsManager.java
@@ -205,10 +205,10 @@
                    "执行失败:没有配置通讯协议。");
        }
        if (Constant.YN_N.equals(deviceSer.getStatus())) {
            return new BaseResponse(OrderRespEnum.ORDER_ERROR.getCode(),
                    "执行失败:能耗分机不在线。");
        }
//        if (Constant.YN_N.equals(deviceSer.getStatus())) {
//            return new BaseResponse(OrderRespEnum.ORDER_ERROR.getCode(),
//                    "执行失败:能耗分机不在线。");
//        }
        RemoteEsService remoteEsService = remoteManager.getRemoteEsService(deviceSer.getProtocol());
igds-protocol-modbus/src/main/java/com/ld/igds/modbus/DeviceModbus.view.xml
@@ -104,6 +104,15 @@
          <Property name="valueProperty">name</Property>
        </Property>
      </PropertyDef>
      <PropertyDef name="bizType">
        <Property/>
        <Property name="label">业务类型</Property>
        <Property name="mapping">
          <Property name="mapValues">${dorado.getDataProvider("dicTriggerPR#triggerBizType").getResult()}</Property>
          <Property name="keyProperty">code</Property>
          <Property name="valueProperty">name</Property>
        </Property>
      </PropertyDef>
      <PropertyDef name="serId">
        <Property/>
        <Property name="label">所属分机</Property>
@@ -182,6 +191,9 @@
        <DataColumn name="serId">
          <Property name="property">serId</Property>
        </DataColumn>
        <DataColumn name="bizType">
          <Property name="property">bizType</Property>
        </DataColumn>
        <ColumnGroup>
          <Property name="caption">开操作</Property>
          <DataColumn name="open">
igds-protocol-modbus/src/main/java/com/ld/igds/modbus/service/HModbusService.java
@@ -140,6 +140,23 @@
        return null;
    }
    /**
     * 根据类型获取Modbus能耗设备配置信息
     * @param bizType
     * @param serId
     * @return
     */
    public List<DeviceModbus> getDataByBizType(String bizType, String serId) {
        String hql = " from " + DeviceModbus.class.getName() + " where bizType=:bizType and serId =:serId";
        Map<String, Object> param = new HashMap<>();
        param.put("bizType", bizType);
        param.put("serId", serId);
        return this.query(hql, param);
    }
    public DeviceModbus getGasData(String companyId, String depotId, String bizType) {
igds-protocol-modbus/src/main/java/com/ld/igds/models/DeviceModbus.java
@@ -33,7 +33,7 @@
    private String bizType = BizType.AREATION.getCode();
    @Column(name = "OPEN_", length = 10)
    @PropertyDef(label = "开地址")
    @PropertyDef(label = "开地址", description = "开地址、能耗读取地址")
    private String open = Constant.YN_N;
@@ -42,7 +42,7 @@
    private String openFun = "99";
    @Column(name = "CLOSE_", length = 10)
    @PropertyDef(label = "关地址")
    @PropertyDef(label = "关地址", description = "关地址、空调温度设置地址")
    private String close = Constant.YN_N;
    @Column(name = "CLOSE_FUN", length = 4)
@@ -58,7 +58,7 @@
    private String stopFun = "99";
    @Column(name = "OPEN_END_", length = 10)
    @PropertyDef(label = "开到位地址")
    @PropertyDef(label = "开到位地址", description = "开到位地址、运行状态地址(风机和空调)")
    private String openEnd = Constant.YN_N;
    @Column(name = "OPEN_END_FUN", length = 4)
igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/ModbusUtil2.java
@@ -10,9 +10,6 @@
import com.serotonin.modbus4j.locator.BaseLocator;
import com.serotonin.modbus4j.msg.*;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import java.util.HashMap;
/**
 * @Desc: 工具类
@@ -25,13 +22,10 @@
    //从机默认值
    private static Integer slaveId = 1;
    private static HashMap<String, ModbusMaster> masterMap = new HashMap<>();
    /**
     * 工厂
     */
    static ModbusFactory modbusFactory;
    //static ModbusMaster modbusMaster;
    static {
        if (modbusFactory == null) {
@@ -46,23 +40,17 @@
     * @return
     */
    public static ModbusMaster getMaster(String ip, int port) throws ModbusInitException, InterruptedException {
        String key = ip;
//        ModbusMaster modbusMaster = masterMap.get(key);
//        if (modbusMaster == null || !modbusMaster.isConnected()) {
            IpParameters ipParameters = new IpParameters();
            ipParameters.setHost(ip);
            ipParameters.setPort(port);
        IpParameters ipParameters = new IpParameters();
        ipParameters.setHost(ip);
        ipParameters.setPort(port);
        ModbusMaster modbusMaster = modbusFactory.createTcpMaster(ipParameters, false);
            modbusMaster.init();
        modbusMaster.init();
            //初始化之后等待,避免出现连接未创建
            Thread.sleep(2500);
        //初始化之后等待,避免出现连接未创建
        Thread.sleep(2500);
//            masterMap.put(key, modbusMaster);
            return modbusMaster;
//        }
//        return modbusMaster;
        return modbusMaster;
    }
igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/command/AnalysisService.java
@@ -2,9 +2,12 @@
import com.ld.igds.common.CoreDeviceService;
import com.ld.igds.constant.BizType;
import com.ld.igds.es.dto.EsData;
import com.ld.igds.es.service.CoreEsService;
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.BaseRequest;
import com.ld.igds.io.request.CheckGasRequest;
import com.ld.igds.io.request.DeviceControlRequest;
import com.ld.igds.models.Gas;
@@ -35,6 +38,8 @@
    private NotifyWebInvoker notifyInvoker;
    @Autowired
    private CoreGasService gasService;
    @Autowired
    private CoreEsService esService;
    /**
@@ -156,4 +161,33 @@
        notifyInvoker.notifyWeb(gas.getCompanyId(), OrderRespEnum.MSG_SUCCESS, BizType.GAS, request.getDepotId() + " 气体检测:结果返回成功.");
        log.info("控制柜----->>>平台:气体解析完成-仓库={}", request.getDepotId());
    }
    /**
     * 解析能耗数据
     *
     * @param request
     * @param result
     */
    public void analysisEs(BaseRequest request, Number result) {
        log.debug("----------开始执行能耗结果解析----{}", request.getDepotId());
        //有功电能判断是否返回有效数据
        if (null == result) {
            log.error("---能耗数据返回数据不完整,停止解析----{}", result.toString());
            return;
        }
        EsData esData = new EsData();
        esData.setCompanyId(request.getCompanyId());
        esData.setDepotId(request.getDepotId());
        esData.setUpdateTime(new Date());
        esData.setEp(result.doubleValue());
        esData.setEs(result.doubleValue());
        log.info("Modbus电表----->>>平台:能耗数据解析完成-仓库={}", esData.getDepotId());
        esService.saveAndUpdateInc(esData);
    }
}
igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/command/RemoteControlServiceImpl.java
@@ -67,6 +67,7 @@
            ModbusTcp modbusTcp;
            ModbusTcp modbusTcpLink = null;
            String temp = Constant.YN_N;
            DeviceSer deviceSer;
            for (ExeDevice exeDevice : deviceList) {
                deviceModbus = deviceModbusService.getCacheDeviceModbus(request.getCompanyId(), exeDevice.getPassCode() + "");
@@ -78,6 +79,12 @@
                modbusTcp = new ModbusTcp(deviceModbus);
                modbusTcp.setIp(request.getIp());
                modbusTcp.setPort(request.getPort());
                //若Modbus设备配置分机,则使用所配置分机的IP、端口
                if(StringUtils.isNotEmpty(deviceModbus.getSerId())){
                    deviceSer = coreSerService.getCacheSer(request.getCompanyId(), deviceModbus.getSerId());
                    modbusTcp.setIp(deviceSer.getIp());
                    modbusTcp.setPort(deviceSer.getPort());
                }
                modbusTcp.setBizCode(exeDevice.getPassCode() + "");
                modbusTcp.setSerId(request.getSerId());
                modbusTcp.setCompanyId(request.getCompanyId());
@@ -109,7 +116,6 @@
                    continue;
                }
                deviceModbus = deviceModbusService.getCacheDeviceModbus(request.getCompanyId(), exeDevice.getLink());
                if (null == deviceModbus) continue;
                modbusTcpLink = new ModbusTcp(deviceModbus);
@@ -118,9 +124,10 @@
                modbusTcpLink.setBizCode(exeDevice.getLink());
                modbusTcpLink.setSerId(request.getSerId());
                modbusTcpLink.setCompanyId(request.getCompanyId());
                //若Modbus设备配置分机,则使用所配置分机的IP、端口
                if(StringUtils.isNotEmpty(deviceModbus.getSerId())){
                    //若Modbus设备配置分机,则使用所配置分机的IP、端口
                    DeviceSer deviceSer = coreSerService.getCacheSer(request.getCompanyId(), deviceModbus.getSerId());
                    deviceSer = coreSerService.getCacheSer(request.getCompanyId(), deviceModbus.getSerId());
                    modbusTcpLink.setIp(deviceSer.getIp());
                    modbusTcpLink.setPort(deviceSer.getPort());
                }
@@ -131,9 +138,7 @@
                    //先开窗口
                    temp = modbusTcp.getDeviceModbus().getOpen();
                    modbusTcp.setAddrExe(ServerUtil.getAddrExe(temp));
                    doWriteExe(modbusTcp, DeviceStatus.OPEN.getCode());
                    Thread.sleep(300);
igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/command/RemoteEsServiceImpl.java
@@ -1,10 +1,24 @@
package com.ld.igds.protocol.modbus.command;
import com.ld.igds.common.CoreSerService;
import com.ld.igds.constant.BizType;
import com.ld.igds.io.RemoteEsService;
import com.ld.igds.io.constant.OrderRespEnum;
import com.ld.igds.io.constant.ProtocolEnum;
import com.ld.igds.io.request.BaseRequest;
import com.ld.igds.io.response.BaseResponse;
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.DeviceSer;
import com.ld.igds.protocol.modbus.ModbusUtil2;
import com.ld.igds.protocol.modbus.ServerUtil;
import com.ld.igds.protocol.modbus.data.ModbusTcp;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.List;
/**
 * 当前协议针对标准Modbus-TCP协议
@@ -19,13 +33,60 @@
    public static final String BEAN_ID = "modbus.remoteEsService";
    @Resource
    private HModbusService modbusService;
    @Resource
    private AnalysisService analysisService;
    @Resource
    private CoreSerService coreSerService;
    @Override
    public String getProtocol() {
        return null;
        return ProtocolEnum.TCP_MODBUS.getCode();
    }
    @Override
    public BaseResponse checkEs(BaseRequest request) {
        return null;
        String passCode = request.getDepotId();
        try {
            //获取需要执行的设备配置
            List<DeviceModbus> list = modbusService.getDataByBizType(BizType.ES.getCode(), request.getSerId());
            if(null == list || list.isEmpty()){
                return new GasResponse(OrderRespEnum.ORDER_ERROR.getCode(), "未获取到Modbus能耗配置信息");
            }
            ModbusTcp modbusTcp;
            DeviceSer deviceSer;
            for (DeviceModbus deviceModbus : list) {
                modbusTcp = new ModbusTcp(deviceModbus);
                modbusTcp.setIp(request.getIp());
                modbusTcp.setPort(request.getPort());
                //若Modbus设备配置分机,则使用所配置分机的IP、端口
                if(StringUtils.isNotEmpty(deviceModbus.getSerId())){
                    deviceSer = coreSerService.getCacheSer(request.getCompanyId(), deviceModbus.getSerId());
                    modbusTcp.setIp(deviceSer.getIp());
                    modbusTcp.setPort(deviceSer.getPort());
                }
                modbusTcp.setBizCode(passCode);
                modbusTcp.setSerId(request.getSerId());
                modbusTcp.setCompanyId(request.getCompanyId());
                modbusTcp.setAddrExe(ServerUtil.getAddrExe(deviceModbus.getOpen()));
                log.debug("--------启动能耗查询---{}-{}", modbusTcp.getSerId(), modbusTcp.getBizCode());
                Number check = ModbusUtil2.readHoldingRegister(modbusTcp.getIp(), modbusTcp.getPort(), modbusTcp.getAddrExe());
                //解析能耗数据
                analysisService.analysisEs(request, check);
            }
        } catch (Exception e) {
            return new GasResponse(OrderRespEnum.ORDER_ERROR.getCode(), "后台执行异常:" + e.getLocalizedMessage());
        }
        return new GasResponse(OrderRespEnum.ORDER_SUCCESS);
    }
}