private void pingMeters(Object metersDt) { DataTable dt = (DataTable)metersDt; int columnIndexFactory = 1; List <string> factoryNumbers = new List <string>(); if (Vp.OpenPort()) { for (int i = 1; i < dt.Rows.Count; i++) { object oColLocalAddr = dt.Rows[i][0]; object oColFactory = dt.Rows[i][columnIndexFactory]; //object oColResult = dt.Rows[i][columnIndexResult]; //check if already polled if (bPollOnlyOffline && oColFactory != null && oColFactory.ToString() != "Нет связи") { continue; } Thread.Sleep(5); Meter.ChangeMAddress(uint.Parse(oColLocalAddr.ToString())); string tmpSerialNumber = ""; if (Meter.OpenLinkCanal() && Meter.ReadSerialNumber(ref tmpSerialNumber)) { dt.Rows[i][columnIndexFactory] = tmpSerialNumber; if (cbWithData.Checked) { byte[] mAnswBytes = new byte[1]; // перебираем тарифы for (byte j = 0; j < 5; j++) { try { // получим данные ток по T0 if (Meter.ReadCurrentMeterageToTarif(j, ref mAnswBytes)) { for (ushort k = 0; k < captions.Length; k++) { float val = -1f; Meter.GetValueFromMeterageToTarifAnswer(k, mAnswBytes, ref val); dt.Rows[i][colNames[k] + j] = val; } } else { dt.Rows[i][j * 4] = "Ошибка"; } } catch (Exception ex) { WriteToStatus(ex.ToString()); } if (j == 0 && rbT0.Checked) { break; } } } } else { dt.Rows[i][columnIndexFactory] = "Нет связи"; } Invoke(meterPinged); if (bStopProcess) { bStopProcess = false; break; } } Vp.Close(); } else { Invoke(portProblems); } Invoke(pollingEnd); }