/// <summary> /// 添加一个信息体 /// </summary> /// <param name="io">信息体对象</param> public void AddInformationObject(InformationObject io) { if (informationObjects == null) { informationObjects = new List <InformationObject>(); } if (hasTypeId) { //类型标识不同的,直接异常,不予以添加 if (io.Type != typeId) { throw new ArgumentException("Invalid information object type: expected " + typeId.ToString() + " was " + io.Type.ToString()); } } else { //初始化的时候没有设置类型标识,则在赋值的时候确认类型标识 typeId = io.Type; hasTypeId = true; } //增加对象 informationObjects.Add(io); //修改数量 vsq = (byte)((vsq & 0x80) | informationObjects.Count); }
/// <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); }