igds-core/src/main/java/com/ld/igds/common/CoreDeviceService.java
@@ -39,6 +39,14 @@ */ List<Device> getCacheDeviceBySerId(String companyId, String serId); /** * 根据仓库编码获取设备信息 * @param companyId * @param depotId * @return */ List<Device> getCacheDeviceByDepotId(String companyId, String depotId); /** * 根据分机信息获取设备 igds-core/src/main/java/com/ld/igds/common/impl/CoreDeviceServiceImpl.java
@@ -9,6 +9,7 @@ import com.ld.igds.constant.DeviceStatus; import com.ld.igds.constant.DeviceType; import com.ld.igds.models.Depot; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; @@ -112,6 +113,32 @@ return list; } @SuppressWarnings("unchecked") @Override public List<Device> getCacheDeviceByDepotId(String companyId, String depotId) { String patten = RedisConst.buildKey(companyId, RedisConst.KEY_DEVICE_LIST); Set<String> keys = redisUtil.keys(patten); if (null == keys) return null; List<Device> result = new ArrayList<>(); List<Device> list = new ArrayList<>(); for (String key : keys) { list.addAll((List<Device>) redisUtil.get(key)); } if (list.isEmpty()) { return null; } for (Device device : list) { if(depotId.equals(device.getDepotId())){ result.add(device); } } return result; } @Override public Device getCacheDeviceById(String companyId, String id) { String key = RedisConst.buildDeviceKey(companyId, RedisConst.KEY_DEVICE, id); igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/ModbusUtil2.java
@@ -48,7 +48,7 @@ modbusMaster.init(); //初始化之后等待,避免出现连接未创建 Thread.sleep(2500); Thread.sleep(3000); return modbusMaster; } igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/ServerUtil.java
@@ -1,7 +1,9 @@ package com.ld.igds.protocol.modbus; import com.ld.igds.constant.Constant; import com.ld.igds.constant.DeviceStatus; import com.ld.igds.util.ContextUtil; import org.apache.commons.lang3.StringUtils; import java.util.HashMap; import java.util.Map; @@ -30,7 +32,36 @@ * @param deviceCode 设备通道ID * @param status 不考虑设备类型,只在通道上标记是OPEN或者CLOSE即可 */ public static void add2StatusMap(String companyId, String serId, String deviceCode, String status) { public static void add2StatusMap(String companyId, String serId, String deviceCode, String status, String mainLink) { //若不为空,则查询主设备状态 if(StringUtils.isNotEmpty(mainLink)){ String oldStatus = contextStatusMap.get(ContextUtil.buildDeviceStatusKey(companyId, serId, mainLink)); //若风窗或风口开 if(DeviceStatus.OPEN.getCode().equals(oldStatus)){ //若风机开 if(DeviceStatus.OPEN.getCode().equals(status)){ status = DeviceStatus.F_OPEN.getCode(); } //若风机关 if(DeviceStatus.CLOSE.getCode().equals(status)){ status = DeviceStatus.W_OPEN.getCode(); } } //若风窗或风口开 if(DeviceStatus.CLOSE.getCode().equals(oldStatus)){ //若风机开 if(DeviceStatus.OPEN.getCode().equals(status)){ status = DeviceStatus.ERROR.getCode(); } //若风机关 if(DeviceStatus.CLOSE.getCode().equals(status)){ status = DeviceStatus.W_CLOSE.getCode(); } } contextStatusMap.put(ContextUtil.buildDeviceStatusKey(companyId, serId, mainLink), status); return; } contextStatusMap.put(ContextUtil.buildDeviceStatusKey(companyId, serId, deviceCode), status); } igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/command/AnalysisService.java
@@ -190,4 +190,33 @@ log.info("Modbus电表----->>>平台:能耗数据解析完成-仓库={}", esData.getDepotId()); esService.saveAndUpdateInc(esData); } /** * 解析空调状态 * * @param request * @param result */ public void analysisTempStatus(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
@@ -5,6 +5,7 @@ import com.ld.igds.constant.BizType; import com.ld.igds.constant.Constant; import com.ld.igds.constant.DeviceStatus; import com.ld.igds.constant.DeviceType; import com.ld.igds.io.RemoteControlService; import com.ld.igds.io.constant.OrderRespEnum; import com.ld.igds.io.constant.ProtocolEnum; @@ -200,7 +201,7 @@ 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); ServerUtil.add2StatusMap(modbusTcp.getCompanyId(), modbusTcp.getSerId(), modbusTcp.getBizCode(), targetStatus, null); } } @@ -213,7 +214,8 @@ @Override public DeviceControlResponse queryStatus(DeviceControlRequest request) { try { List<Device> list = coreDeviceService.getCacheDeviceBySerId(request.getCompanyId(), request.getSerId()); //由于modbus设备可能在多个分机配置上,需根据仓库编码查询设备信息 List<Device> list = coreDeviceService.getCacheDeviceByDepotId(request.getCompanyId(), request.getDepotId()); if (null == list || list.isEmpty()) { return new DeviceControlResponse(OrderRespEnum.ORDER_ERROR.getCode(), "未获取到设备列表信息"); @@ -223,6 +225,11 @@ ModbusTcp modbusTcpLink; for (Device device : list) { deviceModbus = deviceModbusService.getCacheDeviceModbus(request.getCompanyId(), device.getPassCode() + ""); //空调设备单独查询 if(DeviceType.TYPE_05.getCode().equals(device.getType())){ deviceModbus = deviceModbusService.getCacheDeviceModbus(request.getCompanyId(), device.getPassCode() + "", BizType.TEMPCONTROL.getCode()); } if (null == deviceModbus) { log.error("当前设备---{}{},为获取到配置的MODBUS信息", device.getSerId(), device.getName()); @@ -238,7 +245,13 @@ modbusTcp.setSerId(device.getSerId()); modbusTcp.setCompanyId(device.getCompanyId()); doReadStatus(modbusTcp); //空调状态单独读取 if(DeviceType.TYPE_05.getCode().equals(device.getType())){ doReadTempStatus(modbusTcp); continue; } doReadStatus(modbusTcp, null); if (StringUtils.isBlank(device.getLink()) || "null".equals(device.getLink())) continue; @@ -257,7 +270,7 @@ modbusTcpLink.setAddrExe(ServerUtil.getAddrExe(modbusTcp.getDeviceModbus().getOpenEnd())); doReadStatus(modbusTcpLink); doReadStatus(modbusTcpLink, device.getPassCode() + ""); } } catch (Exception e) { @@ -274,9 +287,10 @@ * 读取状态,同时读取开状态和关闭状态 * * @param modbusTcp * @param mainLink 主设备编码 * @throws Exception */ private void doReadStatus(ModbusTcp modbusTcp) throws Exception { private void doReadStatus(ModbusTcp modbusTcp, String mainLink) throws Exception { if (Constant.YN_N.equals(modbusTcp.getDeviceModbus().getOpen())) return; if (Constant.YN_N.equals(modbusTcp.getDeviceModbus().getOpenEnd())) return; @@ -285,7 +299,7 @@ boolean result = ModbusUtil2.readInputStatus(modbusTcp.getIp(), modbusTcp.getPort(), addrExe); log.debug("---------读风窗风口开到位状态(或其他设备运行状态)------{}-{}-{}", modbusTcp.getBizCode(), addrExe, result); if (result) { ServerUtil.add2StatusMap(modbusTcp.getCompanyId(), modbusTcp.getSerId(), modbusTcp.getBizCode(), DeviceStatus.OPEN.getCode()); ServerUtil.add2StatusMap(modbusTcp.getCompanyId(), modbusTcp.getSerId(), modbusTcp.getBizCode(), DeviceStatus.OPEN.getCode(), mainLink); } if (Constant.YN_N.equals(modbusTcp.getDeviceModbus().getCloseEnd())) return; @@ -294,7 +308,30 @@ result = ModbusUtil2.readInputStatus(modbusTcp.getIp(), modbusTcp.getPort(), addrExe); log.debug("---------读风窗风口关到位状态------{}-{}-{}", modbusTcp.getBizCode(), addrExe, result); if (result) { ServerUtil.add2StatusMap(modbusTcp.getCompanyId(), modbusTcp.getSerId(), modbusTcp.getBizCode(), DeviceStatus.CLOSE.getCode()); ServerUtil.add2StatusMap(modbusTcp.getCompanyId(), modbusTcp.getSerId(), modbusTcp.getBizCode(), DeviceStatus.CLOSE.getCode(), mainLink); } } /** * 读取空调设备状态 * * @param modbusTcp * @throws Exception */ private void doReadTempStatus(ModbusTcp modbusTcp) throws Exception { if (Constant.YN_N.equals(modbusTcp.getDeviceModbus().getOpenEnd())) return; int addrExe = ServerUtil.getAddrExe(modbusTcp.getDeviceModbus().getOpenEnd()); Number number = ModbusUtil2.readHoldingRegister(modbusTcp.getIp(), modbusTcp.getPort(), addrExe); log.debug("---------读空调运行状态------{}-{}-{}", modbusTcp.getBizCode(), addrExe, number); int num = number.intValue(); if(num == 1){ ServerUtil.add2StatusMap(modbusTcp.getCompanyId(), modbusTcp.getSerId(), modbusTcp.getBizCode(), DeviceStatus.OPEN.getCode(), null); } if(num == 2){ ServerUtil.add2StatusMap(modbusTcp.getCompanyId(), modbusTcp.getSerId(), modbusTcp.getBizCode(), DeviceStatus.CLOSE.getCode(), null); } }