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); } }