示例#1
0
        /// <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);
        }
示例#2
0
        /// <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);
        }