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.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 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; String[] addr; String temp; 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(); modbusTcp.setIp(request.getIp()); modbusTcp.setPort(request.getPort()); modbusTcp.setDeviceId(device.getId()); modbusTcp.setSerId(request.getSerId()); //modbus规则:开地址-关地址-停地址-开到位-关到位-开故障-关故障,无地址用N代替 addr = device.getModbus().split("-"); temp = addr[0]; if (!Constant.YN_N.equals(temp)) modbusTcp.setAddrOpen(temp); temp = addr[1]; if (!Constant.YN_N.equals(temp)) modbusTcp.setAddrClose(temp); temp = addr[2]; if (!Constant.YN_N.equals(temp)) modbusTcp.setAddrStop(temp); temp = addr[3]; if (!Constant.YN_N.equals(temp)) modbusTcp.setAddrOpenEnd(temp); temp = addr[4]; if (!Constant.YN_N.equals(temp)) modbusTcp.setAddrCloseEnd(temp); temp = addr[5]; if (!Constant.YN_N.equals(temp)) modbusTcp.setAddrOpenError(temp); temp = addr[6]; if (!Constant.YN_N.equals(temp)) modbusTcp.setAddrCloseError(temp); //根据设备目标目标状态,选择需要执行的通道 if (DeviceStatus.CLOSE.getCode().equals(device.getTargetStatus())) { addrExe = Integer.valueOf(modbusTcp.getAddrClose()); } if(DeviceStatus.OPEN.getCode().equals(device.getTargetStatus())){ addrExe = Integer.valueOf(modbusTcp.getAddrOpen()); } //TODO 其他状态待定 //根据设备目标状态,调用MODBUS执行 modbusUtil.writeCoil(modbusTcp.getIp(), modbusTcp.getPort(),addrExe, true); } } catch (Exception e) { } return new DeviceControlResponse(OrderRespEnum.ORDER_SUCCESS); } @Override public DeviceControlResponse closeAll(DeviceControlRequest request) { return null; } @Override public DeviceControlResponse queryStatus(DeviceControlRequest request) { return null; } @Override public DeviceControlResponse tempControl(TempControlRequest request) { return null; } @Override public DeviceControlResponse airAutoControl(DeviceAutoControlRequest request) { return null; } @Override public DeviceControlResponse n2AutoControl(DeviceAutoControlRequest request) { return null; } }