Ejemplo n.º 1
0
        //private void WriteArchiveChannel(NewChannelValue channelValue)
        //{
        //    Exception ex;

        //    if (channelValue.Channel != null)
        //    {
        //        if (_fArchiveState == 1)
        //        {
        //            Program.Archive.WriteValue(channelValue.Channel.Code, _intervalId, channelValue.CurrentValue, channelValue.Time, (byte) channelValue.Status, out ex);
        //            if (ex != null) ClassLog.AddLog(ELogType.Event, "Archive", ex.Message);
        //        }
        //    }
        //    else
        //    {
        //        if (channelValue.Status == NewEnumSignalStatus.FlagNewArchiveInterval)
        //        {
        //            bool res = Program.Archive.Connect(_archiveFileName, out ex);
        //            if(res)
        //            {
        //                res = Program.Archive.UpdateParams(Program.Net.Modules, out ex);
        //                if(res)
        //                {
        //                    _intervalId = Program.Archive.BeginInterval(channelValue.Time, null, out ex);
        //                    if (ex != null)
        //                    {
        //                        ClassLog.AddLog(ELogType.Event, null, "Ошибка при начале нового интервала архива: " + ex.Message);
        //                        res = false;
        //                    }
        //                }
        //                else
        //                    ClassLog.AddLog(ELogType.Event, null, "Ошибка при обновление списка параметров архива: " + ex.Message);
        //            }
        //            else
        //                ClassLog.AddLog(ELogType.Event, null, "Ошибка подключения к архиву: " + ex.Message);

        //            if (res)
        //                _fArchiveState = 1;
        //            else
        //            {
        //                _fArchiveState = 2;
        //                //добавить событие на ошибку записи в архив (для главной формы)
        //                ArchiveStop();
        //                if (EventConnectArchiveError != null) EventConnectArchiveError(/*DateTime.Now*/);
        //            }
        //        }
        //        else if (channelValue.Status == NewEnumSignalStatus.FlagArchiveStop)
        //        {
        //            if (_fArchiveState == 1)
        //            {
        //                Program.Archive.WriteEndIntervalValues(_intervalId, channelValue.Time, out ex);
        //                if (ex != null)
        //                    ClassLog.AddLog(ELogType.Event, null, "Ошибка при завершении значей интервала архива: " + ex.Message);
        //                Program.Archive.EndInterval(_intervalId, channelValue.Time, out ex);
        //                if (ex != null)
        //                    ClassLog.AddLog(ELogType.Event, null, "Ошибка при завершении интервала архива: " + ex.Message);
        //            }

        //            Program.Archive.Disconnect();
        //            _intervalId = -1;
        //            _fArchiveState = 0;
        //        }
        //        else if (channelValue.Status == NewEnumSignalStatus.FlagEndCicle)
        //        {
        //            if (_fArchiveState == 1)
        //            {
        //                //обновить ин-цию на форме
        //                if (EventArchiveUpdated != null) EventArchiveUpdated(Program.Archive.ValuesRecordCount);
        //            }
        //        }
        //    }
        //}

        private void ArchiverSerie(NewChannelValueSerie valueSerie)
        {
            Exception ex;
            DateTime  endTime = valueSerie.Time;

            //новый интервал
            if (valueSerie.InArchiveStatus(NewEnumSerieStatus.NewArchiveInterval))
            {
                bool res = Program.Archive.Connect(valueSerie.ArchiveFileName, out ex);
                if (res)
                {
                    res = Program.Archive.UpdateParams(Program.Net.Modules, out ex);
                    if (res)
                    {
                        _intervalId = Program.Archive.BeginInterval(valueSerie.Time, null, out ex);
                        if (ex != null)
                        {
                            ClassLog.AddLog(ELogType.Event, null, "Ошибка при начале нового интервала архива: " + ex.Message);
                            res = false;
                        }
                    }
                    else
                    {
                        ClassLog.AddLog(ELogType.Event, null, "Ошибка при обновление списка параметров архива: " + ex.Message);
                    }
                }
                else
                {
                    ClassLog.AddLog(ELogType.Event, null, "Ошибка подключения к архиву: " + ex.Message);
                }

                if (res)
                {
                    _fArchiveState = 1;
                }
                else
                {
                    _fArchiveState = 2;
                    //добавить событие на ошибку записи в архив (для главной формы)
                    ArchiveStop();
                    if (EventWriteArchiveState != null)
                    {
                        EventWriteArchiveState(true);
                    }
                    if (EventConnectArchiveError != null)
                    {
                        EventConnectArchiveError(/*DateTime.Now*/);
                    }
                }
            }

            //значения

            if (_fArchiveState == 1)
            {
                bool archiveError = false;

                while (valueSerie.QueueValues.Count > 0)
                {
                    var channelValue = valueSerie.QueueValues.Dequeue();
                    if (WriteArchiveByRead || channelValue.ValueChanged ||
                        valueSerie.InArchiveStatus(NewEnumSerieStatus.NewArchiveInterval))
                    {
                        Program.Archive.WriteValue(channelValue.Code, _intervalId, channelValue.CurrentValue,
                                                   channelValue.Time, (byte)channelValue.Status, out ex);
                        if (ex != null)
                        {
                            ClassLog.AddLog(ELogType.Event, "Archive", ex.Message);
                            archiveError = true;
                        }
                    }

                    if (channelValue.Time > endTime)
                    {
                        endTime = channelValue.Time;
                    }
                }

                if (EventWriteArchiveState != null)
                {
                    EventWriteArchiveState(archiveError);
                }
                if (EventArchiveUpdated != null)
                {
                    EventArchiveUpdated(Program.Archive.ValuesRecordCount);
                }
            }


            //конец интервала
            if (valueSerie.InArchiveStatus(NewEnumSerieStatus.EndArchiveInterval))
            {
                if (_fArchiveState == 1)
                {
                    Program.Archive.WriteEndIntervalValues(_intervalId, endTime, out ex);
                    if (ex != null)
                    {
                        ClassLog.AddLog(ELogType.Event, null, "Ошибка при завершении значей интервала архива: " + ex.Message);
                    }
                    Program.Archive.EndInterval(_intervalId, endTime, out ex);
                    if (ex != null)
                    {
                        ClassLog.AddLog(ELogType.Event, null, "Ошибка при завершении интервала архива: " + ex.Message);
                    }
                }

                Program.Archive.Disconnect();
                _intervalId    = -1;
                _fArchiveState = 0;

                if (EventWriteArchiveState != null)
                {
                    EventWriteArchiveState(false);
                }
            }
        }
