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.models.Device; import com.ld.igds.protocol.modbus.ModbusUtil; import com.ld.igds.protocol.modbus.ServerUtil; import com.ld.igds.protocol.modbus.data.ModbusTcp; import lombok.extern.slf4j.Slf4j; 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 deviceService; @Resource private AnalysisService analysisService; @Resource private ModbusUtil modbusUtil; @Override public String getProtocol() { return ProtocolEnum.MODBUS_TCP.getCode(); } @Override public DeviceControlResponse deviceControl(DeviceControlRequest request) { List deviceList = request.getDeviceList(); if (null == deviceList || deviceList.isEmpty()) { return new DeviceControlResponse(OrderRespEnum.ORDER_ERROR.getCode(), "没有需要执行的设备"); } try { Device device; ModbusTcp modbusTcp; ModbusTcp modbusTcpLink = null; String temp = Constant.YN_N; int addrExe = 65535; for (ExeDevice exeDevice : deviceList) { device = deviceService.getCacheDeviceById(exeDevice.getCompanyId(), exeDevice.getId()); if (null == device) continue; if (null == device.getModbus()) continue; modbusTcp = new ModbusTcp(device.getModbus()); modbusTcp.setIp(request.getIp()); modbusTcp.setPort(request.getPort()); modbusTcp.setDeviceCode(device.getPassCode() + ""); modbusTcp.setSerId(request.getSerId()); modbusTcp.setCompanyId(request.getCompanyId()); if (null != device.getLinkModbus()) { modbusTcpLink = new ModbusTcp(device.getLinkModbus()); modbusTcpLink.setIp(request.getIp()); modbusTcpLink.setPort(request.getPort()); modbusTcpLink.setDeviceCode(device.getLink()); modbusTcpLink.setSerId(request.getSerId()); modbusTcpLink.setCompanyId(request.getCompanyId()); } //根据设备目标目标状态,选择需要执行的通道 if (DeviceStatus.CLOSE.getCode().equals(device.getTargetStatus())) { temp = modbusTcp.getAddrClose(); } if (DeviceStatus.OPEN.getCode().equals(device.getTargetStatus())) { temp = modbusTcp.getAddrOpen(); } if (null == modbusTcpLink) { //根据设备目标状态,调用MODBUS执行 addrExe = Integer.valueOf(temp) - 1; modbusTcp.setAddrExe(addrExe); doExe(modbusTcp, device.getTargetStatus()); continue; } //如果是开风机 if (DeviceStatus.F_OPEN.getCode().equals(device.getTargetStatus())) { //先开窗口 temp = modbusTcp.getAddrOpen(); addrExe = Integer.valueOf(temp) - 1; modbusTcp.setAddrExe(addrExe); doExe(modbusTcp, DeviceStatus.OPEN.getCode()); Thread.sleep(300); //再开风机 temp = modbusTcpLink.getAddrOpen(); addrExe = Integer.valueOf(temp) - 1; modbusTcpLink.setAddrExe(addrExe); doExe(modbusTcpLink, DeviceStatus.OPEN.getCode()); } //如果关风机 if(DeviceStatus.F_CLOSE.equals(device.getTargetStatus())){ temp = modbusTcpLink.getAddrClose(); addrExe = Integer.valueOf(temp) - 1; modbusTcpLink.setAddrExe(addrExe); doExe(modbusTcpLink, DeviceStatus.CLOSE.getCode()); } //如果开窗 if(DeviceStatus.W_OPEN.equals(device.getTargetStatus())){ temp = modbusTcp.getAddrOpen(); addrExe = Integer.valueOf(temp) - 1; modbusTcp.setAddrExe(addrExe); doExe(modbusTcp, device.getTargetStatus()); } //如果是关窗户 if(DeviceStatus.W_CLOSE.equals(device.getTargetStatus())){ //先关风机 temp = modbusTcpLink.getAddrClose(); addrExe = Integer.valueOf(temp) - 1; modbusTcpLink.setAddrExe(addrExe); doExe(modbusTcpLink, DeviceStatus.CLOSE.getCode()); Thread.sleep(300); //在关窗户 temp = modbusTcp.getAddrClose(); addrExe = Integer.valueOf(temp) - 1; modbusTcp.setAddrExe(addrExe); doExe(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 void doExe(ModbusTcp modbusTcp, String targetStatus) throws Exception { boolean exeResult = modbusUtil.writeValue05(modbusTcp.getIp(), modbusTcp.getPort(), modbusTcp.getAddrExe(), true); if (exeResult) { 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 = deviceService.getCacheDeviceBySerId(request.getCompanyId(), request.getSerId()); if (null == list || list.isEmpty()) { return new DeviceControlResponse(OrderRespEnum.ORDER_ERROR.getCode(), "未获取到设备列表信息"); } ModbusTcp modbusTcp; ModbusTcp modbusTcpLink; int addrStart; boolean[] result; for (Device device : list) { if (null == device.getModbus()) continue; modbusTcp = new ModbusTcp(device.getModbus()); modbusTcp.setIp(request.getIp()); modbusTcp.setPort(request.getPort()); modbusTcp.setDeviceCode(device.getPassCode() + ""); modbusTcp.setSerId(request.getSerId()); addrStart = Integer.valueOf(modbusTcp.getAddrOpenEnd()) - 1; result = modbusUtil.readStatus02(modbusTcp.getIp(), modbusTcp.getPort(), addrStart, 2); log.debug("---------读取状态------{}--{}", modbusTcp.getDeviceCode(), result.toString()); analysisResult(device.getCompanyId(), device.getSerId(), modbusTcp.getDeviceCode(), result); if (null != device.getLinkModbus()) { Thread.sleep(300); modbusTcpLink = new ModbusTcp(device.getModbus()); modbusTcpLink.setIp(request.getIp()); modbusTcpLink.setPort(request.getPort()); modbusTcpLink.setSerId(request.getSerId()); modbusTcpLink.setDeviceCode(device.getLink()); addrStart = Integer.valueOf(modbusTcpLink.getAddrOpenEnd()) - 1; result = modbusUtil.readStatus02(modbusTcpLink.getIp(), modbusTcpLink.getPort(), addrStart, 2); log.debug("---------读取状态-LINK------{}--{}", modbusTcpLink.getDeviceCode(), result.toString()); analysisResult(device.getCompanyId(), device.getSerId(), modbusTcpLink.getDeviceCode(), result); } } } catch (Exception e) { log.error("调用MODBUS-TCP执行异常:{}", e); return new DeviceControlResponse(OrderRespEnum.ORDER_ERROR.getCode(), "后台执行异常:" + e.getMessage()); } analysisService.analysisDevice(request, 3000); return new DeviceControlResponse(OrderRespEnum.ORDER_SUCCESS); } /** * 返回两位,第一位是开到位,第二位是关到位,根据这两个标记确认当前设备的状态 * * @param deviceCode * @param result */ private void analysisResult(String companyId, String serId, String deviceCode, boolean[] result) { if (result[0]) { ServerUtil.add2StatusMap(companyId, serId, deviceCode, DeviceStatus.OPEN.getCode()); } if (result[1]) { ServerUtil.add2StatusMap(companyId, serId, deviceCode, 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(), "终端柜体未接入当前控制"); } }