瀏覽代碼

功图采集数据处理增加衍生参数的计算、入库(上下行最大,平衡度),修复电流图、功率图位移数据重复

chenwen 1 年之前
父節點
當前提交
b1cf44d292

+ 82 - 0
src/main/java/com/hb/proj/gather/model/DiagramPO.java

@@ -23,6 +23,16 @@ public class DiagramPO {
 	
 	private Date  gatherTime;
 	
+	private Float upstrokeMax;  //上冲程最大(y值)采集后计算
+	private Float dwnstrokeMax; //下冲程最大(y值)采集后计算
+	private Float stroke; //冲程 采集后计算
+	private Float glbMax; //最大y值
+	private Float glbMin; //最小y值
+	private Double balance; //平衡度,百分数
+	private Boolean startup; //起始是上行
+	private Integer turnIndex; //上下行切换点索引
+	private Double freq; //冲次
+	
 	public DiagramPO() {
 		
 	}
@@ -83,4 +93,76 @@ public class DiagramPO {
 	public void setWellParam(String wellParam) {
 		this.wellParam = wellParam;
 	}
+
+	public Float getUpstrokeMax() {
+		return upstrokeMax;
+	}
+
+	public void setUpstrokeMax(Float upstrokeMax) {
+		this.upstrokeMax = upstrokeMax;
+	}
+
+	public Float getDwnstrokeMax() {
+		return dwnstrokeMax;
+	}
+
+	public void setDwnstrokeMax(Float dwnstrokeMax) {
+		this.dwnstrokeMax = dwnstrokeMax;
+	}
+
+	public Float getStroke() {
+		return stroke;
+	}
+
+	public void setStroke(Float stroke) {
+		this.stroke = stroke;
+	}
+
+	public Float getGlbMax() {
+		return glbMax;
+	}
+
+	public void setGlbMax(Float glbMax) {
+		this.glbMax = glbMax;
+	}
+
+	public Float getGlbMin() {
+		return glbMin;
+	}
+
+	public void setGlbMin(Float glbMin) {
+		this.glbMin = glbMin;
+	}
+
+	public Double getBalance() {
+		return balance;
+	}
+
+	public void setBalance(Double balance) {
+		this.balance = balance;
+	}
+
+	public Boolean getStartup() {
+		return startup;
+	}
+
+	public void setStartup(Boolean startup) {
+		this.startup = startup;
+	}
+
+	public Integer getTurnIndex() {
+		return turnIndex;
+	}
+
+	public void setTurnIndex(Integer turnIndex) {
+		this.turnIndex = turnIndex;
+	}
+
+	public Double getFreq() {
+		return freq;
+	}
+
+	public void setFreq(Double freq) {
+		this.freq = freq;
+	}
 }

+ 11 - 3
src/main/java/com/hb/proj/gather/process/DataTransRepTask.java

@@ -6,6 +6,7 @@ import org.slf4j.LoggerFactory;
 import com.hb.proj.gather.model.DiagramPO;
 import com.hb.proj.gather.model.WellParamVO;
 import com.hb.proj.gather.rep.GatherDataRepService;
+import com.hb.proj.gather.rep.RedisRepComponent;
 import com.hb.xframework.util.ApplicationContextUtils;
 
 /**
@@ -34,13 +35,20 @@ public class DataTransRepTask implements Runnable{
 				return;
 			}
 			
+			//数据转换,图形衍生参数计算
 			diagramPO.setWellParam(paramConfig.getParamId());
-			DataTransUtils.transMulti(diagramPO, paramConfig); //数据转换
+			DataTransUtils.transMulti(diagramPO, paramConfig);
 			
+			//绑定当前的冲次数据(单值实时数据)
+			RedisRepComponent repRedis=ApplicationContextUtils.getBean("redisRepComponent", RedisRepComponent.class);
+			Object rtFreq=repRedis.get(paramConfig.getWellId(), "freq");
+			diagramPO.setFreq((Double)rtFreq);
+			
+			//图形数据入库
 			GatherDataRepService repService=ApplicationContextUtils.getBean("gatherDataRepService", GatherDataRepService.class);
-			repService.save(diagramPO);  //入库
+			repService.save(diagramPO);
 			
-			logger.info("数据转换入库完成:{}",diagramPO.getParamCode());
+			logger.info("数据转换入库完成:{},{}",diagramPO.getParamCode(),diagramPO.getDisps().size());
 		}
 		catch(Exception e) {
 			e.printStackTrace();

+ 90 - 0
src/main/java/com/hb/proj/gather/process/DataTransUtils.java

@@ -2,6 +2,7 @@ package com.hb.proj.gather.process;
 
 import java.text.DecimalFormat;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 
 import org.apache.commons.lang3.StringUtils;
@@ -55,12 +56,19 @@ public class DataTransUtils {
 		return Float.parseFloat(String.format("%.3f", d));
 	}
 	
+	/**
+	 * 数据标定、单位转换(采集单位->入库单位),衍生参数计算
+	 * @param diaramData
+	 * @param wp
+	 */
 	public static void transMulti(DiagramPO diaramData,WellParamVO  wp) {
 		
 		List<Float> datas=transMulti(diaramData.getOths(),wp.getCalibrateA(),wp.getCalibrateB(),wp.getCalibrateC(),wp.getGatInsScale());
 		diaramData.setOths(datas);
 		datas=transMulti(diaramData.getDisps(),wp.getCalibrateA2(),wp.getCalibrateB2(),wp.getCalibrateC2(),wp.getGatInsScale2());
 		diaramData.setDisps(datas);
+		
+		bindCalcParam(diaramData);
 	}
 	
 	public static List<Float> transMulti(List<Float> datas,Double calA,Double calB,Double calC,Double unitScale) {
@@ -83,4 +91,86 @@ public class DataTransUtils {
 		return rtndatas;
 	}
 	
+	/**
+	 * 绑定计算参数 用于电流图(上行最大、下行最大、平衡度)
+	 * 参数单位基于源数据单位即入库单位
+	 * @param diaramData
+	 */
+	public static void bindCalcParam(DiagramPO diaramData) {
+		
+		List<Float> disps=diaramData.getDisps(),oths=diaramData.getOths();
+		int maxIndex=0,minIndex=0;
+		float xMin=disps.get(0),xMax=xMin;
+		float yMin=oths.get(0),yMax=yMin;
+		
+		for(int i=0,len=disps.size(),len2=oths.size();i<len && i<len2;i++) {
+			if(disps.get(i).floatValue() <= xMin) {
+				xMin=disps.get(i);
+				minIndex=i;
+			}
+			else if(disps.get(i).floatValue() >= xMax) {
+				xMax=disps.get(i);
+				maxIndex=i;
+			}
+			
+			if(oths.get(i).floatValue() < yMin) {
+				yMin=oths.get(i);
+			}
+			else if(oths.get(i).floatValue() > yMax) {
+				yMax=oths.get(i);
+			}
+			
+		}
+		
+		boolean startup=(xMax-disps.get(0)) > (disps.get(0)-xMin);  //起始是上行
+		int turnIndex=(startup?maxIndex:minIndex)+1; //上下行切换点索引,另一行起点索引
+		
+		float startMax=Collections.max(oths.subList(0, turnIndex));
+		float endMax=Collections.max(oths.subList(turnIndex,Math.min(disps.size(), oths.size())));
+		
+		diaramData.setUpstrokeMax(startup?startMax:endMax);
+		diaramData.setDwnstrokeMax(startup?endMax:startMax);
+		diaramData.setGlbMax(yMax);
+		diaramData.setGlbMin(yMin);
+		diaramData.setTurnIndex(turnIndex);
+		diaramData.setStartup(startup);
+		diaramData.setStroke(xMax);
+		
+		calcBalance(diaramData);
+	}
+	
+	//计算平衡度
+	public static void calcBalance(DiagramPO diaramData) {
+		if(DiagramPO.DIAGRAM_LOAD_CODE.equals(diaramData.getParamCode())) {
+			return;
+		}
+		
+		//电流图、功率图才计算平衡度
+		
+		double balance=0.0;
+		if(DiagramPO.DIAGRAM_CURR_CODE.equals(diaramData.getParamCode())) {
+			balance=Math.round(diaramData.getUpstrokeMax()*100*100/diaramData.getDwnstrokeMax())/100;  //百分数,带两位小数
+		}
+		else if(DiagramPO.DIAGRAM_POWER_CODE.equals(diaramData.getParamCode())) {
+			double area1=0.0,area2=0.0;
+			int len=Math.min(diaramData.getDisps().size(),diaramData.getOths().size())-1;
+			double tempArea=0.0;
+			
+			for(int i=0;i<len;i++) {
+				tempArea=Math.abs(diaramData.getDisps().get(i+1)-diaramData.getDisps().get(i))*(diaramData.getOths().get(i+1)+diaramData.getOths().get(i))/2.0;
+				if((i+1)<diaramData.getTurnIndex()){
+					area1+=tempArea;
+				}
+				else {
+					area2+=tempArea;
+				}
+			}
+			
+			balance=diaramData.getStartup()?(area1/area2):(area2/area1);
+			balance=Math.round(balance*100*100)/100;
+		}
+		
+		diaramData.setBalance(balance);
+	}
+	
 }

+ 0 - 1
src/main/java/com/hb/proj/gather/protocol/ZLOpdProtCMDEnum.java

@@ -39,7 +39,6 @@ public enum ZLOpdProtCMDEnum {
 	
 	
 	
-	
 	//196-98功图位移第1部分 01 03 03 e8 00 62  
 	DIAGRAM_DISP_1(
 			new byte[] {0x01, 0x03, 0x03, (byte)0xe8, 0x00, 0x62,        (byte)0x44, 0x53},  

+ 52 - 44
src/main/java/com/hb/proj/gather/protocol/parser/DataPieceDiagramBox.java

@@ -20,6 +20,7 @@ public class DataPieceDiagramBox {
 	
 	private Map<String,List<Float>>  pieceMap=new HashMap<String,List<Float>>(12);
 	
+	private List<Float> fullDisps=null; //完整位移序列
 	
 	public DataPieceDiagramBox(String channelSerial) {
 		this.channelSerial=channelSerial;
@@ -27,71 +28,78 @@ public class DataPieceDiagramBox {
 	
 	
 	public DiagramPO put(String pieceName,List<Float> pieceDatas) {
+		
 		pieceMap.put(pieceName, pieceDatas);
-		if(pieceName.startsWith("chartload")) {
-			return assembleDiagramLoad();
+		
+		DiagramPO diagramPO=null;
+		
+		if(pieceName.startsWith((ZLOpdProtCMDEnum.DIAGRAM_DISP_3.getParamCodes())[0])) {
+			assembleDisp((ZLOpdProtCMDEnum.DIAGRAM_DISP_1.getParamCodes())[0],
+					(ZLOpdProtCMDEnum.DIAGRAM_DISP_2.getParamCodes())[0],
+					(ZLOpdProtCMDEnum.DIAGRAM_DISP_3.getParamCodes())[0]);
 		}
-		if(pieceName.startsWith("chartcurr")) {
-			return assembleDiagramCurr();
+		else if(pieceName.startsWith((ZLOpdProtCMDEnum.DIAGRAM_LOAD_3.getParamCodes())[0])) {
+			diagramPO = assembleDiagram(DiagramPO.DIAGRAM_LOAD_CODE,
+					(ZLOpdProtCMDEnum.DIAGRAM_LOAD_1.getParamCodes())[0],
+					(ZLOpdProtCMDEnum.DIAGRAM_LOAD_2.getParamCodes())[0],
+					(ZLOpdProtCMDEnum.DIAGRAM_LOAD_3.getParamCodes())[0]); //与指令ZLOpdProtCMDEnum中配置的参数名一致
 		}
-		if(pieceName.startsWith("chartpower")) {
-			return assembleDiagramPower();
+		else if(pieceName.startsWith((ZLOpdProtCMDEnum.DIAGRAM_CURR_3.getParamCodes())[0])) {
+			diagramPO =  assembleDiagram(DiagramPO.DIAGRAM_CURR_CODE,
+					(ZLOpdProtCMDEnum.DIAGRAM_CURR_1.getParamCodes())[0],
+					(ZLOpdProtCMDEnum.DIAGRAM_CURR_2.getParamCodes())[0],
+					(ZLOpdProtCMDEnum.DIAGRAM_CURR_3.getParamCodes())[0]);
+		}
+		else if(pieceName.startsWith((ZLOpdProtCMDEnum.DIAGRAM_POWER_3.getParamCodes())[0])) {
+			diagramPO =  assembleDiagram(DiagramPO.DIAGRAM_POWER_CODE,
+					(ZLOpdProtCMDEnum.DIAGRAM_POWER_1.getParamCodes())[0],
+					(ZLOpdProtCMDEnum.DIAGRAM_POWER_2.getParamCodes())[0],
+					(ZLOpdProtCMDEnum.DIAGRAM_POWER_3.getParamCodes())[0]);
+		}
+		
+		//如果是功率图则清空位移数据(采用全部清除方式)
+		if(diagramPO!=null && DiagramPO.DIAGRAM_POWER_CODE.equals(diagramPO.getParamCode())) {
+			pieceMap.clear();
+			fullDisps=null;
 		}
-		return null;
+		
+		return diagramPO;
 	}
 	
-	public DiagramPO  assembleDiagramLoad() {
-		return assembleDiagram(DiagramPO.DIAGRAM_LOAD_CODE,
-				(ZLOpdProtCMDEnum.DIAGRAM_LOAD_1.getParamCodes())[0],
-				(ZLOpdProtCMDEnum.DIAGRAM_LOAD_2.getParamCodes())[0],
-				(ZLOpdProtCMDEnum.DIAGRAM_LOAD_3.getParamCodes())[0]); //与指令ZLOpdProtCMDEnum中配置的参数名一致
+	/**
+	 * 位移序列组装
+	 */
+	public void assembleDisp(String dispkey1,String dispkey2,String dispkey3) {
+		
+		boolean isReady=pieceMap.get(dispkey1)!=null&&pieceMap.get(dispkey2)!=null&&pieceMap.get(dispkey3)!=null;
+		if(isReady) {
+			fullDisps=pieceMap.get(dispkey1);
+			fullDisps.addAll(pieceMap.get(dispkey2));
+			fullDisps.addAll(pieceMap.get(dispkey3));
+		}
+		
+		
 	}
 	
-	public DiagramPO  assembleDiagramCurr() {
-		return assembleDiagram(DiagramPO.DIAGRAM_CURR_CODE,
-				(ZLOpdProtCMDEnum.DIAGRAM_CURR_1.getParamCodes())[0],
-				(ZLOpdProtCMDEnum.DIAGRAM_CURR_2.getParamCodes())[0],
-				(ZLOpdProtCMDEnum.DIAGRAM_CURR_3.getParamCodes())[0]);
-	}
 	
-	public DiagramPO  assembleDiagramPower() {
-		return assembleDiagram(DiagramPO.DIAGRAM_POWER_CODE,
-				(ZLOpdProtCMDEnum.DIAGRAM_POWER_1.getParamCodes())[0],
-				(ZLOpdProtCMDEnum.DIAGRAM_POWER_2.getParamCodes())[0],
-				(ZLOpdProtCMDEnum.DIAGRAM_POWER_3.getParamCodes())[0]);
-	}
 	
 	public DiagramPO  assembleDiagram(String diagramCode,String othkey1,String othkey2,String othkey3) {
 		
-		String dispCode1=(ZLOpdProtCMDEnum.DIAGRAM_DISP_1.getParamCodes())[0],
-			   dispCode2=(ZLOpdProtCMDEnum.DIAGRAM_DISP_2.getParamCodes())[0],
-			   dispCode3=(ZLOpdProtCMDEnum.DIAGRAM_DISP_3.getParamCodes())[0];
-		
-		boolean dispOk=pieceMap.get(dispCode1)!=null&&pieceMap.get(dispCode2)!=null&&pieceMap.get(dispCode3)!=null;
-		boolean othOk=pieceMap.get(othkey1)!=null&&pieceMap.get(othkey2)!=null&&pieceMap.get(othkey3)!=null;
-		
-		if(!dispOk||!othOk) {
+		if(this.fullDisps==null) {
 			return null;
 		}
 		
-		List<Float> disps=pieceMap.get(dispCode1);
-		disps.addAll(pieceMap.get(dispCode2));
-		disps.addAll(pieceMap.get(dispCode3));
+		boolean isReady=pieceMap.get(othkey1)!=null&&pieceMap.get(othkey2)!=null&&pieceMap.get(othkey3)!=null;
+		if(!isReady) {
+			return null;
+		}
 		
 		List<Float> oths=pieceMap.get(othkey1);
 		oths.addAll(pieceMap.get(othkey2));
 		oths.addAll(pieceMap.get(othkey3));
-		
 		clearPiece(othkey1,othkey2,othkey3); //组装功图后,清除原数据,避免轮询检测发现还有数据又进行功图的组装
 		
-		DiagramPO po = new DiagramPO(channelSerial,diagramCode,disps,oths);
-		
-		//如果是功率则清空位移数据
-		if(DiagramPO.DIAGRAM_POWER_CODE.equalsIgnoreCase(diagramCode)) {
-			clearPiece(dispCode1,dispCode2,dispCode3);
-		}
-		
-		return po;
+		return new DiagramPO(channelSerial,diagramCode,this.fullDisps,oths);
 		
 	}
 	

+ 7 - 7
src/main/java/com/hb/proj/gather/rep/GatherDataRepService.java

@@ -58,17 +58,17 @@ public class GatherDataRepService {
 	 */
 	public void save(DiagramPO diagramPO) {
 		String sql="""
-				insert into tzl_gather_data_multi(well_param,gather_time,data_val1,data_val2) values(?,?,?,?)
+				insert into tzl_gather_data_multi(well_param,gather_time,data_val1,data_val2,
+				freq,upstroke_max,downstroke_max,balance,stroke,glb_max,glb_min,turn_index,startup) 
+				values(?,?,?,?,?,?,?,?,?,?,?,?,?)
 				""";
 		
-		dao.exeUpdate(sql, diagramPO.getWellParam(),diagramPO.getGatherTime(),listNum2Str(diagramPO.getDisps()),listNum2Str(diagramPO.getOths()));
+		dao.exeUpdate(sql, diagramPO.getWellParam(), diagramPO.getGatherTime(), listNum2Str(diagramPO.getDisps()),
+				listNum2Str(diagramPO.getOths()),diagramPO.getFreq(),diagramPO.getUpstrokeMax(),diagramPO.getDwnstrokeMax(),
+				diagramPO.getBalance(),diagramPO.getStroke(),diagramPO.getGlbMax(),diagramPO.getGlbMin(),diagramPO.getTurnIndex(),diagramPO.getStartup());
 	}
 	
-	/*
-	 * private String list2Str(List<Float> datas) { StringBuilder strb=new
-	 * StringBuilder(datas.size()*10); for(Float d : datas) {
-	 * strb.append(","+String.valueOf(d)); } return strb.substring(1); }
-	 */
+	
 	
 	/**
 	 * 构建单值批量入库参数

+ 4 - 0
src/main/java/com/hb/proj/gather/rep/RedisRepComponent.java

@@ -23,6 +23,10 @@ public class RedisRepComponent {
 	public static final String ALARM_WELL_KEY="alarm_well_set";
 	
 	
+	public Object get(String key,String hashKey) {
+		return redisTemplate.opsForHash().get(key, hashKey);
+	}
+	
 	public void put(String key,String hashKey,Object val) {
 		redisTemplate.opsForHash().put(key, hashKey, val);
 	}