Beispiel #1
0
        private void ReadCicle(object readOnlySelected)
        {
            ClassLog.AddLog(ELogType.Event, "ReadCicle", "ThreadRead запущен");

            while (Interlocked.CompareExchange(ref _fRead, 3, 2) == 1)
            {
                DateTime timeNext = DateTime.Now.AddMilliseconds(_readPeriod);

                ReadNet((bool)readOnlySelected);

                if (_fRead == 1)
                {
                    TimeSpan ts  = timeNext.Subtract(DateTime.Now);
                    bool     res = _autoResetReadStop.WaitOne(ts);
                    if (res)
                    {
                        Interlocked.CompareExchange(ref _fRead, 2, 1);

                        //-var flagValue = new NewChannelValue(null, DateTime.Now, NewEnumSignalStatus.FlagArchiveStop);
                        //-lock (_queueChannelValues) _queueChannelValues.Enqueue(flagValue);
                        var valueSerie = new NewChannelValueSerie(NewEnumSerieStatus.EndArchiveInterval, DateTime.Now);
                        lock (_queueCalc) _queueCalc.Enqueue(valueSerie);

                        _autoResetReadNet.Set();

                        Interlocked.CompareExchange(ref _fCalc, 2, 1);
                        _autoResetReadNet.Set();
                    }
                }
            }

            Interlocked.CompareExchange(ref _fRead, 0, 3);
            ClassLog.AddLog(ELogType.Event, "ReadCicle", "ThreadRead остановлен");
            //if (EventNetReadStop != null) EventNetReadStop(/*DateTime.Now*/);
        }
Beispiel #2
0
 public void ReadSingle(string archiveFileName = null, bool readOnlySelected = false)
 {
     if (archiveFileName != null)
     {
         ArchiveStart(archiveFileName);
     }
     else
     {
         ArchiveStop();
     }
     ReadNet(readOnlySelected);
     //-if (archiveFileName != null)
     //-{
     //-    var flagValue = new NewChannelValue(null, DateTime.Now, NewEnumSignalStatus.FlagArchiveStop);
     //-    lock (_queueChannelValues) _queueChannelValues.Enqueue(flagValue);
     //-}
     CalcQueue(false);
     if (archiveFileName != null)
     {
         var valueSerie = new NewChannelValueSerie(NewEnumSerieStatus.EndArchiveInterval, DateTime.Now);
         lock (_queueArchive) _queueArchive.Enqueue(valueSerie);
         ArchiverQueue();
     }
 }
Beispiel #3
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);
                }
            }
        }
Beispiel #4
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();
            }
        }
Beispiel #5
0
        //-private bool _fArchiveI;
        //-private bool _fLap;

        private void ReadNet(bool readOnlySelected = false)
        {
            lock (_hyperTerminal)
            {
                ClassLog.AddLog(ELogType.Event, null, "Опрос сети начат");

                //-NewChannelValue flagValue;

                ////-запись в архив: начало
                //-if(Interlocked.CompareExchange(ref _fArchiveE, 3, 1) == 1)
                //-{
                //-    flagValue = new NewChannelValue(null, DateTime.Now, NewEnumSignalStatus.FlagNewArchiveInterval);
                //-    lock (_queueChannelValues) _queueChannelValues.Enqueue(flagValue);
                //-}

                ////-опрос
                //-foreach (NewModuleAdamAbstract module in Modules)
                //-    module.ReadModule(_queueChannelValues, readOnlySelected);
                ////-lock (QueueChannelValues) QueueChannelValues.Enqueue(null);

                ////-конец цикла
                //-flagValue = new NewChannelValue(null, DateTime.Now, NewEnumSignalStatus.FlagEndCicle);
                //-_queueChannelValues.Enqueue(flagValue);

                ////-запись в архив: конец
                //-if (Interlocked.CompareExchange(ref _fArchiveE, 2, 0) == 0)
                //-{
                //-    flagValue = new NewChannelValue(null, DateTime.Now, NewEnumSignalStatus.FlagArchiveStop);
                //-    lock (_queueChannelValues) _queueChannelValues.Enqueue(flagValue);
                //-}

                var valueSerie = new NewChannelValueSerie();

                //опрос
                foreach (NewModuleAdamAbstract module in Modules)
                {
                    module.ReadModule(valueSerie.QueueValues, readOnlySelected);
                }

                //Архив
                //запись в архив: начало
                if (Interlocked.CompareExchange(ref _fArchiveE, 3, 1) == 1)
                {
                    valueSerie.ArchiveStatus  += (byte)NewEnumSerieStatus.NewArchiveInterval;
                    valueSerie.ArchiveFileName = _archiveFileName;
                }

                //запись в архив
                if (_fArchiveE == 3)
                {
                    valueSerie.ArchiveStatus += (byte)NewEnumSerieStatus.WriteArchive;
                    valueSerie.Time           = (valueSerie.QueueValues.Count > 0) ? valueSerie.QueueValues.Peek().Time  : DateTime.Now;
                }

                //запись в архив: конец
                if (Interlocked.CompareExchange(ref _fArchiveE, 0, 2) == 2)
                {
                    valueSerie.ArchiveStatus += (byte)NewEnumSerieStatus.EndArchiveInterval;
                }

                lock (_queueCalc) _queueCalc.Enqueue(valueSerie);
                _autoResetReadNet.Set();

                ClassLog.AddLog(ELogType.Event, null, "Опрос сети произведен");
            }
        }