public async Task <byte[]> GetData(Roc809 roc, byte[] request) { var portName = _statuses.FirstOrDefault(s => s.Value.Status == PortStatus.CONNECTED && s.Value.Phone.Equals(roc.Phone)).Key; if (string.IsNullOrEmpty(portName)) { return(new byte[1024]); } var port = _statuses[portName].Port; var retries = Retries; var stream = port.BaseStream; do { var response = new byte[1024]; port.DiscardInBuffer(); port.DiscardOutBuffer(); await Task.Delay(WriteDelay * 1000); SetStatus(new ModemLogEntry { Message = BytesToString(request), Status = Common.ModemStatus.SEND, Port = port.PortName }); var task = Task.Factory.StartNew(async() => { await stream.WriteAsync(request, 0, request.Length); await Task.Delay(ReadDelay * 1000); var result = await stream.ReadAsync(response, 0, response.Length); SetStatus(new ModemLogEntry { Message = $"Отримано {result} байтів", Status = Common.ModemStatus.RECEIVE, Port = port.PortName }); }).Unwrap(); if (await Task.WhenAny(task, Task.Delay(Timeout * 1000)) == task) { return(response); } retries--; } while (retries > 0); await Disconnect(roc.Phone); throw new Exception("Таймаут читання даних через GPRS"); }
private void ProcessRoc(RocScanMember member, Roc809 roc, IClient client) { if (member.ScanEventData) { ScanEventData(roc, client); } if (member.ScanAlarmData) { ScanAlarmData(roc, client); } }
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 }); }); }
public async Task GetAlarmData(IClient client, Roc809 roc, Action <List <Roc809AlarmData> > onSuccess, Action <Exception> onException) { await _rocPlusProtocol.GetAlarmData(roc, client) .ContinueWith(result => { if (result.Exception != null) { onException?.Invoke(result.Exception.InnerException); } else { onSuccess?.Invoke(result.Result); } }, TaskScheduler.FromCurrentSynchronizationContext()); }
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); } }
/// <summary> /// Возвращает полную информацию о вычислителе ROC809 /// </summary> public static string Info(this Roc809 roc) { return($"Id:\t\t\t{roc.Id}\n" + $"Назва:\t\t\t{roc.Name}\n" + $"Опис:\t\t\t{roc.Description}\n" + $"ROC Unit:\t\t{roc.RocUnit}\n" + $"ROC Group:\t\t{roc.RocGroup}\n" + $"Host Unit:\t\t{roc.HostUnit}\n" + $"Host Group:\t\t{roc.HostGroup}\n" + $"IP-адреса:\t\t{roc.Address}\n" + $"Порт:\t\t\t{roc.Port}\n" + $"Номер телефону:\t{roc.Phone}\n" + "Опитування:\t\t" + (roc.IsScannedViaGPRS ? "По GPRS" : "По TCP/IP") + "\n" + $"Створено:\t\t{roc.DateCreated.ToString("dd.MM.yyyy HH:mm")}\n" + $"Змінено:\t\t{roc.DateModified.ToString("dd.MM.yyyy HH:mm")}"); }
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 EstimatorBase estimator) { Floutec floutec = estimator as Floutec; if (floutec != null) { return($"{floutec.Name} (ФЛОУТЕК, Адреса = {floutec.Address})"); } Roc809 roc = estimator as Roc809; if (roc != null) { return(roc.IsScannedViaGPRS ? $"{roc.Name} (ROC, Телефон = {roc.Phone})" : $"{roc.Name} (ROC, Адреса = {roc.Address})"); } return(string.Empty); }
public async Task <byte[]> GetData(Roc809 roc, byte[] request) { var client = new TcpClient(); // Если соединение не было установлено, то установить if (!client.Connected) { client.Connect(roc.Address, roc.Port); } // Получение потока var stream = client.GetStream(); // Запись запроса в поток await stream.WriteAsync(request, 0, request.Length); await stream.FlushAsync(); // Чтение ответа из потока var response = new byte[1024]; await stream.ReadAsync(response, 0, response.Length); return(response); }
public EditRocForm() { InitializeComponent(); Load += (sender, args) => { if (!IsEdit) { Roc = new Roc809(); Text = TITLE_CREATE; Icon = Resources.Add; } else { Text = TITLE_EDIT; txtName.Text = Roc.Name; txtDescription.Text = Roc.Description; numRocUnit.Value = Roc.RocUnit; numRocGroup.Value = Roc.RocGroup; numHostUnit.Value = Roc.HostUnit; numHostGroup.Value = Roc.HostGroup; rbGPRS.Checked = Roc.IsScannedViaGPRS; rbTCPIP.Checked = !rbGPRS.Checked; txtAddress.Text = ConvertIpToMask(Roc.Address); txtPhone.Text = Roc.Phone; numPort.Value = Roc.Port; Icon = Resources.Estimator1; } txtAddress.Enabled = rbTCPIP.Checked; numPort.Enabled = rbTCPIP.Checked; txtPhone.Enabled = rbGPRS.Checked; }; btnCancel.Select(); }
public async Task <List <Roc809AlarmData> > GetAlarmData(Roc809 roc, IClient client) { var request = new byte[11]; var data = new List <Roc809AlarmData>(); request[0] = (byte)roc.RocUnit; request[1] = (byte)roc.RocGroup; request[2] = (byte)roc.HostUnit; request[3] = (byte)roc.HostGroup; request[4] = 0x76; request[5] = 0x03; request[6] = 0x0a; request[7] = 0x00; request[8] = 0x00; var crc = Crc16.Compute(request, 9); request[9] = crc[0]; request[10] = crc[1]; int startIndex = request.GetInt16(7); int totalIndex; 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 = response.GetInt16(9); var alarmsToProcess = totalIndex - startIndex >= 10 ? 10 : totalIndex - startIndex; for (var i = 0; i < alarmsToProcess; i++) { var offset = i * 23; var record = new Roc809AlarmData(); var time = new DateTime(1970, 1, 1, 0, 0, 0, 0); record.SRBX = (response[11 + offset] & (1 << 7)) != 0; record.Condition = (response[11 + offset] & (1 << 6)) != 0; record.Type = response[11 + offset] & 63; record.Time = time.AddSeconds(response.GetUInt32(12 + offset)); switch (record.Type) { case 0: break; case 1: record.Code = response[16 + offset]; record.T = response[17 + offset]; record.L = response[18 + offset]; record.P = response[19 + offset]; record.Description = response.GetASCII(20 + offset, 10); record.Value = response.GetSingle(30 + offset).ToString(CultureInfo.InvariantCulture); break; case 2: record.FST = response[16 + offset]; record.Description = response.GetASCII(17 + offset, 13); record.Value = response.GetSingle(30 + offset).ToString(CultureInfo.InvariantCulture); break; case 3: record.Description = response.GetASCII(16 + offset, 18); break; case 4: record.Description = response.GetASCII(16 + offset, 14); record.Value = response.GetSingle(30 + offset).ToString(CultureInfo.InvariantCulture); break; } data.Add(record); } startIndex = BitConverter.ToInt32(BitConverter.GetBytes(startIndex + 10), 0); request[7] = BitConverter.GetBytes(startIndex)[0]; request[8] = BitConverter.GetBytes(startIndex)[1]; crc = Crc16.Compute(request, 9); request[9] = crc[0]; request[10] = crc[1]; } while (startIndex < totalIndex); if (gprsClient != null) { await gprsClient.Disconnect(roc.Phone); } return(data); }
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()); }
public async Task <List <Roc809EventData> > GetEventData(Roc809 roc, IClient client) { var request = new byte[11]; request[0] = (byte)roc.RocUnit; request[1] = (byte)roc.RocGroup; request[2] = (byte)roc.HostUnit; request[3] = (byte)roc.HostGroup; request[4] = 0x77; request[5] = 0x03; request[6] = 0x0a; request[7] = 0x01; request[8] = 0x00; var crc = Crc16.Compute(request, 9); request[9] = crc[0]; request[10] = crc[1]; int startIndex = request.GetInt16(7); int totalIndex; var data = new List <Roc809EventData>(); 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 = response.GetInt16(9); var eventsToProcess = totalIndex - startIndex >= 10 ? 10 : totalIndex - startIndex; for (var i = 0; i < eventsToProcess; i++) { var offset = i * 22; var record = new Roc809EventData(); var time = new DateTime(1970, 1, 1, 0, 0, 0, 0); record.Type = response[11 + offset]; record.Time = time.AddSeconds(response.GetUInt32(12 + offset)); switch (record.Type) { case 0: break; case 1: record.OperatorId = response.GetASCII(16 + offset, 3); record.T = response[19 + offset]; record.L = response[20 + offset]; record.P = response[21 + offset]; switch (response[22 + offset]) { case 0: record.NewValue = response.GetBool(23 + offset) ? "1" : "0"; record.OldValue = response.GetBool(27 + offset) ? "1" : "0"; break; case 1: record.NewValue = response[23 + offset].ToString(); record.OldValue = response[27 + offset].ToString(); break; case 2: record.NewValue = response.GetInt16(23 + offset).ToString(); record.OldValue = response.GetInt16(27 + offset).ToString(); break; case 3: record.NewValue = response.GetInt32(23 + offset).ToString(); record.OldValue = response.GetInt32(27 + offset).ToString(); break; case 4: record.NewValue = response[23 + offset].ToString(); record.OldValue = response[27 + offset].ToString(); break; case 5: record.NewValue = response.GetUInt16(23 + offset).ToString(); record.OldValue = response.GetUInt16(27 + offset).ToString(); break; case 6: record.NewValue = response.GetUInt32(23 + offset).ToString(); record.OldValue = response.GetUInt32(27 + offset).ToString(); break; case 7: record.NewValue = response.GetSingle(23 + offset).ToString(CultureInfo.InvariantCulture); record.OldValue = response.GetSingle(27 + offset).ToString(CultureInfo.InvariantCulture); break; case 8: record.NewValue = response.GetTLP(23 + offset); record.OldValue = response.GetTLP(27 + offset); break; case 9: record.NewValue = response.GetASCII(23 + offset, 3); record.OldValue = response.GetASCII(27 + offset, 3); break; case 10: record.NewValue = response.GetASCII(23 + offset, 7); break; case 11: record.NewValue = response.GetASCII(23 + offset, 10); break; case 12: record.NewValue = response.GetASCII(23 + offset, 10); break; case 13: record.NewValue = response.GetASCII(23 + offset, 10); break; case 14: record.NewValue = response.GetASCII(23 + offset, 10); break; case 15: record.NewValue = response.GetASCII(23 + offset, 10); break; case 16: record.NewValue = response.GetDouble(23 + offset).ToString(CultureInfo.InvariantCulture); break; case 17: record.NewValue = time.AddSeconds(response.GetUInt32(23 + offset)).ToString("dd.MM.yyyy HH:mm:ss"); record.OldValue = time.AddSeconds(response.GetUInt32(27 + offset)).ToString("dd.MM.yyyy HH:mm:ss"); break; } break; case 2: record.Code = response[16 + offset]; record.Description = response.GetASCII(17 + offset, 16); break; case 3: record.FST = response[16 + offset]; record.Value = response.GetSingle(17 + offset).ToString(CultureInfo.InvariantCulture); break; case 4: record.OperatorId = response.GetASCII(16 + offset, 3); record.Code = response[19 + offset]; record.Description = response.GetASCII(20 + offset, 13); break; case 5: record.Value = time.AddSeconds(response.GetUInt32(16 + offset)).ToString("dd.MM.yyyy HH:mm:ss"); break; case 6: record.Value = time.AddSeconds(response.GetUInt32(16 + offset)).ToString("dd.MM.yyyy HH:mm:ss"); break; case 7: record.OperatorId = response.GetASCII(16 + offset, 3); record.T = response[19 + offset]; record.L = response[20 + offset]; record.P = response[21 + offset]; record.RawValue = response.GetSingle(22 + offset).ToString(CultureInfo.InvariantCulture); record.CalibratedValue = response.GetSingle(26 + offset).ToString(CultureInfo.InvariantCulture); break; } data.Add(record); } startIndex = BitConverter.ToInt32(BitConverter.GetBytes(startIndex + 10), 0); request[7] = BitConverter.GetBytes(startIndex)[0]; request[8] = BitConverter.GetBytes(startIndex)[1]; crc = Crc16.Compute(request, 9); request[9] = crc[0]; request[10] = crc[1]; } while (startIndex < totalIndex); if (gprsClient != null) { await gprsClient.Disconnect(roc.Phone); } return(data); }