/// <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); }
/// <summary> /// Закрывает соединение с счётчиком /// </summary> public void closeConnectWithMeter() { bool disc = false; string commandType = ""; for (int i = 0; i < 3; i++) { //отправляю команду DISC счётчику, если предыдущий сеанс завершился некоректно HDLC_Response hDLC_Response = hDLC_FrameManager.parseHDLCresponse( HDLC_FrameManager.sendCommadToMeter( hDLC_FrameManager.createFrame_U(HDLC_FrameManager.U_Commands.DISC, false, true), serialPort)); //Ответ командой commandType = ((HDLC_Response_Frame_U)hDLC_Response).CommandName; //Если ответ тот, который нужен if (commandType.Equals("DM") || commandType.Equals("SARM") || commandType.Equals("UA")) { disc = true; break; } } if (!disc) { throw new Exception("Не удалось закрыть соединение с счётчиком " + commandType); } //отправляю команду DISC счётчику, если предыдущий сеанс завершился некоректно HDLC_Response hDLC_Response_DISC = hDLC_FrameManager.parseHDLCresponse( HDLC_FrameManager.sendCommadToMeter( hDLC_FrameManager.createFrame_U(HDLC_FrameManager.U_Commands.DISC, false, true), serialPort)); }
/// <summary> /// Установка соединения с счётчиком электроэнергии /// </summary> public void getConnectToMeter() { //отправляю команду DISC счётчику, если предыдущий сеанс завершился некоректно HDLC_Response hDLC_Response_DISC = hDLC_FrameManager.parseHDLCresponse( HDLC_FrameManager.sendCommadToMeter( hDLC_FrameManager.createFrame_U(HDLC_FrameManager.U_Commands.DISC, false, true), serialPort)); //Ответ командой string commandType = ((HDLC_Response_Frame_U)hDLC_Response_DISC).CommandName; //Если ответ не тот, который нужен, то это ошибка DM? if (!(commandType.Equals("UA") || commandType.Equals("SARM"))) { throw new FormatException("Ответ счётчика на команду DISC " + commandType); } //SNRM HDLC_Response hDLC_Response_SNRM = hDLC_FrameManager.parseHDLCresponse( HDLC_FrameManager.sendCommadToMeter( hDLC_FrameManager.createFrame_U(HDLC_FrameManager.U_Commands.SNRM, false, true), serialPort)); commandType = ((HDLC_Response_Frame_U)hDLC_Response_SNRM).CommandName; //AARQ установка соединения HDLC_Response hDLC_Response_AARQ = hDLC_FrameManager.parseHDLCresponse( HDLC_FrameManager.sendCommadToMeter( hDLC_FrameManager.getAARQopenConnect(hDLC_FrameManager.No_SendFrame, hDLC_FrameManager.No_ReseivedFrame, passMeter), serialPort)); }