/// <summary> /// Принять тренд входного канала от SCADA-Сервера /// </summary> public bool ReceiveTrend(string tableName, DateTime date, Trend trend) { Monitor.Enter(tcpLock); bool result = false; errMsg = ""; try { try { if (RestoreConnection()) { WriteAction(string.Format(Localization.UseRussian ? "Приём тренда входного канала {0} от SCADA-Сервера. Файл: {1}" : "Receive input channel {0} trend from SCADA-Server. File: {1}", trend.CnlNum, tableName), Log.ActTypes.Action); commState = CommStates.WaitResponse; tcpClient.ReceiveTimeout = commSettings.ServerTimeout; byte tableType; // тип таблицы: текущая, часовая или минутная byte year, month, day; // дата запрашиваемых данных if (tableName == "current.dat") { tableType = (byte)0x01; year = month = day = 0; } else { tableType = tableName.Length > 0 && tableName[0] == 'h' ? (byte)0x02 : (byte)0x03; year = (byte)(date.Year % 100); month = (byte)date.Month; day = (byte)date.Day; } // отправка запроса тренда входного канала byte[] buf = new byte[13]; buf[0] = 0x0D; buf[1] = 0x00; buf[2] = 0x0D; buf[3] = tableType; buf[4] = year; buf[5] = month; buf[6] = day; buf[7] = 0x01; buf[8] = 0x00; byte[] bytes = BitConverter.GetBytes(trend.CnlNum); Array.Copy(bytes, 0, buf, 9, 4); netStream.Write(buf, 0, 13); // приём данных тренда входного канала buf = new byte[7]; int bytesRead = netStream.Read(buf, 0, 7); int pointCnt = 0; if (bytesRead == 7) { pointCnt = buf[5] + buf[6] * 256; if (pointCnt > 0) { Array.Resize<byte>(ref buf, 7 + pointCnt * 18); bytesRead += ReadNetStream(buf, 7, buf.Length - 7); } } // заполение тренда входного канала из полученных данных if (bytesRead == buf.Length && buf[4] == 0x0D) { for (int i = 0; i < pointCnt; i++) { Trend.Point point; int pos = i * 18 + 7; point.DateTime = Arithmetic.DecodeDateTime(BitConverter.ToDouble(buf, pos)); point.Val = BitConverter.ToDouble(buf, pos + 8); point.Stat = BitConverter.ToUInt16(buf, pos + 16); trend.Points.Add(point); } trend.Sort(); result = true; commState = CommStates.Authorized; } else { errMsg = Localization.UseRussian ? "Неверный формат ответа SCADA-Сервера на запрос тренда входного канала" : "Incorrect SCADA-Server response to input channel trend request"; WriteAction(errMsg, Log.ActTypes.Error); commState = CommStates.Error; } } } finally { // очистка тренда, если не удалось получить новые данные if (!result) { trend.Clear(); trend.TableName = tableName; } } } catch (Exception ex) { errMsg = (Localization.UseRussian ? "Ошибка при приёме тренда входного канала от SCADA-Сервера: " : "Error receiving input channel trend from SCADA-Server: ") + ex.Message; WriteAction(errMsg, Log.ActTypes.Exception); Disconnect(); } finally { RestoreReceiveTimeout(); Monitor.Exit(tcpLock); } return result; }
public void FreeTrend() { Trend.Clear(); IsTrendLoaded = false; }