package com.ld.igds.protocol.modbus.command; import com.ld.igds.common.CoreDeviceService; import com.ld.igds.constant.Constant; import com.ld.igds.constant.DeviceStatus; import com.ld.igds.io.RemoteControlService; import com.ld.igds.io.constant.OrderRespEnum; import com.ld.igds.io.constant.ProtocolEnum; import com.ld.igds.io.request.DeviceAutoControlRequest; import com.ld.igds.io.request.DeviceControlRequest; import com.ld.igds.io.request.ExeDevice; import com.ld.igds.io.request.TempControlRequest; import com.ld.igds.io.response.DeviceControlResponse; import com.ld.igds.modbus.service.HModbusService; import com.ld.igds.models.Device; import com.ld.igds.models.DeviceModbus; 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协议 * * @Desc: * @author: andy.jia * @update-time: 2023/8/11 10:07 */ @Slf4j @Component(RemoteControlServiceImpl.BEAN_ID) public class RemoteControlServiceImpl implements RemoteControlService { public static final String BEAN_ID = "modbus.remoteControlService"; @Resource private CoreDeviceService coreDeviceService; @Resource private HModbusService deviceModbusService; @Resource private AnalysisService analysisService; @Override public String getProtocol() { return ProtocolEnum.TCP_MODBUS.getCode(); } @Override public DeviceControlResponse deviceControl(DeviceControlRequest request) { List deviceList = request.getDeviceList(); if (null == deviceList || deviceList.isEmpty()) { return new DeviceControlResponse(OrderRespEnum.ORDER_ERROR.getCode(), "没有需要执行的设备"); } try { DeviceModbus deviceModbus; ModbusTcp modbusTcp; ModbusTcp modbusTcpLink = null; String temp = Constant.YN_N; for (ExeDevice exeDevice : deviceList) { deviceModbus = deviceModbusService.getCacheDeviceModbus(request.getCompanyId(), exeDevice.getPassCode() + ""); if (null == deviceModbus) { log.error("当前设备---{}{},为获取到配置的MODBUS信息", exeDevice.getSerId(), exeDevice.getName()); continue; } modbusTcp = new ModbusTcp(deviceModbus); modbusTcp.setIp(request.getIp()); modbusTcp.setPort(request.getPort()); modbusTcp.setDeviceCode(exeDevice.getPassCode() + ""); modbusTcp.setSerId(request.getSerId()); modbusTcp.setCompanyId(request.getCompanyId()); //根据设备目标目标状态,选择需要执行的通道 if (DeviceStatus.CLOSE.getCode().equals(exeDevice.getTargetStatus())) { temp = modbusTcp.getDeviceModbus().getClose(); } if (DeviceStatus.OPEN.getCode().equals(exeDevice.getTargetStatus())) { temp = modbusTcp.getDeviceModbus().getOpen(); } if (StringUtils.isBlank(exeDevice.getLink()) || "null".equals(exeDevice.getLink())) { //根据设备目标状态,调用MODBUS执行 modbusTcp.setAddrExe(this.getAddrExe(temp)); doWriteExe(modbusTcp, exeDevice.getTargetStatus()); continue; } deviceModbus = deviceModbusService.getCacheDeviceModbus(request.getCompanyId(), exeDevice.getLink()); if (null == deviceModbus) continue; modbusTcpLink = new ModbusTcp(deviceModbus); modbusTcpLink.setIp(request.getIp()); modbusTcpLink.setPort(request.getPort()); modbusTcpLink.setDeviceCode(exeDevice.getLink()); modbusTcpLink.setSerId(request.getSerId()); modbusTcpLink.setCompanyId(request.getCompanyId()); //如果是开风机 if (DeviceStatus.F_OPEN.getCode().equals(exeDevice.getTargetStatus())) { //先开窗口 temp = modbusTcp.getDeviceModbus().getOpen(); modbusTcp.setAddrExe(this.getAddrExe(temp)); doWriteExe(modbusTcp, DeviceStatus.OPEN.getCode()); Thread.sleep(300); //再开风机 temp = modbusTcpLink.getDeviceModbus().getOpen(); modbusTcpLink.setAddrExe(this.getAddrExe(temp)); doWriteExe(modbusTcpLink, DeviceStatus.OPEN.getCode()); } //如果关风机 if (DeviceStatus.F_CLOSE.equals(exeDevice.getTargetStatus())) { temp = modbusTcpLink.getDeviceModbus().getStop(); modbusTcpLink.setAddrExe(this.getAddrExe(temp)); doWriteExe(modbusTcpLink, DeviceStatus.CLOSE.getCode()); } //如果开窗 if (DeviceStatus.W_OPEN.equals(exeDevice.getTargetStatus())) { temp = modbusTcp.getDeviceModbus().getOpen(); modbusTcp.setAddrExe(this.getAddrExe(temp)); doWriteExe(modbusTcp, exeDevice.getTargetStatus()); } //如果是关窗户 if (DeviceStatus.W_CLOSE.equals(exeDevice.getTargetStatus())) { //先关风机 temp = modbusTcpLink.getDeviceModbus().getStop(); modbusTcpLink.setAddrExe(this.getAddrExe(temp)); doWriteExe(modbusTcpLink, DeviceStatus.CLOSE.getCode()); Thread.sleep(300); //在关窗户 temp = modbusTcp.getDeviceModbus().getOpen(); modbusTcp.setAddrExe(this.getAddrExe(temp)); doWriteExe(modbusTcp, DeviceStatus.CLOSE.getCode()); } } } catch (Exception e) { log.error("调用MODBUS-TCP执行异常:{}", e); return new DeviceControlResponse(OrderRespEnum.ORDER_ERROR.getCode(), "后台执行异常:" + e.getMessage()); } 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); } } @Override public DeviceControlResponse closeAll(DeviceControlRequest request) { return new DeviceControlResponse(OrderRespEnum.ORDER_ERROR.getCode(), "终端柜体不支持"); } @Override public DeviceControlResponse queryStatus(DeviceControlRequest request) { try { List list = coreDeviceService.getCacheDeviceBySerId(request.getCompanyId(), request.getSerId()); if (null == list || list.isEmpty()) { return new DeviceControlResponse(OrderRespEnum.ORDER_ERROR.getCode(), "未获取到设备列表信息"); } DeviceModbus deviceModbus; ModbusTcp modbusTcp; ModbusTcp modbusTcpLink; for (Device device : list) { deviceModbus = deviceModbusService.getCacheDeviceModbus(request.getCompanyId(), device.getPassCode() + ""); if (null == deviceModbus) { log.error("当前设备---{}{},为获取到配置的MODBUS信息", device.getSerId(), device.getName()); continue; } if (Constant.YN_N.equals(deviceModbus.getOpen())) continue; modbusTcp = new ModbusTcp(deviceModbus); modbusTcp.setIp(request.getIp()); modbusTcp.setPort(request.getPort()); modbusTcp.setDeviceCode(device.getPassCode() + ""); modbusTcp.setSerId(device.getSerId()); modbusTcp.setCompanyId(device.getCompanyId()); doReadStatus(modbusTcp); if (StringUtils.isBlank(device.getLink()) || "null".equals(device.getLink())) continue; Thread.sleep(300); deviceModbus = deviceModbusService.getCacheDeviceModbus(request.getCompanyId(), device.getLink()); if (null == deviceModbus) continue; modbusTcpLink = new ModbusTcp(deviceModbus); modbusTcpLink.setIp(request.getIp()); modbusTcpLink.setPort(request.getPort()); modbusTcpLink.setSerId(device.getSerId()); modbusTcpLink.setDeviceCode(device.getLink()); modbusTcpLink.setCompanyId(device.getCompanyId()); modbusTcpLink.setAddrExe(this.getAddrExe(modbusTcp.getDeviceModbus().getOpenEnd())); doReadStatus(modbusTcpLink); } } catch (Exception e) { log.error("调用MODBUS-TCP执行异常:{}", e); return new DeviceControlResponse(OrderRespEnum.ORDER_ERROR.getCode(), "后台执行异常:" + e.getLocalizedMessage()); } analysisService.analysisDevice(request, 3000); return new DeviceControlResponse(OrderRespEnum.ORDER_SUCCESS); } /** * 读取状态,同时读取开状态和关闭状态 * * @param modbusTcp * @throws Exception */ private void doReadStatus(ModbusTcp modbusTcp) throws Exception { if (Constant.YN_N.equals(modbusTcp.getDeviceModbus().getOpen())) return; int addrExe = getAddrExe(modbusTcp.getDeviceModbus().getOpenEnd()); boolean result = ModbusUtil2.readInputStatus(modbusTcp.getIp(), modbusTcp.getPort(), addrExe); log.debug("---------读开到位状态------{}-{}-{}", modbusTcp.getDeviceCode(), addrExe, result); if (result) { ServerUtil.add2StatusMap(modbusTcp.getCompanyId(), modbusTcp.getSerId(), modbusTcp.getDeviceCode(), DeviceStatus.OPEN.getCode()); } addrExe = getAddrExe(modbusTcp.getDeviceModbus().getCloseEnd()); result = ModbusUtil2.readInputStatus(modbusTcp.getIp(), modbusTcp.getPort(), addrExe); log.debug("---------读关到位状态------{}-{}-{}", modbusTcp.getDeviceCode(), addrExe, result); if (result) { ServerUtil.add2StatusMap(modbusTcp.getCompanyId(), modbusTcp.getSerId(), modbusTcp.getDeviceCode(), DeviceStatus.CLOSE.getCode()); } } @Override public DeviceControlResponse tempControl(TempControlRequest request) { return new DeviceControlResponse(OrderRespEnum.ORDER_ERROR.getCode(), "终端柜体未接入当前控制"); } @Override public DeviceControlResponse airAutoControl(DeviceAutoControlRequest request) { return new DeviceControlResponse(OrderRespEnum.ORDER_ERROR.getCode(), "终端柜体未接入当前控制"); } @Override public DeviceControlResponse n2AutoControl(DeviceAutoControlRequest request) { return new DeviceControlResponse(OrderRespEnum.ORDER_ERROR.getCode(), "终端柜体未接入当前控制"); } }