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*/); }
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(); } }
//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); } } }
//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(); } }
//-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, "Опрос сети произведен"); } }