Browse Source

优化采集控制逻辑

prod_202403
mh 10 months ago
parent
commit
5d6b9c58b2
  1. 5
      user-service/src/main/java/com/mh/user/constants/Constant.java
  2. 104
      user-service/src/main/java/com/mh/user/controller/SerialPortController.java
  3. 14
      user-service/src/main/java/com/mh/user/job/DealDataJob.java
  4. 20
      user-service/src/main/java/com/mh/user/model/SerialPortModel.java
  5. 2
      user-service/src/main/java/com/mh/user/serialport/SerialPortSendReceive.java
  6. 6
      user-service/src/main/java/com/mh/user/serialport/SerialPortSendReceive2.java
  7. 7
      user-service/src/main/java/com/mh/user/serialport/SerialPortSingle2.java
  8. 1
      user-service/src/main/java/com/mh/user/service/impl/NowDataServiceImpl.java
  9. 3121
      user-service/src/main/java/com/mh/user/utils/AnalysisReceiveOrder485.java
  10. 2
      user-service/src/main/resources/application.yml
  11. 5
      热水新增脚本.sql

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

@ -11,7 +11,8 @@ public class Constant {
public static boolean CONTROL_WEB_FLAG = false;
public static boolean SEND_STATUS = false; // 指令发送状态
public static boolean FLAG = false;
public static boolean WEB_FLAG = false; // 判断是否有前端指令下发
public static volatile boolean FLAG = false;
public static volatile boolean WEB_FLAG = false; // 判断是否有前端指令下发
}

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

