Ejemplo n.º 1
0
        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();
        }
Ejemplo n.º 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);
        }