From d9b9ff9011b8b814704774ccd1f084b7841e52db Mon Sep 17 00:00:00 2001 From: wangshilong Date: Wed, 27 Nov 2024 14:12:46 +0800 Subject: [PATCH] =?UTF-8?q?KNPCV1=E6=96=B0=E5=A2=9E3=E4=B8=AD=E6=8C=87?= =?UTF-8?q?=E4=BB=A4=EF=BC=8C=E5=B9=B6=E6=B5=8B=E8=AF=95=E6=8C=87=E4=BB=A4?= =?UTF-8?q?=E8=BD=AC=E6=8D=A2=E5=8F=8A=E5=8F=91=E9=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/modbus/ModbusCommandDto.java | 5 + .../modbus/impl/CommandServiceImpl.java | 2 +- .../isu/gaswellwatch/vo/command/Command.java | 6 +- .../vo/command/knpcv1/Timing.java | 8 +- .../vo/command/knpcv1/mode/ManualMode.java | 3 +- .../vo/command/knpcv1/mode/PlungerMode.java | 78 ++++++ .../vo/command/knpcv1/mode/PressureMode.java | 226 ++++++++++++++++++ .../command/knpcv1/mode/TimePressureMode.java | 157 ++++++++++++ .../vo/command/knpcv1/mode/TimerMode.java | 42 +++- .../vo/command/knpcv1/mode/TimingMode.java | 14 +- 10 files changed, 523 insertions(+), 18 deletions(-) create mode 100644 src/main/java/com/isu/gaswellwatch/vo/command/knpcv1/mode/PlungerMode.java create mode 100644 src/main/java/com/isu/gaswellwatch/vo/command/knpcv1/mode/PressureMode.java create mode 100644 src/main/java/com/isu/gaswellwatch/vo/command/knpcv1/mode/TimePressureMode.java diff --git a/src/main/java/com/isu/gaswellwatch/dto/modbus/ModbusCommandDto.java b/src/main/java/com/isu/gaswellwatch/dto/modbus/ModbusCommandDto.java index d775dd3..bd5479d 100644 --- a/src/main/java/com/isu/gaswellwatch/dto/modbus/ModbusCommandDto.java +++ b/src/main/java/com/isu/gaswellwatch/dto/modbus/ModbusCommandDto.java @@ -4,6 +4,7 @@ import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; import lombok.experimental.SuperBuilder; +import org.apache.commons.lang3.StringUtils; @Getter @@ -31,4 +32,8 @@ public class ModbusCommandDto extends CommandTypeComparable implements CommandDt * 网关唯一标识符 */ private String identifier; + + public String getCommand() { + return StringUtils.isBlank(this.command) ? this.command : this.command.toUpperCase(); + } } diff --git a/src/main/java/com/isu/gaswellwatch/modbus/impl/CommandServiceImpl.java b/src/main/java/com/isu/gaswellwatch/modbus/impl/CommandServiceImpl.java index 0c96975..38d496a 100644 --- a/src/main/java/com/isu/gaswellwatch/modbus/impl/CommandServiceImpl.java +++ b/src/main/java/com/isu/gaswellwatch/modbus/impl/CommandServiceImpl.java @@ -68,7 +68,7 @@ public class CommandServiceImpl implements CommandService { return response.getBody(); } catch (Exception e) { log.error("Send command fail", e); - return Response.failed("Send command fail"); + return Response.failed("Send command fail, error: " + e.getMessage()); } } diff --git a/src/main/java/com/isu/gaswellwatch/vo/command/Command.java b/src/main/java/com/isu/gaswellwatch/vo/command/Command.java index 87eb92d..d13041d 100644 --- a/src/main/java/com/isu/gaswellwatch/vo/command/Command.java +++ b/src/main/java/com/isu/gaswellwatch/vo/command/Command.java @@ -31,7 +31,8 @@ import java.util.Objects; @JsonSubTypes.Type(value = TimingMode.class, name = Command.KNPCV1_RUN_TIMING), @JsonSubTypes.Type(value = ManualMode.class, name = Command.KNPCV1_RUN_MANUAL), @JsonSubTypes.Type(value = PlungerMode.class, name = Command.KNPCV1_RUN_PLUNGER), - @JsonSubTypes.Type(value = PressureMode.class, name = Command.KNPCV1_RUN_TIME_PRESSURE), + @JsonSubTypes.Type(value = PressureMode.class, name = Command.KNPCV1_RUN_PRESSURE), + @JsonSubTypes.Type(value = TimePressureMode.class, name = Command.KNPCV1_RUN_TIME_PRESSURE), }) @Getter @Setter @@ -52,6 +53,7 @@ public abstract class Command implements Serializable { public static final String KNPCV1_RUN_TIMING = "KNPCV1.RUN.TIMING"; public static final String KNPCV1_RUN_MANUAL = "KNPCV1.RUN.MANUAL"; public static final String KNPCV1_RUN_PLUNGER = "KNPCV1.RUN.PLUNGER"; + public static final String KNPCV1_RUN_PRESSURE = "KNPCV1.RUN.PRESSURE"; public static final String KNPCV1_RUN_TIME_PRESSURE = "KNPCV1.RUN.TIME_PRESSURE"; /* 点表类型:KNPCV1 end */ @@ -60,7 +62,7 @@ public abstract class Command implements Serializable { private Long deviceId; public Collection buildModbusCommand() { - if (this.validate()) { + if (!this.validate()) { throw new InvalidParameterException("Invalid command"); } return this.builderModbusCommand(); diff --git a/src/main/java/com/isu/gaswellwatch/vo/command/knpcv1/Timing.java b/src/main/java/com/isu/gaswellwatch/vo/command/knpcv1/Timing.java index 6287c80..f794abb 100644 --- a/src/main/java/com/isu/gaswellwatch/vo/command/knpcv1/Timing.java +++ b/src/main/java/com/isu/gaswellwatch/vo/command/knpcv1/Timing.java @@ -63,7 +63,7 @@ public interface Timing { * @return */ default String toHexString(String stringTime) { - if (StringUtils.equals(stringTime, "00:00:00")) { + if (StringUtils.equals(stringTime, "00:00") || StringUtils.equals(stringTime, "00:00:00")) { return "000000000000"; } if (StringUtils.equals(stringTime, "23:59:59")) { @@ -73,9 +73,9 @@ public interface Timing { return "03E7003B003B"; } String[] items = StringUtils.split(stringTime, ":"); - int hours = NumberUtils.createInteger(items[0]); - int minutes = NumberUtils.createInteger(items[1]); - int seconds = NumberUtils.createInteger(items[2]); + int hours = Integer.parseInt(items[0]); + int minutes = items.length < 2 ? 0 : Integer.parseInt(items[1]); + int seconds = items.length < 3 ? 0 : Integer.parseInt(items[2]); return StringUtils.leftPad(Integer.toHexString(hours), 4, "0") + StringUtils.leftPad(Integer.toHexString(minutes), 4, "0") + StringUtils.leftPad(Integer.toHexString(seconds), 4, "0"); diff --git a/src/main/java/com/isu/gaswellwatch/vo/command/knpcv1/mode/ManualMode.java b/src/main/java/com/isu/gaswellwatch/vo/command/knpcv1/mode/ManualMode.java index 1eb6700..71ca7c3 100644 --- a/src/main/java/com/isu/gaswellwatch/vo/command/knpcv1/mode/ManualMode.java +++ b/src/main/java/com/isu/gaswellwatch/vo/command/knpcv1/mode/ManualMode.java @@ -1,6 +1,7 @@ package com.isu.gaswellwatch.vo.command.knpcv1.mode; import com.isu.gaswellwatch.dto.modbus.ModbusCommandDto; +import com.isu.gaswellwatch.vo.command.Command; import com.isu.gaswellwatch.vo.command.knpcv1.ChangeRunMode; import java.io.Serial; @@ -17,7 +18,7 @@ public class ManualMode extends ChangeRunMode { public ManualMode() { super(0); - this.setCode("KNPCV1.RUN.MANUAL"); + this.setCode(Command.KNPCV1_RUN_MANUAL); } @Override diff --git a/src/main/java/com/isu/gaswellwatch/vo/command/knpcv1/mode/PlungerMode.java b/src/main/java/com/isu/gaswellwatch/vo/command/knpcv1/mode/PlungerMode.java new file mode 100644 index 0000000..d2a0583 --- /dev/null +++ b/src/main/java/com/isu/gaswellwatch/vo/command/knpcv1/mode/PlungerMode.java @@ -0,0 +1,78 @@ +package com.isu.gaswellwatch.vo.command.knpcv1.mode; + +import com.isu.gaswellwatch.dto.modbus.ModbusCommandDto; +import com.isu.gaswellwatch.vo.command.Command; +import com.isu.gaswellwatch.vo.command.knpcv1.ChangeRunMode; +import com.isu.gaswellwatch.vo.command.knpcv1.Timing; +import lombok.Builder; +import lombok.Getter; +import lombok.Setter; +import lombok.experimental.SuperBuilder; +import org.apache.commons.lang3.StringUtils; + +import java.io.Serial; +import java.util.Collection; +import java.util.List; + +/** + * @author 王仕龙 + * 2024/11/26 21:02 + */ +@Getter +@Setter +@SuperBuilder +public class PlungerMode extends ChangeRunMode implements Timing { + + @Serial + private static final long serialVersionUID = 9127026055666073752L; + + /** + * 柱塞模式初始气井状态。 + * true:开井 + * false:关井 + */ + @Builder.Default + private boolean enable = false; + + /** + * 柱塞模式续流时长。[0-999]:[0-59]:[0-59] + */ + private String sustainTiming; + /** + * 柱塞模式关井时长。[0-999]:[0-59]:[0-59] + */ + private String closeTiming; + + + public PlungerMode() { + super(4); + this.setCode(Command.KNPCV1_RUN_PLUNGER); + } + + @Override + public boolean validate() { + return super.validate() && StringUtils.isNotBlank(this.sustainTiming) + && StringUtils.isNotBlank(this.closeTiming); + } + + @Override + protected Collection builderSubModbusCommand() { + StringBuilder command = new StringBuilder(150); + // 0007*2->hex + // 地址码 功能码 起始地址 连续长度 连续字长 + // 01 10 015C 0007 0E + command.append("0110015C00070E"); + command.append("000").append(this.enable ? "1" : "0"); + command.append(this.toHexString(this.sustainTiming)).append(this.toHexString(this.closeTiming)); + return List.of(ModbusCommandDto.builder().command(command.toString()).length(16).build()); + } + + public void setSustainTiming(String sustainTiming) { + this.sustainTiming = this.timingValidate(sustainTiming, "sustainTiming"); + } + + public void setCloseTiming(String closeTiming) { + this.closeTiming = this.timingValidate(closeTiming, "closeTiming"); + } + +} \ No newline at end of file diff --git a/src/main/java/com/isu/gaswellwatch/vo/command/knpcv1/mode/PressureMode.java b/src/main/java/com/isu/gaswellwatch/vo/command/knpcv1/mode/PressureMode.java new file mode 100644 index 0000000..930035f --- /dev/null +++ b/src/main/java/com/isu/gaswellwatch/vo/command/knpcv1/mode/PressureMode.java @@ -0,0 +1,226 @@ +package com.isu.gaswellwatch.vo.command.knpcv1.mode; + +import com.isu.gaswellwatch.dto.modbus.ModbusCommandDto; +import com.isu.gaswellwatch.vo.command.Command; +import com.isu.gaswellwatch.vo.command.knpcv1.ChangeRunMode; +import com.isu.gaswellwatch.vo.command.knpcv1.Timing; +import lombok.Builder; +import lombok.Getter; +import lombok.Setter; +import lombok.experimental.SuperBuilder; +import org.apache.commons.lang3.StringUtils; + +import java.io.Serial; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Objects; + +/** + * 压力模式:存在3个不同的地址段,需要发发送4条命令 + * + * @author 王仕龙 + * 2024/11/26 20:44 + */ +@Getter +@Setter +@SuperBuilder +public class PressureMode extends ChangeRunMode implements Timing { + + @Serial + private static final long serialVersionUID = 8128429933652613769L; + + /** + * 压力源 + */ + @Builder.Default + private PresourceEnum presource = PresourceEnum.OIL; + /** + * 压力触发类型 + */ + @Builder.Default + private TriggerTypeEnum triggerType = TriggerTypeEnum.L0; + + /** + * 开井压力:单位Mpa,*100,[0~9999] + */ + @Builder.Default + private int pressureOpen = 0; + + /** + * 关井压力: 单位Mpa,*100,[0~9999] + */ + @Builder.Default + private int pressureClose = 0; + + /** + * 传感器压力稳定时间:秒,[0~36000] + */ + @Builder.Default + private int stabilityTime = 0; + + /** + * 最大开井时长 + */ + @Builder.Default + private String maxOpenWell = "00:00:00"; + /** + * 最小开井时长 + */ + @Builder.Default + private String minOpenWell = "00:00:00"; + /** + * 最大关井时长 + */ + @Builder.Default + private String maxCloseWell = "00:00:00"; + /** + * 最小关井时长 + */ + @Builder.Default + private String minCloseWell = "00:00:00"; + /** + * 开井压力保护使能 + */ + @Builder.Default + private boolean presproTect = false; + /** + * 开井压力保护源 + */ + @Builder.Default + private PresourceEnum presproSource = PresourceEnum.OIL; + /** + * 开井压力限制上限,[0-9999] + */ + @Builder.Default + private int openWellLimitMax = 0; + /** + * 开井压力限制下限,[0-9999] + */ + @Builder.Default + private int openWellLimitMin = 0; + + + public PressureMode() { + super(3); + this.setCode(Command.KNPCV1_RUN_PRESSURE); + } + + @Override + public boolean validate() { + return super.validate() + && Objects.nonNull(this.presource) + && Objects.nonNull(this.triggerType) + && Objects.nonNull(this.presproSource) + && StringUtils.isNotBlank(this.maxOpenWell) + && StringUtils.isNotBlank(this.minOpenWell) + && StringUtils.isNotBlank(this.maxCloseWell) + && StringUtils.isNotBlank(this.minCloseWell) + && this.pressureOpen >= 0 && this.pressureOpen <= 9999 + && this.pressureClose >= 0 && this.pressureClose <= 9999 + && this.openWellLimitMax >= 0 && this.openWellLimitMax <= 9999 + && this.openWellLimitMin >= 0 && this.openWellLimitMin <= 9999 + && this.stabilityTime >= 0 && this.stabilityTime <= 36000; + } + + @Override + protected Collection builderSubModbusCommand() { + List commandList = new ArrayList<>(4); + StringBuilder command = new StringBuilder(150); + // 0005*2->hex + // 地址码 功能码 起始地址 连续长度 连续字长 + // 01 10 00A0 0005 0A + command.append("011000A000050A"); + command.append(StringUtils.leftPad(Integer.toHexString(this.presource.getCode()), 4, "0")); + command.append(StringUtils.leftPad(Integer.toHexString(this.pressureOpen), 4, "0")); + command.append(StringUtils.leftPad(Integer.toHexString(this.pressureClose), 4, "0")); + command.append(StringUtils.leftPad(Integer.toHexString(this.triggerType.getCode()), 4, "0")); + command.append(StringUtils.leftPad(Integer.toHexString(this.stabilityTime), 4, "0")); + commandList.add(ModbusCommandDto.builder().command(command.toString()).length(16).build()); + + command.setLength(0); + // 000C*2->hex + // 地址码 功能码 起始地址 连续长度 连续字长 + // 01 10 00AA 000C 18 + command.append("011000AA000C18"); + command.append(this.toHexString(this.maxOpenWell)); + command.append(this.toHexString(this.minOpenWell)); + command.append(this.toHexString(this.maxCloseWell)); + command.append(this.toHexString(this.minCloseWell)); + commandList.add(ModbusCommandDto.builder().command(command.toString()).length(16).build()); + + command.setLength(0); + // 0004*2->hex + // 地址码 功能码 起始地址 连续长度 连续字长 + // 01 10 0140 0004 08 + command.append("01100140000408"); + command.append("000").append(this.presproTect ? "1" : "0"); + command.append(StringUtils.leftPad(Integer.toHexString(this.presproSource.getCode()), 4, "0")); + command.append(StringUtils.leftPad(Integer.toHexString(this.openWellLimitMax), 4, "0")); + command.append(StringUtils.leftPad(Integer.toHexString(this.openWellLimitMin), 4, "0")); + commandList.add(ModbusCommandDto.builder().command(command.toString()).length(16).build()); + + return commandList; + } + + public void setMaxOpenWell(String maxOpenWell) { + this.maxOpenWell = this.timingValidate(maxOpenWell, "maxOpenWell"); + } + + public void setMinOpenWell(String minOpenWell) { + this.minOpenWell = this.timingValidate(minOpenWell, "minOpenWell"); + } + + public void setMaxCloseWell(String maxCloseWell) { + this.maxCloseWell = this.timingValidate(maxCloseWell, "maxCloseWell"); + } + + public void setMinCloseWell(String minCloseWell) { + this.minCloseWell = this.timingValidate(minCloseWell, "minCloseWell"); + } + + /** + * 触发压力源: + * 0:油压 + * 1:套压 + * 2:输压 + * 3:差压 + */ + @Getter + public enum PresourceEnum { + OIL(0, "油压"), CAS(1, "套压"), PRE(2, "输压"), DIFF(3, "差压"); + + private final int code; + private final String name; + + PresourceEnum(int code, String name) { + this.code = code; + this.name = name; + } + } + + /** + * 压力触发类型: + * 0:大于开井压力开井、小于关井压力关井 + * 1:大于开井压力开井、大于关井压力关井 + * 2:小于开井压力开井、小于关井压力关井 + * 3:小于开井压力开井、大于关井压力关井 + */ + @Getter + public enum TriggerTypeEnum { + L0(0, "大于开井压力开井、小于关井压力关井"), + L1(1, "大于开井压力开井、大于关井压力关井"), + L2(2, "小于开井压力开井、小于关井压力关井"), + L3(3, "小于开井压力开井、大于关井压力关井"); + + private final int code; + private final String name; + + TriggerTypeEnum(int code, String name) { + this.code = code; + this.name = name; + } + + } + +} diff --git a/src/main/java/com/isu/gaswellwatch/vo/command/knpcv1/mode/TimePressureMode.java b/src/main/java/com/isu/gaswellwatch/vo/command/knpcv1/mode/TimePressureMode.java new file mode 100644 index 0000000..45b0817 --- /dev/null +++ b/src/main/java/com/isu/gaswellwatch/vo/command/knpcv1/mode/TimePressureMode.java @@ -0,0 +1,157 @@ +package com.isu.gaswellwatch.vo.command.knpcv1.mode; + +import com.isu.gaswellwatch.dto.modbus.ModbusCommandDto; +import com.isu.gaswellwatch.vo.command.Command; +import com.isu.gaswellwatch.vo.command.knpcv1.ChangeRunMode; +import com.isu.gaswellwatch.vo.command.knpcv1.Timing; +import lombok.Builder; +import lombok.Getter; +import lombok.Setter; +import lombok.experimental.SuperBuilder; +import org.apache.commons.lang3.StringUtils; + +import java.io.Serial; +import java.util.Collection; +import java.util.List; +import java.util.Objects; + +/** + * @author 王仕龙 + * 2024/11/26 21:44 + */ +@Getter +@Setter +@SuperBuilder +public class TimePressureMode extends ChangeRunMode implements Timing { + + @Serial + private static final long serialVersionUID = 8128429933652613769L; + /** + * 时压模式初始气井状态 + */ + @Builder.Default + private boolean tpInitStatus = false; + /** + * 时压模式开井源 + */ + @Builder.Default + private TimePressureOpenSouceEnum tpOpenSource = TimePressureOpenSouceEnum.OIL; + /** + * 时压模式开井压力触发模式: + * 0:大于压力触发 + * 1:小于压力触发 + */ + @Builder.Default + private int tpOpenTrigger = 0; + /** + * 时压模式开井压力,[0~9999] + */ + @Builder.Default + private int tpOpenPressure = 0; + /** + * 时压模式开井时长 + */ + @Builder.Default + private String tpOpenTiming = "00:00:00"; + /** + * 时压模式关井源 + */ + @Builder.Default + private TimePressureOpenSouceEnum tpCloseSource = TimePressureOpenSouceEnum.OIL; + /** + * 时压模式关井触发 + * 0:大于压力触发 + * 1:小于压力触发 + */ + @Builder.Default + private int tpCloseTrigger = 0; + /** + * 时压模式关井压力,[0~9999] + */ + @Builder.Default + private int tpClosePressure = 0; + /** + * 时压模式关井时长 + */ + @Builder.Default + private String tpCloseTiming = "00:00:00"; + /** + * 时压模式压力稳定时长:秒,[0-120] + */ + @Builder.Default + private int tpStabilityTime = 0; + + public TimePressureMode() { + super(5); + this.setCode(Command.KNPCV1_RUN_TIME_PRESSURE); + } + + @Override + public boolean validate() { + return super.validate() + && Objects.nonNull(this.tpOpenSource) + && Objects.nonNull(this.tpCloseSource) + && StringUtils.isNotBlank(this.tpOpenTiming) + && StringUtils.isNotBlank(this.tpCloseTiming) + && this.tpOpenTrigger >= 0 && this.tpOpenTrigger <= 1 + && this.tpCloseTrigger >= 0 && this.tpCloseTrigger <= 1 + && this.tpOpenPressure >= 0 && this.tpOpenPressure <= 9999 + && this.tpClosePressure >= 0 && this.tpClosePressure <= 9999 + && this.tpStabilityTime >= 0 && this.tpStabilityTime <= 120; + } + + @Override + protected Collection builderSubModbusCommand() { + StringBuilder command = new StringBuilder(150); + // 000E*2->hex + // 地址码 功能码 起始地址 连续长度 连续字长 + // 01 10 0177 000E 1C + command.append("01100177000E1C"); + command.append("000").append(this.tpInitStatus ? "1" : "0"); + command.append(StringUtils.leftPad(Integer.toHexString(this.tpOpenSource.getCode()), 4, "0")); + command.append(StringUtils.leftPad(Integer.toHexString(this.tpOpenTrigger), 4, "0")); + command.append(StringUtils.leftPad(Integer.toHexString(this.tpOpenPressure), 4, "0")); + command.append(this.toHexString(this.tpOpenTiming)); + command.append(StringUtils.leftPad(Integer.toHexString(this.tpCloseSource.getCode()), 4, "0")); + command.append(StringUtils.leftPad(Integer.toHexString(this.tpCloseTrigger), 4, "0")); + command.append(StringUtils.leftPad(Integer.toHexString(this.tpClosePressure), 4, "0")); + command.append(this.toHexString(this.tpCloseTiming)); + command.append(StringUtils.leftPad(Integer.toHexString(this.tpStabilityTime), 4, "0")); + return List.of(ModbusCommandDto.builder().command(command.toString()).length(16).build()); + } + + public void setTpOpenTiming(String tpOpenTiming) { + this.tpOpenTiming = this.timingValidate(tpOpenTiming, "tpOpenTiming"); + } + + public void setTpCloseTiming(String tpCloseTiming) { + this.tpCloseTiming = this.timingValidate(tpCloseTiming, "tpCloseTiming"); + } + + /** + * 时压模式开井源: + * 0:油压 + * 1:套压 + * 2:输压 + * 3:差压 + *

+ * 4:时间 + */ + @Getter + public enum TimePressureOpenSouceEnum { + OIL(0, "油压"), + CAS(1, "套压"), + PRE(2, "输压"), + DIFF(3, "差压"), + TIME(4, "时间"); + + private final int code; + private final String name; + + TimePressureOpenSouceEnum(int code, String name) { + this.code = code; + this.name = name; + } + } + +} diff --git a/src/main/java/com/isu/gaswellwatch/vo/command/knpcv1/mode/TimerMode.java b/src/main/java/com/isu/gaswellwatch/vo/command/knpcv1/mode/TimerMode.java index dc4e2ca..241732a 100644 --- a/src/main/java/com/isu/gaswellwatch/vo/command/knpcv1/mode/TimerMode.java +++ b/src/main/java/com/isu/gaswellwatch/vo/command/knpcv1/mode/TimerMode.java @@ -1,6 +1,7 @@ package com.isu.gaswellwatch.vo.command.knpcv1.mode; import com.isu.gaswellwatch.dto.modbus.ModbusCommandDto; +import com.isu.gaswellwatch.vo.command.Command; import com.isu.gaswellwatch.vo.command.knpcv1.ChangeRunMode; import com.isu.gaswellwatch.vo.command.knpcv1.Timing; import lombok.Builder; @@ -93,11 +94,43 @@ public class TimerMode extends ChangeRunMode implements Timing { public TimerMode() { super(1); - this.setCode("KNPCV1.RUN.TIMER"); + this.setCode(Command.KNPCV1_RUN_TIMER); } @Override public boolean validate() { + if (!this.enable1) { + if (Objects.isNull(this.openTimer1)) { + this.openTimer1 = LocalTime.MIN; + } + if (Objects.isNull(this.closeTimer1)) { + this.closeTimer1 = LocalTime.MIN; + } + } + if (!this.enable2) { + if (Objects.isNull(this.openTimer2)) { + this.openTimer2 = LocalTime.MIN; + } + if (Objects.isNull(this.closeTimer2)) { + this.closeTimer2 = LocalTime.MIN; + } + } + if (!this.enable3) { + if (Objects.isNull(this.openTimer3)) { + this.openTimer3 = LocalTime.MIN; + } + if (Objects.isNull(this.closeTimer3)) { + this.closeTimer3 = LocalTime.MIN; + } + } + if (!this.enable4) { + if (Objects.isNull(this.openTimer4)) { + this.openTimer4 = LocalTime.MIN; + } + if (Objects.isNull(this.closeTimer4)) { + this.closeTimer4 = LocalTime.MIN; + } + } return super.validate() && Objects.nonNull(this.openTimer1) && Objects.nonNull(this.closeTimer1) && Objects.nonNull(this.openTimer2) && Objects.nonNull(this.closeTimer2) @@ -108,6 +141,9 @@ public class TimerMode extends ChangeRunMode implements Timing { @Override protected Collection builderSubModbusCommand() { StringBuilder command = new StringBuilder(150); + // 001C*2->hex + // 地址码 功能码 起始地址 连续长度 连续字长 + // 01 10 006E 001C 38 command.append("0110006E001C38"); command.append("000").append(this.enable1 ? "1" : "0"); command.append("000").append(this.enable2 ? "1" : "0"); @@ -117,9 +153,7 @@ public class TimerMode extends ChangeRunMode implements Timing { .append(this.toHexString(this.openTimer2)).append(this.toHexString(this.closeTimer2)) .append(this.toHexString(this.openTimer3)).append(this.toHexString(this.closeTimer3)) .append(this.toHexString(this.openTimer4)).append(this.toHexString(this.closeTimer4)); - return List.of(ModbusCommandDto.builder() - .command(command.toString()) - .length(16).build()); + return List.of(ModbusCommandDto.builder().command(command.toString()).length(16).build()); } } diff --git a/src/main/java/com/isu/gaswellwatch/vo/command/knpcv1/mode/TimingMode.java b/src/main/java/com/isu/gaswellwatch/vo/command/knpcv1/mode/TimingMode.java index f816e98..79fda88 100644 --- a/src/main/java/com/isu/gaswellwatch/vo/command/knpcv1/mode/TimingMode.java +++ b/src/main/java/com/isu/gaswellwatch/vo/command/knpcv1/mode/TimingMode.java @@ -1,6 +1,7 @@ package com.isu.gaswellwatch.vo.command.knpcv1.mode; import com.isu.gaswellwatch.dto.modbus.ModbusCommandDto; +import com.isu.gaswellwatch.vo.command.Command; import com.isu.gaswellwatch.vo.command.knpcv1.ChangeRunMode; import com.isu.gaswellwatch.vo.command.knpcv1.Timing; import lombok.Builder; @@ -43,7 +44,7 @@ public class TimingMode extends ChangeRunMode implements Timing { public TimingMode() { super(2); - this.setCode("KNPCV1.RUN.TIMING"); + this.setCode(Command.KNPCV1_RUN_TIMING); } @Override @@ -57,7 +58,7 @@ public class TimingMode extends ChangeRunMode implements Timing { } public void setCloseTiming(String closeTiming) { - this.closeTiming = this.timingValidate(this.openTiming, "closeTiming"); + this.closeTiming = this.timingValidate(closeTiming, "closeTiming"); } public void setDelayTiming(String delayTiming) { @@ -67,14 +68,15 @@ public class TimingMode extends ChangeRunMode implements Timing { @Override protected Collection builderSubModbusCommand() { StringBuilder command = new StringBuilder(60); + // 000A*2->hex + // 地址码 功能码 起始地址 连续长度 连续字长 + // 01 10 0096 000A 14 command.append("01100096000A14") .append(this.toHexString(this.openTiming)) .append(this.toHexString(this.closeTiming)) - .append("0000") // 地址位:0154,值为空 + .append("0000") // 地址位:0156,值为空 .append(this.toHexString(this.delayTiming)); - return List.of(ModbusCommandDto.builder() - .command(command.toString()) - .length(16).build()); + return List.of(ModbusCommandDto.builder().command(command.toString()).length(16).build()); } }