コード例 #1
0
            /// <summary>
            /// Считывает необходимый параметр с счётчика
            /// </summary>
            /// <param name="OBIS">Обис код параметра</param>
            /// <returns>Значение считываетмого параметра</returns>
            private string getCOSEMValue(byte[] OBIS)
            {
                byte[] classID_COSEM = new byte[] { 0x00, 0x03 };
                byte[] readAttribyte = new byte[] { 1, 2, 3 };

                XDLMS_Structure_C3 xDLMS_Structure_C3 = new XDLMS_Structure_C3();

                byte[] reguestData = xDLMS_Structure_C3.GetRequestWithList(
                    classID_COSEM,
                    OBIS,
                    readAttribyte);

                XDLMS_Structure_C4 xDLMS_Structure_C4 = new XDLMS_Structure_C4();

                //Порядковый номер передаваемого пакета
                hDLC_FrameManager.No_SendFrame++;

                //Ответ на команду запроса
                HDLC_Response hDLC_Response = hDLC_FrameManager.parseHDLCresponse(
                    HDLC_FrameManager.sendCommadToMeter(
                        hDLC_FrameManager.createFrame_I(hDLC_FrameManager.No_SendFrame, hDLC_FrameManager.No_ReseivedFrame, false, true, reguestData),
                        serialPort));

                COSEM_Object value = new Class_3_Ver_0();

                xDLMS_Structure_C4.GetResponseWithList(hDLC_Response.Data, ref value);

                string valuePhase = string.Format("{0:0.00000}", (((Class_3_Ver_0)value).Value * Math.Pow(10, ((Class_3_Ver_0)value).Scaler)));

                return(valuePhase);
            }
コード例 #2
0
        public void GetResponseWithList(byte[] dataByte, ref COSEM_Object classObject)
        {
            //E6 E7 00 C4 03 81 03 00 09 06 01 00 48 07 00 FF 00 06 00 00 5D 61 00 02 02 0F FE 16 23

            //8 байт должен быть 0 если не ноль то код ошибки
            //9 байт формат
            //10 кол-во
            //02 02 тип данных структ и кол-во полей
            //0F тип поля первого поля
            //FE - значение
            //16 - тип данных Enum
            //23 тип значения (едизм)

            //Тип структуры и метод
            byte[] noStructAndMethod = { 0xC4, 0x03 };

            //Проверка, что начало HDLC пакета
            for (int i = 0; i < base.StartByteOldHDLCProtocholReques.Length; i++)
            {
                if (dataByte[i] != StartByteOldHDLCProtocholReques[i])
                {
                    throw new FormatException("Неверный формат полученного пакета");
                }
            }

            //Проверка на то, что верный класс структуры и верный метод
            for (int i = 0; i < noStructAndMethod.Length; i++)
            {
                if (dataByte[i + 3] != noStructAndMethod[i])
                {
                    throw new FormatException("Неверный формат полученного пакета");
                }
            }

            base.InvokeIdAndPriority = dataByte[5];

            //Количество пересылаемых атрибутов
            int amountResponce = dataByte[6];

            dynamic[] respounce = new dynamic[amountResponce];

            //Начало прсинга
            int arrayIndex = 7;

            //Проверка на наличие кода ошибки в ответ
            if (dataByte[arrayIndex] != 0x00)
            {
                throw new Exception("Получена ошибка в getResponse структуре, номер ошибки " + dataByte[arrayIndex].ToString("x2"));
            }

            //Индекc распарсенного ответа
            int responceIndex = 0;

            while (arrayIndex < dataByte.Length - 1)
            {
                //Смещение после полученного ответа
                int indexOffset = 1;

                //Если вернулся код ошибки
                if (dataByte[arrayIndex] != 0x00)
                {
                    throw new Exception("Получена ошибка в getResponse структуре, номер ошибки " + dataByte[arrayIndex].ToString("x2"));
                }
                arrayIndex++;

                respounce[responceIndex] = parseBytesAndGetValue(arrayIndex, ref dataByte, ref indexOffset);
                responceIndex++;
                arrayIndex += indexOffset;
            }

            //Если это Class_3
            if (classObject is Class_3_Ver_0)
            {
                Class_3_Ver_0 class_3_Ver_0 = classObject as Class_3_Ver_0;
                class_3_Ver_0.setLogical_name(respounce[0]);
                class_3_Ver_0.Value  = respounce[1];
                class_3_Ver_0.Scaler = respounce[2][0];
                class_3_Ver_0.Units  = COSEM_Object.getUnits(respounce[2][1]);
            }
        }