//Подготовка сигналов public void Prepare() { try { if (CloneFile.IsEmpty()) { return; } Logger.AddEvent("Установка отметок для считываемых сигналов"); _signalsId.Clear(); _signalsStrId.Clear(); using (var rec = new RecDao(CloneFile, "SELECT SignalId, FullCode, Otm FROM Signals")) while (rec.Read()) { string code = rec.GetString("FullCode"); if (!ProviderSignals.ContainsKey(code)) { rec.Put("Otm", false); } else { rec.Put("Otm", true); (ProviderSignals[code].DataType.LessOrEquals(DataType.Real) ? _signalsId : _signalsStrId) .Add(rec.GetInt("SignalId"), ProviderSignals[code]); } } } catch (Exception ex) { Logger.AddError("Ошибка при подготовке сигналов", ex); } }
//Получение диапазона клона public TimeInterval GetTime() { if (CloneFile.IsEmpty()) { return(new TimeInterval(Different.MinDate, Different.MaxDate)); } using (var sys = new SysTabl(CloneFile)) { TimeIntervals.Clear(); var t = new TimeInterval(sys.Value("BeginInterval").ToDateTime(), IsHandInput ? DateTime.Now : sys.Value("EndInterval").ToDateTime()); TimeIntervals.Add(t); return(t); } }
//Чтение значений public override void GetValues() { try { if (CloneFile.IsEmpty()) { return; } bool needCut = false; foreach (var sig in ProviderSignals.Values) { sig.Value.Moments.Clear(); needCut |= sig.BeginMoment == null || Math.Abs(sig.BeginMoment.Time.Subtract(BeginRead).TotalSeconds) > 0.5; } DateTime beg = BeginRead; var t = GetTime(); if (needCut) { beg = IsHandInput ? Different.MinDate : (beg.AddMinutes(-10) <= t.Begin ? t.Begin.AddSeconds(-1) : beg.AddMinutes(-10)); } int nread = 0, nwrite = 0; if (_signalsId.Count > 0) { Logger.AddEvent("Открытие рекордсета значений"); using (var rec = new ReaderAdo(CloneFile, "SELECT MomentsValues.SignalId as SignalId, Value, Time, Nd FROM MomentsValues INNER JOIN Signals ON Signals.SignalId = MomentsValues.SignalId " + "WHERE (Signals.Otm=True) AND (Time >= " + beg.ToAccessString() + ") AND (Time <= " + EndRead.ToAccessString() + ") ORDER BY Time, MomentsValues.SignalId")) { Logger.AddEvent("Чтение значений из рекордсета", _signalsId.Count + " сигналов"); while (rec.Read() && rec.GetTime("Time") <= BeginRead) { var sig = _signalsId[rec.GetInt("SignalId")]; sig.AddMoment(new Moment(sig.DataType, rec.GetDouble("Value"), rec.GetTime("Time"), rec.GetInt("Nd")), true); nread++; } foreach (var sig in _signalsId.Values) { nwrite += sig.AddBegin(); } while (!rec.EOF) { nread++; var sig = _signalsId[rec.GetInt("SignalId")]; nwrite += sig.AddMoment(new Moment(sig.DataType, rec.GetDouble("Value"), rec.GetTime("Time"), rec.GetInt("Nd"))); rec.Read(); } } } if (_signalsStrId.Count > 0) { Logger.AddEvent("Открытие рекордсета строковых значений"); using (var rec = new ReaderAdo(CloneFile, "SELECT MomentsStrValues.SignalId as SignalId, StrValue, TimeValue, Time, Nd FROM MomentsStrValues INNER JOIN Signals ON Signals.SignalId = MomentsStrValues.SignalId " + "WHERE (Signals.Otm=True) AND (Time >= " + beg.ToAccessString() + ") AND (Time < " + EndRead.ToAccessString() + ") ORDER BY Time, MomentsStrValues.SignalId")) if (rec.HasRows()) { Logger.AddEvent("Чтение строковых значений из рекордсета", _signalsStrId.Count + " сигналов"); while (rec.Read() && rec.GetTime("Time") <= BeginRead) { var sig = _signalsStrId[rec.GetInt("SignalId")]; if (sig.DataType == DataType.Time) { sig.AddMoment(rec.GetTime("Time"), rec.GetTime("TimeValue"), rec.GetInt("Nd"), true); } else { sig.AddMoment(rec.GetTime("Time"), rec.GetString("StrValue"), rec.GetInt("Nd"), true); } nread++; } foreach (var sig in _signalsStrId.Values) { nwrite += sig.AddBegin(); } while (!rec.EOF) { nread++; var sig = _signalsStrId[rec.GetInt("SignalId")]; if (sig.DataType == DataType.Time) { nwrite += sig.AddMoment(rec.GetTime("Time"), rec.GetTime("TimeValue"), rec.GetInt("Nd")); } else { nwrite += sig.AddMoment(rec.GetTime("Time"), rec.GetString("StrValue"), rec.GetInt("Nd")); } rec.Read(); } } } if (CloneRec != null) { foreach (var sig in ProviderSignals.Values) { nwrite += sig.MakeEnd(EndRead); } } Logger.AddEvent("Чтение значений завершено", nread + " значений прочитано, " + nwrite + " значений сформировано"); } catch (Exception ex) { Logger.AddError("Ошибка при попытке прочитать" + _cloneFileType, ex); } }