Browse Source

设备控制代码整理优化

prod_202403
mh 9 months ago
parent
commit
4f478a504d
  1. 146
      user-service/src/main/java/com/mh/user/serialport/SerialPortSingle2.java
  2. 7
      user-service/src/main/java/com/mh/user/serialport/SerialTool.java
  3. 39
      user-service/src/main/java/com/mh/user/service/impl/DeviceControlServiceImpl.java
  4. 10
      user-service/src/main/java/com/mh/user/service/impl/NowDataServiceImpl.java
  5. 61
      user-service/src/main/java/com/mh/user/utils/AnalysisReceiveOrder485.java
  6. 79
      user-service/src/main/java/com/mh/user/utils/CacheTools.java
  7. 728
      user-service/src/main/java/com/mh/user/utils/GetReadOrder485.java

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

@ -1,20 +1,20 @@
package com.mh.user.serialport;
import com.mh.common.utils.StringUtils;
import com.mh.user.constants.Constant;
import com.mh.user.entity.DeviceCodeParamEntity;
import com.mh.user.service.BuildingService;
import com.mh.user.service.DeviceInstallService;
import com.mh.user.service.NowDataService;
import com.mh.user.utils.AnalysisReceiveOrder485;
import com.mh.user.utils.ExchangeStringUtil;
import com.mh.user.utils.SendOrderUtils;
import com.mh.user.utils.SpringBeanUtil;
import com.mh.user.utils.*;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.ApplicationContext;
import java.io.IOException;
import purejavacomm.SerialPort;
import purejavacomm.SerialPortEvent;
import purejavacomm.SerialPortEventListener;
/**
* @author nxr
@ -51,73 +51,95 @@ public class SerialPortSingle2 {
if (serialPort != null) {
String sendStr = SendOrderUtils.getSendStr(deviceCodeParamEntity);
SerialTool.sendToPort(SerialTool.HexString2Bytes(sendStr), serialPort, sendStr, deviceCodeParamEntity.getDeviceType());
if (deviceCodeParamEntity.getDeviceType().equals("热泵")) {
Thread.sleep(4000);
} else {
Thread.sleep(2000);
}
CacheTools.initReceiveMsg(serialPort.getName());
SerialPort finalSerialPort = serialPort;
SerialTool.addListener(serialPortEvent -> {
try {
for (int i = 0; i < 5; i++) {
Thread.sleep(1000);
byte[] bytes = SerialTool.readFromPort(finalSerialPort);
if (bytes!= null && bytes.length > 0) {
if (Constant.WEB_FLAG) {
CacheTools.setReceiveMsg(finalSerialPort.getName(), ExchangeStringUtil.printHexString(bytes));
break;
}
}
}
} catch (Exception e) {
log.error("单抄串口" + finalSerialPort + "异常,关闭串口", e);
}
}, serialPort);
}
} catch (Exception e) {
SerialTool.closePort(serialPort);
log.info("单抄串口" + serialPort + "异常,没有数据返回!关闭串口", e);
return "fail";
}
//对返回数据进行相关解析处理
byte[] bytes = SerialTool.readFromPort(serialPort); //读取串口数据
if (null == bytes) {
SerialTool.closePort(serialPort);
log.info("单抄串口" + serialPort + "异常,没有数据返回!关闭串口");
return "fail";
}
String receiveStr = null;
receiveStr = ExchangeStringUtil.printHexString(bytes);
//去掉空格和null
receiveStr = receiveStr.replace("null", "").replace(" ", "");
log.info("串口" + serialPort + "接收数据:" + receiveStr + ",大小: " + receiveStr.length());
//返回值全部变成大写
String receiveData = receiveStr.toUpperCase();
//截取去掉FE
String dataStr = receiveData.replace("FE", "");
String deviceType = deviceCodeParamEntity.getDeviceType();
String deviceAddr = deviceCodeParamEntity.getDeviceAddr();
String registerAddr = deviceCodeParamEntity.getRegisterAddr();
String brand = deviceCodeParamEntity.getBrand();
String buildingId = deviceCodeParamEntity.getBuildingId();
String buildingName = buildingService.queryBuildingName(buildingId); //查询楼栋名称
// //对返回数据进行相关解析处理
// byte[] bytes = SerialTool.readFromPort(serialPort); //读取串口数据
// if (null == bytes) {
// SerialTool.closePort(serialPort);
// log.info("单抄串口" + serialPort + "异常,没有数据返回!关闭串口");
// return "fail";
// }
// String receiveStr = null;
// receiveStr = ExchangeStringUtil.printHexString(bytes);
String receiveStr;
if (serialPort != null) {
receiveStr = CacheTools.waitReceiveMsg(serialPort.getName());
//去掉空格和null
if (StringUtils.isBlank(receiveStr)) {
return "fail";
}
receiveStr = receiveStr.replace("null", "").replace(" ", "");
log.info("串口" + serialPort + "接收数据:" + receiveStr + ",大小: " + receiveStr.length());
//返回值全部变成大写
String receiveData = receiveStr.toUpperCase();
//截取去掉FE
String dataStr = receiveData.replace("FE", "");
String deviceType = deviceCodeParamEntity.getDeviceType();
String deviceAddr = deviceCodeParamEntity.getDeviceAddr();
String registerAddr = deviceCodeParamEntity.getRegisterAddr();
String brand = deviceCodeParamEntity.getBrand();
String buildingId = deviceCodeParamEntity.getBuildingId();
String buildingName = buildingService.queryBuildingName(buildingId); //查询楼栋名称
deviceInstallService.updateOnline(deviceAddr, deviceType, buildingId, "在线"); //设备在线
log.info(deviceType + "在线,设备号:" + deviceAddr + ",所属楼栋:" + buildingName);
if (deviceType.equals("热泵")) {
String strState = nowDataService.selectState(buildingId, deviceAddr);
if (strState != null && strState.equals("离线")) { //采集到数据
nowDataService.updateRunState(buildingId, deviceAddr, "不运行", buildingName); //监控界面状态表热泵在线状态
deviceInstallService.updateOnline(deviceAddr, deviceType, buildingId, "在线"); //设备在线
log.info(deviceType + "在线,设备号:" + deviceAddr + ",所属楼栋:" + buildingName);
if (deviceType.equals("热泵")) {
String strState = nowDataService.selectState(buildingId, deviceAddr);
if (strState != null && strState.equals("离线")) { //采集到数据
nowDataService.updateRunState(buildingId, deviceAddr, "不运行", buildingName); //监控界面状态表热泵在线状态
}
}
}
try {
if ((dataStr.length() == 18 || dataStr.length() == 70 || dataStr.length() == 44) && deviceType.equals("水表")) {
rtData = analysisReceiveOrder485.analysisWtMeterOrder4852(dataStr, registerAddr, brand, buildingId, buildingName);
} else if ((dataStr.length() == 36 || dataStr.length() == 44 || dataStr.length() == 40 || dataStr.length() == 50) && deviceType.equals("电表")) {
rtData = analysisReceiveOrder485.analysisMeterOrder4852(dataStr, registerAddr, brand, buildingId, buildingName);
} else if (deviceType.equals("压变")) {
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("水位开关") && (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("水位开关") && !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);
} else if (deviceType.equals("热泵状态")) {
rtData = analysisReceiveOrder485.analysisPumpStateOrder2(dataStr, registerAddr, brand, buildingId, buildingName);
try {
if ((dataStr.length() == 18 || dataStr.length() == 70 || dataStr.length() == 44) && deviceType.equals("水表")) {
rtData = analysisReceiveOrder485.analysisWtMeterOrder4852(dataStr, registerAddr, brand, buildingId, buildingName);
} else if ((dataStr.length() == 36 || dataStr.length() == 44 || dataStr.length() == 40 || dataStr.length() == 50) && deviceType.equals("电表")) {
rtData = analysisReceiveOrder485.analysisMeterOrder4852(dataStr, registerAddr, brand, buildingId, buildingName);
} else if (deviceType.equals("压变")) {
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("水位开关") && (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("水位开关") && !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);
} else if (deviceType.equals("热泵状态")) {
rtData = analysisReceiveOrder485.analysisPumpStateOrder2(dataStr, registerAddr, brand, buildingId, buildingName);
}
} catch (Exception e) {
log.error(deviceCodeParamEntity.getDeviceType() + "单抄保存数据库失败!", e);
SerialTool.closePort(serialPort);
return "fail";
}
} catch (Exception e) {
log.error(deviceCodeParamEntity.getDeviceType() + "单抄保存数据库失败!", e);
SerialTool.closePort(serialPort);
} else {
return "fail";
}
SerialTool.closePort(serialPort);

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

@ -1,5 +1,8 @@
package com.mh.user.serialport;
import com.mh.user.constants.Constant;
import com.mh.user.utils.CacheTools;
import com.mh.user.utils.ExchangeStringUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import purejavacomm.*;
@ -206,6 +209,9 @@ public class SerialTool {
in.read(bytes);
bufflenth = in.available();
}
if (bytes == null) {
return null;
}
} catch (Exception e) {
throw e;
} finally {
@ -219,7 +225,6 @@ public class SerialTool {
}
}
return bytes;
}

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

@ -78,14 +78,13 @@ public class DeviceControlServiceImpl implements DeviceControlService {
deviceCodeParam.setParam(param);
deviceCodeParam.setDataValue(serialPortModel.getDataValue());//传入相关参数值
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;
@ -105,6 +104,7 @@ public class DeviceControlServiceImpl implements DeviceControlService {
rtData = handleElectricMeter(serialPortModel, deviceCodeParam, controlData, rtData, type, serialPortSingle);
break;
default:
// 热泵
rtData = handleHotPump(serialPortModel, deviceCodeParam, controlData, rtData, type, serialPortSingle);
break;
}
@ -250,17 +250,17 @@ public class DeviceControlServiceImpl implements DeviceControlService {
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 (StringUtils.isBlank(deviceCodeParam.getParam()) || deviceCodeParam.getParam().contains("温度设定")) {
//保存数据
if (Constant.READ.equals(type)) {
deviceCodeParam.setFunCode("03"); //功能码读数据
if (deviceCodeParam.getBrand().equals("美的")) {
deviceCodeParam.setRegisterAddr("0642"); //寄存器地址
} else if ("瑞星".equals(deviceCodeParam.getBrand())) {
deviceCodeParam.setRegisterAddr("000A"); //寄存器地址
} else {
deviceCodeParam.setRegisterAddr("0003"); //寄存器地址
}
rtData = serialPortSingle.serialPortSend(deviceCodeParam);//生成并发送指令
if (!rtData.equals("fail")) {
pumpData.setTempSet(rtData);
@ -268,6 +268,17 @@ public class DeviceControlServiceImpl implements DeviceControlService {
}
return rtData;
}
//发送指令
if (deviceCodeParam.getBrand().equals("美的")) {
deviceCodeParam.setRegisterAddr("0642"); //寄存器地址
deviceCodeParam.setFunCode("10"); //功能码写数据
} else if (deviceCodeParam.getBrand().equals("瑞星")) {
deviceCodeParam.setRegisterAddr("000A"); //寄存器地址
deviceCodeParam.setFunCode("10"); //功能码写数据
} else {
deviceCodeParam.setRegisterAddr("0003"); //寄存器地址
deviceCodeParam.setFunCode("06"); //功能码写数据
}
pumpData.setTempSet(serialPortModel.getDataValue());
pumpSetService.savePumpSet(pumpData);//热泵信息保存数据库
@ -312,6 +323,8 @@ public class DeviceControlServiceImpl implements DeviceControlService {
deviceCodeParam.setFunCode("03"); //功能码读数据
if ("美的".equals(deviceCodeParam.getBrand())) {
deviceCodeParam.setRegisterAddr("0007"); //寄存器地址
} else if ("瑞星".equals(deviceCodeParam.getBrand())) {
deviceCodeParam.setRegisterAddr("0046"); //寄存器地址
} else {
deviceCodeParam.setRegisterAddr("0064"); //寄存器地址
}
@ -325,6 +338,8 @@ public class DeviceControlServiceImpl implements DeviceControlService {
deviceCodeParam.setFunCode("03"); //功能码读数据
if ("美的".equals(deviceCodeParam.getBrand())) {
deviceCodeParam.setRegisterAddr("0641"); //寄存器地址
} else if ("瑞星".equals(deviceCodeParam.getBrand())) {
deviceCodeParam.setRegisterAddr("0001");
} else {
deviceCodeParam.setRegisterAddr("0BBD"); //寄存器地址
}

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

@ -14,6 +14,8 @@ import com.mh.user.service.NowDataService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
@ -263,8 +265,12 @@ public class NowDataServiceImpl implements NowDataService {
if (data1!=null){
if (dataType.equals("tempSet")){ //温度设定
data1.setTempSet(strData);
}else if (dataType.equals("waterTemp")){ //水箱水温
data1.setWaterTemp(strData);
} else if (dataType.equals("waterTemp")){ //水箱水温
BigDecimal bigDecimal = new BigDecimal(strData);
if (bigDecimal.compareTo(new BigDecimal(0)) >= 0
&& bigDecimal.compareTo(new BigDecimal(100)) <= 0) {
data1.setWaterTemp(strData);
}
}else if (dataType.equals("runState")){ //运行状态
data1.setRunState(strData);
}else if (dataType.equals("isFault")){ //是否故障

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

@ -589,6 +589,67 @@ public class AnalysisReceiveOrder485 {
} else if (checkStr.substring(2, 4).equalsIgnoreCase("06")) {
log.info("时间: " + dateStr + ",热泵ID: " + addr + ",操作成功! ");
}
} else if (brand.equals("瑞星")) {
if (checkStr.substring(2, 4).equalsIgnoreCase("03")) {//读
if (registerAddr.equalsIgnoreCase("0001")) { //运行状态
dataType = "runState";
data = checkStr.substring(8, 10);
if (data.equalsIgnoreCase("00")) {
sValue = "不运行"; //关机模式
} else if (data.equalsIgnoreCase("01")) {
sValue = "运行"; //制热模式
}
//计算热泵运行时间,按分钟
nowDataService.proPumpMinutes(buildingId, addr, sValue);
log.info("计算热泵运行时长,楼栋名称:" + buildingName + ",热泵编号:" + addr + ",状态:" + sValue);
nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId);
log.info("时间: " + dateStr + ",热泵ID: " + addr + ",数据: " + sValue + "保存数据库成功!楼栋名称:" + buildingName);
} else if (registerAddr.equalsIgnoreCase("000A") || registerAddr.equalsIgnoreCase("0046")) {
//000A设定温度,0046水箱水温
if (registerAddr.equalsIgnoreCase("000A")) {
dataType = "tempSet";
} else {
dataType = "waterTemp";
}
//读数
sValue = ExchangeStringUtil.hexToDec(checkStr.substring(6, 10));
if (dataType.equals("waterTemp")) {
sValue = String.valueOf(Double.parseDouble(sValue)/10);
NowPublicDataEntity publicData = new NowPublicDataEntity();
publicData.setBuildingId(buildingId);
publicData.setUseWaterTemp(sValue);
publicData.setBackWaterTemp(sValue);
nowPublicDataService.saveNowHistoryPublicData(publicData);
nowDataService.proWaterTemp(dateStr, buildingId, addr); //保存楼栋时间点温度变化
} else if (dataType.equals("tempSet")) {
pumpSetService.updatePumpSetTemp(sValue, buildingId, addr); //更新设定温度
}
nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId);
log.info("时间: " + dateStr + ",热泵ID: " + addr + ",数据: " + sValue + "保存数据库成功!楼栋名称:" + buildingName);
} else if (registerAddr.equalsIgnoreCase("0050")) { //故障状态
dataType = "isFault";
String sData = ExchangeStringUtil.hexString2binaryString(checkStr.substring(8, 10));
sData = ExchangeStringUtil.addZeroForNum(sData, 8);
if (sData.substring(7, 8).equalsIgnoreCase("0")) {
sValue = "无故障";
deviceInstallService.updateDeviceFault("0", addr, "热泵");
} else if (sData.substring(7, 8).equalsIgnoreCase("1")) {
sValue = "有故障";
deviceInstallService.updateDeviceFault("1", addr, "热泵");
}
nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId);
log.info("时间: " + dateStr + ",热泵ID: " + addr + ",数据: " + sValue + "保存数据库成功!楼栋名称:" + buildingName);
} else if (registerAddr.equalsIgnoreCase("0028")
|| registerAddr.equalsIgnoreCase("002C")
|| registerAddr.equalsIgnoreCase("0030")) { //读定时设置值
String startTime = checkStr.substring(8, 10) + checkStr.substring(12, 14);
String closetTime = checkStr.substring(16, 18) + checkStr.substring(20, 22);
sValue = startTime + closetTime;
}
} else if (checkStr.substring(2, 4).equalsIgnoreCase("10")) {
log.info("时间: " + dateStr + ",热泵ID: " + addr + ",操作成功! ");
}
rtData = sValue;
}
} else {
log.info("热泵报文检验失败: " + receiveData);

79
user-service/src/main/java/com/mh/user/utils/CacheTools.java

@ -0,0 +1,79 @@
package com.mh.user.utils;
import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;
import io.micrometer.core.instrument.util.StringUtils;
import lombok.extern.slf4j.Slf4j;
import java.util.Objects;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.TimeUnit;
/**
* @author LJF
* @version 1.0
* @project TAD_Server
* @description 缓存等待数据
* @date 2023/7/4 08:45:16
*/
@Slf4j
public class CacheTools {
/**
* 响应消息缓存
*/
private static final Cache<String, BlockingQueue<String>> responseMsgCache = CacheBuilder.newBuilder()
.maximumSize(500)
.expireAfterWrite(1000, TimeUnit.SECONDS)
.build();
/**
* 等待响应消息
*
* @param key 消息唯一标识
* @return ReceiveDdcMsgVo
*/
public static String waitReceiveMsg(String key) {
try {
//设置超时时间
String vo = Objects.requireNonNull(responseMsgCache.getIfPresent(key))
.poll(1000 * 5, TimeUnit.MILLISECONDS);
//删除key
responseMsgCache.invalidate(key);
return vo;
} catch (Exception e) {
log.error("获取数据异常,sn={},msg=null", key);
return "";
}
}
/**
* 初始化响应消息的队列
*
* @param key 消息唯一标识
*/
public static void initReceiveMsg(String key) {
responseMsgCache.put(key, new LinkedBlockingQueue<String>(1));
}
/**
* 设置响应消息
*
* @param key 消息唯一标识
*/
public static void setReceiveMsg(String key, String msg) {
if (!responseMsgCache.asMap().containsKey(key)) {
initReceiveMsg(key);
}
if (responseMsgCache.getIfPresent(key) != null) {
responseMsgCache.getIfPresent(key).add(msg);
return;
}
log.warn("sn {}不存在", key);
}
}

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

