private static void TestReadAccountingITWithAddressRange() { ConnectionParameters para = new ConnectionParameters(); para.LinkAddress = 1; para.SizeOfCA = 2; LinkControlDown lc = new LinkControlDown(); lc.FCB = false; lc.FCV = true; lc.FuncCode = LinkFunctionCodeDown.UserData; T102Frame frame = new T102Frame(lc, para); ASDU asdu = new ASDU(CauseOfTransmission.ACTIVATION, false, false, 1, RecordAddress.Default, false); ReadAccountingITWithAddressRange ar = new lib102.ReadAccountingITWithAddressRange(3, 7); asdu.AddInformationObject(ar); asdu.Encode(frame, para); frame.PrepareToSend(); //todo 书上实例报文,记录地址是03,这个有点扯。。。 byte[] aa = frame.GetBuffer(); int length = aa[1]; byte linkControl = aa[4]; int linkAddr = aa[5] + aa[6] * 0x100; //解析 ASDU na = new ASDU(para, aa, length + 4 + 2); InformationObject sp = na.GetElement(0); //无数据 na.Cot = CauseOfTransmission.NO_RECORD; LinkControlUp lc2 = new LinkControlUp(); lc2.ACD = false; lc2.DFC = false; lc2.FuncCode = LinkFunctionCodeUp.NoData; T102Frame frame2 = new T102Frame(lc2, para); na.Encode(frame2, para); frame2.PrepareToSend(); //镜像报文 byte[] bb = frame2.GetBuffer(); }
/// <summary> /// 获取第n个信息对象 /// </summary> /// <param name="index">0为基底</param> /// <returns></returns> public InformationObject GetElement(int index) { InformationObject retVal = null; int elementSize; switch (typeId) { #region 根据不同的类型标识,做不同的解析 case TypeID.M_SP_TA_2: /* 1 单位遥信 */ //1个字节地址+ 1个字节内容+ 7个字节的时标 elementSize = 1 + 1 + 7; retVal = new SinglePointInformation(payload, index * elementSize, false); break; case TypeID.M_IT_TA_2: /* 2 */ //1字节地址+4字节数据+1字节标志位+1字节校核 elementSize = 1 + 4 + 1 + 1; retVal = new IntegratedTotals(payload, index * elementSize, false); break; case TypeID.M_IT_TB_2: /* 3 */ //1字节地址+3字节数据+1字节标志位+1字节校核 elementSize = 1 + 3 + 1 + 1; retVal = new IntegratedTotalsWith3Byte(payload, index * elementSize, false); break; case TypeID.M_IT_TC_2: /* 4 */ //1字节地址+2字节数据+1字节标志位+1字节校核 elementSize = 1 + 2 + 1 + 1; retVal = new IntegratedTotalsWith2Byte(payload, index * elementSize, false); break; case TypeID.M_IT_TD_2: /* 5 */ //1字节地址+4字节数据+1字节标志位+1字节校核 elementSize = 1 + 4 + 1 + 1; retVal = new PeriodIT(payload, index * elementSize, false); break; case TypeID.M_IT_TE_2: /* 6 */ //1字节地址+3字节数据+1字节标志位+1字节校核 elementSize = 1 + 3 + 1 + 1; retVal = new PeriodITWith3Byte(payload, index * elementSize, false); break; case TypeID.M_IT_TF_2: /* 7 */ //1字节地址+2字节数据+1字节标志位+1字节校核 elementSize = 1 + 2 + 1 + 1; retVal = new PeriodITWith2Byte(payload, index * elementSize, false); break; case TypeID.M_IT_TG_2: /* 8 */ //1字节地址+4字节内容+1字节标志位 elementSize = 1 + 4 + 1; retVal = new OperationalIT(payload, index * elementSize, false); break; case TypeID.M_IT_TH_2: /* 9 */ //1字节地址+3字节内容+1字节标志位 elementSize = 1 + 3 + 1; retVal = new OperationalITWith3Byte(payload, index * elementSize, false); break; case TypeID.M_IT_TI_2: /* 10 */ //1字节地址+3字节内容+1字节标志位 elementSize = 1 + 2 + 1; retVal = new OperationalITWith2Byte(payload, index * elementSize, false); break; case TypeID.M_IT_TK_2: /* 11 */ //1字节地址+4字节内容+1字节标志位 elementSize = 1 + 4 + 1; retVal = new PeriodOperationalIT(payload, index * elementSize, false); break; case TypeID.M_IT_TL_2: /* 12 */ //1字节地址+3字节内容+1字节标志位 elementSize = 1 + 3 + 1; retVal = new PeriodOperationalITWith3Byte(payload, index * elementSize, false); break; case TypeID.M_IT_TM_2: /* 13 */ //1字节地址+2字节内容+1字节标志位 elementSize = 1 + 2 + 1; retVal = new PeriodOperationalITWith2Byte(payload, index * elementSize, false); break; case TypeID.M_EI_NA_2: /* 70 */ //1字节地址+1字节内容 elementSize = 2; retVal = new EndOfInit(payload, index * elementSize, false); break; case TypeID.P_MP_NA_2: /* 71 */ //1字节日期+1字节制造厂编码+4字节产品编码 elementSize = 1 + 1 + 4; retVal = new ManufacturerSpec(payload, index * elementSize); break; case TypeID.M_TI_TA_2: /* 72 */ //7字节时标 elementSize = 7; retVal = new CurrentTime(payload, index * elementSize); break; case TypeID.C_RD_NA_2: /* 100 */ //无信息体 retVal = new ReadManufacturerSpec(); break; case TypeID.C_SP_NA_2: /* 101*/ //无信息体 elementSize = 0; retVal = new ReadSinglePoint(); break; case TypeID.C_SP_NB_2: /* 102 */ //只有一个信息体,两个5字节时标 elementSize = 10; retVal = new ReadSinglePointWithTimeRange(payload, index * elementSize); break; case TypeID.C_TI_NA_2: /* 103 */ //无信息体 elementSize = 0; retVal = new ReadCurrentTime(); break; case TypeID.C_CI_NA_2: /* 104 */ //无信息体 elementSize = 0; retVal = new ReadAccountingIT(); break; case TypeID.C_CI_NB_2: /* 105 */ //信息体包含2个字节地址 elementSize = 2; retVal = new ReadAccountingITWithAddressRange(payload, index * elementSize); break; case TypeID.C_CI_NC_2: /* 106 */ //信息体包含1个5字节时标 elementSize = 5; retVal = new ReadAccountingITWithSpecificTime(payload, index * elementSize); break; case TypeID.C_CI_ND_2: /* 107 */ //信息体包含2个字节地址+1个5字节时标 elementSize = 2 + 5; retVal = new ReadAccountingITWithSpecificTimeAndAddressRange(payload, index * elementSize); break; case TypeID.C_CI_NE_2: /* 108 */ //无信息体 elementSize = 0; retVal = new ReadPeriodAIT(); break; case TypeID.C_CI_NF_2: /* 109 */ //信息体包含2个字节地址 elementSize = 2; retVal = new ReadPeriodAITWithAddressRange(payload, index * elementSize); break; case TypeID.C_CI_NG_2: /* 110 */ //信息体包含1个5字节时标 elementSize = 5; retVal = new ReadPeriodAITWithSpecificTime(payload, index * elementSize); break; case TypeID.C_CI_NH_2: /* 111 */ //信息体包含2个字节地址+1个5字节时标 elementSize = 2 + 5; retVal = new ReadPeriodAITWithSpecificTimeAndAddressRange(payload, index * elementSize); break; case TypeID.C_CI_NI_2: /* 112 */ //无信息体 elementSize = 0; retVal = new ReadOperationalIT(); break; case TypeID.C_CI_NK_2: /* 113 */ //信息体包含2个字节地址 elementSize = 2; retVal = new ReadOperationalITWithAddressRange(payload, index * elementSize); break; case TypeID.C_CI_NL_2: /* 114 */ //信息体包含1个5字节时标 elementSize = 5; retVal = new ReadOperationalITWithSpecificTime(payload, index * elementSize); break; case TypeID.C_CI_NM_2: /* 115 */ //信息体包含2个字节地址+1个5字节时标 elementSize = 2 + 5; retVal = new ReadOperationalITWithSpecificTimeAndAddressRange(payload, index * elementSize); break; case TypeID.C_CI_NN_2: /* 116 */ //无信息体 elementSize = 0; retVal = new ReadPeriodOIT(); break; case TypeID.C_CI_NO_2: /* 117 */ //信息体包含2个字节地址 elementSize = 2; retVal = new ReadPeriodOITWithAddressRange(payload, index * elementSize); break; case TypeID.C_CI_NP_2: /* 118 */ //信息体包含1个5字节时标 elementSize = 5; retVal = new ReadPeriodOITWithSpecificTime(payload, index * elementSize); break; case TypeID.C_CI_NQ_2: /* 119 */ //信息体包含2个字节地址+1个5字节时标 elementSize = 2 + 5; retVal = new ReadPeriodOITWithSpecificTimeAndAddressRange(payload, index * elementSize); break; case TypeID.C_CI_NR_2: /* 120 */ //信息体包含2个1字节的地址+2个5字节时标 elementSize = 2 + 10; retVal = new ReadAccountingITWithTimeRangeAndAddressRange(payload, index * elementSize); break; case TypeID.C_CI_NS_2: /* 121 */ //信息体包含2个1字节的地址+2个5字节时标 elementSize = 2 + 10; retVal = new ReadPeriodAITWithTimeRangeAndAddressRange(payload, index * elementSize); break; case TypeID.C_CI_NT_2: /* 122 */ //信息体包含2个1字节的地址+2个5字节时标 elementSize = 2 + 10; retVal = new ReadOperationalITWithTimeRangeAndAddressRange(payload, index * elementSize); break; case TypeID.C_CI_NU_2: /* 123 */ //信息体包含2个1字节的地址+2个5字节时标 elementSize = 2 + 10; retVal = new ReadPeriodOITWithTimeRangeAndAddressRange(payload, index * elementSize); break; case TypeID.C_SYN_TA_2: /* 128 */ //1个7字节时标 elementSize = 7; retVal = new SyncTime(payload, index * elementSize); break; #endregion default: throw new ASDUParsingException("Unknown ASDU type id:" + typeId); } return(retVal); }