//Подготовка провайдера, чтение значений IDCHANNEL protected override void PrepareProvider() { OutsId.Clear(); using (var rec = new AdoReader(SqlProps, "SELECT OBJECTS.NAME_OBJECT, DEVICES.NAME_DEVICE, LIB_CHANNELS.NAME_TYPE, LIB_CHANNELS.UNIT, CHANNELS.IDCHANNEL, LIB_CHANNELS.TABLE_NAME " + "FROM CHANNELS INNER JOIN DEVICES ON CHANNELS.IDDEVICE = DEVICES.IDDEVICE INNER JOIN " + "LIB_CHANNELS ON dbo.CHANNELS.IDTYPE_CHANNEL = dbo.LIB_CHANNELS.IDTYPE_CHANNEL INNER JOIN " + "POINT_DEVICES ON dbo.DEVICES.IDDEVICE = dbo.POINT_DEVICES.IDDEVICE INNER JOIN " + "POINT_CONNECTIONS ON dbo.POINT_DEVICES.IDPOINT_CONNECTION = dbo.POINT_CONNECTIONS.IDPOINT_CONNECTION INNER JOIN " + "POINT_OBJ ON dbo.POINT_CONNECTIONS.IDPOINT_CONNECTION = dbo.POINT_OBJ.IDPOINT_CONNECTION INNER JOIN " + "OBJECTS ON dbo.POINT_OBJ.IDOBJECT = dbo.OBJECTS.IDOBJECT")) while (rec.Read()) { string ocode = rec.GetString("NAME_OBJECT") + "." + rec.GetString("NAME_DEVICE") + "." + rec.GetString("NAME_TYPE"); var id = rec.GetInt("IDCHANNEL"); if (Outs.ContainsKey(ocode)) { var ob = Outs[ocode]; ob.IdChannel = id; OutsId.Add(id, ob); } } }
//Добавить выход в провайдер 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))); }
private void LoadParams(string fileName, string tablName) { using (var db = new DaoDb(Dir + fileName + ".accdb")) { var paramsId = new DicI <CalcParam>(); using (var rec = new DaoRec(db, tablName + "Params")) while (rec.Read()) { var cp = new CalcParam(this, rec, false); CalcParams.Add(cp.Code, cp); paramsId.Add(rec.GetInt("ParamId"), cp); } using (var rec = new DaoRec(db, tablName + "SubParams")) while (rec.Read()) { var cp = new CalcParam(this, rec, true); var owner = paramsId[rec.GetInt("ParamId")]; owner.SubParams.Add(cp.Code, cp); cp.Owner = owner; } } }
//Подготова источника protected override void PrepareProvider() { OutsId.Clear(); OutsId2.Clear(); using (var rec = new DaoRec(DbFile, "Objects")) while (rec.Read()) { var code = rec.GetString("Code"); var table = rec.GetString("TableName"); var id = rec.GetInt("ObjectId"); if (table == "MomValues" && Outs.ContainsKey(code)) { var ob = Outs[code]; ob.IsInitialized = true; OutsId.Add(id, ob).Id = id; } if (table == "MomValues2" && Outs2.ContainsKey(code)) { var ob = Outs2[code]; OutsId2.Add(id, ob).Id = id; } } }
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); }
//Загрузить список сигналов, возвращает ошибку или "" 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 string CheckSignals(bool onlyInUse = false) { StartAtom(Atom.CheckSignals); CountsToZero(); var objectsId = new DicI <ObjectSignal>(); var signals = new DicS <Signal>(); _objects.Clear(); try { if (State == State.Closed) { AddError("Копилятор уже был закрыт"); } else if (State == State.Empty) { AddError("Проект не загружен"); } else { //using (var reco = new RecDao(_projectFile, "SELECT CodeObject, NameObject, TagObject, ObjectId, CommName, ErrMess FROM Objects ORDER BY ObjectId")) using (var reco = new RecDao(_objectsFile, "SELECT CodeObject, NameObject, TagObject, ObjectId, CommName, ErrMess FROM Objects ORDER BY ObjectId")) //ab\ { Procent = 10; while (reco.Read()) { var ob = new ObjectSignal(reco, true); objectsId.Add(ob.Id, ob); if (!_objects.ContainsKey(ob.Code)) { _objects.Add(ob.Code, ob); } else { ob.ErrMess += "Повтор кода объекта (" + ob.Code + "); "; reco.Put("ErrMess", ob.ErrMess); _objects[ob.Code].ErrMess += "Повтор кода объекта (" + ob.Code + "); "; } } Procent = 25; using (var recs = new RecDao(reco.DaoDb, "SELECT ObjectId, Signals.Default, CodeSignal, NameSignal, Units, Signals.DataType, ConstValue, Signals.SourceName, Signals.ReceiverName, Signals.Inf, Signals.FullCode AS FullCode, Signals.ErrMess" + (!onlyInUse ? "" : ", SignalsInUse.FullCode AS FullCodeInUse") + " FROM Signals" + (!onlyInUse ? "" : " LEFT JOIN SignalsInUse ON Signals.FullCode=SignalsInUse.FullCode "))) { Procent = 35; while (recs.Read()) { var sig = new Signal(recs, objectsId, true); if (onlyInUse) { sig.InUse = !recs.GetString("FullCodeInUse").IsEmpty(); } objectsId[sig.ObjectId].InUse |= sig.InUse; if (signals.ContainsKey(sig.FullCode)) { sig.ErrMess += "Повтор полного кода сигнала (" + sig.FullCode + "); "; } else { signals.Add(sig.FullCode, sig); } if (sig.ErrMess != "") { recs.Put("ErrMess", sig.ErrMess, true); if (sig.InUse || !onlyInUse) { SignalsErrorsCount++; } objectsId[sig.ObjectId].ErrorInSignals = true; } } } Procent = 80; reco.MoveFirst(); while (!reco.EOF) { var ob = objectsId[reco.GetInt("ObjectId")]; if (ob.DefalutsCount == 0) { ob.ErrMess += "Объект не содержит сигналов по умолчанию; "; } if (ob.DefalutsCount >= 2) { ob.ErrMess += "Объект содержит более одного сигнала по умолчанию; "; } if (ob.ErrorInSignals) { ob.ErrMess += "Ошибки в сигналах; "; } if (ob.ErrMess != "") { reco.Put("ErrMess", ob.ErrMess); if (!onlyInUse || ob.InUse) { ObjectsErrorsCount++; } } reco.MoveNext(); } } } } catch (Exception ex) { return(ex.MessageError("Ошибка при проверке сигналов")); } return(FinishAtom(State.Project, State.Project, "Проект: " + _code + "; Объектов с ошибками: " + ObjectsErrorsCount + "; Сигналов с ошибками: " + SignalsErrorsCount)); }
//Загрузка сигналов public void LoadSignals() { StartLog("Загрузка сигналов", null, Type + " " + Code).Run(() => { BaseObjectsTypes.Clear(); ObjectsTypes.Clear(); Objects.Clear(); var typesId = new DicI <ObjectType>(); var baseTypesId = new DicI <BaseObjectType>(); var objectsId = new DicI <TablikObject>(); using (var db = new DaoDb(SignalsFile)) { using (var rec = new DaoRec(db, "BaseObjectTypes")) while (rec.Read()) { var t = new BaseObjectType(this, rec); baseTypesId.Add(t.Id, t); BaseObjectsTypes.Add(t.Code, t); BaseObjectsTypes.Add(Code + "." + t.Code, t); } using (var rec = new DaoRec(db, "ObjectTypes")) while (rec.Read()) { var t = new ObjectType(this, rec); typesId.Add(t.Id, t); ObjectsTypes.Add(t.Code, t); ObjectsTypes.Add(Code + "." + t.Code, t); var list = rec.GetString("BaseTypes").ToPropertyList(); foreach (var bt in list) { if (BaseObjectsTypes.ContainsKey(bt)) { t.BaseTypes.Add(BaseObjectsTypes[bt]); } } } using (var rec = new DaoRec(db, "Objects")) while (rec.Read()) { var t = rec.GetString("TypeObject"); if (ObjectsTypes.ContainsKey(t)) { var ob = new TablikObject(this, ObjectsTypes[t], rec); objectsId.Add(ob.Id, ob); Objects.Add(ob.Code, ob); Objects.Add(Code + "." + ob.Code, ob); foreach (Field f in rec.Recordset.Fields) { if (f.Name != "Otm" && f.Name != "ObjectId" && f.Name != "SysField") { var dt = f.Type.ToDataType(); var m = rec.GetMean(dt, f.Name); ob.Props.Add(f.Name, new ObjectProp(f.Name, dt, m)); } } } } using (var rec = new DaoRec(db, "BaseSignals")) while (rec.Read()) { var s = new BaseTablikSignal(this, rec); var t = baseTypesId[rec.GetInt("BaseTypeId")]; t.Signals.Add(s.Code, s); if (rec.GetBool("Default")) { t.Signal = s; } } using (var rec = new DaoRec(db, "Signals")) while (rec.Read()) { var s = new TablikSignal(this, rec); var t = typesId[rec.GetInt("TypeId")]; t.Signals.Add(s.Code, s); if (rec.GetBool("Default")) { t.Signal = s; } foreach (var bt in t.BaseTypes) { var bcode = rec.GetString("CodeSignal" + (bt.SignalColumnNum == 1 ? "" : bt.SignalColumnNum.ToString())); if (!bcode.IsEmpty()) { t.Signals.Add(bcode, s); } } } using (var rec = new DaoRec(db, "ObjectsColumns")) while (rec.Read()) { ObjectsColumns.Add(rec.GetString("CodeColumn"), rec.GetString("DataType").ToDataType()); } } }); }