pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V1/CodeV1.java
@@ -2,7 +2,7 @@ public class CodeV1 { //功能码为字符串,十六进制数据 public static final String cd_02 = "02" ;//遥测站链路检测 public static final String cd_02 = "02" ;//遥测站链路检测 主动上报 public static final String cd_10 = "10" ;//设置遥测站终端地址 public static final String cd_11 = "11" ;//设置遥测站时钟(未实现) public static final String cd_12 = "12" ;//设置工作模式(未实现) @@ -30,9 +30,9 @@ public static final String cd_6A = "6A" ;//查询阀门堵转电流值 public static final String cd_6B = "6B" ;//查询阀门超时时间 public static final String cd_6D = "6D" ;//查询阶梯水价 public static final String cd_81 = "81" ;//随机自报报 ok public static final String cd_83 = "83" ;//遥测站开关阀自报 ok public static final String cd_84 = "84" ;//开阀工作报 ok public static final String cd_81 = "81" ;//随机自报报 主动上报 public static final String cd_83 = "83" ;//遥测站开关阀自报 主动上报 public static final String cd_84 = "84" ;//开阀工作报 主动上报 public static final String cd_91 = "91" ;//清空历史记录 public static final String cd_92 = "92" ;//遥控启动阀门 public static final String cd_93 = "93" ;//遥控关闭阀门 @@ -44,7 +44,7 @@ public static final String cd_A1 = "A1" ;//定时关阀式计划开阀 public static final String cd_A2 = "A2" ;//定量关阀式计划开阀 public static final String cd_B0 = "B0" ;//查询实时数据(未实现) public static final String cd_C0 = "C0" ;//遥测站整点上报实时数据 ok public static final String cd_C0 = "C0" ;//遥测站整点上报实时数据 主动上报 public static final String cd_1600 = "1600" ;//升级复位 public static final String cd_1601 = "1601" ;//升级配置 pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V2/upVos/DataAlarmVo.java
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/CodeV202404.java
@@ -2,12 +2,10 @@ public class CodeV202404 { //功能码为字符串,十六进制数据 public static final String cd_02 = "02" ;//链路检测 public static final String cd_02 = "02" ;//链路检测 主动上报 public static final String cd_10 = "10" ;//设置设备终端地址 public static final String cd_8A = "8A" ;//设备登录 public static final String cd_50 = "50" ; //查询设备终端地址 public static final String cd_80 = "80" ; //设备终端工作上报 public static final String cd_81 = "81" ; //设备终端随机自报 public static final String cd_5B = "5B" ; //查询设备终端实时值 public static final String cd_65 = "65" ; //查询设备终端用户用水记录 public static final String cd_97 = "97" ; //清除设备终端用户用水记录 @@ -26,9 +24,11 @@ public static final String cd_93 = "93" ; //平台远程关闭水泵/阀门 public static final String cd_A2 = "A2" ; //APP远程开启水泵/阀门 public static final String cd_A3 = "A3" ; //APP远程关闭水泵/阀门 public static final String cd_83 = "83" ; //遥测终端定点上报 public static final String cd_84 = "84" ; //刷卡开泵/阀上报 public static final String cd_85 = "85" ; //刷卡关泵/阀上报 public static final String cd_80 = "80" ; //设备终端工作上报 主动上报 public static final String cd_81 = "81" ; //设备终端随机自报 主动上报 public static final String cd_83 = "83" ; //遥测终端定点上报(一天报一次) 主动上报 public static final String cd_84 = "84" ; //刷卡开泵/阀上报 主动上报 public static final String cd_85 = "85" ; //刷卡关泵/阀上报 主动上报 public static final String cd_9A = "9A" ; //查询年用水量 public static final String cd_26 = "26" ; //设置设备终端年用水量 public static final String cd_21 = "21" ; //设置设备终端IP地址 pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/ProtocolConstantV206V202404.java
@@ -48,6 +48,8 @@ public static final int codeIndex = 12 ;//功能码字节数组下标 public static final int dataIndex = 13 ;//具体数据字节数组下标 public static final String vsCardAddr = "00000000";//本系统应用的虚拟卡,卡物理地址采用10个0作为模拟 //////////////////////////////////////////////// // //远程升级相关 pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/parse/global/GlParse.java
@@ -70,12 +70,16 @@ b = bs[index + 1] ; vo.alarm0MoneyRemain = (byte)(b & 0x1) ; vo.alarmInnerDoor = (byte)((b >> 1) & 1) ; vo.alarmOuterDoor = (byte)((b >> 2) & 1) ; vo.alarmDoor = (byte)((b >> 1) & 1) ; vo.alarmBatteryVolt = (byte)((b >> 2) & 1) ; vo.alarmEleMiss = (byte)((b >> 3) & 1) ; vo.alarmEleExceed = (byte)((b >> 4) & 1) ; vo.alarmEleLowVolt = (byte)((b >> 5) & 1) ; vo.stateIcEnable = (byte)((b >> 6) & 1) ; vo.stateOpClValve = (byte)((b >> 7) & 1) ; b = bs[index + 2] ; vo.alarmBlockValve = (byte)(b & 0x1) ; } public static String parseTp(byte[] bs, short index){ pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/upVos/AlarmVo.java
@@ -6,23 +6,97 @@ * @Description */ public class AlarmVo { public static final byte DevOpenState = 1 ; public static final byte DevCloseState = 0 ; public Byte statePump ; //泵/阀状态 (1:开泵/阀;0:关泵/阀) public Byte alarmWaterRemain ; //剩余水量报警 (1:小于报警上限报警 0:正常) public Byte alarm0WaterRemain ; //剩余水量为0关泵/阀 (1:剩余水量为0关泵 0:正常) public Byte alarmExceedYear ; //年度超采报警 (1:年用水量大于限制水量报警 0:正常) public Byte alarmWaterMeterFault ; //外部流量计故障 (1:流量计故障报警 0:正常) public Byte alarmSteal ; //偷水报警 (1:绕开控制器用水报警 0:正常) public Byte alarmSteal ; //偷水报警 (1:绕开控制器用水报警 0:正常)(2025-02-19:对应靳总协议中的漏损报警,即关阀态时有流量产生) public Byte alarmWaterMeterBreak ; //流量计损坏报警 (1:正常通讯但瞬时为0报警 0:正常) public Byte alarmEleMeterFault ; //电表故障报警 (1:和电表通讯断或数据不正常 0:正常) public Byte alarm0MoneyRemain ; //剩余金额为0 (1:剩余金额为0报警 0:正常) public Byte alarmInnerDoor ; //控制器内门报警 (1:内门打开报警 0:正常) public Byte alarmOuterDoor ; //控制器外门报警 (1:外门打开报警 0:正常) public Byte alarmDoor; //控制器内门报警 (1:内门打开报警 0:正常) public Byte alarmBatteryVolt; //电池电压低报警 (1:电池低关阀报警 0:正常) public Byte alarmEleMiss ; //交流缺项报警 (1:三相缺项报警 0:正常) public Byte alarmEleExceed ; //交流过流报警 (1:交流过流报警 0:正常) public Byte alarmEleLowVolt ; //三相电欠压报警 (1:欠压报警 0:正常) public Byte stateIcEnable ; //IC卡使能 (1、IC有刷卡支持 0:不支持) public Byte stateIcEnable ; //IC卡使能 (1:IC有刷卡支持 0:不支持) public Byte alarmBlockValve; //阀门故障报警 (1:阀门堵转 0:阀门正常(不堵转)) public Byte stateOpClValve ; //阀门开关状态 (1:开关阀不到位 0:开关阀到位) public boolean hasAlarm(){ boolean flag = false ; if((alarmBatteryVolt != null && alarmBatteryVolt == 1) || (alarmWaterMeterFault != null && alarmWaterMeterFault == 1) || (alarmWaterMeterBreak != null && alarmWaterMeterBreak == 1) || (alarmSteal != null && alarmSteal == 1) || (alarmBlockValve != null && alarmBlockValve == 1) ){ flag = true ; } return flag ; } public boolean hasAlarmExcludeLoss(){ boolean flag = false ; if((alarmBatteryVolt != null && alarmBatteryVolt == 1) || (alarmWaterMeterFault != null && alarmWaterMeterFault == 1) || (alarmWaterMeterBreak != null && alarmWaterMeterBreak == 1)|| (alarmBlockValve != null && alarmBlockValve == 1) ){ flag = true ; } return flag ; } public String alarmContent(){ String txt = "" ; boolean hasTxt = false ; if(alarmBatteryVolt != null && alarmBatteryVolt == 1){ txt += (hasTxt?"、":"") + "电池电压低报警" ; hasTxt = true ; } if(alarmWaterMeterFault != null && alarmWaterMeterFault == 1){ txt += (hasTxt?"、":"") + "外部流量计故障报警" ; hasTxt = true ; } if(alarmWaterMeterBreak != null && alarmWaterMeterBreak == 1){ txt += (hasTxt?"、":"") + "流量计故障报警" ; hasTxt = true ; } if(alarmSteal != null && alarmSteal == 1){ txt += (hasTxt?"、":"") + "漏损报警" ; hasTxt = true ; } if(alarmBlockValve != null && alarmBlockValve == 1){ txt += (hasTxt?"、":"") + "阀门故障报警" ; hasTxt = true ; } return txt ; } public String alarmContentExcludeLoss(){ String txt = "" ; boolean hasTxt = false ; if(alarmBatteryVolt != null && alarmBatteryVolt == 1){ txt += (hasTxt?"、":"") + "电池电压低报警" ; hasTxt = true ; } if(alarmWaterMeterFault != null && alarmWaterMeterFault == 1){ txt += (hasTxt?"、":"") + "外部流量计故障报警" ; hasTxt = true ; } if(alarmWaterMeterBreak != null && alarmWaterMeterBreak == 1){ txt += (hasTxt?"、":"") + "流量计故障报警" ; hasTxt = true ; } if(alarmBlockValve != null && alarmBlockValve == 1){ txt += (hasTxt?"、":"") + "阀门故障报警" ; hasTxt = true ; } return txt ; } public String toString(){ StringBuffer sb = new StringBuffer() ; sb.append(" 泵/阀状态 : ") ; @@ -53,10 +127,10 @@ sb.append(alarm0MoneyRemain == null?"未知":(alarm0MoneyRemain.byteValue() == 0 ? "正常":(alarm0MoneyRemain.byteValue() == 1 ? "关泵/阀":"未知"))) ; sb.append("\n") ; sb.append(" 控制器内门 : ") ; sb.append(alarmInnerDoor == null?"未知":(alarmInnerDoor.byteValue() == 0 ? "正常":(alarmInnerDoor.byteValue() == 1 ? "报警":"未知"))) ; sb.append(alarmDoor == null?"未知":(alarmDoor.byteValue() == 0 ? "正常":(alarmDoor.byteValue() == 1 ? "报警":"未知"))) ; sb.append("\n") ; sb.append(" 控制器外门 : ") ; sb.append(alarmOuterDoor == null?"未知":(alarmOuterDoor.byteValue() == 0 ? "正常":(alarmOuterDoor.byteValue() == 1 ? "报警":"未知"))) ; sb.append(" 电池电压低 : ") ; sb.append(alarmBatteryVolt == null?"未知":(alarmBatteryVolt.byteValue() == 0 ? "正常":(alarmBatteryVolt.byteValue() == 1 ? "报警":"未知"))) ; sb.append("\n") ; sb.append(" 交流缺项 : ") ; sb.append(alarmEleMiss == null?"未知":(alarmEleMiss.byteValue() == 0 ? "正常":(alarmEleMiss.byteValue() == 1 ? "报警":"未知"))) ; @@ -70,6 +144,12 @@ sb.append(" IC卡功能 : ") ; sb.append(stateIcEnable == null?"未知":(stateIcEnable.byteValue() == 0 ? "无效":(stateIcEnable.byteValue() == 1 ? "有效":"未知"))) ; sb.append("\n") ; sb.append(" 阀门开关状态 : ") ; sb.append(stateOpClValve == null?"未知":(stateOpClValve.byteValue() == 0 ? "正常":(stateOpClValve.byteValue() == 1 ? "未到位":"未知"))) ; sb.append("\n") ; sb.append(" 阀门堵转报警 : ") ; sb.append(alarmBlockValve == null?"未知":(alarmBlockValve.byteValue() == 0 ? "正常":(alarmBlockValve.byteValue() == 1 ? "报警":"未知"))) ; sb.append("\n") ; return sb.toString() ; } pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/pojoRm/RmAlarmStateHistory.java
@@ -120,6 +120,7 @@ public Byte alarmInnerDoor; /** * 2025-02-19 含义变为 电池电压报警(1:报警,0:正常) * 控制器外门打开报警(1:报警,0:正常) */ public Byte alarmOuterDoor; pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/rtuData/p206V1/TkDealAlarmStatus.java
@@ -114,7 +114,7 @@ * @param stateVo 状态对象 */ private void toMsCenter(PrController controller, String rtuAddr, DataV1 dV1, DataAlarmVo alarmVo, DataStateVo stateVo){ if(alarmVo != null && controller != null){ if(alarmVo != null && controller != null && alarmVo.hasAlarm()){ MsObj msObj = new MsObj() ; msObj.put("name", "报警"); msObj.put("rtuAddr", rtuAddr); pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/rtuData/p206V1/TkPreGenObjs.java
@@ -57,7 +57,7 @@ if(sv != null){ PrController controller = sv.getControllersByRtuAddrAndIntakeNotNull(rtuAddr) ; PrControllerTramp controllerTramp = null ; SeClient clientVo = null ;//这个值对象中只有id和name会有值 SeClient clientVo = null ;//这个值对象中只有id、name、address会有值 if(controller == null){ //数据库中未查询到控制器(RTU实体)(已经绑定且控制器地址相符) //流浪者控制器 @@ -90,7 +90,7 @@ (d1.subData instanceof DataCd83OpenVo || d1.subData instanceof DataCd83CloseVo || d1.subData instanceof DataCd84Vo)){ //开阀后,关阀报,阀开工作报 //开阀报,关阀报,阀开工作报 String icCardAddr = null ; String icCardNo = null ; if(d1.subData instanceof DataCd83OpenVo){ pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/rtuData/p206V2/TkDealAlarmStatusV2.java
@@ -37,6 +37,7 @@ Data d = (Data)data ; Object subD = d.getSubData() ; if(subD != null){ boolean toNext = false ; DataV2 dV2 = (DataV2)subD ; if(dV2 != null && dV2.subData != null){ //dV2.dataCd81Vo、 dV2.dataCd84Vo 与 dV2.dataCdC0Vo 不会同时有值 @@ -57,6 +58,7 @@ if(dataCd02Vo.stateVo != null && dataCd02Vo.stateVo.valveState != null && dataCd02Vo.stateVo.valveState.byteValue() == DataStateVo.ValveCloseState){ if(controller != null && controller.getIntakeId() != null){ this.taskResult = new Object[]{controller.getIntakeId(), DataStateVo.ValveCloseState} ; toNext = true ; } } } @@ -73,6 +75,7 @@ if(dataCd81Vo.stateVo != null && dataCd81Vo.stateVo.valveState != null && dataCd81Vo.stateVo.valveState.byteValue() == DataStateVo.ValveCloseState){ if(controller != null && controller.getIntakeId() != null){ this.taskResult = new Object[]{controller.getIntakeId(), DataStateVo.ValveCloseState} ; toNext = true ; } } } @@ -106,6 +109,7 @@ if(dataCdC0Vo.stateVo != null && dataCdC0Vo.stateVo.valveState != null && dataCdC0Vo.stateVo.valveState.byteValue() == DataStateVo.ValveCloseState){ if(controller != null && controller.getIntakeId() != null){ this.taskResult = new Object[]{controller.getIntakeId(), DataStateVo.ValveCloseState} ; toNext = true ; } } } @@ -113,6 +117,9 @@ } catch (Exception e) { log.error("保存控制器报警和状态数据时发生异常", e); } } if(toNext){ this.toNextTasks(d); } } } @@ -126,7 +133,7 @@ * @param stateVo 状态对象 */ private void toMsCenter(PrController controller, String rtuAddr, DataV2 dV12, DataAlarmVo alarmVo, DataStateVo stateVo){ if(alarmVo != null && controller != null){ if(alarmVo != null && controller != null && alarmVo.hasAlarm()){ MsObj msObj = new MsObj() ; msObj.put("name", "报警"); msObj.put("rtuAddr", rtuAddr); pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/rtuData/p206V202404/TkDealAlarmStatusV202404.java
@@ -12,8 +12,6 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import java.util.Date; /** * @Author liurunyu * @Date 2024/5/8 14:18 @@ -35,6 +33,7 @@ DataV202404 dV202404 = (DataV202404)d.getSubData() ; Object cdObj = dV202404.subData ; //前面任务已经判断cdObj不为null boolean toNext = false ; try{ Object[] objs = this.getTaskResults(TkPreGenObjsV202404.taskId) ; DbSv sv = (DbSv)objs[0] ; @@ -44,29 +43,62 @@ DataCd81Vo cdData = (DataCd81Vo)(cdObj) ; this.saveOrUpdateLast(sv, controller, d.getRtuAddr(), cdData.rtuDt, cdData, dV202404.dt) ; this.saveHistory(sv, controller, d.getRtuAddr(), cdData.rtuDt, cdData, dV202404.dt) ; if(cdData.statePump != null && cdData.statePump.byteValue() == AlarmVo.DevCloseState){ if(controller != null && controller.getIntakeId() != null){ this.taskResult = new Object[]{controller.getIntakeId(), AlarmVo.DevCloseState} ; toNext = true ; } } }else if(cdObj instanceof DataCd80_5BVo){ //设备终端工作上报 + 查询设备终端实时值 DataCd80_5BVo cdData = (DataCd80_5BVo)(cdObj) ; this.saveOrUpdateLast(sv, controller, d.getRtuAddr(), cdData.rtuDt, cdData, dV202404.dt) ; this.saveHistory(sv, controller, d.getRtuAddr(), cdData.rtuDt, cdData, dV202404.dt) ; if(cdData.statePump != null && cdData.statePump.byteValue() == AlarmVo.DevCloseState){ if(controller != null && controller.getIntakeId() != null){ this.taskResult = new Object[]{controller.getIntakeId(), AlarmVo.DevCloseState} ; toNext = true ; } } }else if(cdObj instanceof DataCd93_A3Vo){ //平台/APP远程关闭水泵/阀门 + 刷卡关泵/阀上报 DataCd93_A3Vo cdData = (DataCd93_A3Vo)(cdObj) ; this.saveOrUpdateLast(sv, controller, d.getRtuAddr(), cdData.endDt, cdData, dV202404.dt) ; this.saveHistory(sv, controller, d.getRtuAddr(), cdData.endDt, cdData, dV202404.dt) ; if(cdData.statePump != null && cdData.statePump.byteValue() == AlarmVo.DevCloseState){ if(controller != null && controller.getIntakeId() != null){ this.taskResult = new Object[]{controller.getIntakeId(), AlarmVo.DevCloseState} ; toNext = true ; } } }else if(cdObj instanceof DataCd84Vo){ //设备终端刷卡开泵/阀上报 DataCd84Vo cdData = (DataCd84Vo)(cdObj) ; this.saveOrUpdateLast(sv, controller, d.getRtuAddr(), cdData.openDt, cdData, dV202404.dt) ; this.saveHistory(sv, controller, d.getRtuAddr(), cdData.openDt, cdData, dV202404.dt) ; if(cdData.statePump != null && cdData.statePump.byteValue() == AlarmVo.DevCloseState){ if(controller != null && controller.getIntakeId() != null){ this.taskResult = new Object[]{controller.getIntakeId(), AlarmVo.DevCloseState} ; toNext = true ; } } }else if(cdObj instanceof DataCdC2Vo){ //设备终端开关水泵/阀门成功/失败上报 DataCdC2Vo cdData = (DataCdC2Vo)(cdObj) ; this.saveOrUpdateLast(sv, controller, d.getRtuAddr(), cdData.rtuDt, cdData, dV202404.dt) ; this.saveHistory(sv, controller, d.getRtuAddr(), cdData.rtuDt, cdData, dV202404.dt) ; if(cdData.statePump != null && cdData.statePump.byteValue() == AlarmVo.DevCloseState){ if(controller != null && controller.getIntakeId() != null){ this.taskResult = new Object[]{controller.getIntakeId(), AlarmVo.DevCloseState} ; toNext = true ; } } } }catch (Exception e){ log.error("保存控制器报警和状态数据时发生异常", e); } if(toNext){ this.toNextTasks(d); } } /** @@ -101,21 +133,20 @@ alarmVo==null?null:alarmVo.alarmWaterMeterBreak, alarmVo==null?null:alarmVo.alarmEleMeterFault, alarmVo==null?null:alarmVo.alarm0MoneyRemain, alarmVo==null?null:alarmVo.alarmInnerDoor, alarmVo==null?null:alarmVo.alarmOuterDoor, alarmVo==null?null:alarmVo.alarmDoor, alarmVo==null?null:alarmVo.alarmDoor,//2025-02-19机箱外门报警项改为电池电压了 alarmVo==null?null:alarmVo.alarmEleMiss, alarmVo==null?null:alarmVo.alarmEleExceed, alarmVo==null?null:alarmVo.alarmEleLowVolt, alarmVo==null?null:alarmVo.stateIcEnable, (byte)0,//电池电压(1:报警,0:正常) (byte)0,//阀门报警(1:报警,0:正常) alarmVo==null?null:alarmVo.alarmBatteryVolt,//电池电压(1:报警,0:正常) alarmVo==null?null:alarmVo.alarmBlockValve,//阀门堵转报警(1:报警,0:正常) (byte)0,//供电方式(0: 220V,1:蓄电池) System.currentTimeMillis() ) ; sv.saveRmAlarmStateLast(po) ; }else{ po = this.update(po, controller, rtuDt, alarmVo, receiveDt) ; this.updateVirCardNoUseState(sv, controller, alarmVo) ; sv.updateRmAlarmStateLast(po); } } @@ -150,14 +181,14 @@ alarmVo==null?null:alarmVo.alarmWaterMeterBreak, alarmVo==null?null:alarmVo.alarmEleMeterFault, alarmVo==null?null:alarmVo.alarm0MoneyRemain, alarmVo==null?null:alarmVo.alarmInnerDoor, alarmVo==null?null:alarmVo.alarmOuterDoor, alarmVo==null?null:alarmVo.alarmDoor, alarmVo==null?null:alarmVo.alarmDoor,//2025-02-19机箱外门报警项改为电池电压了 alarmVo==null?null:alarmVo.alarmEleMiss, alarmVo==null?null:alarmVo.alarmEleExceed, alarmVo==null?null:alarmVo.alarmEleLowVolt, alarmVo==null?null:alarmVo.stateIcEnable, (byte)0,//电池电压(1:报警,0:正常) (byte)0,//阀门报警(1:报警,0:正常) alarmVo==null?null:alarmVo.alarmBatteryVolt,//电池电压(1:报警,0:正常) alarmVo==null?null:alarmVo.alarmBlockValve,//阀门堵转报警(1:报警,0:正常) (byte)0//供电方式(0: 220V,1:蓄电池) ) ; sv.saveRmAlarmStateHistory(po) ; @@ -192,32 +223,16 @@ po.alarmWaterMeterBreak = alarmVo.alarmWaterMeterBreak ; po.alarmEleMeterFault = alarmVo.alarmEleMeterFault ; po.alarm0MoneyRemain = alarmVo.alarm0MoneyRemain ; po.alarmInnerDoor = alarmVo.alarmInnerDoor ; po.alarmOuterDoor = alarmVo.alarmOuterDoor ; po.alarmInnerDoor = alarmVo.alarmDoor; po.alarmOuterDoor = alarmVo.alarmDoor; po.alarmEleMiss = alarmVo.alarmEleMiss ; po.alarmEleExceed = alarmVo.alarmEleExceed ; po.alarmEleLowVolt = alarmVo.alarmEleLowVolt ; po.stateIcEnable = alarmVo.stateIcEnable ; po.alarmBatteryVolt = alarmVo.alarmBatteryVolt ; po.alarmValve = alarmVo.alarmBlockValve; } return po ; } /** * 虚拟卡在取水中的占用状态改为非应用状态 */ private void updateVirCardNoUseState(DbSv sv, PrController controller, AlarmVo alarmVo){ if(alarmVo != null){ if(alarmVo.statePump != null && alarmVo.statePump.byteValue() == 0){ //阀门关闭状态 if(controller != null && controller.getIntakeId() != null){ //虚拟卡在取水中的占用状态改为非应用状态 Date now = new Date() ; sv.updateVirCardNoUseState(controller.getIntakeId(), now); } } } } } pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/rtuData/p206V202404/TkDealVirCardStateV202404.java
New file @@ -0,0 +1,43 @@ package com.dy.rtuMw.server.rtuData.p206V202404; import com.dy.common.mw.protocol.p206V202404.upVos.AlarmVo; import com.dy.rtuMw.server.rtuData.TaskSurpport; import com.dy.rtuMw.server.rtuData.dbSv.DbSv; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import java.util.Date; /** * @Author: liurunyu * @Date: 2024/8/9 9:49 * @Description */ public class TkDealVirCardStateV202404 extends TaskSurpport { private static final Logger log = LogManager.getLogger(TkDealVirCardStateV202404.class.getName()) ; //类ID,一定与Tree.xml配置文件中配置一致 public static final String taskId = "TkDealVirCardStateV202404" ; /** * 执行节点任务:虚拟卡在取水口上的占用状态改为非占用状态 * @param data 需要处理的数据 */ @Override public void execute(Object data) { Object[] objs = this.getTaskResults(TkDealAlarmStatusV202404.taskId); if(objs != null && objs.length >= 2){ Long intakeId = (Long)objs[0] ; Byte valveState = (Byte)objs[1] ; if(intakeId != null && valveState.byteValue() == AlarmVo.DevCloseState){ objs = this.getTaskResults(TkPreGenObjsV202404.taskId); DbSv sv = (DbSv) objs[0]; //虚拟卡在取水口上的占用状态改为非占用状态 Date now = new Date() ; sv.updateVirCardNoUseState(intakeId, now); } } } } pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/rtuData/p206V202404/TkPreGenObjsV202404.java
@@ -3,10 +3,12 @@ import com.dy.common.mw.protocol.Command; import com.dy.common.mw.protocol.CommandType; import com.dy.common.mw.protocol.Data; import com.dy.common.mw.protocol.p206V202404.CodeV202404; import com.dy.common.mw.protocol.p206V202404.*; import com.dy.common.mw.protocol.p206V202404.upVos.*; import com.dy.common.springUtil.SpringContextUtil; import com.dy.pipIrrGlobal.pojoPr.PrController; import com.dy.pipIrrGlobal.pojoPr.PrControllerTramp; import com.dy.pipIrrGlobal.pojoSe.SeClient; import com.dy.rtuMw.server.ServerProperties; import com.dy.rtuMw.server.rtuData.TaskSurpport; import com.dy.rtuMw.server.rtuData.dbSv.DbSv; @@ -16,11 +18,16 @@ import java.text.ParseException; import java.util.Date; import java.util.HashMap; import java.util.Map; /** * @Author liurunyu * @Date 2024/5/8 14:18 */ public class TkPreGenObjsV202404 extends TaskSurpport { private static final Map<String, Boolean> onceUpDataRtus = new HashMap<>(); private static final Logger log = LogManager.getLogger(TkPreGenObjsV202404.class.getName()) ; @@ -35,10 +42,24 @@ public void execute(Object data) throws ParseException { Data d = (Data)data ; String rtuAddr = d.getRtuAddr() ;//TkRtuData里判断了rtuAddr为空 DbSv sv = (DbSv) SpringContextUtil.getBean(DbSv.class) ; if(d.subData != null && d.subData instanceof DataV202404){ DataV202404 dataV1 = (DataV202404)d.subData ; if(dataV1.subData != null && dataV1.subData instanceof DataCd02Vo){ //过滤掉心跳数据 if(onceUpDataRtus.containsKey(rtuAddr)){ return ; } } } if(!onceUpDataRtus.containsKey(rtuAddr)){ onceUpDataRtus.put(rtuAddr, true) ; } DbSv sv = SpringContextUtil.getBean(DbSv.class) ; if(sv != null){ PrController controller = sv.getControllersByRtuAddrAndIntakeNotNull(rtuAddr) ; PrControllerTramp controllerTramp = null ; SeClient clientVo = null ;//这个值对象中只有id、name、address会有值 if(controller == null){ //数据库中未查询到控制器(RTU实体)(已经绑定且控制器地址相符) //流浪者控制器 @@ -49,9 +70,13 @@ //第一次发现,下发清空RTU历史命令,以使其重新开始记录新地点的数据 this.sendClearCommand(rtuAddr, d.protocol); } }else{ if(d.subData != null && d.subData instanceof DataV202404){ clientVo = this.getClient(sv, (DataV202404)d.subData); } } //不论是否为流浪控制器(RTU实体),都要进行下步工作,记录其上报的一些数据,当绑定控制器后,数据自动有了归属 this.taskResult = new Object[]{sv, controller, controllerTramp} ; this.taskResult = new Object[]{sv, controller, controllerTramp, clientVo} ; this.toNextTasks(data); }else{ log.error("严重错误,未能得到DbSv对象"); @@ -59,6 +84,41 @@ } /** * 得到相关农户信息 */ private SeClient getClient(DbSv sv, DataV202404 d1){ SeClient clientVo = null ; if(d1.subData != null && (d1.subData instanceof DataCd84Vo || d1.subData instanceof DataCd85Vo || d1.subData instanceof DataCd80_5BVo)){ //开阀报,关阀报,阀开工作报 String icCardAddr = null ; String icCardNo = null ; if(d1.subData instanceof DataCd84Vo){ DataCd84Vo vo = (DataCd84Vo)d1.subData ; icCardAddr = vo.icCardAddr ; icCardNo = vo.icCardNo ; }else if(d1.subData instanceof DataCd85Vo){ DataCd85Vo vo = (DataCd85Vo)d1.subData ; icCardAddr = vo.icCardAddr ; icCardNo = vo.icCardNo ; }else if(d1.subData instanceof DataCd80_5BVo){ DataCd80_5BVo vo = (DataCd80_5BVo)d1.subData ; icCardAddr = vo.icCardAddr ; icCardNo = vo.icCardNo ; } if(icCardAddr != null && icCardNo != null){ if(icCardAddr.equals(ProtocolConstantV206V202404.vsCardAddr)){ clientVo = sv.getClientIdAndNameByVsCardNo(icCardNo) ; }else{ clientVo = sv.getClientIdAndNameByCardAddrAndCardNo(icCardAddr, icCardNo) ; } } } return clientVo ; } /** * 发送清空RTU的命令 * @param rtuAddr * @param protocol pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/resources/RtuDataDealTree.xml
@@ -18,7 +18,7 @@ <task id="TkDealAlarmStatus" name="控制器报警与状态及向钉钉发送报警信息" enable="true" class="com.dy.rtuMw.server.rtuData.p206V1.TkDealAlarmStatus"> <task id="TkDealVirCardState" name="虚拟卡占用状态恢复" enable="true" class="com.dy.rtuMw.server.rtuData.p206V1.TkDealVirCardState" /> </task> <task id="TkDealOnHourReport" name="控制器自报数据(定点报)(功能码C0)" enable="true" class="com.dy.rtuMw.server.rtuData.p206V1.TkDealOnHourReport" /> <task id="TkDealOnHourReport" name="控制器自报数据(整点报)(功能码C0)" enable="true" class="com.dy.rtuMw.server.rtuData.p206V1.TkDealOnHourReport" /> <task id="TkDealWorkReport" name="控制器阀开工作上报(功能码84)" enable="true" class="com.dy.rtuMw.server.rtuData.p206V1.TkDealWorkReport" /> <task id="TkDealOpenValveReport" name="控制器开阀上报(功能码83)" enable="true" class="com.dy.rtuMw.server.rtuData.p206V1.TkDealOpenValveReport" /> <task id="TkDealCloseValveReport" name="控制器关阀上报(功能码83)" enable="true" class="com.dy.rtuMw.server.rtuData.p206V1.TkDealCloseValveReport" /> @@ -46,7 +46,7 @@ <task id="TkDealAlarmStatusV2" name="控制器报警与状态及向钉钉发送报警信息" enable="true" class="com.dy.rtuMw.server.rtuData.p206V2.TkDealAlarmStatusV2"> <task id="TkDealVirCardStateV2" name="虚拟卡占用状态恢复" enable="true" class="com.dy.rtuMw.server.rtuData.p206V2.TkDealVirCardStateV2" /> </task> <task id="TkDealOnHourReportV2" name="控制器自报数据(定点报)(功能码C0)" enable="true" class="com.dy.rtuMw.server.rtuData.p206V2.TkDealOnHourReportV2" /> <task id="TkDealOnHourReportV2" name="控制器自报数据(整点报)(功能码C0)" enable="true" class="com.dy.rtuMw.server.rtuData.p206V2.TkDealOnHourReportV2" /> <task id="TkDealWorkReportV2" name="控制器阀开工作上报(功能码84)" enable="true" class="com.dy.rtuMw.server.rtuData.p206V2.TkDealWorkReportV2" /> <task id="TkDealOpenValveReportV2" name="控制器开阀上报(功能码83)" enable="true" class="com.dy.rtuMw.server.rtuData.p206V2.TkDealOpenValveReportV2" /> <task id="TkDealCloseValveReportV2" name="控制器关阀上报(功能码83)" enable="true" class="com.dy.rtuMw.server.rtuData.p206V2.TkDealCloseValveReportV2" /> @@ -71,9 +71,11 @@ <task id="TkDealControllerNoTrampV202404" name="非流浪者RTU" enable="true" class="com.dy.rtuMw.server.rtuData.p206V202404.TkDealControllerNoTrampV202404"> <!-- 识别非命令应答上行数据 --> <task id="TkFindReportV202404" name="识别非命令应答上行数据" enable="true" class="com.dy.rtuMw.server.rtuData.p206V202404.TkFindReportV202404"> <task id="TkDealAlarmStatusV202404" name="控制器报警与状态" enable="true" class="com.dy.rtuMw.server.rtuData.p206V202404.TkDealAlarmStatusV202404" /> <task id="TkDealAlarmStatusV202404" name="控制器报警与状态及向钉钉发送报警信息" enable="true" class="com.dy.rtuMw.server.rtuData.p206V202404.TkDealAlarmStatusV202404"> <task id="TkDealVirCardStateV202404" name="虚拟卡占用状态恢复" enable="true" class="com.dy.rtuMw.server.rtuData.p206V202404.TkDealVirCardStateV202404" /> </task> <task id="TkDealWorkingReportV202404" name="控制器工作报(功能码80)" enable="true" class="com.dy.rtuMw.server.rtuData.p206V202404.TkDealWorkingReportV202404" /> <task id="TkDealTimingReportV202404" name="控制器定时上报(功能码83)" enable="true" class="com.dy.rtuMw.server.rtuData.p206V202404.TkDealTimingReportV202404" /> <task id="TkDealTimingReportV202404" name="控制器定时(一天一次)上报(功能码83)" enable="true" class="com.dy.rtuMw.server.rtuData.p206V202404.TkDealTimingReportV202404" /> <task id="TkDealOpenValveReportV202404" name="控制器开阀上报(功能码84)" enable="true" class="com.dy.rtuMw.server.rtuData.p206V202404.TkDealOpenValveReportV202404" /> <task id="TkDealCloseValveReportV202404" name="控制器关阀上报(功能码85)" enable="true" class="com.dy.rtuMw.server.rtuData.p206V202404.TkDealCloseValveReportV202404" /> </task>