private void timerPlcDataPolling_Tick(object sender, EventArgs e) { if (!ReadArea(client, dbNumber, dbSize, Buffer)) { listBox1.Items.Add(string.Format("{0:dd.MM.yyyy HH:mm:ss}", DateTime.Now) + " Ошибка чтения DB. PLC:" + plc.Id + "; DB:" + dbNumber + "; dbSize:" + dbSize); } else { foreach (Sensor s in sensorList) { int S7Type = 0; int Pos = 0; if (!GetAddress(s.Address, ref S7Type, ref Pos)) { //Переход к следующему элементу в списке сенсоров sensorList listBox1.Items.Add(string.Format("{0:dd.MM.yyyy HH:mm:ss}", DateTime.Now) + " Ошибка парсинга адреса. PLC:" + plc.Id + "; address:" + s.Address); continue; } else { string txtValue = string.Empty; if (!GetValue(S7Type, Pos, Buffer, ref txtValue)) { //Переход к следующему элементу в списке сенсоров sensorList listBox1.Items.Add(string.Format("{0:dd.MM.yyyy HH:mm:ss}", DateTime.Now) + " Ошибка чтения зн-я по адресу. PLC:" + plc.Id + "; address:" + s.Address); continue; } else //! Успешное чтение зн-я переменной { double value = 0; if (txtValue == "False") { value = 0.0; } else if (txtValue == "True") { value = 1.0; } else { if (s.IsLine == 1) { int val = double.Parse(txtValue) <= 0 ? 0 : Int32.Parse((Math.Log(double.Parse(txtValue), 2) + 1).ToString()); if (val == 17 || val == 26 || val == 28 || val == 31 || val == 32) { value = 0; } else if (val == 9 || val == 24) { value = 1; } else if (val == 23) { value = 2; } else if (val == 18 || val == 19 || val == 20) { value = 3; } else if (val == 21 || val == 22 || val == 29) { value = 4; } else if (val == 27 || val == 30) { value = 5; } else if (val == 25) { value = 6; } currLineState = Int32.Parse(value.ToString()); } else { if (s.SensorId == 6 || s.SensorId == 7 || s.SensorId == 8) { value = double.Parse(txtValue) / 1000.0; } else { value = double.Parse(txtValue); } } } //Последняя запись для данного sensor.id в текущем json (2-х минутном). Вычисляется ниже SensorValueModel lastCounterValue2m = new SensorValueModel() { CounterId = -1 }; double diffValue = 0; if (s.IsLine == 1) { if (lineStateInsertList.Count > 0) { diffValue = Math.Abs(value - lineStateInsertList.Last().idState); if (diffValue >= s.Deadband) { lineStateInsertList.Add( new LineStateInsertModel() { connectionStringName = cnnString, dtFrom = _dateTimeService.UnixTimeNow(), idLine = s.IdLine, idState = Int32.Parse(value.ToString()), typeInfo = s.typeLine.Trim() }); } } else { lineStateInsertList.Add( new LineStateInsertModel() { connectionStringName = cnnString, dtFrom = _dateTimeService.UnixTimeNow(), idLine = s.IdLine, idState = Int32.Parse(value.ToString()), typeInfo = s.typeLine.Trim() }); } } else if (s.IsLine == 0) { #region Заполение коллекций (sensorId1Val1m, sensorId2Val1m) для вычисления производительности в минуту if (s.SensorId == 1) { for (int i = sensorId1Val1m.Count - 1; i >= 0; i--) { if ((DateTime.UtcNow - _dateTimeService.UnixTimeToDateTime(sensorId1Val1m[i].Time)).TotalSeconds >= 60) { sensorId1Val1m.Remove(sensorId1Val1m[i]); } } sensorId1Val1m.Add( new Model.SensorValueModel() { CounterId = s.SensorId, Value = value, Time = _dateTimeService.UnixTimeNow() } ); } if (s.SensorId == 2) { for (int i = sensorId2Val1m.Count - 1; i >= 0; i--) { if ((DateTime.UtcNow - _dateTimeService.UnixTimeToDateTime(sensorId2Val1m[i].Time)).TotalSeconds >= 60) { sensorId2Val1m.Remove(sensorId2Val1m[i]); } } sensorId2Val1m.Add( new Model.SensorValueModel() { CounterId = s.SensorId, Value = value, Time = _dateTimeService.UnixTimeNow() } ); } #endregion if (sensorValue2mList.Where(x => x.CounterId == s.SensorId).Count() > 0) {//Если запись присутствует в коллекции, которая набивается в течение 2мин., то сравнить текущее зн-е с последним значением этого id из коллекции //если оно больше или равно deadband этого сенсора, то внести его в коллекции 2мин и 20сек /json/ для отправки на сервер //Удаление из коллекции counterValue2mList элементов старше 2-х минут //((sender as Timer).Tag as Model.PlcData).counterValue2mList.RemoveAll(x => (DateTime.UtcNow - _dateTimeService.UnixTimeToDateTime(x.Time)).Seconds >= 120); //удобнее, но в 10 раз дольше //Циклом удаление элемента из коллекции в 10 раз быстрее //http://www.dotnetblog.ru/2014/03/blog-post_23.html for (int i = sensorValue2mList.Count - 1; i >= 0; i--) { if ((DateTime.UtcNow - _dateTimeService.UnixTimeToDateTime(sensorValue2mList[i].Time)).TotalSeconds >= 120) { sensorValue2mList.Remove(sensorValue2mList[i]); } } if (sensorValue2mList.Where(x => x.CounterId == s.SensorId).Count() > 0) { //Выбрать последнюю запись для данного сенсора из коллекции 2мин lastCounterValue2m = sensorValue2mList.Where(x => x.CounterId == s.SensorId).Last(); diffValue = Math.Abs(value - lastCounterValue2m.Value); if (diffValue >= s.Deadband) { //Вставка в коллекцию 20сек для отправки на сервер sensorValueInsert.counterValue.Add( new Model.SensorValueModel() { CounterId = s.SensorId, Value = value, Time = _dateTimeService.UnixTimeNow() } ); //Вставка в коллекцию 2мин sensorValue2mList.Add( new Model.SensorValueModel() { CounterId = s.SensorId, Value = value, Time = _dateTimeService.UnixTimeNow() } ); if (s.SensorId == 7) { currActualPower = value; } } } else //Если записи для этого сенсора, после удаления старых зн-й >2мин, нет в коллекции 2мин. { //то вставить в коллекции 2мин и 20сек /json/ для отправки на сервер //Вставка в коллекцию 20сек для отправки на сервер sensorValueInsert.counterValue.Add( new Model.SensorValueModel() { CounterId = s.SensorId, Value = value, Time = _dateTimeService.UnixTimeNow() } ); //Вставка в коллекцию 2мин sensorValue2mList.Add( new Model.SensorValueModel() { CounterId = s.SensorId, Value = value, Time = _dateTimeService.UnixTimeNow() } ); if (s.SensorId == 7) { currActualPower = value; } } } else //Если записи для этого сенсора нет в коллекции 2мин. { //то вставить в коллекции 2мин и 20сек /json/ для отправки на сервер //Вставка в коллекцию 20сек для отправки на сервер sensorValueInsert.counterValue.Add( new Model.SensorValueModel() { CounterId = s.SensorId, Value = value, Time = _dateTimeService.UnixTimeNow() } ); //Вставка в коллекцию 2мин sensorValue2mList.Add( new Model.SensorValueModel() { CounterId = s.SensorId, Value = value, Time = _dateTimeService.UnixTimeNow() } ); if (s.SensorId == 7) { currActualPower = value; } } } lastCounterValue2m = null; } } } } listBox1.SelectedIndex = listBox1.Items.Count - 1; //TODO: очистить Buffer Array.Clear(Buffer, 0, Buffer.Length); }