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<ExeDevice> 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;
|
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执行
|
modbusTcp.setAddrExe(this.getAddrExe(temp));
|
doWriteExe(modbusTcp, device.getTargetStatus());
|
continue;
|
}
|
|
|
//如果是开风机
|
if (DeviceStatus.F_OPEN.getCode().equals(device.getTargetStatus())) {
|
|
//先开窗口
|
temp = modbusTcp.getAddrOpen();
|
modbusTcp.setAddrExe(this.getAddrExe(temp));
|
|
doWriteExe(modbusTcp, DeviceStatus.OPEN.getCode());
|
|
|
Thread.sleep(300);
|
|
//再开风机
|
temp = modbusTcpLink.getAddrOpen();
|
modbusTcpLink.setAddrExe(this.getAddrExe(temp));
|
|
doWriteExe(modbusTcpLink, DeviceStatus.OPEN.getCode());
|
}
|
|
//如果关风机
|
if (DeviceStatus.F_CLOSE.equals(device.getTargetStatus())) {
|
temp = modbusTcpLink.getAddrClose();
|
modbusTcpLink.setAddrExe(this.getAddrExe(temp));
|
|
doWriteExe(modbusTcpLink, DeviceStatus.CLOSE.getCode());
|
}
|
|
|
//如果开窗
|
if (DeviceStatus.W_OPEN.equals(device.getTargetStatus())) {
|
temp = modbusTcp.getAddrOpen();
|
modbusTcp.setAddrExe(this.getAddrExe(temp));
|
|
doWriteExe(modbusTcp, device.getTargetStatus());
|
}
|
|
//如果是关窗户
|
if (DeviceStatus.W_CLOSE.equals(device.getTargetStatus())) {
|
|
//先关风机
|
temp = modbusTcpLink.getAddrClose();
|
modbusTcpLink.setAddrExe(this.getAddrExe(temp));
|
doWriteExe(modbusTcpLink, DeviceStatus.CLOSE.getCode());
|
|
Thread.sleep(300);
|
|
//在关窗户
|
temp = modbusTcp.getAddrClose();
|
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 = 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<Device> list = deviceService.getCacheDeviceBySerId(request.getCompanyId(), request.getSerId());
|
|
if (null == list || list.isEmpty()) {
|
return new DeviceControlResponse(OrderRespEnum.ORDER_ERROR.getCode(), "未获取到设备列表信息");
|
}
|
|
ModbusTcp modbusTcp;
|
ModbusTcp modbusTcpLink;
|
int addrExe;
|
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(device.getSerId());
|
modbusTcp.setCompanyId(device.getCompanyId());
|
|
|
if (Constant.YN_N.equals(modbusTcp.getAddrOpenEnd())) continue;
|
|
addrExe = Integer.valueOf(modbusTcp.getAddrOpenEnd()) - 1;
|
modbusTcp.setAddrExe(addrExe);
|
|
doReadExe(modbusTcp);
|
|
if (null == device.getLinkModbus()) continue;
|
|
Thread.sleep(300);
|
|
modbusTcpLink = new ModbusTcp(device.getModbus());
|
modbusTcpLink.setIp(request.getIp());
|
modbusTcpLink.setPort(request.getPort());
|
modbusTcpLink.setSerId(device.getSerId());
|
modbusTcpLink.setDeviceCode(device.getLink());
|
modbusTcpLink.setCompanyId(device.getCompanyId());
|
addrExe = Integer.valueOf(modbusTcpLink.getAddrOpenEnd()) - 1;
|
modbusTcpLink.setAddrExe(addrExe);
|
|
doReadExe(modbusTcpLink);
|
|
}
|
|
} 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 modbusTcp
|
* @throws Exception
|
*/
|
private void doReadExe(ModbusTcp modbusTcp) throws Exception {
|
|
if (Constant.YN_N.equals(modbusTcp.getAddrOpenEnd())) return;
|
|
boolean[] result = modbusUtil.readStatus02(modbusTcp.getIp(), modbusTcp.getPort(), modbusTcp.getAddrExe(), 2);
|
log.debug("---------读取状态------{}--{}", modbusTcp.getDeviceCode(), result.toString());
|
|
if (result[0]) {
|
ServerUtil.add2StatusMap(modbusTcp.getCompanyId(), modbusTcp.getSerId(), modbusTcp.getDeviceCode(), DeviceStatus.OPEN.getCode());
|
}
|
if (result[1]) {
|
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(), "终端柜体未接入当前控制");
|
}
|
}
|