public EditRocPointForm() { InitializeComponent(); Load += (sender, args) => { if (!IsEdit) { Point = new Roc809MeasurePoint(); Text = TITLE_CREATE; Icon = Resources.Add; } else { Text = TITLE_EDIT; txtName.Text = Point.Name; txtDescription.Text = Point.Description; numNumber.Value = Point.Number; numHistSegment.Value = Point.HistSegment; Icon = Resources.Sensor1; } }; btnSave.Select(); }
/// <summary> /// Возвращает полную информацию о измерительной точке вычислителя ROC809 /// </summary> public static string Info(this Roc809MeasurePoint point) { return($"Id:\t\t\t{point.Id}\n" + $"Назва:\t\t\t{point.Name}\n" + $"Опис:\t\t\t{point.Description}\n" + $"Номер:\t\t\t{point.Number}\n" + $"Історичний сегмент:\t{point.HistSegment}\n" + $"Створено:\t\t{point.DateCreated.ToString("dd.MM.yyyy HH:mm")}\n" + $"Змінено:\t\t{point.DateModified.ToString("dd.MM.yyyy HH:mm")}"); }
private async void ScanDailyData(Roc809 roc, Roc809MeasurePoint point, IClient client) { var s = roc.IsScannedViaGPRS ? $"телефоном {roc.Phone}" : $"адресою {roc.Address}"; Logger.Log(_log, new LogEntry { Message = $"Опитування добових даних обчислювача ROC809 з {s} ...", Status = LogStatus.Info, Type = LogType.Roc }); await _service.GetDailyData(client, roc, point, async data => { if (data == null || !data.Any()) { Logger.Log(_log, new LogEntry { Message = $"Добові дані точки №{point.Number} обчислювача ROC809 з {s} відсутні", Status = LogStatus.Warning, Type = LogType.Roc }); return; } data.ForEach(d => { d.Roc809MeasurePointId = point.Id; }); await _dataService.SaveDailyData(point.Id, data, saved => { Logger.Log(_log, saved > 0 ? new LogEntry { Message = $"Добові дані точки №{point.Number} обчислювача ROC809 з {s} успішно оновлено. Додано записів: {saved}", Status = LogStatus.Success, Type = LogType.Roc } : new LogEntry { Message = $"Нові добові дані точки №{point.Number} обчислювача ROC809 з {s} відсутні", Status = LogStatus.Warning, Type = LogType.Roc }); }, ex => { Logger.Log(_log, new LogEntry { Message = $"Помилка збереження добових даних точки №{point.Number} обчислювача ROC809 з {s}", Status = LogStatus.Error, Type = LogType.Roc }); Logger.Log(_log, new LogEntry { Message = ex.Message, Status = LogStatus.Error, Type = LogType.Roc }); }); }, ex => { Logger.Log(_log, new LogEntry { Message = $"Помилка читання добових даних точки №{point.Number} обчислювача ROC809 з {s}", Status = LogStatus.Error, Type = LogType.Roc }); Logger.Log(_log, new LogEntry { Message = ex.Message, Status = LogStatus.Error, Type = LogType.Roc }); }); }
private void ProcessPoint(RocScanMember member, Roc809 roc, Roc809MeasurePoint point, IClient client) { if (member.ScanMinuteData) { ScanMinuteData(roc, point, client); } if (member.ScanPeriodicData) { ScanPeriodicData(roc, point, client); } if (member.ScanDailyData) { ScanDailyData(roc, point, client); } }
public async Task GetDailyData(IClient client, Roc809 roc, Roc809MeasurePoint point, Action <List <Roc809DailyData> > onSuccess, Action <Exception> onException) { await _rocPlusProtocol.GetPeriodicData(roc, point, RocHistoryType.Daily, client) .ContinueWith(result => { if (result.Exception != null) { onException?.Invoke(result.Exception.InnerException); } else { onSuccess?.Invoke(result.Result.Select(d => new Roc809DailyData { Period = d.DatePeriod, Value = d.Value }).ToList()); } }, TaskScheduler.FromCurrentSynchronizationContext()); }
/// <summary> /// Возвращает текст для элемента дерева для точки измерения /// </summary> public static string NodeTitle(this MeasurePointBase point) { FloutecMeasureLine floutecLine = point as FloutecMeasureLine; if (floutecLine != null) { string sensor; switch (floutecLine.SensorType) { case 0: sensor = "Діафрагма"; break; case 1: sensor = "Лічильник"; break; case 2: sensor = "Витратомір"; break; default: sensor = "Діафрагма"; break; } return($"{floutecLine.Number} {floutecLine.Name} ({sensor})"); } Roc809MeasurePoint rocPoint = point as Roc809MeasurePoint; if (rocPoint != null) { return($"{rocPoint.Number} {rocPoint.Name} (Сегмент = {rocPoint.HistSegment})"); } return(string.Empty); }
public async Task <List <ROC809PeriodicDataModel> > GetPeriodicData(Roc809 roc, Roc809MeasurePoint point, RocHistoryType historyType, IClient client) { var request = new byte[15]; request[0] = (byte)roc.RocUnit; request[1] = (byte)roc.RocGroup; request[2] = (byte)roc.HostUnit; request[3] = (byte)roc.HostGroup; request[4] = 0x88; request[5] = 0x07; request[6] = (byte)point.HistSegment; request[7] = 0x00; request[8] = 0x00; request[9] = (byte)historyType; request[10] = (byte)(point.Number - 1); request[11] = 0x01; request[12] = 0x1e; var crc = Crc16.Compute(request, 13); request[13] = crc[0]; request[14] = crc[1]; int startIndex = request.GetInt16(7); int totalIndex; var data = new List <ROC809PeriodicDataModel>(); var gprsClient = client as GprsClient; if (gprsClient != null) { await gprsClient.Connect(roc.Phone); } do { byte[] response; var retries = client.Retries; var valid = false; do { response = await client.GetData(roc, request); var responseCrc = Crc16.Compute(response, 6 + response[5]); if (response[6 + response[5]] == responseCrc[0] && response[6 + response[5] + 1] == responseCrc[1]) { valid = true; break; } retries--; } while (retries > 0); if (!valid) { if (gprsClient != null) { await gprsClient.Disconnect(roc.Phone); } throw new Exception("Помилка читання даних через GPRS. Дані не є консистентними"); } totalIndex = historyType == RocHistoryType.Minute ? 60 : response.GetInt16(9); int recordsToProcess; if (historyType == RocHistoryType.Minute) { recordsToProcess = response[11] / 2 >= 30 ? 30 : response[11] / 2; } else { recordsToProcess = totalIndex - startIndex >= 30 ? 30 : totalIndex - startIndex; } for (var j = 0; j < recordsToProcess; j++) { var offset = j * 8; var period = new DateTime(1970, 1, 1, 0, 0, 0, 0); double value = 0; for (var k = 0; k < 2; k++) { var dataOffset = k * 4 + offset; if (k == 0) { period = period.AddSeconds(response.GetUInt32(12 + dataOffset)); } else { value = response.GetSingle(12 + dataOffset); } } data.Add(new ROC809PeriodicDataModel { DatePeriod = period, Value = value }); } startIndex = BitConverter.ToInt32(BitConverter.GetBytes(startIndex + 30), 0); request[7] = BitConverter.GetBytes(startIndex)[0]; request[8] = BitConverter.GetBytes(startIndex)[1]; crc = Crc16.Compute(request, 13); request[13] = crc[0]; request[14] = crc[1]; } while (startIndex < totalIndex); if (gprsClient != null) { await gprsClient.Disconnect(roc.Phone); } return(data.Distinct().ToList()); }