Browse Source

设备控制代码整理

prod_202403
mh 9 months ago
parent
commit
6657e8ffeb
  1. 9
      user-service/src/main/java/com/mh/user/constants/Constant.java
  2. 93
      user-service/src/main/java/com/mh/user/controller/DeviceOperateController.java
  3. 4
      user-service/src/main/java/com/mh/user/controller/SerialPortController.java
  4. 2
      user-service/src/main/java/com/mh/user/entity/DeviceCodeParamEntity.java
  5. 19
      user-service/src/main/java/com/mh/user/serialport/SerialPortSingle2.java
  6. 23
      user-service/src/main/java/com/mh/user/service/DeviceControlService.java
  7. 336
      user-service/src/main/java/com/mh/user/service/impl/DeviceControlServiceImpl.java
  8. 1
      user-service/src/main/java/com/mh/user/utils/GetReadOrder485.java

9
user-service/src/main/java/com/mh/user/constants/Constant.java

@ -15,4 +15,13 @@ public class Constant {
public static volatile boolean WEB_FLAG = false; // 判断是否有前端指令下发
public static final String FAIL = "fail";
public static final String SUCCESS = "success";
public static final String READ = "0";
public static final String WRITE = "1";
}

93
user-service/src/main/java/com/mh/user/controller/DeviceOperateController.java

@ -0,0 +1,93 @@
package com.mh.user.controller;
import com.alibaba.fastjson2.JSONObject;
import com.mh.common.http.HttpResult;
import com.mh.common.utils.StringUtils;
import com.mh.user.annotation.SysLogger;
import com.mh.user.constants.Constant;
import com.mh.user.entity.ControlSetEntity;
import com.mh.user.entity.DeviceCodeParamEntity;
import com.mh.user.entity.DeviceInstallEntity;
import com.mh.user.entity.PumpSetEntity;
import com.mh.user.model.DeviceModel;
import com.mh.user.model.SerialPortModel;
import com.mh.user.serialport.SerialPortSingle2;
import com.mh.user.service.*;
import com.mh.user.utils.ExchangeStringUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.math.BigDecimal;
import java.util.List;
import java.util.Map;
@Slf4j
@RestController
@RequestMapping("serial")
public class DeviceOperateController {
@Autowired
DeviceInstallService deviceInstallService;
@Autowired
PumpSetService pumpSetService;
@Autowired
ControlSetService controlSetService;
@Autowired
NowDataService nowDataService;
@Autowired
private DeviceControlService deviceControlService;
//操作设备
@SysLogger(title = "控制管理", optDesc = "设置设备参数值")
@PostMapping(value = "/operate")
public HttpResult operateDevice(@RequestBody List<SerialPortModel> params) {
try {
Constant.WEB_FLAG = true; //单抄,暂时停止采集
String returnStr = deviceControlService.readOrWriteDevice(params, Constant.WRITE);
if (!StringUtils.isBlank(returnStr) && "fail".equals(returnStr)) {
return HttpResult.error(500, "fail");
}
Constant.WEB_FLAG = false; //单抄,恢复采集
return HttpResult.ok();
} catch (Exception e) {
log.error("前端发送控制异常==>", e);
Constant.WEB_FLAG = false; //单抄,恢复采集
return HttpResult.error(500, "fail");
} finally {
Constant.WEB_FLAG = false;
}
}
//读数据
@SysLogger(title = "控制管理", optDesc = "读设备数据")
@PostMapping(value = "/read")
public HttpResult readData(@RequestBody List<SerialPortModel> params) {
try {
Constant.WEB_FLAG = true; //单抄,暂时停止采集
String rtData = deviceControlService.readOrWriteDevice(params, Constant.READ);
Constant.WEB_FLAG = false; //单抄,恢复采集
if (ExchangeStringUtil.getJSONType(rtData)) {
Map map = JSONObject.parseObject(rtData);
return HttpResult.ok("success", map);
} else {
if (rtData.equals("fail")) {
return HttpResult.error(500, "fail");
} else {
return HttpResult.ok(rtData, rtData);
}
}
} catch (Exception e) {
Constant.WEB_FLAG = false; //单抄,恢复采集
return HttpResult.error(500, "fail");
} finally {
Constant.WEB_FLAG = false; //单抄,恢复采集
}
}
}

