//Добавляет описание ошибки с числовым ключом public void AddDescr(int number, string text, ErrQuality quality = ErrQuality.Error) { if (!_errDescrs.ContainsKey(number)) { _errDescrs.Add(number, new ErrDescr(number, text, quality, MomErrType)); } }
//Добавить объект в провайдер protected override ProviderOut AddOut(ProviderSignal sig) { int id = sig.Inf.GetInt("Id"); return(OutsId.ContainsKey(id) ? OutsId[id] : OutsId.Add(id, new SimaticOut(this, sig.Inf["Archive"], sig.Inf["Tag"], id))); }
//Добавить объект в провайдер protected override ProviderOut AddOut(ProviderSignal sig) { var num = sig.Inf.GetInt("NumObject"); if (_outs.ContainsKey(num)) { return(_outs[num]); } return(_outs.Add(num, new FictiveOut(this, sig.Inf.GetInt("ValuesInterval")))); }
public void Simple() { var dic = new DicI <string>("def"); dic.Add(2, "22"); dic.Add(3, "33"); Assert.IsTrue(dic.ContainsKey(2)); Assert.IsTrue(dic.ContainsKey(3)); Assert.IsFalse(dic.ContainsKey(4)); Assert.IsTrue(dic.Keys.Contains(3)); Assert.AreEqual("22", dic[2]); Assert.AreEqual("22", dic.Get(2)); Assert.AreEqual("33", dic.Dic[3]); Assert.AreEqual("def", dic[4]); Assert.AreEqual(2, dic.Count); Assert.AreEqual(2, dic.Values.Count); Assert.AreEqual(2, dic.Keys.Count); dic.Add(2, "222"); dic.Add(3, "333", true); dic.Add(4, "444"); Assert.IsTrue(dic.ContainsKey(2)); Assert.IsTrue(dic.ContainsKey(3)); Assert.IsTrue(dic.ContainsKey(4)); Assert.AreEqual("22", dic[2]); Assert.AreEqual("333", dic[3]); Assert.AreEqual("444", dic[4]); Assert.AreEqual("444", dic.Get(4, "hh")); Assert.AreEqual("def", dic[5]); Assert.AreEqual("hh", dic.Get(5, "hh")); Assert.IsTrue(dic.ContainsValue("22")); Assert.IsFalse(dic.ContainsValue("33")); Assert.AreEqual(3, dic.Count); dic[4] = "44"; Assert.IsTrue(dic.ContainsKey(4)); Assert.AreEqual("44", dic[4]); Assert.IsTrue(dic.Remove(3)); Assert.IsFalse(dic.Remove(5)); Assert.IsFalse(dic.ContainsKey(3)); Assert.IsFalse(dic.ContainsKey(5)); dic.Clear(); Assert.AreEqual(0, dic.Count); Assert.IsFalse(dic.ContainsKey(2)); }
//Добавить сигнал public ProviderSignal AddSignal(string signalInf, string code, DataType dataType, int id = 0) { var sig = new SignalOvation(signalInf, code, dataType, this, 0); if (!_objectsId.ContainsKey(sig.Id)) { _objectsId.Add(sig.Id, new ObjectOvation(sig.Id, code)); if (IsOriginal) { if (_objectsId.Count % 200 == 1) { _objectsParts.Add(new List <ObjectOvation>()); } _objectsParts[_objectsParts.Count - 1].Add(_objectsId[sig.Id]); } } var ob = _objectsId[sig.Id]; if (sig.IsState) //Слово состояния { if (ob.StateSignal == null) { _signals.Add(sig.Code, sig); } return(ob.StateSignal ?? (ob.StateSignal = sig)); } if (sig.Bit == -1)//Аналоговый или дискретный { ob.IsValue = true; if (ob.ValueSignal == null) { _signals.Add(sig.Code, sig); } return(ob.ValueSignal ?? (ob.ValueSignal = sig)); } if (!ob.BitSignals.ContainsKey(sig.Bit))//Бит упакованного { ob.IsValue = true; _signals.Add(sig.Code, sig); ob.BitSignals.Add(sig.Bit, sig); } return(ob.BitSignals[sig.Bit]); }
//Добавить сигнал public ProviderSignal AddSignal(string signalInf, string code, DataType dataType, int idInClone) { var sig = new SignalOvation(signalInf, code, dataType, this, idInClone); ObjectOvation ob; if (!_objectsId.ContainsKey(sig.Id)) { ob = new ObjectOvation(sig.Id, code); _objectsId.Add(sig.Id, ob); if (_parts.Count == 0 || _parts[_parts.Count - 1].Count == 200) { _parts.Add(new List <ProviderObject>()); } _parts[_parts.Count - 1].Add(_objectsId[sig.Id]); } ob = _objectsId[sig.Id]; if (sig.IsState) //Слово состояния { if (ob.StateSignal == null) { ProviderSignals.Add(sig.Code, sig); } return(ob.StateSignal ?? (ob.StateSignal = sig)); } if (sig.Bit == -1)//Аналоговый или дискретный { if (ob.ValueSignal == null) { ProviderSignals.Add(sig.Code, sig); } return(ob.ValueSignal ?? (ob.ValueSignal = sig)); } if (!ob.BitSignals.ContainsKey(sig.Bit))//Бит упакованного { ProviderSignals.Add(sig.Code, sig); ob.BitSignals.Add(sig.Bit, sig); } return(ob.BitSignals[sig.Bit]); }
//Чтение значений public override void GetValues() { try { DateTime beg = BeginRead.AddMinutes(-BeginRead.Minute).AddSeconds(-BeginRead.Second - 1); DateTime en = EndRead.AddSeconds(1); using (var db = new DaoDb(_db)) { foreach (var tableName in _objects.Keys) { Logger.AddEvent("Чтение значений из таблицы " + tableName + "_ARCHIVE"); using (var rec = new RecDao(db, "SELECT * FROM " + tableName + "_ARCHIVE " + "WHERE (TYPE = 0) AND (Время >= " + beg.ToAccessString() + ") AND (Время <= " + en.ToAccessString() + ")")) while (rec.Read()) { int id = rec.GetInt("PARENT_ID"); if (_objectsId.ContainsKey(id)) { var ob = _objectsId[id]; foreach (var sigCode in ob.Signals.Keys) { ob.Signals[sigCode].AddMoment(rec.GetTime("Время"), rec.GetDouble(sigCode)); } } } } foreach (var tableName in _totals.Keys) { Logger.AddEvent("Чтение значений из таблицы " + tableName + "_TOTALS"); using (var rec = new RecDao(db, "SELECT * FROM " + tableName + "_TOTALS " + "WHERE (Время >= " + beg.ToAccessString() + ") AND (Время <= " + en.ToAccessString() + ")")) while (rec.Read()) { int id = rec.GetInt("PARENT_ID"); if (_totalsId.ContainsKey(id)) { var ob = _totalsId[id]; foreach (var sigCode in ob.Signals.Keys) { ob.Signals[sigCode].AddMoment(rec.GetTime("Время"), rec.GetDouble(sigCode)); } } } } } } catch (Exception ex) { Logger.AddError("Ошибка при чтении данных из файла программы Пролог", ex); } }
//Конструктор, на входе рекорсет rec, objects - список объектов, checkErrors: true - проверка сигналов, false - сигналы для компиляции public Signal(IRecordRead rec, DicI <ObjectSignal> objects, bool checkErrors) { ErrMess = ""; Code = rec.GetString("CodeSignal"); Name = rec.GetString("NameSignal"); Units = rec.GetString("Units"); DataType = rec.GetString("DataType").ToDataType(); InUseSource = false; InUseReceiver = false; ObjectId = rec.GetInt("ObjectId"); ConstValue = rec.GetString("ConstValue"); SourceName = rec.GetString("SourceName"); ReceiverName = rec.GetString("ReceiverName"); Inf = rec.GetString("Inf"); Default = rec.GetBool("Default"); if (checkErrors) { if (Code.IsEmpty()) { ErrMess += "Не заполнен код (CodeSignal); "; } if (DataType == DataType.Error) { ErrMess += "Недопустимый тип данных (DataType); "; } if (ConstValue.IsEmpty() && SourceName.IsEmpty() && ReceiverName.IsEmpty()) { ErrMess += "Должно быть заполнено имя источника (SourceName), имя приемника (ReceiverName) или значение константы (ConstValue); "; } } if (objects.ContainsKey(ObjectId)) { ObjectSignal = objects[ObjectId]; ObjectSignal.Signals.Add(Code, this); FullCode = ObjectSignal.Code + "." + Code; if (checkErrors) { //((RecDao)rec).Put("FullCode", FullCode); if (Default) { objects[ObjectId].DefalutsCount++; } if (ErrMess != "") { objects[ObjectId].ErrorInSignals = true; } } } }
public void Complex() { var dic = new DicI <int>(); dic.Add(1, 1); Assert.IsTrue(dic.ContainsKey(1)); Assert.AreEqual(0, dic[2]); Assert.AreEqual(1, dic[1]); Assert.AreEqual(1, dic.Count); var dicAdd = new DicI <int>(); dicAdd.Add(1, 11); dicAdd.Add(2, 22); dicAdd.Add(3, 333); dic.AddDic(dicAdd, false); Assert.IsTrue(dic.ContainsKey(1)); Assert.IsTrue(dic.ContainsKey(2)); Assert.IsTrue(dic.ContainsKey(3)); Assert.AreEqual(3, dic.Count); Assert.AreEqual(1, dic[1]); Assert.AreEqual(22, dic[2]); Assert.AreEqual(333, dic[3]); dicAdd[3] = 33; dic.AddDic(dicAdd); Assert.AreEqual(3, dic.Count); Assert.IsTrue(dic.ContainsKey(1)); Assert.IsTrue(dic.ContainsKey(2)); Assert.IsTrue(dic.ContainsKey(3)); Assert.AreEqual(22, dic[2]); Assert.AreEqual(33, dic[3]); dic.Remove((k, v) => v > 30); Assert.IsTrue(dic.ContainsKey(1)); Assert.IsTrue(dic.ContainsKey(2)); Assert.IsFalse(dic.ContainsKey(3)); Assert.AreEqual(2, dic.Count); }
//Получение списков кодов провайдеров по типам для выпадающих списков private static void ReadProvidersLists() { try { var prIds = new DicI <ProviderConfig>(); using (var rec = new ReaderAdo(ConfigFile, "SELECT * FROM SysTabl WHERE (ParamType='Provider') And (ParamValue <>'Коммуникатор')")) { while (rec.Read()) { var code = rec.GetString("ParamName"); var pr = new ProviderConfig(rec.GetString("ParamValue").ToProviderType(), code); pr.JointProviders.Add(code); prIds.Add(rec.GetInt("ParamId"), pr); ProviderConfigs.Add(pr.Code, pr); } foreach (var pr in prIds.Values) { if (pr.Type == ProviderType.Source) { ProviderConfigs["CloneSource"].JointProviders.Add(pr.Code); } } using (var recp = new ReaderAdo(ConfigFile, "SELECT * FROM SysSubTabl WHERE (SubParamName='ProviderFile') Or (SubParamName='JointProviders')")) while (recp.Read()) { int id = recp.GetInt("ParamId"); if (prIds.ContainsKey(id)) { string prop = recp.GetString("SubParamName"); var pval = recp.GetString("SubParamValue"); if (prop == "ProviderFile") { prIds[id].File = InfoTaskDir + (pval.StartsWith(@"\") ? pval.Substring(1) : pval); } if (prop == "JointProviders") { prIds[id].JointProviders.AddRange(pval.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries)); } } } } } catch (Exception ex) { ex.MessageError("Ошибка загрузки установленных провайдеров. Не правильный файл Config.accdb"); } }
//Добавляет описание ошибки с числовым ключом private ErrDescr AddDescr(int number, string text, ErrorQuality quality) { ErrDescr errDescr; lock (_locker) { if (!_errDescrsI.ContainsKey(number)) { errDescr = new ErrDescr(text, quality, number); _errDescrsI.Add(number, errDescr); } else { errDescr = _errDescrsI[number]; } } return(errDescr); }
//Добавить выход в источник protected override ProviderOut AddOut(ProviderSignal sig) { int id = sig.Inf.GetInt("NodeId"); if (OutsId.ContainsKey(id)) { return(OutsId[id]); } string tableName = sig.Inf["TableName"]; if (!Outs.ContainsKey(tableName)) { Outs.Add(tableName, new DicI <LogikaOut>()); } var ob = new LogikaOut(this); Outs[tableName].Add(id, ob); return(OutsId.Add(id, ob)); }
//Чтение среза или изменений private bool GetVals(DateTime beg, DateTime en, bool forBegin) { string s = forBegin ? "Срез" : "Изменения"; string queryString = "SELECT IDCHANNEL, TIME, VALUE, VALUE_UNIT, VALUE_INDICATION FROM IZM_TII" + " WHERE (TIME >= " + beg.ToSqlString() + ") AND (TIME <=" + en.ToSqlString() + ") ORDER BY TIME"; Logger.AddEvent("Запрос значений из базы", s); using (var rec = new ReaderAdo(SqlProps, queryString, 1000)) { Logger.Procent = 30; Logger.AddEvent("Чтение списка значений", s); while (rec.Read()) { int id = rec.GetInt("IDCHANNEL"); if (_signalsIndication.ContainsKey(id)) { var sig = _signalsIndication[id]; sig.AddMoment(rec.GetTime("TIME"), rec.GetDouble("VALUE_INDICATION"), 0, forBegin); } if (_signalsUnit.ContainsKey(id)) { var sig = _signalsUnit[id]; sig.AddMoment(rec.GetTime("TIME"), rec.GetDouble("VALUE_UNIT"), 0, forBegin); } } if (forBegin) { foreach (var sig in _signalsIndication.Values) { sig.AddBegin(BeginRead); //ab Было без параметра } foreach (var sig in _signalsUnit.Values) { sig.AddBegin(BeginRead); //ab Было без параметра } } } return(true); }
//Добавить выход в провайдер protected override ProviderOut AddOut(ProviderSignal sig) { var obType = sig.Inf.Get("ObjectType").ToUpper(); switch (obType) { case "ALARM": return(AlarmOut ?? (AlarmOut = new OvationMsgOut(this, "ALARM"))); case "SOE": return(SoeOut ?? (SoeOut = new OvationMsgOut(this, "SOE"))); case "TEXT": return(TextOut ?? (TextOut = new OvationMsgOut(this, "TEXT"))); } int id = sig.Inf.GetInt("Id"); return(OutsId.ContainsKey(id) ? OutsId[id] : OutsId.Add(id, new OvationOut(this, id))); }
//Загрузить список сигналов, возвращает ошибку или "" public string LoadSignals() { StartAtom(Atom.LoadSignals); CountsToZero(); if (State == State.Closed) { AddError("Копилятор уже был закрыт"); } else if (State == State.Empty) { AddError("Проект не загружен"); } else { try { var objectsId = new DicI <ObjectSignal>(); Signals.Clear(); SignalsList.Clear(); //using (var db = new DaoDb(_projectFile)) using (var db = new DaoDb(_objectsFile)) //ab\ { using (var reco = new ReaderAdo(db, "SELECT CodeObject, NameObject, TagObject, ObjectId, CommName FROM Objects ORDER BY ObjectId")) { AddEvent("Открыт рекордсет объектов"); Procent = 5; while (reco.Read()) { var curo = new ObjectSignal(reco, false); Objects.Add(curo.Code, curo); objectsId.Add(curo.Id, curo); } AddEvent("Объекты загружены"); } Thread.Sleep(50); Procent = 20; using (var recs = new ReaderAdo(db, "SELECT ObjectId, Default, CodeSignal, NameSignal, Units, DataType, ConstValue, SourceName, ReceiverName, Inf, FullCode FROM Signals ORDER BY ObjectId, SignalId")) { int i = 0, n = recs.RecordCount("SELECT Count(*) FROM Signals"); Procent = 30; AddEvent("Открыт рекордсет сигналов"); if (n != 0) { while (recs.Read()) { var sig = new Signal(recs, objectsId, false); SignalsList.Add(sig); Signals.Add(sig.FullCode, sig); if (sig.Default && objectsId.ContainsKey(sig.ObjectId)) { Signals.Add(objectsId[sig.ObjectId].Code, sig); } if (n > 20 && i % (n / 15) == 0) { Procent = (i++ *70) / n + 30; } } } } AddEvent("Сигналы загружены"); } } catch (Exception ex) { //ab //AddError("Ошибка загрузки сигналов", ex); AddError("Ошибка загрузки сигналов: " + ex.Message, ex); //\ab } } return(FinishAtom(State.Signals, State.Project, "Проект: " + _code + @"; Сигналов: " + SignalsList.Count)); }
//Чтение значений public override void GetValues() { try { 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 = needCut ? Different.MinDate : BeginRead; int nread = 0, nwrite = 0; if (_signalsId.Count > 0) { Logger.AddEvent("Открытие рекордсета значений"); using (var rec = new ReaderAdo(SqlProps, "SELECT MomentsValues.SignalId as SignalId, Value, Time, Nd FROM MomentsValues INNER JOIN Signals ON Signals.SignalId = MomentsValues.SignalId " + "WHERE (Time >= " + beg.ToSqlString() + ") AND (Time <= " + EndRead.ToSqlString() + ") 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(SqlProps, "SELECT MomentsStrValues.SignalId as SignalId, StrValue, TimeValue, Time, Nd FROM MomentsStrValues INNER JOIN Signals ON Signals.SignalId = MomentsStrValues.SignalId " + "WHERE (Time >= " + beg.ToSqlString() + ") AND (Time < " + EndRead.ToSqlString() + ") ORDER BY Time, MomentsStrValues.SignalId")) if (rec.HasRows()) { Logger.AddEvent("Чтение строковых значений из рекордсета", _signalsStrId.Count + " сигналов"); while (rec.Read() && rec.GetTime("Time") <= BeginRead) { var sigId = rec.GetInt("SignalId"); if (!_signalsStrId.ContainsKey(sigId)) { Logger.AddEvent("Не понятный SignalId", sigId.ToString()); } var sig = _signalsStrId[sigId]; 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("Ошибка при попытке прочитать значения ручного ввода", ex); } }