Ejemplo n.º 2
0
        //private void CalcChannel(NewChannelValue channelValue, bool startArchive = true)
        //{
        //    if (channelValue.Channel != null)
        //    {
        //        //calc
        //        lock (channelValue.Channel) channelValue.CalcValue();

        //        //archive
        //        if (_fArchiveI)
        //        {
        //            if (WriteArchiveByRead || channelValue.ValueChanged || _fLap)
        //                lock(_queueArchiveValues) { _queueArchiveValues.Enqueue(channelValue); }
        //        }

        //        //graphic
        //    }
        //    else
        //    {
        //        if(channelValue.Status == NewEnumSignalStatus.FlagNewArchiveInterval)
        //        {
        //            _fArchiveI = true;
        //            _fLap = true;
        //            lock (_queueArchiveValues) { _queueArchiveValues.Enqueue(channelValue); }

        //            //старт архив
        //            if (startArchive)
        //            {
        //                int i = Interlocked.CompareExchange(ref _fArchive, 1, 2);
        //                if (i == 3)
        //                {
        //                    _threadArchive.Join();
        //                    i = _fArchive;
        //                }
        //                if (i == 0)
        //                {
        //                    _threadArchive = new Thread(Archiver);
        //                    Interlocked.CompareExchange(ref _fArchive, 1, 0);
        //                    _threadArchive.Start();
        //                }
        //            }
        //        }
        //        else if (channelValue.Status == NewEnumSignalStatus.FlagArchiveStop)
        //        {
        //            _fArchiveI = false;
        //            lock (_queueArchiveValues) { _queueArchiveValues.Enqueue(channelValue); }

        //            Interlocked.CompareExchange(ref _fArchive, 2, 1);
        //            _autoResetReadNet.Set();
        //        }
        //        else if (channelValue.Status == NewEnumSignalStatus.FlagEndCicle)
        //        {
        //            if(_fLap) _fLap = false;

        //            lock (_queueArchiveValues) { _queueArchiveValues.Enqueue(channelValue); }
        //            if (EventNetRead != null) EventNetRead(DateTime.Now);
        //            _autoResetArchive.Set();
        //        }
        //    }
        //}

        private void CalcSerie(NewChannelValueSerie valueSerie, bool startArchive = true)
        {
            var archiveSerie = new NewChannelValueSerie
            {
                ArchiveFileName = valueSerie.ArchiveFileName,
                ArchiveStatus   = valueSerie.ArchiveStatus,
                Time            = valueSerie.Time
            };

            while (valueSerie.QueueValues.Count > 0)
            {
                NewChannelValue channelValue;
                lock (valueSerie.QueueValues) { channelValue = valueSerie.QueueValues.Dequeue(); }

                //calc
                channelValue.CalcValue();

                //archive
                if ((byte)valueSerie.ArchiveStatus >= 1)
                {
                    archiveSerie.QueueValues.Enqueue(channelValue);
                }

                //graphic
            }

            if (EventNetRead != null)
            {
                EventNetRead(DateTime.Now);
            }

            //archive
            if ((byte)valueSerie.ArchiveStatus >= 1)
            {
                lock (_queueArchive) { _queueArchive.Enqueue(archiveSerie); }

                //старт Archiver
                if (valueSerie.InArchiveStatus(NewEnumSerieStatus.NewArchiveInterval))
                {
                    if (startArchive)
                    {
                        int i = Interlocked.CompareExchange(ref _fArchive, 1, 2);
                        if (i == 3)
                        {
                            _threadArchive.Join();
                            i = _fArchive;
                        }
                        if (i == 0)
                        {
                            _threadArchive = new Thread(Archiver);
                            Interlocked.CompareExchange(ref _fArchive, 1, 0);
                            _threadArchive.Start();
                        }
                    }
                }

                //стоп Archiver
                if (valueSerie.InArchiveStatus(NewEnumSerieStatus.EndArchiveInterval))
                {
                    Interlocked.CompareExchange(ref _fArchive, 2, 1);
                }

                _autoResetArchive.Set();
            }
        }