4
user-service/src/main/java/com/mh/user/controller/SerialPortController.java

@ -46,7 +46,7 @@ public class SerialPortController {
//操作设备
@SysLogger(title = "控制管理", optDesc = "设置设备参数值")
@PostMapping(value = "/operate")
@PostMapping(value = "/operate/old")
public HttpResult operateDevice(@RequestBody List<SerialPortModel> params) {
try {
SerialPortSingle2 serialPortSingle = new SerialPortSingle2(); //发送接收类
@ -204,7 +204,7 @@ public class SerialPortController {
//读数据
@SysLogger(title = "控制管理", optDesc = "读设备数据")
@PostMapping(value = "/read")
@PostMapping(value = "/read/old")
public HttpResult readData(@RequestBody List<SerialPortModel> params) {
try {
SerialPortSingle2 serialPortSingle = new SerialPortSingle2();

2
user-service/src/main/java/com/mh/user/entity/DeviceCodeParamEntity.java

@ -23,4 +23,6 @@ public class DeviceCodeParamEntity {
private Integer isuse;
private String param;
}

19
user-service/src/main/java/com/mh/user/serialport/SerialPortSingle2.java

@ -1,5 +1,6 @@
package com.mh.user.serialport;
import com.mh.common.utils.StringUtils;
import com.mh.user.entity.DeviceCodeParamEntity;
import com.mh.user.service.BuildingService;
import com.mh.user.service.DeviceInstallService;
@ -11,8 +12,7 @@ import com.mh.user.utils.SpringBeanUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.ApplicationContext;
import java.nio.ByteBuffer;
import java.nio.charset.StandardCharsets;
import java.io.IOException;
import purejavacomm.SerialPort;
@ -58,6 +58,7 @@ public class SerialPortSingle2 {
}
}
} catch (Exception e) {
SerialTool.closePort(serialPort);
log.info("单抄串口" + serialPort + "异常,没有数据返回!关闭串口", e);
return "fail";
}
@ -101,13 +102,13 @@ public class SerialPortSingle2 {
rtData = analysisReceiveOrder485.analysisPressureOrder4852(dataStr, registerAddr, brand, buildingId, buildingName);
} else if ((dataStr.length() == 30) && deviceType.equals("状态检测")) {//五路状态读取,兼容旧版系统
analysisReceiveOrder485.analysisStateOrder485(dataStr, registerAddr, brand, buildingId, buildingName);
} else if (deviceType.equals("水位开关") && (registerAddr.equals("0018") || registerAddr.equals("0017"))) {
} else if (deviceType.equals("水位开关") && (StringUtils.isBlank(registerAddr) || (registerAddr.equals("0018") || registerAddr.equals("0017")))) {
rtData = analysisReceiveOrder485.analysisRelayOrder4852(dataStr, registerAddr, brand, buildingId, buildingName);
} else if (deviceType.equals("热泵")) {
rtData = analysisReceiveOrder485.analysisPumpOrder4852(dataStr, registerAddr, brand, buildingId, buildingName);
} else if (deviceType.equals("时控")) {
rtData = analysisReceiveOrder485.analysisTimeSetOrder4852(dataStr, registerAddr, brand, buildingId, buildingName);
} else if (deviceType.equals("水位开关") && registerAddr.equals("0010")) { //热泵状态
} else if (deviceType.equals("水位开关") && !StringUtils.isBlank(registerAddr) && registerAddr.equals("0010")) { //热泵状态
rtData = analysisReceiveOrder485.analysisPumpStateOrder2(dataStr, registerAddr, brand, buildingId, buildingName);
} else if (deviceType.equals("温度变送器")) {
rtData = analysisReceiveOrder485.analysisMulTempOrder4852(dataStr, registerAddr, brand, buildingId, buildingName);
@ -115,7 +116,7 @@ public class SerialPortSingle2 {
rtData = analysisReceiveOrder485.analysisPumpStateOrder2(dataStr, registerAddr, brand, buildingId, buildingName);
}
} catch (Exception e) {
log.error(deviceCodeParamEntity.getDeviceType() + "单抄保存数据库失败!");
log.error(deviceCodeParamEntity.getDeviceType() + "单抄保存数据库失败!", e);
SerialTool.closePort(serialPort);
return "fail";
}
@ -126,6 +127,14 @@ public class SerialPortSingle2 {
return rtData;
} catch (Exception e) {
log.info("单抄串口" + serialPort + "异常,没有数据返回!关闭串口", e);
} finally {
try {
if (null != serialPort) {
SerialTool.closePort(serialPort);
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}
return "fail";
}

23
user-service/src/main/java/com/mh/user/service/DeviceControlService.java

@ -0,0 +1,23 @@
package com.mh.user.service;
import com.mh.user.model.SerialPortModel;
import java.util.List;
/**
* @author LJF
* @version 1.0
* @project CHWS
* @description 设备控制服务类
* @date 2023-12-21 10:18:34
*/
public interface DeviceControlService {
/**
* 读写设备
* @param params
* @return
*/
public String readOrWriteDevice(List<SerialPortModel> params, String type);
}

336
user-service/src/main/java/com/mh/user/service/impl/DeviceControlServiceImpl.java

@ -0,0 +1,336 @@
package com.mh.user.service.impl;
import com.mh.common.http.HttpResult;
import com.mh.common.utils.StringUtils;
import com.mh.user.constants.Constant;
import com.mh.user.entity.ControlSetEntity;
import com.mh.user.entity.DeviceCodeParamEntity;
import com.mh.user.entity.DeviceInstallEntity;
import com.mh.user.entity.PumpSetEntity;
import com.mh.user.model.DeviceModel;
import com.mh.user.model.SerialPortModel;
import com.mh.user.serialport.SerialPortSingle2;
import com.mh.user.service.*;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.util.List;
/**
* @author LJF
* @version 1.0
* @project CHWS
* @description 设备控制服务类
* @date 2023-12-21 10:21:11
*/
@Slf4j
@Service
public class DeviceControlServiceImpl implements DeviceControlService {
@Resource
private DeviceInstallService deviceInstallService;
@Resource
private PumpSetService pumpSetService;
@Resource
private NowDataService nowDataService;
@Resource
private ControlSetService controlSetService;
@Override
public String readOrWriteDevice(List<SerialPortModel> params, String type) {
try {
SerialPortSingle2 serialPortSingle = new SerialPortSingle2();
String rtData = "";
for (SerialPortModel serialPortModel : params) {
DeviceCodeParamEntity deviceCodeParam = new DeviceCodeParamEntity();
String deviceAddr = serialPortModel.getDeviceAddr();
String deviceType = serialPortModel.getDeviceType();
String buildingId = serialPortModel.getBuildingId();
String param = serialPortModel.getParam();
if (StringUtils.isBlank(deviceAddr)) {
List<DeviceModel> list = deviceInstallService.selectDevices(buildingId, deviceType);
deviceAddr = list.get(0).getDeviceAddr();
}
if (deviceAddr == null || deviceAddr.length() == 0) {
return "fail";
}
DeviceInstallEntity deviceInstallEntity =
deviceInstallService.selectDevice(deviceAddr, deviceType, buildingId);
deviceCodeParam.setDeviceAddr(deviceAddr);
deviceCodeParam.setDeviceType(deviceType);
deviceCodeParam.setDataCom(deviceInstallEntity.getDataCom());
deviceCodeParam.setBaudrate(deviceInstallEntity.getBaudRate());
deviceCodeParam.setParity(deviceInstallEntity.getParity());
deviceCodeParam.setBuildingId(buildingId);
String brand = deviceInstallEntity.getBrand();
deviceCodeParam.setBrand(brand);
deviceCodeParam.setParam(param);
ControlSetEntity controlData = new ControlSetEntity();
controlData.setBuildingId(deviceInstallEntity.getBuildingId());
// 根据设备类型和参数执行相应的操作
switch (deviceType) {
case "热泵":
rtData = handleHotPump(serialPortModel, deviceCodeParam, controlData, rtData, type, serialPortSingle);
break;
case "时控":
rtData = handleTimeControl(serialPortModel, deviceCodeParam, controlData, rtData, type, serialPortSingle);
break;
case "水位开关":
rtData = handleWaterLevelSwitch(serialPortModel, deviceCodeParam, controlData, rtData, type, serialPortSingle);
break;
case "温度变送器":
rtData = handleTemperatureTransmitter(serialPortModel, deviceCodeParam, controlData, rtData, type, serialPortSingle);
break;
case "压变":
rtData = handlePressureTransducer(serialPortModel, deviceCodeParam, controlData, rtData, type, serialPortSingle);
break;
case "水表":
rtData = handleWaterMeter(serialPortModel, deviceCodeParam, controlData, controlData, rtData, type, serialPortSingle);
break;
case "电表":
rtData = handleElectricMeter(serialPortModel, deviceCodeParam, controlData, rtData, type, serialPortSingle);
break;
default:
rtData = handleHotPump(serialPortModel, deviceCodeParam, controlData, rtData, type, serialPortSingle);
break;
}
if (Constant.WRITE.equals(type)) {
rtData = serialPortSingle.serialPortSend(deviceCodeParam);//生成并发送指令
}
}
return rtData;
} catch (Exception e) {
log.error("设备控制异常", e);
return Constant.FAIL;
}
}
private String handleElectricMeter(SerialPortModel serialPortModel, DeviceCodeParamEntity deviceCodeParam, ControlSetEntity controlData, String rtData, String type, SerialPortSingle2 serialPortSingle) {
rtData = serialPortSingle.serialPortSend(deviceCodeParam);
return rtData;
}
private String handleWaterMeter(SerialPortModel serialPortModel, DeviceCodeParamEntity deviceCodeParam, ControlSetEntity controlData, ControlSetEntity controlData1, String rtData, String type, SerialPortSingle2 serialPortSingle) {
rtData = serialPortSingle.serialPortSend(deviceCodeParam);
// 要添加校准值
Double deviationValue = deviceInstallService.selectDeviceDeviation(deviceCodeParam.getDeviceAddr(),deviceCodeParam.getDeviceType(), deviceCodeParam.getBuildingId());
if (null != deviationValue && !"fail".equals(rtData)) {
rtData = new BigDecimal(rtData).add(BigDecimal.valueOf(deviationValue)).toString();
}
return rtData;
}
private String handlePressureTransducer(SerialPortModel serialPortModel, DeviceCodeParamEntity deviceCodeParam, ControlSetEntity controlData, String rtData, String type, SerialPortSingle2 serialPortSingle) {
deviceCodeParam.setFunCode("03"); //功能码读
deviceCodeParam.setRegisterAddr("0004");
rtData = serialPortSingle.serialPortSend(deviceCodeParam);//生成并发送指令
return rtData;
}
private String handleTemperatureTransmitter(SerialPortModel serialPortModel, DeviceCodeParamEntity deviceCodeParam, ControlSetEntity controlData, String rtData, String type, SerialPortSingle2 serialPortSingle) {
deviceCodeParam.setFunCode("03"); //功能码读
deviceCodeParam.setRegisterAddr("0028");
rtData = serialPortSingle.serialPortSend(deviceCodeParam);//生成并发送指令
return rtData;
}
private String handleWaterLevelSwitch(SerialPortModel serialPortModel, DeviceCodeParamEntity deviceCodeParam, ControlSetEntity controlData, String rtData, String type, SerialPortSingle2 serialPortSingle) throws InterruptedException {
if (Constant.WRITE.equals(type)) {
switch (deviceCodeParam.getBrand()) {
case "远向":
deviceCodeParam.setFunCode("06"); //功能码写数据
if (!serialPortModel.getDataValue().equals("100%")) {
deviceCodeParam.setDataValue("100%");
// serialPortSingle.serialPortSend(deviceCodeParam);//生成并发送指令
// Thread.sleep(1000);
}
break;
case "顶威":
deviceCodeParam.setFunCode("0407"); //功能码写数据
break;
default:
deviceCodeParam.setFunCode("12"); //功能码写数据
if (!serialPortModel.getDataValue().equals("100%")) {
deviceCodeParam.setDataValue("100%");
// serialPortSingle.serialPortSend(deviceCodeParam);//生成并发送指令
// Thread.sleep(1000);
}
break;
}
deviceCodeParam.setDataValue(serialPortModel.getDataValue());
nowDataService.upLevelSet(deviceCodeParam.getBuildingId(), serialPortModel.getDataValue());//更新实时状态表
} else if (Constant.READ.equals(type)) {
//生成并发送指令
if ("状态".equals(deviceCodeParam.getParam())) {
if ("远向".equals(deviceCodeParam.getBrand())) {
deviceCodeParam.setFunCode("03"); //功能码读
deviceCodeParam.setRegisterAddr("0010");
}
} else {
if (StringUtils.isBlank(deviceCodeParam.getBrand())
|| "中凯".equals(deviceCodeParam.getBrand())) {//品牌
deviceCodeParam.setFunCode("17"); //功能码读
deviceCodeParam.setRegisterAddr("0017");
} else if ("远向".equals(deviceCodeParam.getBrand())) {
deviceCodeParam.setFunCode("03"); //功能码读
deviceCodeParam.setRegisterAddr("0018");
} else if ("顶威".equals(deviceCodeParam.getBrand())) {
deviceCodeParam.setFunCode("0102"); //功能码读
deviceCodeParam.setRegisterAddr("0102");
}
}
rtData = serialPortSingle.serialPortSend(deviceCodeParam);//生成并发送指令
}
return rtData;
}
private String handleTimeControl(SerialPortModel serialPortModel, DeviceCodeParamEntity deviceCodeParam, ControlSetEntity controlData, String rtData, String type, SerialPortSingle2 serialPortSingle) {
String time = serialPortModel.getDataValue();
if (Constant.READ.equals(type)) {
deviceCodeParam.setFunCode("03"); //功能码读数据
if (deviceCodeParam.getParam().equals("L1")) {
deviceCodeParam.setRegisterAddr("0009"); //寄存器地址,L3路,L1(0009),L2(000D)
} else if (deviceCodeParam.getParam().equals("L2")) {
deviceCodeParam.setRegisterAddr("000D");
} else {
deviceCodeParam.setRegisterAddr("0011");
}
rtData = serialPortSingle.serialPortSend(deviceCodeParam);//生成并发送指令
time = rtData;
} else {
deviceCodeParam.setFunCode("10"); //功能码写数据
}
if (time.length() == 16) {
//时段1 HHmmHHmm
String statTime1 = time.substring(0, 2) + ":" + time.substring(2, 4); //HH:mm
String closeTime1 = time.substring(4, 6) + ":" + time.substring(6, 8); //HH:mm
//时段2
String statTime2 = time.substring(8, 10) + ":" + time.substring(10, 12);
String closeTime2 = time.substring(12, 14) + ":" + time.substring(14, 16);
if ("L1".equals(deviceCodeParam.getParam())) {
deviceCodeParam.setRegisterAddr("0009"); //寄存器地址,L3路,L1(0009),L2(000D)
controlData.setUseStartTime1(statTime1);
controlData.setUseCloseTime1(closeTime1);
controlData.setUseStartTime2(statTime2);
controlData.setUseCloseTime2(closeTime2);
} else if ("L2".equals(deviceCodeParam.getParam())) {
deviceCodeParam.setRegisterAddr("000D");
controlData.setUseStartTime3(statTime1);
controlData.setUseCloseTime3(closeTime1);
controlData.setUseStartTime4(statTime2);
controlData.setUseCloseTime4(closeTime2);
} else {
deviceCodeParam.setRegisterAddr("0011");
controlData.setUseStartTime5(statTime1);
controlData.setUseCloseTime5(closeTime1);
controlData.setUseStartTime6(statTime2);
controlData.setUseCloseTime6(closeTime2);
}
}
controlSetService.saveControlSet(controlData); //保存设置内容
return rtData;
}
private String handleHotPump(SerialPortModel serialPortModel, DeviceCodeParamEntity deviceCodeParam, ControlSetEntity controlData, String rtData, String type, SerialPortSingle2 serialPortSingle) {
//设置热泵实体对象
PumpSetEntity pumpData = new PumpSetEntity();
pumpData.setBuildingId(deviceCodeParam.getBuildingId());
pumpData.setPumpId(deviceCodeParam.getDeviceAddr());
if (StringUtils.isBlank(deviceCodeParam.getParam()) || deviceCodeParam.getParam().equals("温度设定")) {
//发送指令
if (deviceCodeParam.getBrand().equals("美的")) {
deviceCodeParam.setRegisterAddr("0642"); //寄存器地址
deviceCodeParam.setFunCode("10"); //功能码写数据
} else {
deviceCodeParam.setRegisterAddr("0003"); //寄存器地址
deviceCodeParam.setFunCode("06"); //功能码写数据
}
//保存数据
if (Constant.READ.equals(type)) {
rtData = serialPortSingle.serialPortSend(deviceCodeParam);//生成并发送指令
if (!rtData.equals("fail")) {
pumpData.setTempSet(rtData);
pumpSetService.savePumpSet(pumpData);//热泵信息保存数据库
}
return rtData;
}
pumpData.setTempSet(serialPortModel.getDataValue());
pumpSetService.savePumpSet(pumpData);//热泵信息保存数据库
nowDataService.upTempSet2(deviceCodeParam.getBuildingId(), serialPortModel.getDataValue(), deviceCodeParam.getDeviceAddr());//更新实时状态表
log.info("楼栋编号:" + deviceCodeParam.getBuildingId() + ",设定温度:" + serialPortModel.getDataValue() + ",热泵编号:" + deviceCodeParam.getDeviceAddr());
} else if (deviceCodeParam.getParam().equals("时段1") || deviceCodeParam.getParam().equals("时段2")) {
if (deviceCodeParam.getBrand().equals("美的")) {
//发送指令
if (Constant.READ.equals(type)) {
deviceCodeParam.setFunCode("03"); //功能码读数据
} else {
deviceCodeParam.setFunCode("10"); //功能码写数据
}
if ("时段1".equals(deviceCodeParam.getParam())) {
deviceCodeParam.setRegisterAddr("0656"); //寄存器地址
} else {
deviceCodeParam.setRegisterAddr("065A"); //寄存器地址
}
if (Constant.READ.equals(type)) {
rtData = serialPortSingle.serialPortSend(deviceCodeParam);//生成并发送指令
} else {
rtData = serialPortModel.getDataValue();
}
if (!rtData.equals("fail")) {
if (rtData.length() == 8) {
String statTime = rtData.substring(0, 2) + ":" + rtData.substring(2, 4);
String closeTime = rtData.substring(4, 6) + ":" + rtData.substring(6, 8);
if ("时段1".equals(deviceCodeParam.getParam())) {
pumpData.setStartTime1(statTime);
pumpData.setCloseTime1(closeTime);
} else if ("时段2".equals(deviceCodeParam.getParam())) {
pumpData.setStartTime2(statTime);
pumpData.setCloseTime2(closeTime);
}
}
pumpSetService.savePumpSet(pumpData);//热泵信息保存数据库
}
return rtData;
}
} else if ("实际温度".equals(deviceCodeParam.getParam())) {
deviceCodeParam.setFunCode("03"); //功能码读数据
if ("美的".equals(deviceCodeParam.getBrand())) {
deviceCodeParam.setRegisterAddr("0007"); //寄存器地址
} else {
deviceCodeParam.setRegisterAddr("0064"); //寄存器地址
}
rtData = serialPortSingle.serialPortSend(deviceCodeParam);//生成并发送指令
if (!rtData.equals("fail")) {
pumpData.setWaterTemp(rtData);
pumpSetService.savePumpSet(pumpData);//热泵信息保存数据库
}
return rtData;
} else if ("运行状态".equals(deviceCodeParam.getParam())) {
deviceCodeParam.setFunCode("03"); //功能码读数据
if ("美的".equals(deviceCodeParam.getBrand())) {
deviceCodeParam.setRegisterAddr("0641"); //寄存器地址
} else {
deviceCodeParam.setRegisterAddr("0BBD"); //寄存器地址
}
rtData = serialPortSingle.serialPortSend(deviceCodeParam);//生成并发送指令
return rtData;
}
return rtData;
}
}

1
user-service/src/main/java/com/mh/user/utils/GetReadOrder485.java

@ -309,6 +309,7 @@ public class GetReadOrder485 {
// }else{
// log.info("生成水位开关采集指令>>>>" + str);
// }
return str.toUpperCase();
}

Loading…
Cancel
Save