/// <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); }
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]); } }