@ -23,15 +23,15 @@ public class GetReadOrder485 {
// 调用service
ApplicationContext context = SpringBeanUtil.getApplicationContext();
DeviceDisplayServiceImpl.GatewayManageService gatewayManageService = context.getBean(DeviceDisplayServiceImpl.GatewayManageService.class);
DeviceInstallService deviceInstallService=context.getBean(DeviceInstallService.class);
DeviceCodeParamService deviceCodeParamService=context.getBean(DeviceCodeParamService.class);
DeviceInstallService deviceInstallService = context.getBean(DeviceInstallService.class);
DeviceCodeParamService deviceCodeParamService = context.getBean(DeviceCodeParamService.class);
// 电表
public static String createMeterOrder(DeviceCodeParamEntity orderParamModel){
String str="";
String deviceAddr=orderParamModel.getDeviceAddr();
if (deviceAddr!=null && deviceAddr.length()>0){
try{
public static String createMeterOrder(DeviceCodeParamEntity orderParamModel) {
String str = "";
String deviceAddr = orderParamModel.getDeviceAddr();
if (deviceAddr != null && deviceAddr.length() > 0) {
try {
//0代表前面补充0,12代表长度为12,d代表参数为正数型,基表通讯号
str = String.format("%012d", Long.parseLong(deviceAddr));
//转换位置
@ -44,21 +44,21 @@ public class GetReadOrder485 {
//检验和
String checkSum = ExchangeStringUtil.makeChecksum(str);
str = "FEFEFE" + str + checkSum + "16";
}catch (Exception e){
log.error("生成采集电表指令错误==>",e);
} catch (Exception e) {
log.error("生成采集电表指令错误==>", e);
}
}
return str.toUpperCase();
}
// 水表
public static String createWtMeterOrder(DeviceCodeParamEntity orderParamModel){
String deviceAddr=orderParamModel.getDeviceAddr();
String brand=orderParamModel.getBrand();
String str="";
if(deviceAddr!=null && deviceAddr.length()>0){
try{
if (brand==null || brand.equals("") || brand.equals("艾美柯")){
public static String createWtMeterOrder(DeviceCodeParamEntity orderParamModel) {
String deviceAddr = orderParamModel.getDeviceAddr();
String brand = orderParamModel.getBrand();
String str = "";
if (deviceAddr != null && deviceAddr.length() > 0) {
try {
if (brand == null || brand.equals("") || brand.equals("艾美柯")) {
// 0 代表前面补充0,14 代表长度为14,d 代表参数为正数型
str = String.format("%014d", Long.parseLong(deviceAddr));//基表通讯号
// 转换位置
@ -68,14 +68,14 @@ public class GetReadOrder485 {
// 检验和
String checkSum = ExchangeStringUtil.makeChecksum(str);
str = "FEFEFE" + str + checkSum + "16";
}else if(brand.equals("脉冲")){
} else if (brand.equals("脉冲")) {
str = ExchangeStringUtil.decToHex(deviceAddr);
str=ExchangeStringUtil.addZeroForNum(str,2);
str=str+"0302020002";//读表累计值
String checkWord=ExchangeStringUtil.getStrCRC16(str); //CRC16校验
str = ExchangeStringUtil.addZeroForNum(str, 2);
str = str + "0302020002";//读表累计值
String checkWord = ExchangeStringUtil.getStrCRC16(str); //CRC16校验
str = str + checkWord;
}
}catch (Exception e){
} catch (Exception e) {
e.printStackTrace();
log.error("生成水表采集指令异常>>>>", e);
}
@ -84,222 +84,257 @@ public class GetReadOrder485 {
}
// 热泵,参数:功能码、品牌、数据、通讯表号、寄存器地址
public static String createPumpOrder(DeviceCodeParamEntity orderParamModel){
String deviceAddr=orderParamModel.getDeviceAddr();
String brand=orderParamModel.getBrand();
String funCode=orderParamModel.getFunCode();
String registerAddr=orderParamModel.getRegisterAddr();
String dataValue=orderParamModel.getDataValue();
String str="";
String param="";
if(deviceAddr!=null && deviceAddr.length()>0) {
try{
public static String createPumpOrder(DeviceCodeParamEntity orderParamModel) {
String deviceAddr = orderParamModel.getDeviceAddr();
String brand = orderParamModel.getBrand();
String funCode = orderParamModel.getFunCode();
String registerAddr = orderParamModel.getRegisterAddr();
String dataValue = orderParamModel.getDataValue();
String str = "";
String param = "";
if (deviceAddr != null && deviceAddr.length() > 0) {
try {
// 0代表前面补充0,2代表长度为2,d代表参数为正数型
str = ExchangeStringUtil.decToHex(deviceAddr);
str=ExchangeStringUtil.addZeroForNum(str,2);
if (brand==null || brand.equals("") || brand.equals("美的")){
if (funCode==null || funCode.equals("") || funCode.equals("03")){
if (registerAddr==null || registerAddr.equals("") || registerAddr.equalsIgnoreCase("0641")){ // 运行状态
str = str + "0306410001";
param="运行状态";
} else if (registerAddr.equalsIgnoreCase("0007")){ // 水温
str = str + "0300070001";
param="实际温度";
} else if (registerAddr.equalsIgnoreCase("000B")){ // 故障状态,100*N+11
str = str + "03000B0001";
param="故障状态";
} else if (registerAddr.equalsIgnoreCase("0642")){ // 读温度设定
str = str + "0306420001";
param="设定温度";
} else if (registerAddr.equalsIgnoreCase("0656")){ //读时段1
str = str + "0306560004";
param="时段1";
} else if (registerAddr.equalsIgnoreCase("065A")){ //读时段2
str = str + "03065A0004";
param="时段2";
str = ExchangeStringUtil.addZeroForNum(str, 2);
if (brand == null || brand.equals("") || brand.equals("美的")) {
if (funCode == null || funCode.equals("") || funCode.equals("03")) {
if (registerAddr == null || registerAddr.equals("") || registerAddr.equalsIgnoreCase("0641")) { // 运行状态
str = str + "0306410001";
param = "运行状态";
} else if (registerAddr.equalsIgnoreCase("0007")) { // 水温
str = str + "0300070001";
param = "实际温度";
} else if (registerAddr.equalsIgnoreCase("000B")) { // 故障状态,100*N+11
str = str + "03000B0001";
param = "故障状态";
} else if (registerAddr.equalsIgnoreCase("0642")) { // 读温度设定
str = str + "0306420001";
param = "设定温度";
} else if (registerAddr.equalsIgnoreCase("0656")) { //读时段1
str = str + "0306560004";
param = "时段1";
} else if (registerAddr.equalsIgnoreCase("065A")) { //读时段2
str = str + "03065A0004";
param = "时段2";
}
}else{//10
if (registerAddr==null || registerAddr.equals("") || registerAddr.equalsIgnoreCase("0642")){//温度设定,写
str = str + "100642000102"+ExchangeStringUtil.addZeroForNum(ExchangeStringUtil.decToHex(String.valueOf(dataValue)),4); //写,待测试
}else if(registerAddr.equalsIgnoreCase("0656")){//时段1
if(dataValue.length()==8){
String strData="00"+dataValue.substring(0,2)+"00"+dataValue.substring(2,4)+"00"+dataValue.substring(4,6)+"00"+dataValue.substring(6,8);
str = str + "100656000408"+strData; //写
} else {//10
if (registerAddr == null || registerAddr.equals("") || registerAddr.equalsIgnoreCase("0642")) {//温度设定,写
str = str + "100642000102" + ExchangeStringUtil.addZeroForNum(ExchangeStringUtil.decToHex(String.valueOf(dataValue)), 4); //写,待测试
} else if (registerAddr.equalsIgnoreCase("0656")) {//时段1
if (dataValue.length() == 8) {
String strData = "00" + dataValue.substring(0, 2) + "00" + dataValue.substring(2, 4) + "00" + dataValue.substring(4, 6) + "00" + dataValue.substring(6, 8);
str = str + "100656000408" + strData; //写
}
}else if(registerAddr.equalsIgnoreCase("065A")){//时段2
if(dataValue.length()==8){
String strData="00"+dataValue.substring(0,2)+"00"+dataValue.substring(2,4)+"00"+dataValue.substring(4,6)+"00"+dataValue.substring(6,8);
str = str + "10065A000408"+strData; //写
} else if (registerAddr.equalsIgnoreCase("065A")) {//时段2
if (dataValue.length() == 8) {
String strData = "00" + dataValue.substring(0, 2) + "00" + dataValue.substring(2, 4) + "00" + dataValue.substring(4, 6) + "00" + dataValue.substring(6, 8);
str = str + "10065A000408" + strData; //写
}
}
}
}else if(brand.equals("美的2")){
if (funCode==null || funCode.equals("") || funCode.equals("03")){
if (registerAddr==null || registerAddr.equals("") || registerAddr.equalsIgnoreCase("0BBD")){ // 运行状态
str = str + "030BBD0001";
param="运行状态";
} else if (registerAddr.equalsIgnoreCase("0064")){ // 水温
str = str + "0300640001";
param="实际温度";
} else if (registerAddr.equalsIgnoreCase("0BBB")){ // 故障状态
str = str + "030BBB0001";
param="故障状态";
} else if (registerAddr.equalsIgnoreCase("0003")){ // 读温度设定
str = str + "0300030001";
param="设定温度";
} else if (brand.equals("美的2")) {
if (funCode == null || funCode.equals("") || funCode.equals("03")) {
if (registerAddr == null || registerAddr.equals("") || registerAddr.equalsIgnoreCase("0BBD")) { // 运行状态
str = str + "030BBD0001";
param = "运行状态";
} else if (registerAddr.equalsIgnoreCase("0064")) { // 水温
str = str + "0300640001";
param = "实际温度";
} else if (registerAddr.equalsIgnoreCase("0BBB")) { // 故障状态
str = str + "030BBB0001";
param = "故障状态";
} else if (registerAddr.equalsIgnoreCase("0003")) { // 读温度设定
str = str + "0300030001";
param = "设定温度";
}
}else{//06
if (registerAddr==null || registerAddr.equals("") || registerAddr.equalsIgnoreCase("0003")){//温度设定,写
str = str + "060003"+ExchangeStringUtil.addZeroForNum(ExchangeStringUtil.decToHex(String.valueOf(dataValue)),4); //写,待测试
}else if(registerAddr.equals("0000")) {//开关机
if(dataValue.equals("0000")){
str = str + "0600000000"; //关机
}else{
str = str + "0600000003"; //制热水,开机
} else {//06
if (registerAddr == null || registerAddr.equals("") || registerAddr.equalsIgnoreCase("0003")) {//温度设定,写
str = str + "060003" + ExchangeStringUtil.addZeroForNum(ExchangeStringUtil.decToHex(String.valueOf(dataValue)), 4); //写,待测试
} else if (registerAddr.equals("0000")) {//开关机
if (dataValue.equals("0000")) {
str = str + "0600000000"; //关机
} else {
str = str + "0600000003"; //制热水,开机
}
}
}
} else if (brand.equals("瑞星")) {
if (funCode == null || funCode.equals("") || funCode.equals("03")) {
if (registerAddr == null || registerAddr.equals("") || registerAddr.equalsIgnoreCase("0001")) { // 运行状态
str = str + "0300010001";
param = "运行状态";
} else if (registerAddr.equalsIgnoreCase("0046")) { // 水温
str = str + "0300460001";
param = "实际温度";
} else if (registerAddr.equalsIgnoreCase("0050")) { // 故障状态,100*N+11
str = str + "0300500001";
param = "故障状态";
} else if (registerAddr.equalsIgnoreCase("000A")) { // 读温度设定
str = str + "03000A0001";
param = "设定温度";
} else if (registerAddr.equalsIgnoreCase("0028")) { //读时段1
str = str + "0300280004";
param = "时段1";
} else if (registerAddr.equalsIgnoreCase("002C")) { //读时段2
str = str + "03002C0004";
param = "时段2";
}
} else {//10
if (registerAddr == null || registerAddr.equals("") || registerAddr.equalsIgnoreCase("000A")) {//温度设定,写
str = str + "10000A000102" + ExchangeStringUtil.addZeroForNum(ExchangeStringUtil.decToHex(String.valueOf(dataValue)), 4); //写,待测试
} else if (registerAddr.equalsIgnoreCase("0028")) {//时段1
if (dataValue.length() == 8) {
String strData = "00" + dataValue.substring(0, 2) + "00" + dataValue.substring(2, 4) + "00" + dataValue.substring(4, 6) + "00" + dataValue.substring(6, 8);
str = str + "100028000408" + strData; //写
}
} else if (registerAddr.equalsIgnoreCase("002C")) {//时段2
if (dataValue.length() == 8) {
String strData = "00" + dataValue.substring(0, 2) + "00" + dataValue.substring(2, 4) + "00" + dataValue.substring(4, 6) + "00" + dataValue.substring(6, 8);
str = str + "10002C000408" + strData; //写
}
}
}
}
String checkWord=ExchangeStringUtil.getStrCRC16(str); //CRC16校验
String checkWord = ExchangeStringUtil.getStrCRC16(str); //CRC16校验
str = str + checkWord;
}catch (Exception e){
log.info("热泵"+param+"指令>>>>异常" + str, e);
} catch (Exception e) {
log.info("热泵" + param + "指令>>>>异常" + str, e);
}
}
log.info("热泵"+param+"指令>>>>" + str);
log.info("热泵" + param + "指令>>>>" + str);
return str.toUpperCase();
}
// 水位开关(水位设定)
public static String createRelayOrder(DeviceCodeParamEntity orderParamModel){
String deviceAddr=orderParamModel.getDeviceAddr();
String brand=orderParamModel.getBrand();
String funCode=orderParamModel.getFunCode();
String registerAddr=orderParamModel.getRegisterAddr();
String dataValue=orderParamModel.getDataValue();
String str="";
if(deviceAddr!=null && deviceAddr.length()>0){
try{
if (brand==null || brand.equals("") || brand.equals("中凯"))
{
public static String createRelayOrder(DeviceCodeParamEntity orderParamModel) {
String deviceAddr = orderParamModel.getDeviceAddr();
String brand = orderParamModel.getBrand();
String funCode = orderParamModel.getFunCode();
String registerAddr = orderParamModel.getRegisterAddr();
String dataValue = orderParamModel.getDataValue();
String str = "";
if (deviceAddr != null && deviceAddr.length() > 0) {
try {
if (brand == null || brand.equals("") || brand.equals("中凯")) {
str = ExchangeStringUtil.decToHex(deviceAddr);
str=ExchangeStringUtil.addZeroForNum(str,2);
if (funCode==null || funCode.equals("") || funCode.equals("17")){ //读
str ="33"+ str + "1700000000"; //旧版继电器
}else if (funCode.equals("12")){//写
if (dataValue!=null && !dataValue.equals("")){
str = ExchangeStringUtil.addZeroForNum(str, 2);
if (funCode == null || funCode.equals("") || funCode.equals("17")) { //读
str = "33" + str + "1700000000"; //旧版继电器
} else if (funCode.equals("12")) {//写
if (dataValue != null && !dataValue.equals("")) {
//0001(90%) 0002(80%) 0003(70%)...
if (dataValue.equals("100%")){
registerAddr="1300000000"; //全开
}else if (dataValue.equals("90%")){
registerAddr="1200000001";
}else if(dataValue.equals("80%")){
registerAddr="1200000002";
}else if(dataValue.equals("70%")){
registerAddr="1200000003";
}else if(dataValue.equals("60%")){
registerAddr="1200000004";
}else if(dataValue.equals("50%")){
registerAddr="1200000005";
}else if(dataValue.equals("40%")){
registerAddr="1200000006";
if (dataValue.equals("100%")) {
registerAddr = "1300000000"; //全开
} else if (dataValue.equals("90%")) {
registerAddr = "1200000001";
} else if (dataValue.equals("80%")) {
registerAddr = "1200000002";
} else if (dataValue.equals("70%")) {
registerAddr = "1200000003";
} else if (dataValue.equals("60%")) {
registerAddr = "1200000004";
} else if (dataValue.equals("50%")) {
registerAddr = "1200000005";
} else if (dataValue.equals("40%")) {
registerAddr = "1200000006";
}
str ="33"+ str+registerAddr; //示例:33011200000001
str = "33" + str + registerAddr; //示例:33011200000001
}
}else if (funCode.equals("13")) {//写
str ="33"+ str + "1300000000"; //全开
}else {
str ="33"+ str + "1400000000"; //全合
} else if (funCode.equals("13")) {//写
str = "33" + str + "1300000000"; //全开
} else {
str = "33" + str + "1400000000"; //全合
}
// 检验和
String checkSum = ExchangeStringUtil.makeChecksum(str);
str = str + checkSum ;
str = str + checkSum;
} else if (brand.equals("远向")){
} else if (brand.equals("远向")) {
str = ExchangeStringUtil.decToHex(deviceAddr);
str=ExchangeStringUtil.addZeroForNum(str,2);
if (funCode==null || funCode.equals("") || funCode.equals("03")){//读
if (registerAddr.equalsIgnoreCase("0018")){ //读全部位置
str = str + "0300180008";
} else if (registerAddr.equalsIgnoreCase("0010")){ //读全部DI
str = str + "0300100008";
str = ExchangeStringUtil.addZeroForNum(str, 2);
if (funCode == null || funCode.equals("") || funCode.equals("03")) {//读
if (registerAddr.equalsIgnoreCase("0018")) { //读全部位置
str = str + "0300180008";
} else if (registerAddr.equalsIgnoreCase("0010")) { //读全部DI
str = str + "0300100008";
}
}else if (funCode.equals("06")){ // 写
if (dataValue!=null && !dataValue.equals("")){
if (dataValue.equals("100%")){
registerAddr="10001800081000000000000000000000000000000000"; //全开
}else if (dataValue.equals("90%")){
registerAddr="0600180001";
}else if(dataValue.equals("80%")){
registerAddr="0600190001";
}else if(dataValue.equals("70%")){
registerAddr="06001A0001";
}else if(dataValue.equals("60%")){
registerAddr="06001B0001";
}else if(dataValue.equals("50%")){
registerAddr="06001C0001";
}else if(dataValue.equals("40%")){
registerAddr="06001D0001";
} else if (funCode.equals("06")) { // 写
if (dataValue != null && !dataValue.equals("")) {
if (dataValue.equals("100%")) {
registerAddr = "10001800081000000000000000000000000000000000"; //全开
} else if (dataValue.equals("90%")) {
registerAddr = "0600180001";
} else if (dataValue.equals("80%")) {
registerAddr = "0600190001";
} else if (dataValue.equals("70%")) {
registerAddr = "06001A0001";
} else if (dataValue.equals("60%")) {
registerAddr = "06001B0001";
} else if (dataValue.equals("50%")) {
registerAddr = "06001C0001";
} else if (dataValue.equals("40%")) {
registerAddr = "06001D0001";
}
//0018(90%) 0019(80%) 001A(70%)...
str = str +registerAddr; //示例:010600180001
str = str + registerAddr; //示例:010600180001
}
}else {//写
if (dataValue.equals("0000")){
} else {//写
if (dataValue.equals("0000")) {
str = str + "10001800081000000000000000000000000000000000"; //全开
}else{
} else {
str = str + "10001800081000010001000100010001000100010001"; //全合
}
}
String checkWord=ExchangeStringUtil.getStrCRC16(str); //CRC16校验
String checkWord = ExchangeStringUtil.getStrCRC16(str); //CRC16校验
str = str + checkWord;
}else if (brand.equals("顶威")){
} else if (brand.equals("顶威")) {
str = String.format("%012d", Long.parseLong(deviceAddr));
//转换位置
str = ExchangeStringUtil.changePosition(str); //表号
String strData="";
if (funCode.equals("0407")){//写
str ="68"+str+"680407";
String mark="25C0"; //C025交换位置
String strData1="00000000"; //命令带密码4字节,权限密码默认为00000000
String strData2="";
if (dataValue.equals("100%")){
strData2=ExchangeStringUtil.parseByte2HexStr("00000000");
}else if(dataValue.equals("90%")){
strData2=ExchangeStringUtil.parseByte2HexStr("00000001");
}else if(dataValue.equals("85%")){
strData2=ExchangeStringUtil.parseByte2HexStr("00000011");
}else if(dataValue.equals("80%")){
strData2=ExchangeStringUtil.parseByte2HexStr("00000111");
}else if(dataValue.equals("75%")){
strData2=ExchangeStringUtil.parseByte2HexStr("00001111");
}else if(dataValue.equals("70%")){
strData2=ExchangeStringUtil.parseByte2HexStr("00011111");
}else if(dataValue.equals("65%")){
strData2=ExchangeStringUtil.parseByte2HexStr("00111111");
}else if(dataValue.equals("60%")){
strData2=ExchangeStringUtil.parseByte2HexStr("01111111");
}else if(dataValue.equals("50%")){
strData2=ExchangeStringUtil.parseByte2HexStr("11111111");
}else if(dataValue.equals("自动")){
strData2=ExchangeStringUtil.parseByte2HexStr("00100110");
String strData = "";
if (funCode.equals("0407")) {//写
str = "68" + str + "680407";
String mark = "25C0"; //C025交换位置
String strData1 = "00000000"; //命令带密码4字节,权限密码默认为00000000
String strData2 = "";
if (dataValue.equals("100%")) {
strData2 = ExchangeStringUtil.parseByte2HexStr("00000000");
} else if (dataValue.equals("90%")) {
strData2 = ExchangeStringUtil.parseByte2HexStr("00000001");
} else if (dataValue.equals("85%")) {
strData2 = ExchangeStringUtil.parseByte2HexStr("00000011");
} else if (dataValue.equals("80%")) {
strData2 = ExchangeStringUtil.parseByte2HexStr("00000111");
} else if (dataValue.equals("75%")) {
strData2 = ExchangeStringUtil.parseByte2HexStr("00001111");
} else if (dataValue.equals("70%")) {
strData2 = ExchangeStringUtil.parseByte2HexStr("00011111");
} else if (dataValue.equals("65%")) {
strData2 = ExchangeStringUtil.parseByte2HexStr("00111111");
} else if (dataValue.equals("60%")) {
strData2 = ExchangeStringUtil.parseByte2HexStr("01111111");
} else if (dataValue.equals("50%")) {
strData2 = ExchangeStringUtil.parseByte2HexStr("11111111");
} else if (dataValue.equals("自动")) {
strData2 = ExchangeStringUtil.parseByte2HexStr("00100110");
}
strData=mark+strData1+strData2;
}else if (funCode.equals("0102")){ //读
str ="68"+str+"680102";
strData="25C0"; //标志
strData = mark + strData1 + strData2;
} else if (funCode.equals("0102")) { //读
str = "68" + str + "680102";
strData = "25C0"; //标志
}
strData=ExchangeStringUtil.addThree(strData); //加33
str=str+strData;
strData = ExchangeStringUtil.addThree(strData); //加33
str = str + strData;
//检验和
String checkSum = ExchangeStringUtil.makeChecksum(str);//校验
str = "FEFEFE" + str + checkSum + "16";
}
}catch (Exception e){
} catch (Exception e) {
// e.printStackTrace();
if(registerAddr.equals("0010")){
if (registerAddr.equals("0010")) {
log.error("生成热泵状态指令出错!" + str);
}else{
} else {
log.error("生成水位开关指令出错!" + str);
}
}
@ -314,52 +349,51 @@ public class GetReadOrder485 {
}
// 热泵状态(8路开关)
public static String createPumpStateOrder(DeviceCodeParamEntity orderParamModel){
String deviceAddr=orderParamModel.getDeviceAddr();
String brand=orderParamModel.getBrand();
String funCode=orderParamModel.getFunCode();
String registerAddr=orderParamModel.getRegisterAddr();
String str="";
if(deviceAddr!=null && deviceAddr.length()>0){
try{
if (brand==null || brand.equals("") || brand.equals("中凯"))
{
public static String createPumpStateOrder(DeviceCodeParamEntity orderParamModel) {
String deviceAddr = orderParamModel.getDeviceAddr();
String brand = orderParamModel.getBrand();
String funCode = orderParamModel.getFunCode();
String registerAddr = orderParamModel.getRegisterAddr();
String str = "";
if (deviceAddr != null && deviceAddr.length() > 0) {
try {
if (brand == null || brand.equals("") || brand.equals("中凯")) {
str = ExchangeStringUtil.decToHex(deviceAddr);
str=ExchangeStringUtil.addZeroForNum(str,2);
str = ExchangeStringUtil.addZeroForNum(str, 2);
//if (funCode==null || funCode.equals("") || funCode.equals("17")){ //读
str ="33"+ str + "1700000000"; //旧版继电器
str = "33" + str + "1700000000"; //旧版继电器
//}
// 检验和
String checkSum = ExchangeStringUtil.makeChecksum(str);
str = str + checkSum ;
} else if (brand.equals("远向")){
str = str + checkSum;
} else if (brand.equals("远向")) {
str = ExchangeStringUtil.decToHex(deviceAddr);
str=ExchangeStringUtil.addZeroForNum(str,2);
str = ExchangeStringUtil.addZeroForNum(str, 2);
//if (funCode==null || funCode.equals("") || funCode.equals("03")){//读
//if (registerAddr.equalsIgnoreCase("0018")){ //读全部DO
// str = str + "0300180008";
// } else if (registerAddr.equalsIgnoreCase("0010")){ //读全部DI
str = str + "0300100008";
//}
//if (registerAddr.equalsIgnoreCase("0018")){ //读全部DO
// str = str + "0300180008";
// } else if (registerAddr.equalsIgnoreCase("0010")){ //读全部DI
str = str + "0300100008";
//}
String checkWord=ExchangeStringUtil.getStrCRC16(str); //CRC16校验
//}
String checkWord = ExchangeStringUtil.getStrCRC16(str); //CRC16校验
str = str + checkWord;
}else if (brand.equals("顶威")){
} else if (brand.equals("顶威")) {
str = String.format("%012d", Long.parseLong(deviceAddr));
//转换位置
str = ExchangeStringUtil.changePosition(str); //表号
String strData="";
// if (funCode.equals("0102")){ //读
str ="68"+str+"680102";
strData="25C0"; //标志
// }
strData=ExchangeStringUtil.addThree(strData); //加33
str=str+strData;
String strData = "";
// if (funCode.equals("0102")){ //读
str = "68" + str + "680102";
strData = "25C0"; //标志
// }
strData = ExchangeStringUtil.addThree(strData); //加33
str = str + strData;
//检验和
String checkSum = ExchangeStringUtil.makeChecksum(str);//校验
str = "FEFEFE" + str + checkSum + "16";
}
}catch (Exception e){
} catch (Exception e) {
// e.printStackTrace();
log.error("生成热泵状态指令出错!" + str, e);
}
@ -369,12 +403,12 @@ public class GetReadOrder485 {
}
//状态检测
public static String createStateOrder(DeviceCodeParamEntity orderParamModel){
String deviceAddr=orderParamModel.getDeviceAddr();
String brand=orderParamModel.getBrand();
String str="";
if(deviceAddr!=null && deviceAddr.length()>0){
try{
public static String createStateOrder(DeviceCodeParamEntity orderParamModel) {
String deviceAddr = orderParamModel.getDeviceAddr();
String brand = orderParamModel.getBrand();
String str = "";
if (deviceAddr != null && deviceAddr.length() > 0) {
try {
// 0代表前面补充0,12代表长度为12,d代表参数为正数型.12位通讯地址,以0补位
str = String.format("%012d", Long.parseLong(deviceAddr));
// 转换位置
@ -388,33 +422,33 @@ public class GetReadOrder485 {
String checkSum = ExchangeStringUtil.makeChecksum(str);
str = "FEFEFE" + str + checkSum + "16";
}catch (Exception e){
} catch (Exception e) {
// e.printStackTrace();
log.error("生成状态检测指令出错!" + str,e);
log.error("生成状态检测指令出错!" + str, e);
}
}
return str.toUpperCase();
}
// 压变
public static String createPressureOrder(DeviceCodeParamEntity orderParamModel){
String deviceAddr=orderParamModel.getDeviceAddr();
String brand=orderParamModel.getBrand();
String str="";
if(deviceAddr!=null && deviceAddr.length()>0){
try{
public static String createPressureOrder(DeviceCodeParamEntity orderParamModel) {
String deviceAddr = orderParamModel.getDeviceAddr();
String brand = orderParamModel.getBrand();
String str = "";
if (deviceAddr != null && deviceAddr.length() > 0) {
try {
str = ExchangeStringUtil.decToHex(deviceAddr); //十进制转为十六进制
str = ExchangeStringUtil.addZeroForNum(str, 2); //以0补位
if (brand==null || brand.equals("")){
str = str + "0300000002"; // 压力变送器(新的协议)
}else if (brand.equals("澳升")){
str = str + "0300040001"; // 新款压力变送器
}else if (brand.equals("汝翊")){
str = str + "0300040001";
if (brand == null || brand.equals("")) {
str = str + "0300000002"; // 压力变送器(新的协议)
} else if (brand.equals("澳升")) {
str = str + "0300040001"; // 新款压力变送器
} else if (brand.equals("汝翊")) {
str = str + "0300040001";
}
String checkWord=ExchangeStringUtil.getStrCRC16(str); //CRC16校验
String checkWord = ExchangeStringUtil.getStrCRC16(str); //CRC16校验
str = str + checkWord;
}catch (Exception e){
} catch (Exception e) {
log.info("生成压变指令出错!" + str, e);
}
}
@ -422,12 +456,12 @@ public class GetReadOrder485 {
}
// 温控
public static String createTempOrder(DeviceCodeParamEntity orderParamModel){
String deviceAddr=orderParamModel.getDeviceAddr();
String registerAddr=orderParamModel.getRegisterAddr();
String str="";
if(deviceAddr!=null && deviceAddr.length()>0){
try{
public static String createTempOrder(DeviceCodeParamEntity orderParamModel) {
String deviceAddr = orderParamModel.getDeviceAddr();
String registerAddr = orderParamModel.getRegisterAddr();
String str = "";
if (deviceAddr != null && deviceAddr.length() > 0) {
try {
str = ExchangeStringUtil.decToHex(deviceAddr);
str = ExchangeStringUtil.addZeroForNum(str, 2); //以0补位
// if(registerAddr.equals("")){
@ -435,10 +469,10 @@ public class GetReadOrder485 {
// }else if(registerAddr.equals("")){
// str=str+"0300000002";
// }
str=str+"0300000002";
String checkWord=ExchangeStringUtil.getStrCRC16(str); //CRC16校验
str = str + "0300000002";
String checkWord = ExchangeStringUtil.getStrCRC16(str); //CRC16校验
str = str + checkWord;
}catch (Exception e){
} catch (Exception e) {
// e.printStackTrace();
log.error("生成温控指令出错!" + str, e);
}
@ -447,18 +481,18 @@ public class GetReadOrder485 {
}
// 温度变送器
public static String createMulTempOrder(DeviceCodeParamEntity orderParamModel){
String deviceAddr=orderParamModel.getDeviceAddr();
String registerAddr=orderParamModel.getRegisterAddr();
String str="";
if(deviceAddr!=null && deviceAddr.length()>0){
try{
public static String createMulTempOrder(DeviceCodeParamEntity orderParamModel) {
String deviceAddr = orderParamModel.getDeviceAddr();
String registerAddr = orderParamModel.getRegisterAddr();
String str = "";
if (deviceAddr != null && deviceAddr.length() > 0) {
try {
str = ExchangeStringUtil.decToHex(deviceAddr);
str = ExchangeStringUtil.addZeroForNum(str, 2); //以0补位
str=str+"0300280008"; //读8路温度
String checkWord=ExchangeStringUtil.getStrCRC16(str); //CRC16校验
str = str + "0300280008"; //读8路温度
String checkWord = ExchangeStringUtil.getStrCRC16(str); //CRC16校验
str = str + checkWord;
}catch (Exception e){
} catch (Exception e) {
log.info("生成多路温度变送器指令出错!" + str, e);
}
}
@ -466,34 +500,34 @@ public class GetReadOrder485 {
}
//时控设置,registerAddr 0009(L1)、000D(L2)、0011(L3) 读:010300090004、写:01100009000408+dataValue
public static String createTimeSetOrder(DeviceCodeParamEntity orderParamModel){
String deviceAddr=orderParamModel.getDeviceAddr();
String brand=orderParamModel.getBrand();
String funCode=orderParamModel.getFunCode();
String registerAddr=orderParamModel.getRegisterAddr();
String dataValue=orderParamModel.getDataValue();
String str="";
if(deviceAddr!=null && deviceAddr.length()>0){
public static String createTimeSetOrder(DeviceCodeParamEntity orderParamModel) {
String deviceAddr = orderParamModel.getDeviceAddr();
String brand = orderParamModel.getBrand();
String funCode = orderParamModel.getFunCode();
String registerAddr = orderParamModel.getRegisterAddr();
String dataValue = orderParamModel.getDataValue();
String str = "";
if (deviceAddr != null && deviceAddr.length() > 0) {
str = ExchangeStringUtil.decToHex(deviceAddr);
str = ExchangeStringUtil.addZeroForNum(str, 2); //以0补位
try{
try {
// if (!brand.equals("")){ //品牌
if (!funCode.equals("") && !registerAddr.equals("")){
registerAddr=ExchangeStringUtil.addZeroForNum(registerAddr,4); //寄存器地址
funCode=ExchangeStringUtil.addZeroForNum(funCode,2); // 功能码
if (funCode.equals("03")){ //功能码,读
str = str + "03"+registerAddr +"0004";
}else if (funCode.equals("10")){//写
if (!dataValue.equals("")){
str = str + "10"+registerAddr +"000408"+dataValue;
if (!funCode.equals("") && !registerAddr.equals("")) {
registerAddr = ExchangeStringUtil.addZeroForNum(registerAddr, 4); //寄存器地址
funCode = ExchangeStringUtil.addZeroForNum(funCode, 2); // 功能码
if (funCode.equals("03")) { //功能码,读
str = str + "03" + registerAddr + "0004";
} else if (funCode.equals("10")) {//写
if (!dataValue.equals("")) {
str = str + "10" + registerAddr + "000408" + dataValue;
}
}
}
String checkWord=ExchangeStringUtil.getStrCRC16(str); //CRC16校验
String checkWord = ExchangeStringUtil.getStrCRC16(str); //CRC16校验
str = str + checkWord;
// }
}catch (Exception e){
} catch (Exception e) {
log.error("生成时控指令出错!" + str, e);
}
}
@ -501,30 +535,30 @@ public class GetReadOrder485 {
}
// 冷量计
public static String createCloudOrder(String IP,String port, String dataCom,String cloudNum, String cloudType){
public static String createCloudOrder(String IP, String port, String dataCom, String cloudNum, String cloudType) {
IP = ExchangeStringUtil.ipToHex(IP);
port = ExchangeStringUtil.addZeroForNum(ExchangeStringUtil.decToHex(port),4);
dataCom = ExchangeStringUtil.addZeroForNum(ExchangeStringUtil.decToHex(ExchangeStringUtil.getNumFromString(dataCom)),2);
port = ExchangeStringUtil.addZeroForNum(ExchangeStringUtil.decToHex(port), 4);
dataCom = ExchangeStringUtil.addZeroForNum(ExchangeStringUtil.decToHex(ExchangeStringUtil.getNumFromString(dataCom)), 2);
String str1 = IP + port + dataCom;
// 0 代表前面补充0,2 代表长度为2,d 代表参数为正数型
String str = ExchangeStringUtil.decToHex(cloudNum);
str = String.format("%02d", Long.parseLong(str));
if (cloudType.equalsIgnoreCase("4")){ //温控设备,地址为十六进制
str = str + "0300000002";
} else if (cloudType.equalsIgnoreCase("31")){ //流量计冷冻水量
str = str + "0300080002";
} else if (cloudType.equalsIgnoreCase("32")){ // 流量计出水温度
str = str + "0300490002";
} else if (cloudType.equalsIgnoreCase("33")){ // 流量计回水温度
str = str + "03004B0002";
} else if (cloudType.equalsIgnoreCase("34")){ // 流量计冷量累积量
str = str + "0300500002";
if (cloudType.equalsIgnoreCase("4")) { //温控设备,地址为十六进制
str = str + "0300000002";
} else if (cloudType.equalsIgnoreCase("31")) { //流量计冷冻水量
str = str + "0300080002";
} else if (cloudType.equalsIgnoreCase("32")) { // 流量计出水温度
str = str + "0300490002";
} else if (cloudType.equalsIgnoreCase("33")) { // 流量计回水温度
str = str + "03004B0002";
} else if (cloudType.equalsIgnoreCase("34")) { // 流量计冷量累积量
str = str + "0300500002";
}
byte[] strOrder = ExchangeStringUtil.hexStrToBinaryStr(str);
int checkNum = CRC16.CRC16_MODBUS(strOrder);
String checkWord = ExchangeStringUtil.decToHex(String.valueOf(checkNum));
checkWord = ExchangeStringUtil.addZeroForNum(checkWord,4);
checkWord = checkWord.substring(2,4) + checkWord.substring(0,2);
checkWord = ExchangeStringUtil.addZeroForNum(checkWord, 4);
checkWord = checkWord.substring(2, 4) + checkWord.substring(0, 2);
str = str + checkWord;
// 拼接字符
str = str1 + str;
@ -534,6 +568,7 @@ public class GetReadOrder485 {
/**
* // 冷水机组 指令:IP+端口+COM口+数据+modeBus校验
*
* @param chillersEntity
* @return
*/
@ -548,11 +583,11 @@ public class GetReadOrder485 {
// 获取端口号,转16进制
int port = chillersEntity.getPort();
String portStr = ExchangeStringUtil.decToHex(String.valueOf(port));
portStr = ExchangeStringUtil.addZeroForNum(portStr,4);
portStr = ExchangeStringUtil.addZeroForNum(portStr, 4);
str += portStr;
// 获取COM口
String com = ExchangeStringUtil.getNumFromString(chillersEntity.getDataCom());
String dataCom = ExchangeStringUtil.addZeroForNum(ExchangeStringUtil.decToHex(com),2);
String dataCom = ExchangeStringUtil.addZeroForNum(ExchangeStringUtil.decToHex(com), 2);
str += dataCom;
// 获取冷水机组地址
String chillerAddr = chillersEntity.getCollectionNum();
@ -560,16 +595,16 @@ public class GetReadOrder485 {
String str1 = ExchangeStringUtil.addZeroForNum(chillerAddr, 2);
// 获取功能码
String funCode = chillersEntity.getFunCode();
str1 = str1 + ExchangeStringUtil.addZeroForNum(ExchangeStringUtil.decToHex(funCode),2);
str1 = str1 + ExchangeStringUtil.addZeroForNum(ExchangeStringUtil.decToHex(funCode), 2);
// 寄存器地址
String registerAddr = chillersEntity.getRegisterAddress();
str1 = str1 + ExchangeStringUtil.addZeroForNum(registerAddr,4) + "0001";
str1 = str1 + ExchangeStringUtil.addZeroForNum(registerAddr, 4) + "0001";
log.info(str1);
byte[] strOrder = ExchangeStringUtil.hexStrToBinaryStr(str1);
int checkNum = CRC16.CRC16_MODBUS(strOrder);
String checkWord = ExchangeStringUtil.decToHex(String.valueOf(checkNum));
checkWord = ExchangeStringUtil.addZeroForNum(checkWord,4);
checkWord = checkWord.substring(2,4) + checkWord.substring(0,2);
checkWord = ExchangeStringUtil.addZeroForNum(checkWord, 4);
checkWord = checkWord.substring(2, 4) + checkWord.substring(0, 2);
str1 = str1 + checkWord;
// 拼接新的采集报文
str = str + str1;
@ -599,59 +634,59 @@ public class GetReadOrder485 {
}
// 生成对设备操作指令参数
public void createOrderParam(){
public void createOrderParam() {
List<DeviceInstallEntity> deviceList1;
deviceCodeParamService.selectInsertDeviceCodeParam(); //查询插入设备采集参数,包括压变、温控、温度变送器、热泵状态
deviceList1=deviceInstallService.selectDeviceParams();//查找多个采集参数的设备,包括热泵
deviceList1 = deviceInstallService.selectDeviceParams();//查找多个采集参数的设备,包括热泵
System.out.println(deviceList1);
for (DeviceInstallEntity devices:deviceList1) {
for (DeviceInstallEntity devices : deviceList1) {
List<DeviceCodeParamEntity> deviceCodeParamEntityList = new ArrayList<>();
if (devices.getDeviceType().equals("热泵")){
if (devices.getBrand().equals("美的")){
DeviceCodeParamEntity deviceCodeParamEntity3 = new DeviceCodeParamEntity();
deviceCodeParamEntity3.setRegisterAddr("0007");//水温
deviceCodeParamEntity3.setFunCode("03");
deviceCodeParamEntity3.setDeviceAddr(devices.getDeviceAddr());
deviceCodeParamEntity3.setDeviceName(devices.getDeviceName());
deviceCodeParamEntity3.setDeviceType(devices.getDeviceType());
deviceCodeParamEntity3.setBaudrate(devices.getBaudRate());
deviceCodeParamEntity3.setBrand(devices.getBrand());
deviceCodeParamEntity3.setDataCom(devices.getDataCom());
deviceCodeParamEntity3.setBuildingId(devices.getBuildingId());
deviceCodeParamEntity3.setParity(devices.getParity());
deviceCodeParamEntityList.add(deviceCodeParamEntity3);
}else if (devices.getBrand().equals("美的2")){
DeviceCodeParamEntity deviceCodeParamEntity3 = new DeviceCodeParamEntity();
deviceCodeParamEntity3.setRegisterAddr("0064");//水温
deviceCodeParamEntity3.setFunCode("03");
deviceCodeParamEntity3.setDeviceAddr(devices.getDeviceAddr());
deviceCodeParamEntity3.setDeviceName(devices.getDeviceName());
deviceCodeParamEntity3.setDeviceType(devices.getDeviceType());
deviceCodeParamEntity3.setBaudrate(devices.getBaudRate());
deviceCodeParamEntity3.setBrand(devices.getBrand());
deviceCodeParamEntity3.setDataCom(devices.getDataCom());
deviceCodeParamEntity3.setBuildingId(devices.getBuildingId());
deviceCodeParamEntity3.setParity(devices.getParity());
deviceCodeParamEntityList.add(deviceCodeParamEntity3);
}
if (devices.getDeviceType().equals("热泵")) {
if (devices.getBrand().equals("美的")) {
DeviceCodeParamEntity deviceCodeParamEntity3 = new DeviceCodeParamEntity();
deviceCodeParamEntity3.setRegisterAddr("0007");//水温
deviceCodeParamEntity3.setFunCode("03");
deviceCodeParamEntity3.setDeviceAddr(devices.getDeviceAddr());
deviceCodeParamEntity3.setDeviceName(devices.getDeviceName());
deviceCodeParamEntity3.setDeviceType(devices.getDeviceType());
deviceCodeParamEntity3.setBaudrate(devices.getBaudRate());
deviceCodeParamEntity3.setBrand(devices.getBrand());
deviceCodeParamEntity3.setDataCom(devices.getDataCom());
deviceCodeParamEntity3.setBuildingId(devices.getBuildingId());
deviceCodeParamEntity3.setParity(devices.getParity());
deviceCodeParamEntityList.add(deviceCodeParamEntity3);
} else if (devices.getBrand().equals("美的2")) {
DeviceCodeParamEntity deviceCodeParamEntity3 = new DeviceCodeParamEntity();
deviceCodeParamEntity3.setRegisterAddr("0064");//水温
deviceCodeParamEntity3.setFunCode("03");
deviceCodeParamEntity3.setDeviceAddr(devices.getDeviceAddr());
deviceCodeParamEntity3.setDeviceName(devices.getDeviceName());
deviceCodeParamEntity3.setDeviceType(devices.getDeviceType());
deviceCodeParamEntity3.setBaudrate(devices.getBaudRate());
deviceCodeParamEntity3.setBrand(devices.getBrand());
deviceCodeParamEntity3.setDataCom(devices.getDataCom());
deviceCodeParamEntity3.setBuildingId(devices.getBuildingId());
deviceCodeParamEntity3.setParity(devices.getParity());
deviceCodeParamEntityList.add(deviceCodeParamEntity3);
}
}
deviceCodeParamService.insertDeviceCodeParamList(deviceCodeParamEntityList);
}
}
// 生成对设备操作指令参数
public void createOrderParam2(){
public void createOrderParam2() {
List<DeviceInstallEntity> deviceList1;
deviceCodeParamService.selectInsertDeviceCodeParam2(); //查询插入设备采集参数,包括水、电表、状态检测
deviceList1=deviceInstallService.selectDeviceParams(); //查找多个采集参数的设备,包括热泵
deviceList1 = deviceInstallService.selectDeviceParams(); //查找多个采集参数的设备,包括热泵
System.out.println(deviceList1);
for (DeviceInstallEntity devices:deviceList1) {
for (DeviceInstallEntity devices : deviceList1) {
List<DeviceCodeParamEntity> deviceCodeParamEntityList = new ArrayList<>();
if (devices.getDeviceType().equals("热泵")) {
if (devices.getBrand().equals("美的")) {
@ -687,16 +722,16 @@ public class GetReadOrder485 {
}
// 生成对设备操作指令参数
public void createOrderParam3(){
public void createOrderParam3() {
List<DeviceInstallEntity> deviceList1;
// deviceCodeParamService.selectInsertDeviceCodeParam3(); //查询插入设备采集参数-水位开关
deviceList1=deviceInstallService.selectDeviceParams2(); //查找多个采集参数的设备,包括热泵、水位开关
deviceList1 = deviceInstallService.selectDeviceParams2(); //查找多个采集参数的设备,包括热泵、水位开关
System.out.println(deviceList1);
for (DeviceInstallEntity devices:deviceList1) {
for (DeviceInstallEntity devices : deviceList1) {
List<DeviceCodeParamEntity> deviceCodeParamEntityList = new ArrayList<>();
if (devices.getDeviceType().equals("热泵")){
if (devices.getBrand().equals("美的")){
if (devices.getDeviceType().equals("热泵")) {
if (devices.getBrand().equals("美的")) {
DeviceCodeParamEntity deviceCodeParamEntity2 = new DeviceCodeParamEntity();
deviceCodeParamEntity2.setRegisterAddr("0642");//设定温度
deviceCodeParamEntity2.setFunCode("03");
@ -723,7 +758,7 @@ public class GetReadOrder485 {
deviceCodeParamEntity4.setParity(devices.getParity());
deviceCodeParamEntityList.add(deviceCodeParamEntity4);
}else if (devices.getBrand().equals("美的2")){
} else if (devices.getBrand().equals("美的2")) {
DeviceCodeParamEntity deviceCodeParamEntity2 = new DeviceCodeParamEntity();
deviceCodeParamEntity2.setRegisterAddr("0003");//设定温度
@ -751,8 +786,9 @@ public class GetReadOrder485 {
deviceCodeParamEntity4.setParity(devices.getParity());
deviceCodeParamEntityList.add(deviceCodeParamEntity4);
}
} if (devices.getDeviceType().equals("水位开关")){
if (devices.getBrand().equals("远向")){
}
if (devices.getDeviceType().equals("水位开关")) {
if (devices.getBrand().equals("远向")) {
DeviceCodeParamEntity deviceCodeParamEntity2 = new DeviceCodeParamEntity();
deviceCodeParamEntity2.setRegisterAddr("0018");//读水位设定
deviceCodeParamEntity2.setFunCode("03");
@ -778,7 +814,7 @@ public class GetReadOrder485 {
deviceCodeParamEntity4.setBuildingId(devices.getBuildingId());
deviceCodeParamEntity4.setParity(devices.getParity());
deviceCodeParamEntityList.add(deviceCodeParamEntity4);
}else if (devices.getBrand().equals("中凯")){
} else if (devices.getBrand().equals("中凯")) {
DeviceCodeParamEntity deviceCodeParamEntity2 = new DeviceCodeParamEntity();
deviceCodeParamEntity2.setRegisterAddr("0017");//读水位设定
deviceCodeParamEntity2.setFunCode("03");

Loading…
Cancel
Save