Ejemplo n.º 1
0
        /// <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;
        }
Ejemplo n.º 2
0
 public void FreeTrend()
 {
     Trend.Clear();
     IsTrendLoaded = false;
 }