Просмотр исходного кода

增加带时间标度化值的报文 优化cp56时间

(cherry picked from commit 0548e6eded56bf75c17c09251bcbd6743e72d55d)
xiuwei 2 лет назад
Родитель
Сommit
9c5b746a9d

+ 128 - 0
protocol-iec104/src/main/java/wei/yigulu/iec104/asdudataframe/ShortIntegerWithTimeType.java

@@ -0,0 +1,128 @@
+package wei.yigulu.iec104.asdudataframe;
+
+
+import io.netty.buffer.ByteBuf;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import wei.yigulu.iec104.apdumodel.Apdu;
+import wei.yigulu.iec104.apdumodel.Asdu;
+import wei.yigulu.iec104.apdumodel.Vsq;
+import wei.yigulu.iec104.asdudataframe.qualitydescription.IeMeasuredQuality;
+import wei.yigulu.iec104.asdudataframe.typemodel.IeProofreadTime;
+import wei.yigulu.iec104.asdudataframe.typemodel.IeShortFloat;
+import wei.yigulu.iec104.asdudataframe.typemodel.IeShortInteger;
+import wei.yigulu.iec104.asdudataframe.typemodel.InformationBodyAddress;
+import wei.yigulu.iec104.exception.Iec104Exception;
+import wei.yigulu.iec104.nettyconfig.TechnicalTerm;
+
+import java.util.ArrayList;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 104的标度化值数据帧
+ *
+ * @author 修唯xiuwei
+ * @version 3.0
+ */
+@NoArgsConstructor
+@Data
+public class ShortIntegerWithTimeType extends AbstractDataFrameType {
+
+	/**
+	 * TYPEID
+	 */
+	public static final int TYPEID = TechnicalTerm.SHORT_INTEGER_TYPE_TIME;
+
+	private List<InformationBodyAddress> addresses = new ArrayList<>();
+
+	private List<ShortIntegerAndQualityWithTime> datas = new ArrayList<>();
+
+
+	@Override
+	public void loadByteBuf(ByteBuf is, Vsq vsq) {
+		try {
+			if (vsq.getSq() == 0) {
+				for (int i = 0; i < vsq.getNum(); i++) {
+					addresses.add(new InformationBodyAddress(is));
+					datas.add(new ShortIntegerAndQualityWithTime(is));
+				}
+			} else {
+				addresses.add(new InformationBodyAddress(is));
+				for (int i = 0; i < vsq.getNum(); i++) {
+					datas.add(new ShortIntegerAndQualityWithTime(is));
+				}
+			}
+		}catch (Iec104Exception e){
+			if(e.getCode()==3301){
+				return;
+			}
+		}
+	}
+
+
+	@Override
+	public void encode(List<Byte> buffer) {
+
+	}
+
+	@Override
+	public Asdu generateBack() {
+		Asdu asdu = new Asdu();
+		asdu.setTypeId(35);
+		asdu.setDataFrame(this);
+		asdu.getVsq().setSq(this.addresses.size() == 1 ? 1 : 0);
+		asdu.getVsq().setNum(this.datas.size());
+		asdu.setOriginatorAddress(0);
+		asdu.setCommonAddress(1);
+		return asdu;
+	}
+
+
+
+	@Override
+	public byte[][] handleAndAnswer(Apdu apdu) throws Exception {
+		return null;
+	}
+
+
+	@Override
+	public String toString() {
+		StringBuilder s = new StringBuilder("带时长标度化值");
+		if (addresses.size() == 1) {
+			s.append("连续寻址\n");
+			s.append(addresses.get(0).toString() + "\n");
+			int i=0;
+			for (ShortIntegerAndQualityWithTime e : datas) {
+				s.append("点位:"+(addresses.get(0).getAddress()+(i++))+",");
+				s.append("值为 :" + e.getValue() + ";" + e.getQuality() + "; 时间:"+e.getTime()+"\n");
+			}
+		} else {
+			s.append("单一寻址\n");
+			int f = 0;
+			for (ShortIntegerAndQualityWithTime i : datas) {
+				s.append("点位:"+(addresses.get(f++).getAddress())+",");
+				s.append("值为 :" + i.getValue() + ";" + i.getQuality() + "; 时间:"+i.getTime()+"\n");
+			}
+		}
+		return s.toString();
+	}
+
+
+	@AllArgsConstructor
+	@Data
+	class ShortIntegerAndQualityWithTime {
+
+		Integer value;
+		IeMeasuredQuality quality;
+		IeProofreadTime time;
+
+		public ShortIntegerAndQualityWithTime(ByteBuf is) throws Iec104Exception {
+			this.value=new IeShortInteger(is).getValue();
+			this.quality=new IeMeasuredQuality(is);
+			this.time=new IeProofreadTime(is);
+		}
+	}
+}

+ 6 - 6
protocol-iec104/src/main/java/wei/yigulu/iec104/asdudataframe/typemodel/IeProofreadTime.java

@@ -12,7 +12,7 @@ import wei.yigulu.iec104.exception.Iec104Exception;
 import java.util.List;
 
 /**
- * 对时帧的具体时标实体类
+ * 对时帧的具体时标实体类 cp56
  *
  * @author 修唯xiuwei
  * @version 3.0
@@ -39,11 +39,11 @@ public class IeProofreadTime {
 		byte[] btime = new byte[7];
 		is.readBytes(btime);
 		int milliSecond = (btime[0] & 0xff) + ((btime[1] & 0xff) << 8);
-		int minute = btime[2] & 0xff;
-		int hour = btime[3] & 0xff;
-		int day = btime[4] & 0xff;
-		int month = btime[5] & 0xff;
-		int year = btime[6] & 0xff;
+		int minute = btime[2] & 0x3f;
+		int hour = btime[3] & 0x1f;
+		int day = btime[4] & 0x1f;
+		int month = btime[5] & 0x0f;
+		int year = btime[6] & 0x7f;
 		String s = "20" + String.format("%02d", year) + "-" + String.format("%02d", month) + "-" + String.format("%02d", day) + " "
 				+ String.format("%02d", hour) + ":" + String.format("%02d", minute) + ":" + String.format("%02d", milliSecond / 1000) + ":" +
 				String.format("%02d", milliSecond % 1000);

+ 5 - 0
protocol-iec104/src/main/java/wei/yigulu/iec104/nettyconfig/TechnicalTerm.java

@@ -108,6 +108,11 @@ public class TechnicalTerm {
 	 */
 	public static final Integer SHORT_FLOAT_TYPE = 13;
 	/**
+	 * 测量值,标度化值 带时标
+	 */
+	public static final Integer SHORT_INTEGER_TYPE_TIME = 35;
+
+	/**
 	 * 测量值,短浮点数 带时标
 	 */
 	public static final Integer SHORT_FLOAT_TYPE_TIME = 36;