From 2d6539fdf96e1d7b68821f732955f6e6902b3b82 Mon Sep 17 00:00:00 2001 From: "3067418132@qq.com" Date: Tue, 28 Apr 2026 15:40:46 +0800 Subject: [PATCH] =?UTF-8?q?1=E3=80=81=E6=B7=BB=E5=8A=A0=E5=AE=81=E6=B3=A2?= =?UTF-8?q?=E6=97=B6=E4=BB=A3=E6=B0=B4=E8=A1=A8modbus=E5=8D=8F=E8=AE=AE?= =?UTF-8?q?=E8=AF=BB=E5=8F=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/mh/user/strategy/WtMeterStrategy.java | 24 ++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/user-service/src/main/java/com/mh/user/strategy/WtMeterStrategy.java b/user-service/src/main/java/com/mh/user/strategy/WtMeterStrategy.java index 7722232..3a99abd 100644 --- a/user-service/src/main/java/com/mh/user/strategy/WtMeterStrategy.java +++ b/user-service/src/main/java/com/mh/user/strategy/WtMeterStrategy.java @@ -59,6 +59,12 @@ public class WtMeterStrategy implements DeviceStrategy { // 检验和 String checkSum = ExchangeStringUtil.makeChecksum(str); str = "FEFEFE" + str + checkSum + "16"; + } else if (brand.equals("宁波时代MODBUS")) { + // 这个是表后两位 + str = ExchangeStringUtil.addZeroForNum(deviceAddr, 2); + str = str + "0300000002";//读表累计值 + String checkWord = ExchangeStringUtil.getStrCRC16(str); //CRC16校验 + str = str + checkWord; } else if (brand.equals("脉冲")) { str = ExchangeStringUtil.decToHex(deviceAddr); str = ExchangeStringUtil.addZeroForNum(str, 2); @@ -98,7 +104,7 @@ public class WtMeterStrategy implements DeviceStrategy { } else { log.info("水表报文检验失败: " + dataStr); } - } else if (dataStr.length() == 18) { + } else if (dataStr.length() == 18 && "脉冲".equals(brand)) { String checkStr = dataStr.substring(0, dataStr.length() - 4);//检验报文 byte[] strOrder = ExchangeStringUtil.hexStrToBinaryStr(checkStr); int checkNum = CRC16.CRC16_MODBUS(strOrder); @@ -113,7 +119,23 @@ public class WtMeterStrategy implements DeviceStrategy { } else { log.info("水表报文检验失败: " + dataStr); } + } else if (dataStr.length() == 18 && "宁波时代MODBUS".equals(brand)) { + String checkStr = dataStr.substring(0, dataStr.length() - 4);//检验报文 + byte[] strOrder = ExchangeStringUtil.hexStrToBinaryStr(checkStr); + int checkNum = CRC16.CRC16_MODBUS(strOrder); + String checkWord = ExchangeStringUtil.decToHex(String.valueOf(checkNum)); + checkWord = checkWord.substring(2, 4) + checkWord.substring(0, 2); + String sValue = null; + if (checkWord.equalsIgnoreCase(dataStr.substring(dataStr.length() - 4))) { + meterId = ExchangeStringUtil.hexToDec(checkStr.substring(0, 2));//地址 + if (checkStr.substring(2, 4).equalsIgnoreCase("03")) { + data = String.valueOf(Integer.parseInt(ExchangeStringUtil.hexToDec(checkStr.substring(6, 14))) / 100); //读数 + } + } else { + log.info("水表报文检验失败: " + dataStr); + } } + log.info("水表表号: " + meterId + ",水表读数:" + data); try { if (!StringUtils.isBlank(data)) {