@ -2,6 +2,7 @@ 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;
@ -167,14 +168,14 @@ public class SerialPortController {
if (!serialPortModel.getDataValue().equals("100%")) {
deviceCodeParam.setDataValue("100%");
serialPortSingle.serialPortSend(deviceCodeParam);//生成并发送指令
Thread.sleep(1500);
Thread.sleep(1000);
}
} else if (brand.equals("远向")) {
deviceCodeParam.setFunCode("06"); //功能码写数据
if (!serialPortModel.getDataValue().equals("100%")) {
deviceCodeParam.setDataValue("100%");
serialPortSingle.serialPortSend(deviceCodeParam);//生成并发送指令
Thread.sleep(1500);
Thread.sleep(1000);
}
} else if (brand.equals("顶威")) {
deviceCodeParam.setFunCode("0407"); //功能码写数据
@ -184,7 +185,10 @@ public class SerialPortController {
//controlSetService.saveControlSet(controlData);
nowDataService.upLevelSet(buildingId, serialPortModel.getDataValue());//更新实时状态表
}
serialPortSingle.serialPortSend(deviceCodeParam);//生成并发送指令
String returnStr = serialPortSingle.serialPortSend(deviceCodeParam);//生成并发送指令
if (!StringUtils.isBlank(returnStr) && "fail".equals(returnStr)) {
return HttpResult.error(500, "fail");
}
}
Constant.WEB_FLAG = false; //单抄,恢复采集
return HttpResult.ok();
@ -212,11 +216,11 @@ public class SerialPortController {
String deviceType = serialPortModel.getDeviceType();//设备类型
String buildingId = serialPortModel.getBuildingId();//楼栋
String param = serialPortModel.getParam();//操作参数
if (deviceAddr == null || deviceAddr == "") {
if (StringUtils.isBlank(deviceAddr)) {
List<DeviceModel> list = deviceInstallService.selectDevices(buildingId, deviceType);
deviceAddr = list.get(0).getDeviceAddr();
}
if (deviceAddr == null || deviceAddr.length() == 0) {
if (StringUtils.isBlank(deviceAddr)) {
Constant.WEB_FLAG = false;
return HttpResult.error("通讯ID为空!");
}
@ -234,12 +238,12 @@ public class SerialPortController {
//设置设备实体对象
ControlSetEntity controlData = new ControlSetEntity();
controlData.setBuildingId(deviceInstallEntity.getBuildingId());
if (deviceType == null || deviceType.equals("") || deviceType.equals("热泵")) {
if (StringUtils.isBlank(deviceType) || deviceType.equals("热泵")) {
//设置热泵实体对象
PumpSetEntity pumpData = new PumpSetEntity();
pumpData.setBuildingId(deviceInstallEntity.getBuildingId());
pumpData.setPumpId(deviceAddr);
if (param == null || param.equals("") || param.equals("读温度设定")) {
if (StringUtils.isBlank(param) || param.equals("读温度设定")) {
deviceCodeParam.setFunCode("03"); //功能码读数据
if (brand.equals("美的")) {
deviceCodeParam.setRegisterAddr("0642"); //寄存器地址
@ -247,7 +251,7 @@ public class SerialPortController {
deviceCodeParam.setRegisterAddr("0003"); //寄存器地址
}
rtData = serialPortSingle.serialPortSend(deviceCodeParam);//生成并发送指令
if (!rtData.equals("")) {
if (!rtData.equals("fail")) {
pumpData.setTempSet(rtData);
pumpSetService.savePumpSet(pumpData);//热泵信息保存数据库
}
@ -259,7 +263,7 @@ public class SerialPortController {
deviceCodeParam.setRegisterAddr("0064"); //寄存器地址
}
rtData = serialPortSingle.serialPortSend(deviceCodeParam);//生成并发送指令
if (!rtData.equals("")) {
if (!rtData.equals("fail")) {
pumpData.setWaterTemp(rtData);
pumpSetService.savePumpSet(pumpData);//热泵信息保存数据库
}
@ -280,14 +284,15 @@ public class SerialPortController {
deviceCodeParam.setFunCode("03"); //功能码读数据
//保存数据
rtData = serialPortSingle.serialPortSend(deviceCodeParam);//生成并发送指令
String time = rtData;
if (time.length() == 8) {
String statTime = time.substring(0, 2) + ":" + time.substring(2, 4);
String closeTime = time.substring(4, 6) + ":" + time.substring(6, 8);
pumpData.setStartTime1(statTime);
pumpData.setCloseTime1(closeTime);
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);
pumpData.setStartTime1(statTime);
pumpData.setCloseTime1(closeTime);
}
pumpSetService.savePumpSet(pumpData);//热泵信息保存数据库
}
pumpSetService.savePumpSet(pumpData);//热泵信息保存数据库
}
} else if (param.equals("时段2")) {
if (brand.equals("美的")) {
@ -296,14 +301,15 @@ public class SerialPortController {
deviceCodeParam.setFunCode("03"); //功能码读数据
//保存数据
rtData = serialPortSingle.serialPortSend(deviceCodeParam);//生成并发送指令
String time = rtData;
if (time.length() == 8) {
String statTime = time.substring(0, 2) + ":" + time.substring(2, 4);
String closeTime = time.substring(4, 6) + ":" + time.substring(6, 8);
pumpData.setStartTime2(statTime);
pumpData.setCloseTime2(closeTime);
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);
pumpData.setStartTime2(statTime);
pumpData.setCloseTime2(closeTime);
}
pumpSetService.savePumpSet(pumpData);//热泵信息保存数据库
}
pumpSetService.savePumpSet(pumpData);//热泵信息保存数据库
}
}
} else if (deviceType.equals("时控")) {
@ -316,34 +322,34 @@ public class SerialPortController {
}
deviceCodeParam.setFunCode("03"); //功能码读数据
rtData = serialPortSingle.serialPortSend(deviceCodeParam);//生成并发送指令
if (!rtData.equals("fail")) {
if (rtData.length() == 16) {
//时段1
String statTime1 = rtData.substring(0, 2) + ":" + rtData.substring(2, 4);
String closeTime1 = rtData.substring(4, 6) + ":" + rtData.substring(6, 8);
//时段2
String statTime2 = rtData.substring(8, 10) + ":" + rtData.substring(10, 12);
String closeTime2 = rtData.substring(12, 14) + ":" + rtData.substring(14, 16);
String time = rtData;
if (time.length() == 16) {
//时段1
String statTime1 = time.substring(0, 2) + ":" + time.substring(2, 4);
String closeTime1 = time.substring(4, 6) + ":" + time.substring(6, 8);
//时段2
String statTime2 = time.substring(8, 10) + ":" + time.substring(10, 12);
String closeTime2 = time.substring(12, 14) + ":" + time.substring(14, 16);
if (param.equals("L1")) {
controlData.setUseStartTime1(statTime1);
controlData.setUseCloseTime1(closeTime1);
controlData.setUseStartTime2(statTime2);
controlData.setUseCloseTime2(closeTime2);
} else if (param.equals("L2")) {
controlData.setUseStartTime3(statTime1);
controlData.setUseCloseTime3(closeTime1);
controlData.setUseStartTime4(statTime2);
controlData.setUseCloseTime4(closeTime2);
} else {
controlData.setUseStartTime5(statTime1);
controlData.setUseCloseTime5(closeTime1);
controlData.setUseStartTime6(statTime2);
controlData.setUseCloseTime6(closeTime2);
if (param.equals("L1")) {
controlData.setUseStartTime1(statTime1);
controlData.setUseCloseTime1(closeTime1);
controlData.setUseStartTime2(statTime2);
controlData.setUseCloseTime2(closeTime2);
} else if (param.equals("L2")) {
controlData.setUseStartTime3(statTime1);
controlData.setUseCloseTime3(closeTime1);
controlData.setUseStartTime4(statTime2);
controlData.setUseCloseTime4(closeTime2);
} else {
controlData.setUseStartTime5(statTime1);
controlData.setUseCloseTime5(closeTime1);
controlData.setUseStartTime6(statTime2);
controlData.setUseCloseTime6(closeTime2);
}
}
controlSetService.saveControlSet(controlData); //保存设置内容
}
controlSetService.saveControlSet(controlData); //保存设置内容
} else if (deviceType.equals("水位开关") && !param.equals("状态")) {
if (brand == null || brand.equals("") || brand.equals("中凯")) {//品牌
deviceCodeParam.setFunCode("17"); //功能码读
@ -356,7 +362,7 @@ public class SerialPortController {
deviceCodeParam.setRegisterAddr("0102");
}
rtData = serialPortSingle.serialPortSend(deviceCodeParam);//生成并发送指令
deviceCodeParam.setDataValue(rtData);
//deviceCodeParam.setDataValue(rtData);
//controlData.setLevelSet(serialPortModel.getDataValue());
//controlSetService.saveControlSet(controlData);
log.info("--------------读取返回数据:" + rtData + "------------------");

14
user-service/src/main/java/com/mh/user/job/DealDataJob.java

@ -52,7 +52,7 @@ public class DealDataJob {
Date date = new Date();
String curDate = sdf1.format(date);
String name = dealDataService.customName();
if (name != null && name.length() > 0 && name.contains("华夏学院")) {
if (name != null && name.contains("华夏学院")) {
dealDataService.proEnergy2(curDate);
} else {
dealDataService.proEnergy(curDate); //yyyy-MM-dd HH:00:00
@ -60,9 +60,7 @@ public class DealDataJob {
dealDataService.proGatewayState(); //判断网关在线状态:在线或离线
log.info("进入定时调试数据库过程汇总数据!yyyy-MM-dd HH:00:00");
} catch (Exception e) {
e.printStackTrace();
//Constant.FLAG=false;
//Constant.WEB_FLAG=false;
log.error("定时处理数据汇总异常==>", e);
}
}
@ -98,7 +96,10 @@ public class DealDataJob {
Thread thread = new Thread(myThread);
comThreadPool.execute(thread);
}
// 等待执行完成
countDownLatch.await();
// 释放资源
countDownLatch = null;
}
}
}
@ -106,6 +107,7 @@ public class DealDataJob {
log.error("定时采集异常==>", e);
} finally {
Constant.FLAG = false;
log.info("------定时采集结束>>>>Constant.FLAG==" + Constant.FLAG + "------");
}
}
@ -133,9 +135,7 @@ public class DealDataJob {
dealDataService.proTotalPumpMinutes(curDate); //统计周\月热泵运行时长
log.info("进入定时调试数据库过程汇总数据!yyyy-MM-dd");
} catch (Exception e) {
e.printStackTrace();
//Constant.FLAG=false;
//Constant.WEB_FLAG=false;
log.error("定时处理数据异常==>", e);
}
}

20
user-service/src/main/java/com/mh/user/model/SerialPortModel.java

@ -5,9 +5,29 @@ import lombok.Data;
@Data
public class SerialPortModel {
/**
* 楼栋id
*/
private String buildingId;
/**
* 设备地址
*/
private String deviceAddr;
/**
* 设备类型
*/
private String deviceType;
/**
* 操作类型
*/
private String param;
/**
* 操作值
*/
private String dataValue;
}

2
user-service/src/main/java/com/mh/user/serialport/SerialPortSendReceive.java

@ -107,11 +107,11 @@ public class SerialPortSendReceive {
continue; //continue时,跳出本次循环,继续执行下次循环。Break时,跳出循环(结束循环),执行下面的语句。
}
}catch (Exception e){
// e.printStackTrace();
Constant.WEB_FLAG=false;//可以采集的状态
if(i==size-1){
Constant.FLAG=false;
}
log.error("发送指令异常==>", e);
}
receiveStr="";
//从串口读取数据

6
user-service/src/main/java/com/mh/user/serialport/SerialPortSendReceive2.java

@ -59,7 +59,6 @@ public class SerialPortSendReceive2 {
for (int i = 0; i < deviceManageEntityList.size(); i++) {
//判断网页端是否有操作设备的
if (Constant.WEB_FLAG) {
Constant.FLAG = false;
SerialTool.closePort(serialPort);
log.info("有指令下发退出定时采集");
break;
@ -110,7 +109,6 @@ public class SerialPortSendReceive2 {
byte[] bytes = SerialTool.readFromPort(serialPort);
if (bytes == null) {
SerialTool.closePort(serialPort);
Thread.sleep(1000);
log.info("串口" + serialPort + "没有数据返回!" + i);
log.info("----------------" + deviceType + "离线,设备号:" + deviceAddr + ",所属楼栋:" + buildingName + "----------------");
Constant.WEB_FLAG = false;//可以采集的状态
@ -133,11 +131,8 @@ public class SerialPortSendReceive2 {
// 处理返回来的数据报文
dealReceiveData(dateStr, serialPort, i, deviceAddr, deviceType, registerAddr, brand, buildingId, buildingName, bytes);
}
Constant.FLAG = false;
log.info("-------------一轮采集完,采集标志Constant.Flag=false-------------");
} catch (Exception e) {
Constant.WEB_FLAG = false;//可以采集的状态
Constant.FLAG = false;
log.error("-------------串口采集异常!----------->>", e);
}
}
@ -204,7 +199,6 @@ public class SerialPortSendReceive2 {
Constant.WEB_FLAG = false;//可以采集的状态
log.error(deviceManageEntityList.get(i).getDeviceType() + "保存数据库失败!" + i,e);
}
Thread.sleep(1000);
}
static void analysisReceiveData(String dateStr,

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

@ -35,7 +35,7 @@ public class SerialPortSingle2 {
public String serialPortSend(DeviceCodeParamEntity deviceCodeParamEntity) {
SerialPort serialPort = null;
String rtData = "";
String rtData = "fail";
String comName = deviceCodeParamEntity.getDataCom().toUpperCase();
try {
try {
@ -51,10 +51,11 @@ public class SerialPortSingle2 {
if (serialPort != null) {
String sendStr = SendOrderUtils.getSendStr(deviceCodeParamEntity);
SerialTool.sendToPort(SerialTool.HexString2Bytes(sendStr), serialPort, sendStr, deviceCodeParamEntity.getDeviceType());
Thread.sleep(1500);
Thread.sleep(2000);
}
} catch (Exception e) {
e.printStackTrace();
log.info("单抄串口" + serialPort + "异常,没有数据返回!关闭串口", e);
return "fail";
}
//对返回数据进行相关解析处理
byte[] bytes = SerialTool.readFromPort(serialPort); //读取串口数据

1
user-service/src/main/java/com/mh/user/service/impl/NowDataServiceImpl.java

@ -449,7 +449,6 @@ public class NowDataServiceImpl implements NowDataService {
@Override
public void updateRunState(String buildingId, String pumpId,String strState, String buildingName) {
DeviceInstallEntity deviceInstallEntity=deviceInstallMapper.selectDevice(pumpId,"热泵",buildingId);
// String buildingName=buildingService.queryBuildingName(buildingId);
NowDataEntity data=new NowDataEntity();
int r1 = nowDataMapper.selectNowDataCount(buildingId,pumpId);//判断now_data表是否存在记录
if(r1==0){

3121
user-service/src/main/java/com/mh/user/utils/AnalysisReceiveOrder485.java

File diff suppressed because it is too large Load Diff

2
user-service/src/main/resources/application.yml

@ -1,3 +1,3 @@
spring:
profiles:
active: dev
active: prod

5
热水新增脚本.sql

@ -0,0 +1,5 @@
-- 2023-11-10 新增索引
create index pump_set_pump_id_building_id on pump_set(pump_id, building_id);
create index now_data_building_id on pump_set(building_id);
create index now_data_pump_id on pump_set(pump_id);
Loading…
Cancel
Save