Пример #1
0
 //Добавляет описание ошибки с числовым ключом
 public void AddDescr(int number, string text, ErrQuality quality = ErrQuality.Error)
 {
     if (!_errDescrs.ContainsKey(number))
     {
         _errDescrs.Add(number, new ErrDescr(number, text, quality, MomErrType));
     }
 }
Пример #2
0
        //Добавить объект в провайдер
        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)));
        }
Пример #3
0
        //Добавить объект в провайдер
        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"))));
        }
Пример #4
0
        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));
        }
Пример #5
0
        //Добавить сигнал
        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]);
        }
Пример #6
0
        //Добавить сигнал
        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]);
        }
Пример #7
0
 //Чтение значений
 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);
     }
 }
Пример #8
0
 //Конструктор, на входе рекорсет 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;
             }
         }
     }
 }
Пример #9
0
        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);
        }
Пример #10
0
 //Получение списков кодов провайдеров по типам для выпадающих списков
 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");
     }
 }
Пример #11
0
        //Добавляет описание ошибки с числовым ключом
        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);
        }
Пример #12
0
        //Добавить выход в источник
        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));
        }
Пример #13
0
        //Чтение среза или изменений
        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);
        }
Пример #14
0
        //Добавить выход в провайдер
        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)));
        }
Пример #15
0
        //Загрузить список сигналов, возвращает ошибку или ""
        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));
        }
Пример #16
0
        //Чтение значений
        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);
            }
        }