diff --git a/src/main/java/com/isu/gaswellwatch/modbus/data/decode/impl/AbstractByteOrderDecodeHandler.java b/src/main/java/com/isu/gaswellwatch/modbus/data/decode/impl/AbstractByteOrderDecodeHandler.java
new file mode 100644
index 0000000..5b1211f
--- /dev/null
+++ b/src/main/java/com/isu/gaswellwatch/modbus/data/decode/impl/AbstractByteOrderDecodeHandler.java
@@ -0,0 +1,31 @@
+package com.isu.gaswellwatch.modbus.data.decode.impl;
+
+
+import cn.hutool.core.map.MapUtil;
+import com.isu.gaswellwatch.modbus.data.ModbusMessage;
+import com.isu.gaswellwatch.modbus.data.decode.DecodeHandler;
+import com.isu.gaswellwatch.utils.ByteOrderUtils;
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.Map;
+
+/**
+ * @author 王仕龙
+ * 2025/2/25 09:34
+ */
+public class AbstractByteOrderDecodeHandler implements DecodeHandler {
+
+ @Override
+ public String decode(Map commandPointMap, String value) {
+ if (StringUtils.isBlank(value)) {
+ return null;
+ }
+ return ByteOrderUtils.decode(value, MapUtil.getStr(commandPointMap, "byte_order"));
+ }
+
+ @Override
+ public void decode(Map commandPointMap, ModbusMessage.MessagePoint point) {
+ point.setValue(this.decode(commandPointMap, MapUtil.getBool(commandPointMap, "use_hex", Boolean.FALSE) ? point.getOriginalValue() : point.getValue()));
+ }
+
+}
diff --git a/src/main/java/com/isu/gaswellwatch/modbus/data/decode/impl/Base2000YearLocalDateTimeDecodeHandler.java b/src/main/java/com/isu/gaswellwatch/modbus/data/decode/impl/Base2000YearLocalDateTimeDecodeHandler.java
index 28898c9..a520b19 100644
--- a/src/main/java/com/isu/gaswellwatch/modbus/data/decode/impl/Base2000YearLocalDateTimeDecodeHandler.java
+++ b/src/main/java/com/isu/gaswellwatch/modbus/data/decode/impl/Base2000YearLocalDateTimeDecodeHandler.java
@@ -1,5 +1,6 @@
package com.isu.gaswellwatch.modbus.data.decode.impl;
+import cn.hutool.core.map.MapUtil;
import com.isu.gaswellwatch.modbus.data.ModbusMessage;
import com.isu.gaswellwatch.modbus.data.decode.DecodeHandler;
import org.apache.commons.lang3.StringUtils;
@@ -41,7 +42,7 @@ public class Base2000YearLocalDateTimeDecodeHandler implements DecodeHandler {
@Override
public void decode(Map commandPointMap, ModbusMessage.MessagePoint point) {
- point.setValue(this.decode(commandPointMap, point.getValue()));
+ point.setValue(this.decode(commandPointMap, MapUtil.getBool(commandPointMap, "use_hex", Boolean.FALSE) ? point.getOriginalValue() : point.getValue()));
}
}
diff --git a/src/main/java/com/isu/gaswellwatch/modbus/data/decode/impl/ByteToStringDecodeHandler.java b/src/main/java/com/isu/gaswellwatch/modbus/data/decode/impl/ByteToStringDecodeHandler.java
index 2e9f128..3d50e81 100644
--- a/src/main/java/com/isu/gaswellwatch/modbus/data/decode/impl/ByteToStringDecodeHandler.java
+++ b/src/main/java/com/isu/gaswellwatch/modbus/data/decode/impl/ByteToStringDecodeHandler.java
@@ -1,6 +1,6 @@
package com.isu.gaswellwatch.modbus.data.decode.impl;
-
+import cn.hutool.core.map.MapUtil;
import com.isu.gaswellwatch.modbus.data.ModbusMessage;
import com.isu.gaswellwatch.modbus.data.decode.DecodeHandler;
import org.springframework.stereotype.Component;
@@ -31,7 +31,7 @@ public class ByteToStringDecodeHandler implements DecodeHandler {
@Override
public void decode(Map commandPointMap, ModbusMessage.MessagePoint point) {
- point.setValue(this.decode(commandPointMap, point.getValue()));
+ point.setValue(this.decode(commandPointMap, MapUtil.getBool(commandPointMap, "use_hex", Boolean.FALSE) ? point.getOriginalValue() : point.getValue()));
}
}
diff --git a/src/main/java/com/isu/gaswellwatch/modbus/data/decode/impl/IEEE754DoubleDecodeHandler.java b/src/main/java/com/isu/gaswellwatch/modbus/data/decode/impl/IEEE754DoubleDecodeHandler.java
new file mode 100644
index 0000000..02de8a5
--- /dev/null
+++ b/src/main/java/com/isu/gaswellwatch/modbus/data/decode/impl/IEEE754DoubleDecodeHandler.java
@@ -0,0 +1,42 @@
+package com.isu.gaswellwatch.modbus.data.decode.impl;
+
+import cn.hutool.core.map.MapUtil;
+import com.isu.gaswellwatch.modbus.data.ModbusMessage;
+import com.isu.gaswellwatch.modbus.data.decode.DecodeHandler;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Component;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.Map;
+import java.util.Objects;
+
+/**
+ * @author 王仕龙
+ * 2025/2/24 20:18
+ */
+@Component(IEEE754DoubleDecodeHandler.NAME + DecodeHandler.DECODE_NAME)
+public class IEEE754DoubleDecodeHandler implements DecodeHandler {
+
+ public static final String NAME = "IEEE754Double";
+
+ @Override
+ public String decode(Map commandPointMap, String value) {
+ if (StringUtils.isBlank(value)) {
+ return value;
+ }
+ // 反向计算:Long.toHexString(Double.doubleToRawLongBits(num))
+ value = String.valueOf(Double.longBitsToDouble(Long.parseLong(value, 16)));
+ if (Objects.nonNull(commandPointMap) && Objects.nonNull(commandPointMap.get("precision"))) {
+ int precision = MapUtil.getInt(commandPointMap, "precision", 0);
+ return new BigDecimal(value).setScale(precision, RoundingMode.HALF_UP).toString();
+ }
+ return value;
+ }
+
+ @Override
+ public void decode(Map commandPointMap, ModbusMessage.MessagePoint point) {
+ point.setValue(this.decode(commandPointMap, MapUtil.getBool(commandPointMap, "use_hex", Boolean.FALSE) ? point.getOriginalValue() : point.getValue()));
+ }
+
+}
diff --git a/src/main/java/com/isu/gaswellwatch/modbus/data/decode/impl/IEEE754FloatDecodeHandler.java b/src/main/java/com/isu/gaswellwatch/modbus/data/decode/impl/IEEE754FloatDecodeHandler.java
new file mode 100644
index 0000000..7b3cc3a
--- /dev/null
+++ b/src/main/java/com/isu/gaswellwatch/modbus/data/decode/impl/IEEE754FloatDecodeHandler.java
@@ -0,0 +1,47 @@
+package com.isu.gaswellwatch.modbus.data.decode.impl;
+
+import cn.hutool.core.map.MapUtil;
+import com.isu.gaswellwatch.modbus.data.ModbusMessage;
+import com.isu.gaswellwatch.modbus.data.decode.DecodeHandler;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Component;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.Map;
+import java.util.Objects;
+
+/**
+ * @author 王仕龙
+ * 2025/2/22 00:50
+ */
+@Component(IEEE754FloatDecodeHandler.NAME + DecodeHandler.DECODE_NAME)
+public class IEEE754FloatDecodeHandler implements DecodeHandler {
+
+ public static final String NAME = "IEEE754Float";
+
+ @Override
+ public String decode(Map commandPointMap, String value) {
+ if (StringUtils.isBlank(value)) {
+ return value;
+ }
+ value = String.valueOf(Float.intBitsToFloat((int) Long.parseLong(value, 16)));
+ if (Objects.nonNull(commandPointMap) && Objects.nonNull(commandPointMap.get("precision"))) {
+ int precision = MapUtil.getInt(commandPointMap, "precision", 0);
+ return new BigDecimal(value).setScale(precision, RoundingMode.HALF_UP).toString();
+ }
+ // 反向计算:Long.toHexString(Float.floatToRawIntBits(num))
+ return value;
+ }
+
+ @Override
+ public void decode(Map commandPointMap, ModbusMessage.MessagePoint point) {
+ point.setValue(this.decode(commandPointMap, MapUtil.getBool(commandPointMap, "use_hex", Boolean.FALSE) ? point.getOriginalValue() : point.getValue()));
+ }
+
+ public static void main(String[] args) {
+ System.out.println(Double.longBitsToDouble(Long.parseLong("800358C0", 16)));
+ System.out.println(Float.intBitsToFloat((int) Long.parseLong("800358C0", 16)));
+ }
+
+}
diff --git a/src/main/java/com/isu/gaswellwatch/modbus/data/decode/impl/LocalDateDecodeHandler.java b/src/main/java/com/isu/gaswellwatch/modbus/data/decode/impl/LocalDateDecodeHandler.java
index f8ce1a1..c804cfe 100644
--- a/src/main/java/com/isu/gaswellwatch/modbus/data/decode/impl/LocalDateDecodeHandler.java
+++ b/src/main/java/com/isu/gaswellwatch/modbus/data/decode/impl/LocalDateDecodeHandler.java
@@ -1,5 +1,6 @@
package com.isu.gaswellwatch.modbus.data.decode.impl;
+import cn.hutool.core.map.MapUtil;
import com.isu.gaswellwatch.modbus.data.ModbusMessage;
import com.isu.gaswellwatch.modbus.data.decode.DecodeHandler;
import org.apache.commons.lang3.StringUtils;
@@ -33,7 +34,7 @@ public class LocalDateDecodeHandler implements DecodeHandler {
@Override
public void decode(Map commandPointMap, ModbusMessage.MessagePoint point) {
- point.setValue(this.decode(commandPointMap, point.getValue()));
+ point.setValue(this.decode(commandPointMap, MapUtil.getBool(commandPointMap, "use_hex", Boolean.FALSE) ? point.getOriginalValue() : point.getValue()));
}
}
diff --git a/src/main/java/com/isu/gaswellwatch/modbus/data/decode/impl/LocalDateTimeDecodeHandler.java b/src/main/java/com/isu/gaswellwatch/modbus/data/decode/impl/LocalDateTimeDecodeHandler.java
index 54d4a07..e788946 100644
--- a/src/main/java/com/isu/gaswellwatch/modbus/data/decode/impl/LocalDateTimeDecodeHandler.java
+++ b/src/main/java/com/isu/gaswellwatch/modbus/data/decode/impl/LocalDateTimeDecodeHandler.java
@@ -1,5 +1,6 @@
package com.isu.gaswellwatch.modbus.data.decode.impl;
+import cn.hutool.core.map.MapUtil;
import com.isu.gaswellwatch.modbus.data.ModbusMessage;
import com.isu.gaswellwatch.modbus.data.decode.DecodeHandler;
import org.apache.commons.lang3.StringUtils;
@@ -36,7 +37,7 @@ public class LocalDateTimeDecodeHandler implements DecodeHandler {
@Override
public void decode(Map commandPointMap, ModbusMessage.MessagePoint point) {
- point.setValue(this.decode(commandPointMap, point.getValue()));
+ point.setValue(this.decode(commandPointMap, MapUtil.getBool(commandPointMap, "use_hex", Boolean.FALSE) ? point.getOriginalValue() : point.getValue()));
}
}
diff --git a/src/main/java/com/isu/gaswellwatch/modbus/data/decode/impl/LocalTimeDecodeHandler.java b/src/main/java/com/isu/gaswellwatch/modbus/data/decode/impl/LocalTimeDecodeHandler.java
index 6cc5bd6..38330eb 100644
--- a/src/main/java/com/isu/gaswellwatch/modbus/data/decode/impl/LocalTimeDecodeHandler.java
+++ b/src/main/java/com/isu/gaswellwatch/modbus/data/decode/impl/LocalTimeDecodeHandler.java
@@ -1,5 +1,6 @@
package com.isu.gaswellwatch.modbus.data.decode.impl;
+import cn.hutool.core.map.MapUtil;
import com.isu.gaswellwatch.modbus.data.ModbusMessage;
import com.isu.gaswellwatch.modbus.data.decode.DecodeHandler;
import org.apache.commons.lang3.StringUtils;
@@ -32,7 +33,7 @@ public class LocalTimeDecodeHandler implements DecodeHandler {
@Override
public void decode(Map commandPointMap, ModbusMessage.MessagePoint point) {
- point.setValue(this.decode(commandPointMap, point.getValue()));
+ point.setValue(this.decode(commandPointMap, MapUtil.getBool(commandPointMap, "use_hex", Boolean.FALSE) ? point.getOriginalValue() : point.getValue()));
}
}
diff --git a/src/main/java/com/isu/gaswellwatch/modbus/data/decode/impl/LongDecodeHandler.java b/src/main/java/com/isu/gaswellwatch/modbus/data/decode/impl/LongDecodeHandler.java
new file mode 100644
index 0000000..a828748
--- /dev/null
+++ b/src/main/java/com/isu/gaswellwatch/modbus/data/decode/impl/LongDecodeHandler.java
@@ -0,0 +1,35 @@
+package com.isu.gaswellwatch.modbus.data.decode.impl;
+
+import cn.hutool.core.map.MapUtil;
+import com.isu.gaswellwatch.modbus.data.ModbusMessage;
+import com.isu.gaswellwatch.modbus.data.decode.DecodeHandler;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Component;
+
+import java.util.Map;
+
+/**
+ * 整型书解析器解析器
+ *
+ * @author 王仕龙
+ * 2025/2/25 11:15
+ */
+@Component(LongDecodeHandler.NAME + DecodeHandler.DECODE_NAME)
+public class LongDecodeHandler implements DecodeHandler {
+
+ public static final String NAME = "long";
+
+ @Override
+ public String decode(Map commandPointMap, String value) {
+ if (StringUtils.isBlank(value)) {
+ return value;
+ }
+ return String.valueOf(Long.parseLong(value, 16));
+ }
+
+ @Override
+ public void decode(Map commandPointMap, ModbusMessage.MessagePoint point) {
+ point.setValue(this.decode(commandPointMap, MapUtil.getBool(commandPointMap, "use_hex", Boolean.FALSE) ? point.getOriginalValue() : point.getValue()));
+ }
+
+}
diff --git a/src/main/java/com/isu/gaswellwatch/modbus/data/decode/impl/MinuteLocalTimeDecodeHandler.java b/src/main/java/com/isu/gaswellwatch/modbus/data/decode/impl/MinuteLocalTimeDecodeHandler.java
index 9e27a1d..62f6fef 100644
--- a/src/main/java/com/isu/gaswellwatch/modbus/data/decode/impl/MinuteLocalTimeDecodeHandler.java
+++ b/src/main/java/com/isu/gaswellwatch/modbus/data/decode/impl/MinuteLocalTimeDecodeHandler.java
@@ -1,5 +1,6 @@
package com.isu.gaswellwatch.modbus.data.decode.impl;
+import cn.hutool.core.map.MapUtil;
import com.isu.gaswellwatch.modbus.data.ModbusMessage;
import com.isu.gaswellwatch.modbus.data.decode.DecodeHandler;
import org.apache.commons.lang3.StringUtils;
@@ -32,7 +33,7 @@ public class MinuteLocalTimeDecodeHandler implements DecodeHandler {
@Override
public void decode(Map commandPointMap, ModbusMessage.MessagePoint point) {
- point.setValue(this.decode(commandPointMap, point.getValue()));
+ point.setValue(this.decode(commandPointMap, MapUtil.getBool(commandPointMap, "use_hex", Boolean.FALSE) ? point.getOriginalValue() : point.getValue()));
}
}
diff --git a/src/main/java/com/isu/gaswellwatch/modbus/data/decode/impl/OneRegisterLengthByteOrderDecodeHandler.java b/src/main/java/com/isu/gaswellwatch/modbus/data/decode/impl/OneRegisterLengthByteOrderDecodeHandler.java
new file mode 100644
index 0000000..7d38228
--- /dev/null
+++ b/src/main/java/com/isu/gaswellwatch/modbus/data/decode/impl/OneRegisterLengthByteOrderDecodeHandler.java
@@ -0,0 +1,13 @@
+package com.isu.gaswellwatch.modbus.data.decode.impl;
+
+import com.isu.gaswellwatch.modbus.data.decode.DecodeHandler;
+import org.springframework.stereotype.Component;
+
+/**
+ * @author 王仕龙
+ * 2025/2/25 10:12
+ */
+@Component(OneRegisterLengthByteOrderDecodeHandler.NAME + DecodeHandler.DECODE_NAME)
+public class OneRegisterLengthByteOrderDecodeHandler extends AbstractByteOrderDecodeHandler {
+ public static final String NAME = "oneRegisterLengthByteOrder";
+}
diff --git a/src/main/java/com/isu/gaswellwatch/modbus/data/decode/impl/SecondLocalTimeDecodeHandler.java b/src/main/java/com/isu/gaswellwatch/modbus/data/decode/impl/SecondLocalTimeDecodeHandler.java
index d680533..722c4cd 100644
--- a/src/main/java/com/isu/gaswellwatch/modbus/data/decode/impl/SecondLocalTimeDecodeHandler.java
+++ b/src/main/java/com/isu/gaswellwatch/modbus/data/decode/impl/SecondLocalTimeDecodeHandler.java
@@ -1,5 +1,6 @@
package com.isu.gaswellwatch.modbus.data.decode.impl;
+import cn.hutool.core.map.MapUtil;
import com.isu.gaswellwatch.modbus.data.ModbusMessage;
import com.isu.gaswellwatch.modbus.data.decode.DecodeHandler;
import org.apache.commons.lang3.StringUtils;
@@ -37,7 +38,7 @@ public class SecondLocalTimeDecodeHandler implements DecodeHandler {
@Override
public void decode(Map commandPointMap, ModbusMessage.MessagePoint point) {
- point.setValue(this.decode(commandPointMap, point.getValue()));
+ point.setValue(this.decode(commandPointMap, MapUtil.getBool(commandPointMap, "use_hex", Boolean.FALSE) ? point.getOriginalValue() : point.getValue()));
}
}
diff --git a/src/main/java/com/isu/gaswellwatch/modbus/data/decode/impl/SimpleLocalDateTimeDecodeHandler.java b/src/main/java/com/isu/gaswellwatch/modbus/data/decode/impl/SimpleLocalDateTimeDecodeHandler.java
index fc08c55..5ce7949 100644
--- a/src/main/java/com/isu/gaswellwatch/modbus/data/decode/impl/SimpleLocalDateTimeDecodeHandler.java
+++ b/src/main/java/com/isu/gaswellwatch/modbus/data/decode/impl/SimpleLocalDateTimeDecodeHandler.java
@@ -1,5 +1,6 @@
package com.isu.gaswellwatch.modbus.data.decode.impl;
+import cn.hutool.core.map.MapUtil;
import com.isu.gaswellwatch.modbus.data.ModbusMessage;
import com.isu.gaswellwatch.modbus.data.decode.DecodeHandler;
import org.apache.commons.lang3.StringUtils;
@@ -40,7 +41,7 @@ public class SimpleLocalDateTimeDecodeHandler implements DecodeHandler {
@Override
public void decode(Map commandPointMap, ModbusMessage.MessagePoint point) {
- point.setValue(this.decode(commandPointMap, point.getValue()));
+ point.setValue(this.decode(commandPointMap, MapUtil.getBool(commandPointMap, "use_hex", Boolean.FALSE) ? point.getOriginalValue() : point.getValue()));
}
}
diff --git a/src/main/java/com/isu/gaswellwatch/modbus/data/decode/impl/StringTimeDecodeHandler.java b/src/main/java/com/isu/gaswellwatch/modbus/data/decode/impl/StringTimeDecodeHandler.java
index e30623c..59d65d7 100644
--- a/src/main/java/com/isu/gaswellwatch/modbus/data/decode/impl/StringTimeDecodeHandler.java
+++ b/src/main/java/com/isu/gaswellwatch/modbus/data/decode/impl/StringTimeDecodeHandler.java
@@ -1,5 +1,6 @@
package com.isu.gaswellwatch.modbus.data.decode.impl;
+import cn.hutool.core.map.MapUtil;
import com.isu.gaswellwatch.modbus.data.ModbusMessage;
import com.isu.gaswellwatch.modbus.data.decode.DecodeHandler;
import org.apache.commons.lang3.StringUtils;
@@ -32,7 +33,7 @@ public class StringTimeDecodeHandler implements DecodeHandler {
@Override
public void decode(Map commandPointMap, ModbusMessage.MessagePoint point) {
- point.setValue(this.decode(commandPointMap, point.getValue()));
+ point.setValue(this.decode(commandPointMap, MapUtil.getBool(commandPointMap, "use_hex", Boolean.FALSE) ? point.getOriginalValue() : point.getValue()));
}
}
diff --git a/src/main/java/com/isu/gaswellwatch/modbus/data/decode/impl/TwoRegisterLengthByteOrderDecodeHandler.java b/src/main/java/com/isu/gaswellwatch/modbus/data/decode/impl/TwoRegisterLengthByteOrderDecodeHandler.java
new file mode 100644
index 0000000..ce9559e
--- /dev/null
+++ b/src/main/java/com/isu/gaswellwatch/modbus/data/decode/impl/TwoRegisterLengthByteOrderDecodeHandler.java
@@ -0,0 +1,14 @@
+package com.isu.gaswellwatch.modbus.data.decode.impl;
+
+
+import com.isu.gaswellwatch.modbus.data.decode.DecodeHandler;
+import org.springframework.stereotype.Component;
+
+/**
+ * @author 王仕龙
+ * 2025/2/25 10:13
+ */
+@Component(TwoRegisterLengthByteOrderDecodeHandler.NAME + DecodeHandler.DECODE_NAME)
+public class TwoRegisterLengthByteOrderDecodeHandler extends AbstractByteOrderDecodeHandler {
+ public static final String NAME = "twoRegisterLengthByteOrder";
+}
diff --git a/src/main/java/com/isu/gaswellwatch/modbus/data/decode/impl/UnsignedNumberDecodeHandler.java b/src/main/java/com/isu/gaswellwatch/modbus/data/decode/impl/UnsignedNumberDecodeHandler.java
index aa8c299..9e40758 100644
--- a/src/main/java/com/isu/gaswellwatch/modbus/data/decode/impl/UnsignedNumberDecodeHandler.java
+++ b/src/main/java/com/isu/gaswellwatch/modbus/data/decode/impl/UnsignedNumberDecodeHandler.java
@@ -22,7 +22,7 @@ public class UnsignedNumberDecodeHandler implements DecodeHandler {
if (StringUtils.isBlank(value)) {
return value;
}
- return String.valueOf(Integer.parseInt(value, 16));
+ return String.valueOf(Long.parseLong(value, 16));
}
@Override
diff --git a/src/main/java/com/isu/gaswellwatch/modbus/data/decode/impl/weps/WepsCurrentLocalDateTimeDecodeHandler.java b/src/main/java/com/isu/gaswellwatch/modbus/data/decode/impl/weps/WepsCurrentLocalDateTimeDecodeHandler.java
index 29c53c0..3690b23 100644
--- a/src/main/java/com/isu/gaswellwatch/modbus/data/decode/impl/weps/WepsCurrentLocalDateTimeDecodeHandler.java
+++ b/src/main/java/com/isu/gaswellwatch/modbus/data/decode/impl/weps/WepsCurrentLocalDateTimeDecodeHandler.java
@@ -1,6 +1,6 @@
package com.isu.gaswellwatch.modbus.data.decode.impl.weps;
-
+import cn.hutool.core.map.MapUtil;
import com.isu.gaswellwatch.modbus.data.ModbusMessage;
import com.isu.gaswellwatch.modbus.data.decode.DecodeHandler;
import org.apache.commons.lang3.StringUtils;
@@ -49,6 +49,6 @@ public class WepsCurrentLocalDateTimeDecodeHandler implements DecodeHandler {
@Override
public void decode(Map commandPointMap, ModbusMessage.MessagePoint point) {
- point.setValue(this.decode(commandPointMap, point.getValue()));
+ point.setValue(this.decode(commandPointMap, MapUtil.getBool(commandPointMap, "use_hex", Boolean.FALSE) ? point.getOriginalValue() : point.getValue()));
}
}
diff --git a/src/main/java/com/isu/gaswellwatch/modbus/data/decode/impl/weps/WepsCurrentStatus0xDecodeHandler.java b/src/main/java/com/isu/gaswellwatch/modbus/data/decode/impl/weps/WepsCurrentStatus0xDecodeHandler.java
new file mode 100644
index 0000000..4ff1d75
--- /dev/null
+++ b/src/main/java/com/isu/gaswellwatch/modbus/data/decode/impl/weps/WepsCurrentStatus0xDecodeHandler.java
@@ -0,0 +1,36 @@
+package com.isu.gaswellwatch.modbus.data.decode.impl.weps;
+
+
+import cn.hutool.core.map.MapUtil;
+import com.isu.gaswellwatch.modbus.data.ModbusMessage;
+import com.isu.gaswellwatch.modbus.data.decode.DecodeHandler;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Component;
+
+import java.util.Map;
+
+/**
+ * @author 王仕龙
+ * 2025/2/25 11:36
+ */
+@Component(WepsCurrentStatus0xDecodeHandler.NAME + DecodeHandler.DECODE_NAME)
+public class WepsCurrentStatus0xDecodeHandler implements DecodeHandler {
+ public static final String NAME = "wepsCurrentStatus0x";
+
+ @Override
+ public String decode(Map commandPointMap, String value) {
+ if (StringUtils.isBlank(value)) {
+ return value;
+ }
+// 0x8000:关井
+// 0x8001:上升
+// 0x8002:续流
+// 0x8003:停机
+ return value;
+ }
+
+ @Override
+ public void decode(Map commandPointMap, ModbusMessage.MessagePoint point) {
+ point.setValue(this.decode(commandPointMap, MapUtil.getBool(commandPointMap, "use_hex", Boolean.FALSE) ? point.getOriginalValue() : point.getValue()));
+ }
+}
diff --git a/src/main/java/com/isu/gaswellwatch/modbus/data/decode/impl/weps/WepsDecimalDecodeHandler.java b/src/main/java/com/isu/gaswellwatch/modbus/data/decode/impl/weps/WepsDecimalDecodeHandler.java
deleted file mode 100644
index 03445c5..0000000
--- a/src/main/java/com/isu/gaswellwatch/modbus/data/decode/impl/weps/WepsDecimalDecodeHandler.java
+++ /dev/null
@@ -1,41 +0,0 @@
-package com.isu.gaswellwatch.modbus.data.decode.impl.weps;
-
-
-import com.isu.gaswellwatch.modbus.data.ModbusMessage;
-import com.isu.gaswellwatch.modbus.data.decode.DecodeHandler;
-import org.apache.commons.lang3.StringUtils;
-import org.apache.commons.lang3.math.NumberUtils;
-import org.springframework.stereotype.Component;
-
-import java.util.Map;
-
-/**
- * @author 王仕龙
- * 2025/2/22 00:50
- */
-@Component(WepsDecimalDecodeHandler.NAME + DecodeHandler.DECODE_NAME)
-public class WepsDecimalDecodeHandler implements DecodeHandler {
-
- public static final String NAME = "wepsDecimal";
-
- @Override
- public String decode(Map commandPointMap, String value) {
- if (StringUtils.isBlank(value)) {
- return value;
- }
- if (StringUtils.startsWith(value, ".")) {
- return NumberUtils.createBigDecimal("0" + StringUtils.strip(value, "-")).toString();
- } else if (StringUtils.endsWith(value, ".")) {
- return NumberUtils.createBigDecimal(value + "0").toString();
- } else {
- String[] numbers = StringUtils.split(value, ".");
- return numbers[0] + "." + Math.abs(NumberUtils.createLong(numbers[1]));
- }
- }
-
- @Override
- public void decode(Map commandPointMap, ModbusMessage.MessagePoint point) {
- point.setValue(this.decode(commandPointMap, point.getValue()));
- }
-
-}
diff --git a/src/main/java/com/isu/gaswellwatch/modbus/data/decode/impl/weps/WepsRemainingLocalTimeDecodeHandler.java b/src/main/java/com/isu/gaswellwatch/modbus/data/decode/impl/weps/WepsRemainingLocalTimeDecodeHandler.java
index f05f1ba..4443bad 100644
--- a/src/main/java/com/isu/gaswellwatch/modbus/data/decode/impl/weps/WepsRemainingLocalTimeDecodeHandler.java
+++ b/src/main/java/com/isu/gaswellwatch/modbus/data/decode/impl/weps/WepsRemainingLocalTimeDecodeHandler.java
@@ -1,6 +1,6 @@
package com.isu.gaswellwatch.modbus.data.decode.impl.weps;
-
+import cn.hutool.core.map.MapUtil;
import com.isu.gaswellwatch.modbus.data.ModbusMessage;
import com.isu.gaswellwatch.modbus.data.decode.DecodeHandler;
import org.apache.commons.lang3.StringUtils;
@@ -50,6 +50,6 @@ public class WepsRemainingLocalTimeDecodeHandler implements DecodeHandler {
@Override
public void decode(Map commandPointMap, ModbusMessage.MessagePoint point) {
- point.setValue(this.decode(commandPointMap, point.getValue()));
+ point.setValue(this.decode(commandPointMap, MapUtil.getBool(commandPointMap, "use_hex", Boolean.FALSE) ? point.getOriginalValue() : point.getValue()));
}
}
diff --git a/src/main/java/com/isu/gaswellwatch/modbus/data/impl/WepsPlugPersistenceHandler.java b/src/main/java/com/isu/gaswellwatch/modbus/data/impl/WepsPlugPersistenceHandler.java
index fce95ae..d135f09 100644
--- a/src/main/java/com/isu/gaswellwatch/modbus/data/impl/WepsPlugPersistenceHandler.java
+++ b/src/main/java/com/isu/gaswellwatch/modbus/data/impl/WepsPlugPersistenceHandler.java
@@ -97,8 +97,8 @@ public class WepsPlugPersistenceHandler extends AbstractPersistenceHandler {
WepsPlugPersistenceHandler.this.setValue(ps, newRow, 23, "tooFastCount", Types.INTEGER);
WepsPlugPersistenceHandler.this.setValue(ps, newRow, 24, "dangerousRiseTime", Types.VARCHAR);
WepsPlugPersistenceHandler.this.setValue(ps, newRow, 25, "tooFastRiseTime", Types.VARCHAR);
- WepsPlugPersistenceHandler.this.setValue(ps, newRow, 26, "openWellTime", Types.DECIMAL);
- WepsPlugPersistenceHandler.this.setValue(ps, newRow, 27, "closeWellTime", Types.DECIMAL);
+ WepsPlugPersistenceHandler.this.setValue(ps, newRow, 26, "openWellTime", Types.VARCHAR);
+ WepsPlugPersistenceHandler.this.setValue(ps, newRow, 27, "closeWellTime", Types.VARCHAR);
WepsPlugPersistenceHandler.this.setValue(ps, newRow, 28, "openWellCasPressure", Types.DECIMAL);
WepsPlugPersistenceHandler.this.setValue(ps, newRow, 29, "littleRiseCasPressure", Types.DECIMAL);
WepsPlugPersistenceHandler.this.setValue(ps, newRow, 30, "checkStabilityTime", Types.VARCHAR);
diff --git a/src/main/java/com/isu/gaswellwatch/modbus/data/listener/ModbusMessagePersistListener.java b/src/main/java/com/isu/gaswellwatch/modbus/data/listener/ModbusMessagePersistListener.java
index 552268c..b286666 100644
--- a/src/main/java/com/isu/gaswellwatch/modbus/data/listener/ModbusMessagePersistListener.java
+++ b/src/main/java/com/isu/gaswellwatch/modbus/data/listener/ModbusMessagePersistListener.java
@@ -164,7 +164,6 @@ public class ModbusMessagePersistListener implements BatchMessageListener {
}
}
-
public void decode(ModbusMessage modbusMessage) {
Long commandId = modbusMessage.getCommandId();
String cacheName = PersistenceHandler.COMMAND_CACHE + commandId + ":points";
@@ -266,7 +265,11 @@ public class ModbusMessagePersistListener implements BatchMessageListener {
for (int i = 0; i < stepSize; i++) {
messagePoint = pointMap.get(StringUtils.leftPad(String.valueOf(startAddress + i), 4, '0'));
if (MapUtil.getBool(commandPointMap, "use_hex", Boolean.FALSE)) {
- values[i] = messagePoint.getOriginalValue();
+ if (Objects.isNull(messagePoint)) {
+ values[i] = StringUtils.EMPTY;
+ } else {
+ values[i] = messagePoint.getOriginalValue();
+ }
} else {
if (Objects.isNull(messagePoint)) {
values[i] = StringUtils.EMPTY;
@@ -280,7 +283,8 @@ public class ModbusMessagePersistListener implements BatchMessageListener {
StringUtils.isBlank(format) ? StringUtils.join(values) : String.format(format, values));
}
- private String decodeHighLowCommandPoint(Map pointMap, String decodeName,
+ private String decodeHighLowCommandPoint(Map pointMap, String
+ decodeName,
Map commandPointMap, int startAddress) {
String[] values = new String[2];
ModbusMessage.MessagePoint messagePoint;
@@ -295,7 +299,8 @@ public class ModbusMessagePersistListener implements BatchMessageListener {
return highLowBinDecodeHandler.decode(commandPointMap, StringUtils.join(values));
}
- private String decodeHighLowStepCommandPoint(Map pointMap, String decodeName,
+ private String decodeHighLowStepCommandPoint(Map pointMap, String
+ decodeName,
Map commandPointMap, int startAddress, int stepSize) {
String[] values = new String[stepSize];
ModbusMessage.MessagePoint highPoint;
diff --git a/src/main/java/com/isu/gaswellwatch/utils/ByteOrderUtils.java b/src/main/java/com/isu/gaswellwatch/utils/ByteOrderUtils.java
new file mode 100644
index 0000000..9c2a0cb
--- /dev/null
+++ b/src/main/java/com/isu/gaswellwatch/utils/ByteOrderUtils.java
@@ -0,0 +1,71 @@
+package com.isu.gaswellwatch.utils;
+
+
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.Map;
+import java.util.TreeMap;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.stream.Collectors;
+
+/**
+ * @author 王仕龙
+ * 2025/2/25 20:10
+ */
+public class ByteOrderUtils {
+
+ /**
+ * @param hexString
+ * @param byteOrder 可选值:AB,BA,ABCD,CDAB,DCBA等
+ * @return
+ */
+ public static String decode(String hexString, String byteOrder) {
+ if (StringUtils.isBlank(byteOrder) || StringUtils.equalsAnyIgnoreCase(byteOrder, "AB", "ABCD")) {
+ return hexString;
+ }
+ AtomicInteger atomicInteger = new AtomicInteger(0);
+ Map byteOrderMap = new TreeMap<>(Character::compare);
+ byteOrder.chars().forEach(i -> byteOrderMap.put((char) i, atomicInteger.getAndIncrement()));
+ int size = hexString.length() / 2;
+ String[] byteOrderChars = new String[size];
+ for (int i = 0; i < size; i++) {
+ byteOrderChars[i] = hexString.substring(i * 2, i * 2 + 2);
+ }
+ if (hexString.length() >= byteOrder.length()) {
+ return byteOrderMap.values().stream().map(idx -> byteOrderChars[idx]).collect(Collectors.joining());
+ } else {
+ return hexString;
+ }
+ }
+
+
+ /**
+ * @param hexString
+ * @param byteOrder 可选值:AB,BA,ABCD,CDAB,DCBA等
+ * @return
+ */
+ public static String encode(String hexString, String byteOrder) {
+ if (StringUtils.isBlank(byteOrder) || StringUtils.equalsAnyIgnoreCase(byteOrder, "AB", "ABCD")) {
+ return hexString;
+ }
+ int length = byteOrder.length() * 2;
+ if (hexString.length() < length) {
+ hexString = StringUtils.leftPad(hexString, length, '0');
+ }
+ AtomicInteger atomicInteger = new AtomicInteger(0);
+ Map byteOrderMap = new TreeMap<>(Character::compare);
+ byteOrder.chars().forEach(i -> byteOrderMap.put((char) i, atomicInteger.getAndIncrement()));
+ int size = hexString.length() / 2;
+ String[] byteOrderChars = new String[size];
+ for (int i = 0; i < size; i++) {
+ byteOrderChars[i] = hexString.substring(i * 2, i * 2 + 2);
+ }
+ if (hexString.length() >= byteOrder.length()) {
+ return byteOrderMap.values().stream().map(idx -> byteOrderChars[idx]).collect(Collectors.joining());
+ } else {
+ return hexString;
+ }
+ }
+
+
+}
diff --git a/src/main/java/com/isu/gaswellwatch/vo/command/weps/MiWepsPlugControl.java b/src/main/java/com/isu/gaswellwatch/vo/command/weps/MiWepsPlugControl.java
index c989576..e4dc21b 100644
--- a/src/main/java/com/isu/gaswellwatch/vo/command/weps/MiWepsPlugControl.java
+++ b/src/main/java/com/isu/gaswellwatch/vo/command/weps/MiWepsPlugControl.java
@@ -1,14 +1,17 @@
package com.isu.gaswellwatch.vo.command.weps;
import com.isu.gaswellwatch.dto.modbus.ModbusCommandDto;
+import com.isu.gaswellwatch.utils.ByteOrderUtils;
import com.isu.gaswellwatch.vo.command.Command;
import com.isu.gaswellwatch.vo.command.Timing;
import lombok.Getter;
import lombok.Setter;
import lombok.experimental.SuperBuilder;
+import org.apache.commons.lang3.StringUtils;
import java.io.Serial;
import java.math.BigDecimal;
+import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
@@ -25,86 +28,118 @@ public class MiWepsPlugControl extends Command implements Timing {
@Serial
private static final long serialVersionUID = -7540015879950965127L;
- // private Integer gasWellNumber; // 气井编号
- private Integer depthOfLockDevice; // 卡定器深度 单位:米
- private Integer arrivingSensor; // 到达传感器 0/1:禁用/启用
- private Integer zigbee; // Zigbee 0/1:禁用/启用
- private Integer pulseWidth; // 脉冲宽度 驱动电磁阀使用
- private Integer plugRisingSpeed; // 上升速度 米/分钟
- private Integer plugTooFastSpeed; // 过快速度 米/分钟
- private Integer plugTooSlowSpeed; // 过缓速度 米/分钟
- // private Integer gasWellName; // 气井名称
-// 分段
- private Integer oilAndCasDataCollectionInterval; // 油、套压数据采集间隔 0:每5秒采样;1:每10秒采样;2:每15秒采样;3:每30秒采样;4:每1秒采样;5:每2秒采样;6:每3秒采样;7:每4秒采样
- private Integer storeDataIntervalOnOpenWell; // 数据存储间隔(开井期间) 0:每1分钟存储;1:每5分钟存储;2:每10分钟存储;3:每15分钟存储;4:每30秒存储;5:每15秒存储;6:每5秒存储
- private Integer storeDataIntervalOnCloseWell; // 数据存储间隔(关井期间) 0:每1分钟存储;1:每5分钟存储;2:每10分钟存储;3:每15分钟存储;4:每30秒存储;5:每15秒存储;6:每5秒存储
- // 分段
- // private Integer communicationPowerThreshold; // 通信电量门限 Zigbee通讯使用
-// private Integer reserve1; // 保留 Zigbee通讯使用
-// private Integer startTimeOfDaytime; // 白天起始时间 Zigbee通讯使用
-// private Integer endTimeOfDaytime; // 白天结束时间 Zigbee通讯使用
+ // 1005
+ private Integer depthOfLockDevice; // 卡定器深度 单位:米 -- 气井深度
+
+ // 1036
private Integer controlWorkTime; // 控制器工作状态 0:生产模式;1:常开模式;2:常关模式
+ // 1037
private Integer produceMode; // 生产制度设置 0:定时开关井;1:时间优化模式;2:压力微升模式;3:压力回升模式;4:压力跌落模式
- private String plungerRiseTime; // 上升时间 单位:秒
- private String dangerousRiseTime; // 危险上升时间 单位:秒
- private String tooFastRiseTime; // 过快上升时间 单位:秒
- private String tooSlowRiseTime; // 过缓上升时间 单位:秒
+
+ // 1039
+ private String dangerousRiseTime; // 危险上升时间 单位:秒,HH:mm:ss
+ // 1040
+ private String tooFastRiseTime; // 过快上升时间 单位:秒,HH:mm:ss
+
+ // 1042
private Integer tooFastCount; // 过快次数
- private String tooFastRaiseOpenWellTime; // 过快增加开井时间 单位:秒
- private String tooFastLowerCloseWellTime; // 过快减少关井时间 单位:秒
- private String tooSlowLowerOpenWellTime; // 过缓减少开井时间 单位:秒
- private String tooSlowRaiseCloseWellTime; // 过缓增加关井时间 单位:秒
- private String checkStabilityTime; // 检测稳定时间 单位:秒
- private String minCloseWellTime; // 最小关井时间 单位:秒
- private String maxCloseWellTime; // 最大关井时间 单位:秒
- private String wellCloseTimeNotReachedDuration; // 未到达关井时间 单位:秒
- private String minOpenWellTime; // 最小开井时间 单位:秒
- private String maxOpenWellTime; // 最大开井时间 单位:秒
- private String afterFlowTime; // 续流时间 单位:秒
- private String notReachedFlowTime; // 未到续流时间 单位:秒
- private String closeTime; // 关井时间 单位:秒
- private String openTime; // 开井时间 单位:秒
- private BigDecimal openPressure; // 开井压力 单位:MPa
- private BigDecimal closePressure; // 关井压力 单位:MPa
- private BigDecimal littleRisePressure; // 微升压力 单位:MPa
+
+ // 1062 - 2
+ private String closeTime; // 关井时间 单位:秒,HH:mm:ss
+ // 1064 - 2
+ private String openTime; // 开井时间 单位:秒,HH:mm:ss
+
+ // 1072
private Integer gasCollectionMode; // 集气模式 0:低压集气模式;1:高压集气模式
- // private Integer reserve2; // 保留
-// 分段
- private BigDecimal protectionPressure; // 保护压力 单位:MPa
+
+ // 1074 - 2
+ private BigDecimal protectionPressure; // 保护压力 单位:MPa,当集气模式为低压集气模式时,该保护压力为低压保护压力,当集气模式为高压集气模式,该保护压力为高压保护压力
+
public MiWepsPlugControl() {
this.setCode("MI_WEPS.PLUG.CONTROL");
}
+ public void setDangerousRiseTime(String dangerousRiseTime) {
+ this.dangerousRiseTime = this.timingValidate(dangerousRiseTime, "dangerousRiseTime");
+ }
+
+ public void setTooFastRiseTime(String tooFastRiseTime) {
+ this.tooFastRiseTime = this.timingValidate(tooFastRiseTime, "tooFastRiseTime");
+ }
+
+ public void setOpenTime(String openTime) {
+ this.openTime = this.timingValidate(openTime, "openTime");
+ }
+
+ public void setCloseTime(String closeTime) {
+ this.closeTime = this.timingValidate(closeTime, "closeTime");
+ }
@Override
protected Collection builderModbusCommand() {
+ List commandList = new ArrayList<>(7);
StringBuilder command = new StringBuilder(250);
- // 100
+ // 1005
// 地址码 功能码 起始地址 连续长度 连续字长
- // 01 10 003F 0013 26
- command.append("0110003F001326");
-// command.append(StringUtils.leftPad(Integer.toHexString(this.runMode), 4, "0"));
-// command.append(StringUtils.leftPad(Integer.toHexString(this.wellStatus), 4, "0"));
-// command.append(StringUtils.leftPad(Integer.toHexString(this.gasCollectionMethod), 4, "0"));
-// command.append(StringUtils.leftPad(Long.toHexString(this.highPressureProtection.multiply(ONE_HUNDRED).longValue()), 4, "0"));
-// command.append(StringUtils.leftPad(Long.toHexString(this.lowPressureProtection.multiply(ONE_HUNDRED).longValue()), 4, "0"));
-// command.append(StringUtils.leftPad(Integer.toHexString(this.tooFastCount), 4, "0"));
-// command.append(StringUtils.leftPad(Long.toHexString(this.toSeconds(this.dangerousRiseTime)), 4, "0"));
-// command.append(StringUtils.leftPad(Long.toHexString(this.toSeconds(this.tooFastRiseTime)), 4, "0"));
-// command.append(StringUtils.leftPad(Long.toHexString(this.openWellTime.multiply(ONE_SIXTY).longValue()), 4, "0"));
-// command.append(StringUtils.leftPad(Long.toHexString(this.closeWellTime.multiply(ONE_SIXTY).longValue()), 4, "0"));
-// command.append(StringUtils.leftPad(Long.toHexString(this.openWellCasPressure.multiply(ONE_HUNDRED).longValue()), 4, "0"));
-// command.append(StringUtils.leftPad(Long.toHexString(this.littleRiseCasPressure.multiply(ONE_HUNDRED).longValue()), 4, "0"));
-// command.append(StringUtils.leftPad(Long.toHexString(this.toSeconds(this.checkStabilityTime)), 4, "0"));
-// command.append(StringUtils.leftPad(Long.toHexString(this.toMinutes(this.minCloseWellTime)), 4, "0"));
-// command.append(StringUtils.leftPad(Long.toHexString(this.toMinutes(this.maxCloseWellTime)), 4, "0"));
-// command.append(StringUtils.leftPad(Long.toHexString(this.toMinutes(this.minOpenWellTime)), 4, "0"));
-// command.append(StringUtils.leftPad(Long.toHexString(this.toMinutes(this.maxOpenWellTime)), 4, "0"));
-// command.append(StringUtils.leftPad(Integer.toHexString(this.wellDepth), 4, "0"));
-// command.append(StringUtils.leftPad(Integer.toHexString(this.produceMode), 4, "0"));
- return List.of(ModbusCommandDto.builder().command(command.toString()).length(16).build());
+ // 01 10 03ED 0001 02
+ command.append("011003ED000102").append(StringUtils.leftPad(Integer.toHexString(this.depthOfLockDevice), 4, "0"));
+ commandList.add(ModbusCommandDto.builder().command(command.toString()).length(16).build());
+
+ command.setLength(0);
+ // 1036
+ // 地址码 功能码 起始地址 连续长度 连续字长
+ // 01 10 040C 0002 04
+ command.append("0110040C000204")
+ .append(StringUtils.leftPad(Integer.toHexString(this.controlWorkTime), 4, "0"))
+ .append(StringUtils.leftPad(Integer.toHexString(this.produceMode), 4, "0"));
+ commandList.add(ModbusCommandDto.builder().command(command.toString()).length(16).build());
+
+ command.setLength(0);
+ // 1039
+ // 地址码 功能码 起始地址 连续长度 连续字长
+ // 01 10 040F 0002 04
+ command.append("0110040F000204")
+ .append(StringUtils.leftPad(Long.toHexString(this.toSeconds(this.dangerousRiseTime)), 4, "0"))
+ .append(StringUtils.leftPad(Long.toHexString(this.toSeconds(this.dangerousRiseTime)), 4, "0"));
+ commandList.add(ModbusCommandDto.builder().command(command.toString()).length(16).build());
+
+ command.setLength(0);
+ // 1042
+ // 地址码 功能码 起始地址 连续长度 连续字长
+ // 01 10 0412 0001 02
+ command.append("01100412000102")
+ .append(StringUtils.leftPad(Integer.toHexString(this.tooFastCount), 4, "0"));
+ commandList.add(ModbusCommandDto.builder().command(command.toString()).length(16).build());
+
+ command.setLength(0);
+ // 1062
+ // 地址码 功能码 起始地址 连续长度 连续字长
+ // 01 10 0426 0004 08
+ command.append("01100426000408")
+ .append(ByteOrderUtils.encode(Long.toHexString(this.toSeconds(this.closeTime)), "CDAB"))
+ .append(ByteOrderUtils.encode(Long.toHexString(this.toSeconds(this.openTime)), "CDAB"));
+ commandList.add(ModbusCommandDto.builder().command(command.toString()).length(16).build());
+
+ command.setLength(0);
+ // 1072
+ // 地址码 功能码 起始地址 连续长度 连续字长
+ // 01 10 0430 0001 02
+ command.append("01100430000102")
+ .append(StringUtils.leftPad(Integer.toHexString(this.gasCollectionMode), 4, "0"));
+ commandList.add(ModbusCommandDto.builder().command(command.toString()).length(16).build());
+
+ command.setLength(0);
+ // 1074
+ // 地址码 功能码 起始地址 连续长度 连续字长
+ // 01 10 0432 0002 04
+ command.append("01100432000204")
+ .append(ByteOrderUtils.encode(Long.toHexString(Float.floatToRawIntBits(this.protectionPressure.floatValue())), "CDAB"));
+ commandList.add(ModbusCommandDto.builder().command(command.toString()).length(16).build());
+
+ return commandList;
}
+
}
diff --git a/src/main/java/com/isu/gaswellwatch/vo/command/weps/WepsPlugControl.java b/src/main/java/com/isu/gaswellwatch/vo/command/weps/WepsPlugControl.java
index d37f181..14c527c 100644
--- a/src/main/java/com/isu/gaswellwatch/vo/command/weps/WepsPlugControl.java
+++ b/src/main/java/com/isu/gaswellwatch/vo/command/weps/WepsPlugControl.java
@@ -34,8 +34,8 @@ public class WepsPlugControl extends Command implements Timing {
private Integer tooFastCount;
private String dangerousRiseTime;
private String tooFastRiseTime;
- private BigDecimal openWellTime;
- private BigDecimal closeWellTime;
+ private String openWellTime;
+ private String closeWellTime;
private BigDecimal openWellCasPressure;
private BigDecimal littleRiseCasPressure;
private String checkStabilityTime;
@@ -50,6 +50,14 @@ public class WepsPlugControl extends Command implements Timing {
this.setCode("WEPS.PLUG.CONTROL");
}
+ public void setOpenWellTime(String openWellTime) {
+ this.openWellTime = this.timingValidate(openWellTime, "openWellTime");
+ }
+
+ public void setCloseWellTime(String closeWellTime) {
+ this.closeWellTime = this.timingValidate(closeWellTime, "closeWellTime");
+ }
+
public void setDangerousRiseTime(String dangerousRiseTime) {
this.dangerousRiseTime = this.timingValidate(dangerousRiseTime, "dangerousRiseTime");
}
@@ -94,8 +102,8 @@ public class WepsPlugControl extends Command implements Timing {
command.append(StringUtils.leftPad(Integer.toHexString(this.tooFastCount), 4, "0"));
command.append(StringUtils.leftPad(Long.toHexString(this.toSeconds(this.dangerousRiseTime)), 4, "0"));
command.append(StringUtils.leftPad(Long.toHexString(this.toSeconds(this.tooFastRiseTime)), 4, "0"));
- command.append(StringUtils.leftPad(Long.toHexString(this.openWellTime.multiply(ONE_SIXTY).longValue()), 4, "0"));
- command.append(StringUtils.leftPad(Long.toHexString(this.closeWellTime.multiply(ONE_SIXTY).longValue()), 4, "0"));
+ command.append(StringUtils.leftPad(Long.toHexString(this.toMinutes(this.openWellTime)), 4, "0"));
+ command.append(StringUtils.leftPad(Long.toHexString(this.toMinutes(this.closeWellTime)), 4, "0"));
command.append(StringUtils.leftPad(Long.toHexString(this.openWellCasPressure.multiply(ONE_HUNDRED).longValue()), 4, "0"));
command.append(StringUtils.leftPad(Long.toHexString(this.littleRiseCasPressure.multiply(ONE_HUNDRED).longValue()), 4, "0"));
command.append(StringUtils.leftPad(Long.toHexString(this.toSeconds(this.checkStabilityTime)), 4, "0"));
diff --git a/src/main/resources/change_2020220.sql b/src/main/resources/change_2020220.sql
index ed39def..e7506d6 100644
--- a/src/main/resources/change_2020220.sql
+++ b/src/main/resources/change_2020220.sql
@@ -275,3 +275,77 @@ SET `command_id` = 10302,
`format` = NULL,
`decode_name` = 'byteToString'
WHERE `id` = 13208;
+
+update command_points
+set format = null,
+ decode_name = 'IEEE754Float'
+where decode_name = 'wepsDecimal';
+
+update command_points
+set factor = null,
+ `precision` = null,
+ decode_name = 'minuteLocalTime'
+where id in (13021, 13022);
+
+ALTER TABLE `t_device_data_50001`
+ MODIFY COLUMN `open_well_time` varchar (10) NULL DEFAULT NULL COMMENT '开井时间设置;分钟,HH:mm' AFTER `too_fast_rise_time`,
+ MODIFY COLUMN `close_well_time` varchar (10) NULL DEFAULT NULL COMMENT '关井时间设置;分钟,HH:mm' AFTER `open_well_time`;
+
+update t_device_data_50001
+set open_well_time = CONCAT(LPAD(CEILING(open_well_time), 2, '0'), ':',
+ LPAD(open_well_time * 60 - (CEILING(open_well_time) * 60), 2, '0'), ':00'),
+ close_well_time = CONCAT(LPAD(CEILING(close_well_time), 2, '0'), ':',
+ LPAD(close_well_time * 60 - (CEILING(close_well_time) * 60), 2, '0'), ':00');
+
+ALTER TABLE `command_points`
+ ADD COLUMN `byte_order` varchar(5) NULL COMMENT '字节顺序,默认:AB|ABCD' AFTER `use_hex`;
+
+update `command_points`
+set byte_order = 'CDAB',
+ `use_hex` = b'1',
+ decode_name = case
+ when LENGTH(TRIM(decode_name)) > 0 then CONCAT('twoRegisterLengthByteOrder,', decode_name)
+ else 'twoRegisterLengthByteOrder' end
+where command_id in (10301, 10302)
+ and step_size = 2
+ and id not in (13103);
+
+update command_points
+Set decode_name = REPLACE(decode_name, ',highLowBin', ',long')
+where command_id in (10301, 10302)
+ and step_size = 2
+ and id not in (13103);
+
+UPDATE `gas_well_watch`.`command_points`
+SET `command_id` = 10301,
+ `field` = 'currentStatus0x',
+ `name` = '当前状态0x',
+ `details` = '0x8000:关井;0x8001:上升;0x8002:续流;0x8003:停机',
+ `start_address` = 9,
+ `step_size` = 1,
+ `factor` = NULL,
+ `precision` = NULL,
+ `use_hex` = b'1',
+ `byte_order` = '',
+ `format` = NULL,
+ `decode_name` = 'wepsCurrentStatus0x'
+WHERE `id` = 13104;
+
+update command_points
+set `precision` = 2
+where decode_name like '%IEEE754Double%';
+
+UPDATE `gas_well_watch`.`command_points`
+SET `command_id` = 10302,
+ `field` = 'tooFastCount',
+ `name` = '过快次数',
+ `details` = NULL,
+ `start_address` = 1042,
+ `step_size` = 1,
+ `factor` = NULL,
+ `precision` = NULL,
+ `use_hex` = NULL,
+ `byte_order` = NULL,
+ `format` = NULL,
+ `decode_name` = NULL
+WHERE `id` = 13222;
diff --git a/src/main/resources/sql/CREATE_WEPS_PLUG.sql b/src/main/resources/sql/CREATE_WEPS_PLUG.sql
index 437ed23..2c00452 100644
--- a/src/main/resources/sql/CREATE_WEPS_PLUG.sql
+++ b/src/main/resources/sql/CREATE_WEPS_PLUG.sql
@@ -26,8 +26,8 @@ CREATE TABLE `$TableName$`
`too_fast_count` int NULL DEFAULT NULL COMMENT '过快次数设置;次',
`dangerous_rise_time` varchar(10) NULL DEFAULT NULL COMMENT '危险上升时间;秒,HH:mm:ss',
`too_fast_rise_time` varchar(10) NULL DEFAULT NULL COMMENT '过快上升时间;秒,HH:mm:ss',
- `open_well_time` decimal(10, 2) NULL DEFAULT NULL COMMENT '开井时间设置;小时',
- `close_well_time` decimal(10, 2) NULL DEFAULT NULL COMMENT '关井时间设置;小时',
+ `open_well_time` varchar NULL DEFAULT NULL COMMENT '开井时间设置;分钟,HH:mm',
+ `close_well_time` varchar NULL DEFAULT NULL COMMENT '关井时间设置;分钟,HH:mm',
`open_well_cas_pressure` decimal(10, 2) NULL DEFAULT NULL COMMENT '套压开井压力;MPa;压力优化微升模式;',
`little_rise_cas_pressure` decimal(10, 2) NULL DEFAULT NULL COMMENT '套压微升压力;MPa;压力优化微升模式;',
`check_stability_time` varchar(10) NULL DEFAULT NULL COMMENT '检测稳定时间;秒,HH:mm:ss',
diff --git a/src/test/java/com/isu/gaswellwatch/ByteOrderTest.java b/src/test/java/com/isu/gaswellwatch/ByteOrderTest.java
new file mode 100644
index 0000000..c914caa
--- /dev/null
+++ b/src/test/java/com/isu/gaswellwatch/ByteOrderTest.java
@@ -0,0 +1,35 @@
+package com.isu.gaswellwatch;
+
+
+import cn.hutool.core.map.MapUtil;
+import com.isu.gaswellwatch.modbus.data.decode.impl.AbstractByteOrderDecodeHandler;
+import com.isu.gaswellwatch.utils.ByteOrderUtils;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+
+import java.util.Map;
+
+/**
+ * @author 王仕龙
+ * 2025/2/25 19:57
+ */
+public class ByteOrderTest {
+
+ @Test
+ public void byteOrderDecodeTest() {
+ Map commandPointMap = MapUtil.newHashMap();
+ commandPointMap.put("byte_order", "CDAB");
+ AbstractByteOrderDecodeHandler abstractByteOrderDecodeHandler = new AbstractByteOrderDecodeHandler();
+ String value = abstractByteOrderDecodeHandler.decode(commandPointMap, "02580000");
+ Assertions.assertEquals(Long.parseLong(value, 16), 600L);
+ }
+
+ @Test
+ public void byteOrderEncodeTest() {
+ long seconds = 600;
+ String testHexString = "02580000";
+ Assertions.assertEquals(ByteOrderUtils.encode(Long.toHexString(seconds), "CDAB"), testHexString);
+ }
+
+
+}
diff --git a/src/test/java/com/isu/gaswellwatch/IEEE754FloatTest.java b/src/test/java/com/isu/gaswellwatch/IEEE754FloatTest.java
new file mode 100644
index 0000000..e5fa7df
--- /dev/null
+++ b/src/test/java/com/isu/gaswellwatch/IEEE754FloatTest.java
@@ -0,0 +1,30 @@
+package com.isu.gaswellwatch;
+
+
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+
+/**
+ * @author 王仕龙
+ * 2025/2/24 20:05
+ */
+public class IEEE754FloatTest {
+
+ @Test
+ public void testIEEE754Float() {
+ float number = 235.85213f;
+ String hexString = "436BDA25";
+ Assertions.assertEquals(number, Float.intBitsToFloat(Integer.parseInt(hexString, 16)));
+ Assertions.assertEquals(hexString, Integer.toHexString(Float.floatToRawIntBits(number)).toUpperCase());
+ }
+
+ @Test
+ public void testIEEE754Double() {
+ double number = 4.065528388965132E18;
+ String hexString = "43CC35D443CC4433";
+ Assertions.assertEquals(number, Double.longBitsToDouble(Long.parseLong(hexString, 16)));
+ Assertions.assertEquals(hexString, Long.toHexString(Double.doubleToRawLongBits(number)).toUpperCase());
+ }
+
+
+}
diff --git a/src/test/java/com/isu/gaswellwatch/MIWrpsDecodeTest.java b/src/test/java/com/isu/gaswellwatch/MIWrpsDecodeTest.java
index 7359109..825a508 100644
--- a/src/test/java/com/isu/gaswellwatch/MIWrpsDecodeTest.java
+++ b/src/test/java/com/isu/gaswellwatch/MIWrpsDecodeTest.java
@@ -4,6 +4,7 @@ package com.isu.gaswellwatch;
import cn.hutool.json.JSONUtil;
import com.isu.gaswellwatch.modbus.data.listener.DynamicRabbitListener;
import jakarta.annotation.Resource;
+import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.mockito.Mockito;
import org.springframework.amqp.core.Message;
@@ -43,8 +44,8 @@ public class MIWrpsDecodeTest {
Mockito.doReturn(testMessageProperties).when(testMessage10302).getMessageProperties();
Mockito.doReturn("/modbus/collect/0").when(testMessageProperties).getConsumerQueue();
- this.dynamicRabbitListener.getComposeListener().onMessage(testMessage10301);
- this.dynamicRabbitListener.getComposeListener().onMessage(testMessage10302);
+ Assertions.assertDoesNotThrow(() -> this.dynamicRabbitListener.getComposeListener().onMessage(testMessage10301));
+ Assertions.assertDoesNotThrow(() -> this.dynamicRabbitListener.getComposeListener().onMessage(testMessage10302));
LockSupport.parkNanos(TimeUnit.SECONDS.toNanos(2));