private void button4_Click(object sender, EventArgs e) { DevConnection element = ConnList.FirstOrDefault(l => l.Name == "Соединение 0" && l.Name == "Соединение 0"); if (element != null) { ConnList.Remove(element); } }
internal UDSHandler GetUDSHandler() { if (DevConnection == null) { return(null); } Envelope env = DevConnection.SendRequest("UDSManagerService.ListContracts", new Envelope()); XmlHelper h = new XmlHelper(env.Body); return(new UDSHandler(this, h.GetElement("."))); }
internal UDTHandler GetUDT() { if (DevConnection == null) { return(null); } Envelope env = DevConnection.SendRequest("UDTService.DDL.ListTableNames", new Envelope()); XmlHelper h = new XmlHelper(env.Body); return(new UDTHandler(this, h.GetElement("."))); }
internal Envelope SendRequest(string srvName, Envelope request) { try { return(this.DevConnection.SendRequest(srvName, request)); } catch (DSAServerException ex) { if (ex.Status == "511") { ReConnect(); return(DevConnection.SendRequest(srvName, request)); } else { throw; } } }
int NoAnswerCounter = 0; //счетчик неполученных ответов internal int GetState(DevConnection DevConn) { GetStateCounter++; if (DevConn.PortState == 3) { if (Protocol == 0)//используется протокол DCON { int BytesToRead = 0; try { ByteBuff[0] = Convert.ToByte('#');; string Rs485 = String.Format("{0:D2}", RS485Num); ByteBuff[1] = Convert.ToByte(Rs485[0]); ByteBuff[2] = Convert.ToByte(Rs485[1]); ByteBuff[20] = 0; for (int i = 0; i <= 2; i++) { ByteBuff[20] += ByteBuff[i]; } string CRC = String.Format("{0:X2}", ByteBuff[20]); ByteBuff[3] = Convert.ToByte(CRC[0]); ByteBuff[4] = Convert.ToByte(CRC[1]); ByteBuff[5] = 13; DevConn._serialPort.Write(ByteBuff, 0, 6); SendLettersCounter++; Thread.Sleep(SleepTime); BytesToRead = DevConn._serialPort.BytesToRead; if (BytesToRead == 19) { Array.Clear(ByteBuff, 0, ByteBuff.Length); DevConn._serialPort.Read(ByteBuff, 0, BytesToRead); //проверяем CRC ByteBuff[20] = 0; for (int i = 0; i < BytesToRead - 3; i++) { ByteBuff[20] += ByteBuff[i]; } if (ByteBuff[20] == Convert.ToInt32(ASCIIEncoding.ASCII.GetString(ByteBuff, 16, 2), 16)) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < 19; i++) { sb.Append(Convert.ToChar(ByteBuff[i])); } if (DevConn.uiSep == ",") { sb.Replace(".", ","); //заменяем точки если системный разделитель запятая } if ((float.TryParse(sb.ToString(1, 9), out float fResult1)) && (float.TryParse(sb.ToString(11, 5), out float fResult2))) { A = fResult1; Hz = fResult2; StateMess = "Ok"; NoAnswerCounter = 0; RecieveLettersCounter++; } //else //{ // ErrConvertCounter++; // A = -999; // Hz = -99; //} } else { ErrCRC++; } } else { if (BytesToRead > 0) { DevConn._serialPort.DiscardInBuffer(); } } if (NoAnswerCounter < NoAnswerLimit) { NoAnswerCounter++; } if (NoAnswerCounter == NoAnswerLimit)//нет ответа определенное время { NoAnswerCounter++; A = -999; Hz = -999; StateMess = "Нет связи с контроллером Owen 110 224.1T"; LostConnectionCounter++; } } catch (Exception ex) { ErrGetStateDevice++; //// Get stack trace for the exception with source file information //var st = new StackTrace(ex, true); //// Get the top stack frame //var frame = st.GetFrame(0); //// Get the line number from the stack frame //var line = frame.GetFileLineNumber(); //ErrGetStateDeviceMess = ex.Message+" "+ line+""+ BytesToRead; ErrGetStateDeviceMess = ex.Message; } } return(SleepTime); } else { StateMess = "Ошибка открытия порта"; A = -999; Hz = -999; return(0); } }
internal int GetSmartState(DevConnection DevConn) { int FuncSleepTime = 0; GetStateCounter++; if (isActivExchangeMode)//по запросу { } else //постоянная передача с прибора { try { int BytesToRead = DevConn._serialPort.BytesToRead; if (BytesToRead > 0) { if (BytesToRead > 100) { DevConn.ErrManyBytes++; DevConn._serialPort.DiscardInBuffer(); } else { DevConn._serialPort.Read(AnswerByteBuff, storedBytes, BytesToRead); StringBuilder sb = new StringBuilder(); for (int i = 0; i < BytesToRead + storedBytes; i++) { sb.Append(Convert.ToChar(AnswerByteBuff[i])); if (AnswerByteBuff[i] == 10) { if (sb.Length == 14) { if (uiSep == ",") { sb.Replace(".", ","); //заменяем точки если системный разделитель запятая } if (float.TryParse(sb.ToString(2, 7), out float fResult)) { ScaleResult = fResult; if (sb[1] == Convert.ToChar("-")) { ScaleResult = ScaleResult * (-1); //если число отрицательное } if (sb[11] == Convert.ToChar("O")) { IsOverload = true; IsStable = IsInvalid = false; } else if (sb[11] == Convert.ToChar("I")) { IsInvalid = true; IsStable = IsOverload = false; } else if (sb[11] == Convert.ToChar(" ")) { IsStable = true; IsInvalid = IsOverload = false; } else if (sb[11] == Convert.ToChar("M")) { IsStable = IsInvalid = IsOverload = false; } RecieveLettersCounter++; if (StateMess != "Ok") { StateMess = "Ok"; } NoAnswerCounter = 0; } else { ErrConvertCounter++; } } else { ErrAnswerLenghtCounter++; } sb.Clear(); } } if (sb.Length != 0) { //storedBytes = sb.Length; Array.Clear(AnswerByteBuff, 0, AnswerByteBuff.Length); //for (int i = 0; i < sb.Length; i++) //{ // AnswerByteBuff[i] = Convert.ToByte(sb[i]); //} } } } if (NoAnswerCounter < NoAnswerLimit) { NoAnswerCounter++; } if (NoAnswerCounter == NoAnswerLimit)//нет ответа определенное время { NoAnswerCounter++; ScaleResult = -999; IsStable = IsInvalid = IsOverload = false; StateMess = "Нет связи с контроллером SMART"; LostConnectionCounter++; } Thread.Sleep(SleepTime); FuncSleepTime += SleepTime; } catch (Exception) { ErrGetStateDevice++; } } return(FuncSleepTime); }
int NoAnswerCounter = 0; //счетчик неполученных ответов internal int GetState(DevConnection DevConn) { GetStateCounter++; if (DevConn.PortState == 3) { try { int BytesToRead = 0; string Rs485 = String.Format("{0:D2}", RS485Num); string CRC = string.Empty; #region Проверка состояния ByteBuff[0] = 0x05;//начало пакета ByteBuff[1] = Convert.ToByte(Rs485[0]); ByteBuff[2] = Convert.ToByte(Rs485[1]); ByteBuff[3] = 0x37; //7 ByteBuff[4] = 0x41; //A ByteBuff[5] = 0x30; //время ожидания ByteBuff[20] = 0; for (int i = 1; i <= 5; i++) { ByteBuff[20] += ByteBuff[i]; } CRC = String.Format("{0:X2}", ByteBuff[20]); ByteBuff[6] = Convert.ToByte(CRC[0]); ByteBuff[7] = Convert.ToByte(CRC[1]); ByteBuff[8] = 13; DevConn._serialPort.Write(ByteBuff, 0, 9); SendLettersCounter++; Thread.Sleep(SleepTime); BytesToRead = DevConn._serialPort.BytesToRead; if (BytesToRead == 9) { Array.Clear(ByteBuff, 0, ByteBuff.Length); DevConn._serialPort.Read(ByteBuff, 0, BytesToRead); //проверяем CRC ByteBuff[20] = 0; for (int i = 1; i < BytesToRead - 4; i++) { ByteBuff[20] += ByteBuff[i]; } int RecievedCRC = -1; try { RecievedCRC = Convert.ToInt32(ASCIIEncoding.ASCII.GetString(ByteBuff, BytesToRead - 3, 2), 16); } catch (Exception) { ErrConvertCRC++; } if ((RecievedCRC != -1) && (ByteBuff[20] == RecievedCRC)) { string BinState = Convert.ToString(Convert.ToInt32(ASCIIEncoding.ASCII.GetString(ByteBuff, 3, 2), 16), 2).PadLeft(8, '0'); fRun = (BinState[7].Equals('1')) ? true : false; fRunF = (BinState[6].Equals('1')) ? true : false; fRunB = (BinState[5].Equals('1')) ? true : false; fHzMax = (BinState[4].Equals('1')) ? true : false; fOL = (BinState[3].Equals('1')) ? true : false; fHzOk = (BinState[1].Equals('1')) ? true : false; fErr = (BinState[0].Equals('1')) ? true : false; StateMess = "Ok"; NoAnswerCounter = 0; RecieveLettersCounter++; } else { if (RecievedCRC != -1) { ErrCRC++; } } } else { if (BytesToRead > 0) { ErrAnswerLenghtCounter++; //Array.Clear(ByteBuff, 0, ByteBuff.Length); //DevConn._serialPort.Read(ByteBuff, 0, BytesToRead); DevConn._serialPort.DiscardInBuffer(); } } #endregion #region Запрос текущей частоты ByteBuff[0] = 0x05;//начало пакета ByteBuff[1] = Convert.ToByte(Rs485[0]); ByteBuff[2] = Convert.ToByte(Rs485[1]); ByteBuff[3] = 0x36; //6 ByteBuff[4] = 0x46; //F ByteBuff[5] = 0x30; //время ожидания ByteBuff[20] = 0; for (int i = 1; i <= 5; i++) { ByteBuff[20] += ByteBuff[i]; } CRC = String.Format("{0:X2}", ByteBuff[20]); ByteBuff[6] = Convert.ToByte(CRC[0]); ByteBuff[7] = Convert.ToByte(CRC[1]); ByteBuff[8] = 13; DevConn._serialPort.Write(ByteBuff, 0, 9); SendLettersCounter++; Thread.Sleep(SleepTime); BytesToRead = DevConn._serialPort.BytesToRead; if (BytesToRead == 11) { Array.Clear(ByteBuff, 0, ByteBuff.Length); DevConn._serialPort.Read(ByteBuff, 0, BytesToRead); //проверяем CRC ByteBuff[20] = 0; for (int i = 1; i < BytesToRead - 4; i++) { ByteBuff[20] += ByteBuff[i]; } int RecievedCRC = -1; try { RecievedCRC = Convert.ToInt32(ASCIIEncoding.ASCII.GetString(ByteBuff, BytesToRead - 3, 2), 16); } catch (Exception) { ErrConvertCRC++; } if ((RecievedCRC != -1) && (ByteBuff[20] == RecievedCRC)) { CurrentHz = Convert.ToInt32(ASCIIEncoding.ASCII.GetString(ByteBuff, 3, 4), 16) / 100; StateMess = "Ok"; NoAnswerCounter = 0; RecieveLettersCounter++; } else { if (RecievedCRC != -1) { ErrCRC++; } } } else { if (BytesToRead > 0) { ErrAnswerLenghtCounter++; DevConn._serialPort.DiscardInBuffer(); } } #endregion #region Запрос текущего тока ByteBuff[0] = 0x05;//начало пакета ByteBuff[1] = Convert.ToByte(Rs485[0]); ByteBuff[2] = Convert.ToByte(Rs485[1]); ByteBuff[3] = 0x37; //7 ByteBuff[4] = 0x30; //0 ByteBuff[5] = 0x30; //время ожидания ByteBuff[20] = 0; for (int i = 1; i <= 5; i++) { ByteBuff[20] += ByteBuff[i]; } CRC = String.Format("{0:X2}", ByteBuff[20]); ByteBuff[6] = Convert.ToByte(CRC[0]); ByteBuff[7] = Convert.ToByte(CRC[1]); ByteBuff[8] = 13; DevConn._serialPort.Write(ByteBuff, 0, 9); SendLettersCounter++; Thread.Sleep(SleepTime); BytesToRead = DevConn._serialPort.BytesToRead; if (BytesToRead == 11) { Array.Clear(ByteBuff, 0, ByteBuff.Length); DevConn._serialPort.Read(ByteBuff, 0, BytesToRead); //проверяем CRC ByteBuff[20] = 0; for (int i = 1; i < BytesToRead - 4; i++) { ByteBuff[20] += ByteBuff[i]; } int RecievedCRC = -1; try { RecievedCRC = Convert.ToInt32(ASCIIEncoding.ASCII.GetString(ByteBuff, BytesToRead - 3, 2), 16); } catch (Exception) { ErrConvertCRC++; } if ((RecievedCRC != -1) && (ByteBuff[20] == RecievedCRC)) { CurrentA = Convert.ToInt32(ASCIIEncoding.ASCII.GetString(ByteBuff, 3, 4), 16) / 10; StateMess = "Ok"; NoAnswerCounter = 0; RecieveLettersCounter++; } else { if (RecievedCRC != -1) { ErrCRC++; } } } else { if (BytesToRead > 0) { ErrAnswerLenghtCounter++; DevConn._serialPort.DiscardInBuffer(); } } #endregion #region Запрос текущего напряжения ByteBuff[0] = 0x05;//начало пакета ByteBuff[1] = Convert.ToByte(Rs485[0]); ByteBuff[2] = Convert.ToByte(Rs485[1]); ByteBuff[3] = 0x37; //7 ByteBuff[4] = 0x31; //1 ByteBuff[5] = 0x30; //время ожидания ByteBuff[20] = 0; for (int i = 1; i <= 5; i++) { ByteBuff[20] += ByteBuff[i]; } CRC = String.Format("{0:X2}", ByteBuff[20]); ByteBuff[6] = Convert.ToByte(CRC[0]); ByteBuff[7] = Convert.ToByte(CRC[1]); ByteBuff[8] = 13; DevConn._serialPort.Write(ByteBuff, 0, 9); SendLettersCounter++; Thread.Sleep(SleepTime); BytesToRead = DevConn._serialPort.BytesToRead; if (BytesToRead == 11) { Array.Clear(ByteBuff, 0, ByteBuff.Length); DevConn._serialPort.Read(ByteBuff, 0, BytesToRead); //проверяем CRC ByteBuff[20] = 0; for (int i = 1; i < BytesToRead - 4; i++) { ByteBuff[20] += ByteBuff[i]; } int RecievedCRC = -1; try { RecievedCRC = Convert.ToInt32(ASCIIEncoding.ASCII.GetString(ByteBuff, BytesToRead - 3, 2), 16); } catch (Exception) { ErrConvertCRC++; } if ((RecievedCRC != -1) && (ByteBuff[20] == RecievedCRC)) { CurrentV = Convert.ToInt32(ASCIIEncoding.ASCII.GetString(ByteBuff, 3, 4), 16) / 10; StateMess = "Ok"; NoAnswerCounter = 0; RecieveLettersCounter++; } else { if (RecievedCRC != -1) { ErrCRC++; } } } else { if (BytesToRead > 0) { ErrAnswerLenghtCounter++; DevConn._serialPort.DiscardInBuffer(); } } #endregion #region Старт/Стоп if ((isNeedRun && !fRun) || (!isNeedRun && fRun)) { ByteBuff[0] = 0x05;//начало пакета ByteBuff[1] = Convert.ToByte(Rs485[0]); ByteBuff[2] = Convert.ToByte(Rs485[1]); ByteBuff[3] = 0x46; //F ByteBuff[4] = 0x41; //A ByteBuff[5] = 0x30; //время ожидания ByteBuff[6] = 0x30; // ByteBuff[7] = (isNeedRun) ? (Byte)0x32 : (Byte)0x30; ByteBuff[20] = 0; for (int i = 1; i <= 7; i++) { ByteBuff[20] += ByteBuff[i]; } CRC = String.Format("{0:X2}", ByteBuff[20]); ByteBuff[8] = Convert.ToByte(CRC[0]); ByteBuff[9] = Convert.ToByte(CRC[1]); ByteBuff[10] = 13; DevConn._serialPort.Write(ByteBuff, 0, 11); SendLettersCounter++; Thread.Sleep(SleepTime); BytesToRead = DevConn._serialPort.BytesToRead; if (BytesToRead == 4) { Array.Clear(ByteBuff, 0, ByteBuff.Length); DevConn._serialPort.Read(ByteBuff, 0, BytesToRead); RecieveLettersCounter++; } else { if (BytesToRead > 0) { ErrAnswerLenghtCounter++; DevConn._serialPort.DiscardInBuffer(); } } } #endregion #region Задание частоты if (fRun && (CurrentHz != PresetHz)) { String Hez = String.Format("{0:X4}", (int)PresetHz * 100); ByteBuff[0] = 0x05;//начало пакета ByteBuff[1] = Convert.ToByte(Rs485[0]); ByteBuff[2] = Convert.ToByte(Rs485[1]); ByteBuff[3] = 0x45; //E ByteBuff[4] = 0x45; //E ByteBuff[5] = 0x30; //время ожидания ByteBuff[6] = Convert.ToByte(Hez[0]); // ByteBuff[7] = Convert.ToByte(Hez[1]); // ByteBuff[8] = Convert.ToByte(Hez[2]); // ByteBuff[9] = Convert.ToByte(Hez[3]); // ByteBuff[20] = 0; for (int i = 1; i <= 9; i++) { ByteBuff[20] += ByteBuff[i]; } CRC = String.Format("{0:X2}", ByteBuff[20]); ByteBuff[10] = Convert.ToByte(CRC[0]); ByteBuff[11] = Convert.ToByte(CRC[1]); ByteBuff[12] = 13; DevConn._serialPort.Write(ByteBuff, 0, 13); SendLettersCounter++; Thread.Sleep(SleepTime); BytesToRead = DevConn._serialPort.BytesToRead; if (BytesToRead == 4) { Array.Clear(ByteBuff, 0, ByteBuff.Length); DevConn._serialPort.Read(ByteBuff, 0, BytesToRead); RecieveLettersCounter++; } else { if (BytesToRead > 0) { ErrAnswerLenghtCounter++; DevConn._serialPort.DiscardInBuffer(); } } } #endregion if (NoAnswerCounter < NoAnswerLimit) { NoAnswerCounter++; } if (NoAnswerCounter == NoAnswerLimit)//нет ответа определенное время { NoAnswerCounter++; StateMess = "Нет связи с Mitsubishi E5xx"; CurrentHz = 0; CurrentA = 0; CurrentV = 0; fRun = false; fRunB = false; fRunF = false; LostConnectionCounter++; } } catch (Exception e) { //ErrGetStateDeviceMess = e.Message; ErrGetStateDevice++; // Get stack trace for the exception with source file information var st = new StackTrace(e, true); // Get the top stack frame var frame = st.GetFrame(0); // Get the line number from the stack frame var line = frame.GetFileLineNumber(); ErrGetStateDeviceMess = e.Message + " " + line; } return(SleepTime); } else { StateMess = "Ошибка открытия порта"; return(0); } }
internal int GetState(DevConnection DevConn) { GetStateCounter++; if (DevConn.PortState == 3) { #region ежим обмена по запросу if (isActivExchangeMode)//по запросу { try { Thread.Sleep(SleepTime); } catch (Exception e) { ErrGetStateDeviceMess = e.Message; ErrGetStateDevice++; } } #endregion else //постоянная передача с прибора { try { int BytesToRead = DevConn._serialPort.BytesToRead; if (BytesToRead > 0) { if (BytesToRead > 0) { if (BytesToRead > 100) { DevConn.ErrManyBytes++; DevConn._serialPort.DiscardInBuffer(); } else { Array.Clear(ByteBuff, 0, ByteBuff.Length); DevConn._serialPort.Read(ByteBuff, storedBytes, BytesToRead); if ((BytesToRead == 9) && (ByteBuff[0] == 61)) { StringBuilder sb = new StringBuilder(); Array.Reverse(ByteBuff, 0, 9); for (int i = 0; i < 8; i++) { sb.Append(Convert.ToChar(ByteBuff[i])); } if (uiSep == ",") { sb.Replace(".", ","); //заменяем точки если системный разделитель запятая } if (float.TryParse(sb.ToString(), out float fResult)) { ScaleResult = fResult; StateMess = "Ok"; NoAnswerCounter = 0; RecieveLettersCounter++; IsStable = true; if (ZeroRange == 0)//ноль весов { IsZero = (ScaleResult != 0) ? false : true; } else { IsZero = (Math.Abs(ScaleResult) <= ZeroRange) ? false : true; } ResultList.Add(new WeightResult(5, DateTime.Now)); if (ResultList.Count > 20) { ResultList.RemoveAt(0); } } else { ErrConvertCounter++; } } else { ErrAnswerLenghtCounter++; } } } } if (NoAnswerCounter < NoAnswerLimit) { NoAnswerCounter++; } if (NoAnswerCounter == NoAnswerLimit) //нет ответа определенное время { NoAnswerCounter++; ScaleResult = -999; IsStable = false; StateMess = "Нет связи с терминалом МИ МДА/15Я"; LostConnectionCounter++; } Thread.Sleep(SleepTime); } catch (Exception e) { ErrGetStateDeviceMess = e.Message; ErrGetStateDevice++; } } return(SleepTime); } else { StateMess = "Ошибка открытия порта"; return(0); } }
internal int GetState(DevConnection DevConn) { if (DevConn.PortState == 3) { int BytesToRead = 0; try { #region Установка 8-ми выходов bool ChangeFlag = false; for (int i = 0; i < 8; i++) { if (OutputState[i] != _outputStateFact[i]) { ChangeFlag = true; } } if (ChangeFlag)//есть изменения в состоянии выходов { ByteBuff[0] = Convert.ToByte('@'); string Rs485 = String.Format("{0:D2}", _rs485Num); ByteBuff[1] = Convert.ToByte(Rs485[0]); ByteBuff[2] = Convert.ToByte(Rs485[1]); StringBuilder sb = new StringBuilder(); for (int i = 7; i >= 0; i--) { sb.Append(OutputState[i]); } string OutputString = String.Format("{0:X2}", Convert.ToInt32(sb.ToString(), 2)); ByteBuff[3] = Convert.ToByte(OutputString[0]); ByteBuff[4] = Convert.ToByte(OutputString[1]); if (_cRCEnabled) { ByteBuff[20] = 0; for (int i = 0; i <= 4; i++) { ByteBuff[20] += ByteBuff[i]; } string CRC = String.Format("{0:X2}", ByteBuff[20]); ByteBuff[5] = Convert.ToByte(CRC[0]); ByteBuff[6] = Convert.ToByte(CRC[1]); ByteBuff[7] = 13; DevConn._serialPort.Write(ByteBuff, 0, 8); } else { ByteBuff[5] = 13; DevConn._serialPort.Write(ByteBuff, 0, 6); } SendLettersCounter++; Thread.Sleep(_sleepTime); BytesToRead = DevConn._serialPort.BytesToRead; if (BytesToRead > 0) { Array.Clear(ByteBuff, 0, ByteBuff.Length); DevConn._serialPort.Read(ByteBuff, 0, BytesToRead); bool AnswerOk = false; if (_cRCEnabled && BytesToRead == 4) { if (ByteBuff[0] == Convert.ToInt32(ASCIIEncoding.ASCII.GetString(ByteBuff, 1, 2), 16)) { AnswerOk = true; } else { ErrCRC++; } } else if (!_cRCEnabled && BytesToRead == 2) { AnswerOk = true; } else { DevConn._serialPort.DiscardInBuffer(); ErrAnswerLenght++; } if (AnswerOk) { StateMess = "Ok"; NoAnswerCounter = 0; RecieveLettersCounter++; Array.Copy(OutputState, _outputStateFact, 8); } } } #endregion #region Опрос входов if (_diEnabled) { ByteBuff[0] = Convert.ToByte('@'); string Rs485 = String.Format("{0:D2}", _rs485Num); ByteBuff[1] = Convert.ToByte(Rs485[0]); ByteBuff[2] = Convert.ToByte(Rs485[1]); if (_cRCEnabled) { ByteBuff[20] = 0; for (int i = 0; i <= 2; i++) { ByteBuff[20] += ByteBuff[i]; } string CRC = String.Format("{0:X2}", ByteBuff[20]); ByteBuff[3] = Convert.ToByte(CRC[0]); ByteBuff[4] = Convert.ToByte(CRC[1]); ByteBuff[5] = 13; DevConn._serialPort.Write(ByteBuff, 0, 6); } else { ByteBuff[3] = 13; DevConn._serialPort.Write(ByteBuff, 0, 4); } SendLettersCounter++; Thread.Sleep(_sleepTime); BytesToRead = DevConn._serialPort.BytesToRead; if (BytesToRead > 0) { Array.Clear(ByteBuff, 0, ByteBuff.Length); DevConn._serialPort.Read(ByteBuff, 0, BytesToRead); bool AnswerOk = false; if (_cRCEnabled && BytesToRead == 8) { ByteBuff[20] = 0; for (int i = 0; i < BytesToRead - 3; i++) { ByteBuff[20] += ByteBuff[i]; } if (ByteBuff[20] == Convert.ToInt32(ASCIIEncoding.ASCII.GetString(ByteBuff, BytesToRead - 3, 2), 16)) { AnswerOk = true; } else { ErrCRC++; } } else if (!_cRCEnabled && BytesToRead == 6) { AnswerOk = true; } else { DevConn._serialPort.DiscardInBuffer(); ErrAnswerLenght++; } if (AnswerOk) { string BinState = Convert.ToString(Convert.ToInt32(ASCIIEncoding.ASCII.GetString(ByteBuff, 3, 2), 16), 2).PadLeft(8, '0'); for (int i = 0; i < 8; i++) { InputState[7 - i] = (BinState[i].Equals('1')) ? true : false; } StateMess = "Ok"; NoAnswerCounter = 0; RecieveLettersCounter++; } } } #endregion if (NoAnswerCounter < _noAnswerLimit) { NoAnswerCounter++; } if (NoAnswerCounter == _noAnswerLimit)//нет ответа определенное время { NoAnswerCounter++; StateMess = "Нет связи с модулем I7055"; LostConnectionCounter++; } } catch (Exception ex) { ErrGetStateDevice++; //// Get stack trace for the exception with source file information //var st = new StackTrace(ex, true); //// Get the top stack frame //var frame = st.GetFrame(0); //// Get the line number from the stack frame //var line = frame.GetFileLineNumber(); //ErrGetStateDeviceMess = ex.Message+" "+ line+""+ BytesToRead; ErrGetStateDeviceMess = ex.Message; } return(_sleepTime); } else { StateMess = "Ошибка открытия порта"; return(0); } }
internal int GetM06State(DevConnection DevConn) { GetStateCounter++; if (DevConn.PortState == 3) { #region ежим обмена по запросу if (isActivExchangeMode)//по запросу { try { byte SendCommandNum = 0; AnswerByteBuff[0] = 0xFF; AnswerByteBuff[1] = Convert.ToByte(0x20 + RS485Num); AnswerByteBuff[2] = 0x20; if (isNeedZero) //Если необходимо обнулить { isNeedZero = false; AnswerByteBuff[3] = 0x4B; AnswerByteBuff[4] = 0x41; SendCommandNum = 1; } else //запрос состояния прибора { AnswerByteBuff[3] = 0x2E; AnswerByteBuff[4] = 0x7F; SendCommandNum = 2; } //Считаем контрольную сумму int crc = 0; for (int i = 0; i <= 4; i++) { crc = crc ^ AnswerByteBuff[i]; } AnswerByteBuff[5] = Convert.ToByte(crc); AnswerByteBuff[6] = 0x3; DevConn._serialPort.Write(AnswerByteBuff, 0, 7); SendLettersCounter++; Thread.Sleep(SleepTime); BytesToRead = DevConn._serialPort.BytesToRead; if ((BytesToRead > 0) && (BytesToRead > 30)) { if (BytesToRead > 100) { DevConn.ErrManyBytes++; DevConn._serialPort.DiscardInBuffer(); } else { Array.Clear(AnswerByteBuff, 0, AnswerByteBuff.Length); DevConn._serialPort.Read(AnswerByteBuff, 0, BytesToRead); if (AnswerByteBuff[BytesToRead - 3] == 16) //проверяем контрольную сумму на предмет зарезервированного символа { AnswerByteBuff[BytesToRead - 3] = Convert.ToByte(255 - AnswerByteBuff[BytesToRead - 2]); AnswerByteBuff[BytesToRead - 2] = AnswerByteBuff[BytesToRead - 1]; BytesToRead--; } //проверяем контрольную сумму int counter = 0; crc = 0; do { if (AnswerByteBuff[counter] != 16) { crc = crc ^ AnswerByteBuff[counter]; } else { counter++; crc = crc ^ (255 - AnswerByteBuff[counter]); } counter++; } while (counter < (BytesToRead - 2)); if (AnswerByteBuff[BytesToRead - 2] == crc) { //Убираем все резервированные символы int posSource = 0; int posDest = 0; do { if (AnswerByteBuff[posSource] != 16) { AnswerByteBuff[posDest] = AnswerByteBuff[posSource]; posDest++; posSource++; } else { AnswerByteBuff[posDest] = Convert.ToByte(255 - AnswerByteBuff[posSource + 1]); posDest++; posSource += 2; } } while (posSource <= BytesToRead); if (SendCommandNum == 2) //если посылали запрос на состояние { if ((posDest == 36) || (posDest == 35)) { try { //состояние веса, считываем флаги string BinState = Convert.ToString(AnswerByteBuff[18], 2).PadLeft(8, '0'); fNoLoadCell = (BinState[0].Equals('1')) ? true : false; fOverLoad = (BinState[1].Equals('1')) ? true : false; fUnderLoad = (BinState[2].Equals('1')) ? true : false; fMin20d = (BinState[3].Equals('1')) ? true : false; fNearZero = (BinState[4].Equals('1')) ? true : false; IsStable = (BinState[5].Equals('1')) ? true : false; fZeroClb = (BinState[6].Equals('1')) ? true : false; fClb = (BinState[7].Equals('1')) ? true : false; //АЦП string ACPHex = Convert.ToString(AnswerByteBuff[6], 16).PadLeft(2, '0'); ACPHex += Convert.ToString(AnswerByteBuff[7], 16).PadLeft(2, '0'); ACPHex += Convert.ToString(AnswerByteBuff[8], 16).PadLeft(2, '0'); ACPHex += Convert.ToString(AnswerByteBuff[9], 16).PadLeft(2, '0'); ACPResult = int.Parse(ACPHex, System.Globalization.NumberStyles.HexNumber); //определение позиции точки switch (AnswerByteBuff[23]) { case 3: PointPosition = 3; break; case 4: PointPosition = 2; break; case 5: PointPosition = 1; break; case 6: PointPosition = 0; break; default: PointPosition = 0; break; } //текущее брутто double dTemp = (AnswerByteBuff[10] << 8) + AnswerByteBuff[11]; if (AnswerByteBuff[10] > 127) { dTemp -= 65536; } dTemp = dTemp / (Math.Exp(PointPosition * Math.Log(10))); Brutto = (float)dTemp; //текущее нетто dTemp = (AnswerByteBuff[12] << 8) + AnswerByteBuff[13]; if (AnswerByteBuff[12] > 127) { dTemp -= 65536; } dTemp = dTemp / (Math.Exp(PointPosition * Math.Log(10))); Netto = (float)dTemp; //текущее тара dTemp = (AnswerByteBuff[14] << 8) + AnswerByteBuff[15]; if (AnswerByteBuff[14] > 127) { dTemp -= 65536; } dTemp = dTemp / (Math.Exp(PointPosition * Math.Log(10))); Tara = (float)dTemp; //текущий ноль dTemp = (AnswerByteBuff[16] << 8) + AnswerByteBuff[17]; if (AnswerByteBuff[16] > 127) { dTemp -= 65536; } dTemp = dTemp / (Math.Exp(PointPosition * Math.Log(10))); Zero = (float)dTemp; ScaleResult = Netto; StateMess = "Ok"; NoAnswerCounter = 0; RecieveLettersCounter++; } catch (Exception) { ErrConvertCounter++; } } else if (posDest == 9) //прибор занят и не может ответить { RecieveLettersCounter++; } else { ErrAnswerLenghtCounter++; } } else if (SendCommandNum == 1) //если посылали запрос на обнуление { } } else { ErrCRC++; } } } if (NoAnswerCounter < NoAnswerLimit) { NoAnswerCounter++; } if (NoAnswerCounter == NoAnswerLimit)//нет ответа определенное время { NoAnswerCounter++; ScaleResult = -999; Tara = -999; Brutto = -999; Netto = -999; ACPResult = -999; Zero = -999; IsStable = false; StateMess = "Нет связи с контроллером Микросим М06"; LostConnectionCounter++; } } catch (Exception ex) { ErrGetStateDevice++; //// Get stack trace for the exception with source file information //var st = new StackTrace(ex, true); //// Get the top stack frame //var frame = st.GetFrame(0); //// Get the line number from the stack frame //var line = frame.GetFileLineNumber(); //ErrGetStateDeviceMess = ex.Message+" "+ line+""+ BytesToRead; } } #endregion #region ежим постоянной передачи else //постоянная передача с прибора { try { int BytesToRead = DevConn._serialPort.BytesToRead; if (BytesToRead > 0) { if (BytesToRead > 100) { DevConn.ErrManyBytes++; DevConn._serialPort.DiscardInBuffer(); } else { DevConn._serialPort.Read(AnswerByteBuff, storedBytes, BytesToRead); StringBuilder sb = new StringBuilder(); for (int i = 0; i < BytesToRead + storedBytes; i++) { sb.Append(Convert.ToChar(AnswerByteBuff[i])); if (AnswerByteBuff[i] == 10) { if (sb.Length == 15) { if (uiSep == ",") { sb.Replace(".", ","); //заменяем точки если системный разделитель запятая } if (float.TryParse(sb.ToString(3, 6), out float fResult)) { ScaleResult = fResult; if (sb[2] == Convert.ToChar("-")) { ScaleResult = ScaleResult * (-1); //если число отрицательное } IsStable = (sb[9] == Convert.ToChar("?")) ? false : true; if (ZeroRange == 0)//ноль весов { IsZero = (ScaleResult != 0) ? false : true; } else { IsZero = (Math.Abs(ScaleResult) <= ZeroRange) ? false : true; } StateMess = "Ok"; NoAnswerCounter = 0; RecieveLettersCounter++; } else { ErrConvertCounter++; ScaleResult = -999; StateMess = sb.ToString(2, 6); } } else { ErrAnswerLenghtCounter++; } sb.Clear(); } } if (sb.Length != 0) { //storedBytes = sb.Length; Array.Clear(AnswerByteBuff, 0, AnswerByteBuff.Length); //for (int i = 0; i < sb.Length; i++) //{ // AnswerByteBuff[i] = Convert.ToByte(sb[i]); //} } } } if (NoAnswerCounter < NoAnswerLimit) { NoAnswerCounter++; } if (NoAnswerCounter == NoAnswerLimit)//нет ответа определенное время { NoAnswerCounter++; ScaleResult = -999; IsStable = false; StateMess = "Нет связи с контроллером Микросим М06"; LostConnectionCounter++; } Thread.Sleep(SleepTime); } catch (Exception e) { ErrGetStateDeviceMess = e.Message; ErrGetStateDevice++; } } #endregion return(SleepTime); } else //если порт не открылся { StateMess = "Ошибка открытия порта"; ScaleResult = -999; return(0); } }