public void AddPrerequisite(TechObject techToAddAsPrerequisite)
 {
     if (this.Prerequisites.Any(reqTech => reqTech.TechSystemID == techToAddAsPrerequisite.TechSystemID) == false)
     {
         this.Prerequisites.Add(techToAddAsPrerequisite);
     }
 }
Exemple #2
0
        public void TechnologyEffectDescriber_WhenDescribing_Should_ReturnEmptyListWhenUnknownTechType()
        {
            var fakeTech    = new TechObject();
            var description = TechnologyEffectDescriber.GetDescriptionList(fakeTech);

            Assert.IsFalse(description.Any());
        }
        public DbTechObject TechObjectToDb(TechObject theObject)
        {
            var config = new MapperConfiguration(cfg => cfg.CreateMap <TechObject, DbTechObject>());
            var mapper = new Mapper(config);
            var model  = mapper.Map <DbTechObject>(theObject);

            return(model);
        }
Exemple #4
0
        public TechObject AddNewTech(TechObject newTech)
        {
            var objectToSave = _mapper.TechObjectToDb(newTech);

            var id = databaseHandler.InsertTech(objectToSave);

            newTech.TechSystemID = (int?)id;

            return(newTech);
        }
        public int[] FindEqual(TechObject comparableObject,
                               ITechObjectManager techObjectManager)
        {
            int[] matches = techObjectManager.TechObjects
                            .Where(x => x.TechType == comparableObject.TechType &&
                                   x.TechNumber == comparableObject.TechNumber)
                            .Select(x => techObjectManager.GetTechObjectN(x))
                            .ToArray();

            return(matches);
        }
Exemple #6
0
        public ScrapCommandArgs([NotNull] TechObject @object)
        {
            if (@object == null)
            {
                throw new ArgumentNullException("object");
            }

            _objects = new ArrayWrapper <TechObject>(new[] { @object });

            SetInitialScrapValue();
        }
Exemple #7
0
        public void TechnologyEffectDescriber_WhenDescribing_Should_ReturnCorrectDescriptionFor_EnginePower()
        {
            var testTech = new TechObject()
            {
                TechType       = AuroraTechTypes.EnginePower,
                AdditionalInfo = 500.0
            };
            var description = TechnologyEffectDescriber.GetDescriptionList(testTech);

            Assert.AreEqual(TechEffectEnum.EnginePowerPerHs, description[0].EffectType);
            Assert.AreEqual("500.0 Engine Power per HS of Engine Size", description[0].Description);
        }
        public TechObject NewGlobalTech(TechObject theNewTech)
        {
            if (CheckIfTechExists(theNewTech.Name))
            {
                throw new ArgumentException($"{theNewTech.Name} already exists.");
            }

            theNewTech = _persistentStorage.AddNewTech(theNewTech);
            _allTechs.Add(theNewTech);

            return(theNewTech);
        }
Exemple #9
0
        public static List <TechEffectDescription> GetDescriptionList(TechObject techToDescribeEffectsOf)
        {
            var techType = techToDescribeEffectsOf.TechType;

            if (TechnologyEffectDescriber._describerFunctions.ContainsKey(techType) == false)
            {
                return(new List <TechEffectDescription>());
            }

            var describer = TechnologyEffectDescriber._describerFunctions[techType];

            return(describer(techToDescribeEffectsOf));
        }
        public int[] FindEqual(TechObject comparableObject,
                               ITechObjectManager techObjectManager)
        {
            int[] matches = techObjectManager.TechObjects
                            .Where(x => x.NameEplan == comparableObject.NameEplan &&
                                   x.TechNumber == comparableObject.TechNumber &&
                                   x.BaseTechObject?.EplanName ==
                                   comparableObject.BaseTechObject?.EplanName)
                            .Select(x => techObjectManager.GetTechObjectN(x))
                            .ToArray();

            return(matches);
        }
Exemple #11
0
        private static List <TechEffectDescription> DescribeEnginePower(TechObject theTech)
        {
            var result = new List <TechEffectDescription>();

            var entry1 = new TechEffectDescription()
            {
                EffectType  = TechEffectEnum.EnginePowerPerHs,
                Description = string.Format(_effectDescriptions[TechEffectEnum.EnginePowerPerHs], theTech.AdditionalInfo)
            };

            result.Add(entry1);

            return(result);
        }
        public TechObject NewGlobalTech(string name, string description, TechType techType, int techLevel, string componentName = "",
                                        double info1         = 0.0, double info2 = 0.0, double info3 = 0.0, double info4 = 0.0,
                                        string prerequisite1 = null, string prerequisite2 = null)
        {
            var theNewTech = new TechObject()
            {
                Name               = name,
                ComponentName      = componentName,
                TechDescription    = description,
                DevelopCost        = GetStandardTechCostForLevel(techLevel: techLevel),
                CategoryID         = techType.FieldID,
                TechType           = (AuroraTechTypes)techType.TechTypeID,
                GameID             = 0,
                RaceID             = 0,
                AdditionalInfo     = info1,
                AdditionalInfo2    = info2,
                AdditionalInfo3    = info3,
                AdditionalInfo4    = info4,
                ConventionalSystem = false,
                StartingSystem     = false,
                RuinOnly           = false,
                NoTechScan         = true,
                TechSystemID       = null,
                Prerequisite1      = 0,
                Prerequisite2      = 0
            };

            if (string.IsNullOrEmpty(prerequisite1) == false)
            {
                var req1Tech = GetTechByName(prerequisite1);
                if (req1Tech != null)
                {
                    theNewTech.Prerequisite1 = req1Tech.TechSystemID.Value;
                }
            }

            if (string.IsNullOrEmpty(prerequisite2) == false)
            {
                var req2Tech = GetTechByName(prerequisite2);
                if (req2Tech != null)
                {
                    theNewTech.Prerequisite2 = req2Tech.TechSystemID.Value;
                }
            }

            return(NewGlobalTech(theNewTech));
        }
        private TechObject DuplicateAndAdjustTech(TechObject theOriginalTech, NewTechDetails newTech)
        {
            var theNewTech = theOriginalTech.Duplicate(newTech.name);

            theNewTech.DevelopCost = _techManager.GetStandardTechCostForLevel(newTech.tier);

            if (string.IsNullOrEmpty(newTech.description) == false)
            {
                theNewTech.TechDescription = newTech.description;
            }

            if (string.IsNullOrEmpty(newTech.preRequisite1) == false)
            {
                var prereqTech = _techManager.GetTechByName(newTech.preRequisite1);
                theNewTech.Prerequisite1 = prereqTech.TechSystemID.Value;
            }
            if (string.IsNullOrEmpty(newTech.preRequisite2) == false)
            {
                var prereqTech = _techManager.GetTechByName(newTech.preRequisite2);
                theNewTech.Prerequisite2 = prereqTech.TechSystemID.Value;
            }

            if (string.IsNullOrEmpty(newTech.component) == false)
            {
                theNewTech.ComponentName = newTech.component;
            }
            if (newTech.newValue1.HasValue)
            {
                theNewTech.AdditionalInfo = newTech.newValue1.Value;
            }
            if (newTech.newValue2.HasValue)
            {
                theNewTech.AdditionalInfo = newTech.newValue2.Value;
            }
            if (newTech.newValue3.HasValue)
            {
                theNewTech.AdditionalInfo = newTech.newValue3.Value;
            }
            if (newTech.newValue4.HasValue)
            {
                theNewTech.AdditionalInfo = newTech.newValue4.Value;
            }

            return(theNewTech);
        }
        //метод для чтения и созданиия локального объекта из специальной зоны var
        //в режиме var, который определяется главным методом, вызывается этот метод, который будет читать каждую строку
        //и искать правильное определение блока и его нового местного имени.
        //Если такое возможно, то создаст экземпляр объекта с этим именем и через метод создания зарядит экземпляр всем необходимым
        //на выходе наверно лучше сделать bool? или void? подумой. Пока будет void
        public TechObject LocalObjectFinding(string s)
        {
            //Текст слева от символа ":" это имя
            //текст справа от символу ":" это тип объекта
            //Никаких подмен текста делать не надо, только исключить лишние пробелы, в названиях они не допускаются.
            //Сделать проверку того, нет ли чего лишнего в строке, а всё после ; можно игнорировать.
            string name        = "";
            string type        = "";
            int    index       = 0;
            bool   correctType = false;

            s = s.Replace(" ", "");

            for (int i = 0; i < s.IndexOf(":"); i++)
            {
                name += s[i];
                index = i;
            }

            for (int i = index + 2; i < s.IndexOf(";"); i++)
            {
                type += s[i];
            }

            //проверка того, что тип блока на самом деле существует
            foreach (string t in dic.TypeFB.ResultList)
            {
                if (t == type)
                {
                    correctType = true; break;
                }
            }

            if (correctType)
            {
                TechObject newObj = CreateTechObject(BaseAddr, type, 1);
                newObj.NameObject = name;
                return(newObj);
            }
            else
            {
                //исключение с сообщением и остановом программы?
                throw new Exception();
            }
        }
Exemple #15
0
            /// <summary>
            /// Получить корректные номера технологических объектов из
            /// входной строки
            /// </summary>
            /// <param name="value">Входная строка</param>
            /// <param name="selectedObjNum">Номер редактируемого объекта
            /// <returns></returns>
            public List <int> GetValidTechObjNums(string value,
                                                  int selectedObjNum)
            {
                var numbers = new List <int>();

                string[] numbersAsStringArray = value.Split(' ').ToArray();

                List <int> allowedObjectsNums = AllowedObjects?
                                                .Select(x => (int)x).ToList();

                foreach (var numAsString in numbersAsStringArray)
                {
                    int.TryParse(numAsString, out int number);
                    if (number <= 0)
                    {
                        continue;
                    }

                    TechObject obj = TechObjectManager.GetInstance()
                                     .GetTObject(number);
                    if (obj.BaseTechObject == null)
                    {
                        return(new List <int>());
                    }

                    var objValues = obj?.AttachedObjects.Value.Split(' ')
                                    .Where(x => int.TryParse(x, out _))
                                    .Select(x => int.Parse(x)).ToList();
                    if (objValues?.Contains(selectedObjNum) == true)
                    {
                        continue;
                    }

                    bool correctBaseObject = allowedObjectsNums
                                             .Contains(obj.BaseTechObject.S88Level);
                    if (correctBaseObject)
                    {
                        numbers.Add(number);
                    }
                }

                numbers = numbers.Distinct().ToList();
                return(numbers);
            }
        public static List <string> EffectsOfTheTech(TechObject theTechToAnalyse)
        {
            var effectList = TechnologyEffectDescriber.GetDescriptionList(theTechToAnalyse);

            var effects = new List <string>();

            foreach (var effectDescription in effectList)
            {
                var effectSummary = "";
                if (_effectSummary.ContainsKey(effectDescription.EffectType))
                {
                    effectSummary = _effectSummary[effectDescription.EffectType];
                }

                effects.Add($"{effectSummary} : {effectDescription.Description}");
            }

            return(effects);
        }
        //отдельный метод для создания тех объекта
        //надо чтобы создался тех объект со всеми вх/вых каналами (два листа)
        //надо как-то продумать приинадлежность объекта к цепочке, может в свойствах канала прописывать присваивание


        public TechObject CreateTechObject(string BaseAddr, string name, int TypeObj)
        {
            /*Расшифровка типов объектов:
             * 0 = объект имеющий марку
             * 1 = объект не имеющий марки, локальный
             * 2 = объект типа ссылка
             * 3 = объект типа TIOCH
             * */
            ConnectToDB connect = new ConnectToDB();  //создаем экземпляр класса для подключения к базе

            switch (TypeObj)
            {
            case 0:
                //запрос для случая, когда у нас объект с маркой
                string sql = "select isaobj.name, isaobjfields.name, isaobjfields.tid, isaobjfields.direction, isaobjfields.\"ORDER\" from isaobj, isaobjfields where isaobj.id = (select isacards.tid from isacards where isacards.marka = '" + name + "') and isaobjfields.isaobjid = (select isacards.tid from isacards where isacards.marka = '" + name + "') and isaobjfields.direction <> 3";
                //select isaobj.name, isaobjfields.name, isaobjfields.tid, isaobjfields.direction, isaobjfields."ORDER" from isaobj, isaobjfields where isaobj.id = (select isacards.tid from isacards where isacards.marka = 'E_KS7A_034_SEO1_ES1_QF37_L1') and isaobjfields.isaobjid = (select isacards.tid from isacards where isacards.marka = 'E_KS7A_034_SEO1_ES1_QF37_L1') and isaobjfields.direction <> 3

                connect.ConnectToBase(sql, BaseAddr);
                TmpDG = connect.dt1;     //в результату получаем пять столбцов в соответствии с запросом

                //обнаружено, что первый канал улетает в конец, поэтому код ниже работает с учетом этого

                List <TechObjectChIn>  ChInList  = new List <TechObjectChIn>();
                List <TechObjectChOut> ChOutList = new List <TechObjectChOut>();

                //заполним списки входных и выходных каналов для объекта
                for (int i = 0; i < TmpDG.Rows.Count; i++)
                {
                    if (Convert.ToInt16(TmpDG.Rows[i][3]) == 1)
                    {
                        TechObjectChIn newChIn = new TechObjectChIn();
                        newChIn.IndexCh  = Convert.ToInt32(TmpDG.Rows[i][4]);
                        newChIn.DataType = Convert.ToInt32(TmpDG.Rows[i][2]);
                        newChIn.NameCh   = Convert.ToString(TmpDG.Rows[i][1]);
                        ChInList.Add(newChIn);
                    }
                    if (Convert.ToInt16(TmpDG.Rows[i][3]) == 2)
                    {
                        TechObjectChOut newChOut = new TechObjectChOut();
                        newChOut.IndexCh  = Convert.ToInt32(TmpDG.Rows[i][4]);
                        newChOut.DataType = Convert.ToInt32(TmpDG.Rows[i][2]);
                        newChOut.NameCh   = Convert.ToString(TmpDG.Rows[i][1]);
                        ChOutList.Add(newChOut);
                    }
                }

                //теперь отсортируем индексы входных каналов, чтобы расположение было как в скаде
                ChInList.Sort(delegate(TechObjectChIn in1, TechObjectChIn in2)
                              { return(in1.IndexCh.CompareTo(in2.IndexCh)); });

                //выходные каналы также отсортируем, плюс к этому, индексы должны начинаться с нуля
                ChOutList.Sort(delegate(TechObjectChOut out1, TechObjectChOut out2)
                               { return(out1.IndexCh.CompareTo(out2.IndexCh)); });

                int tmpIndex = ChOutList[0].IndexCh;

                foreach (TechObjectChOut out1 in ChOutList)
                {
                    out1.IndexCh -= tmpIndex;
                }

                //создадим сам экземпляр блока
                TechObject obj = new TechObject();
                obj.TechObjectChInList  = ChInList;
                obj.TechObjectChOutList = ChOutList;
                obj.TypeObject          = Convert.ToString(TmpDG.Rows[0][0]);
                obj.local      = false;
                obj.RefType    = false;
                obj.TIOCHType  = false;
                obj.NameObject = name;
                obj.T11ID      = CounterT11Id;
                CounterT11Id++;     //обязательно увеличиваем счетчик объектов, чтобы не оказалось повторяющихся T11ID

                TmpDG.Clear();

                return(obj);

            case 1:

                //запрос для случая, когда у нас объект с маркой
                sql = "select isaobjfields.name, isaobjfields.tid, isaobjfields.direction, isaobjfields.\"ORDER\" from isaobjfields where isaobjfields.isaobjid = (select isaobj.id from isaobj where isaobj.name = '" + name + "') and isaobjfields.direction <> 3";
                //select isaobjfields.name, isaobjfields.tid, isaobjfields.direction, isaobjfields."ORDER" from isaobjfields where isaobjfields.isaobjid = (select isaobj.id from isaobj where isaobj.name = 'Next_AI_SS') and isaobjfields.direction <> 3
                connect.ConnectToBase(sql, BaseAddr);
                TmpDG = connect.dt1;     //в результату получаем 4 столбца в соответствии с запросом

                //обнаружено, что первый канал улетает в конец, поэтому код ниже работает с учетом этого...

                ChInList  = new List <TechObjectChIn>();
                ChOutList = new List <TechObjectChOut>();

                //заполним списки входных и выходных каналов для объекта
                for (int i = 0; i < TmpDG.Rows.Count; i++)
                {
                    if (Convert.ToInt16(TmpDG.Rows[i][2]) == 1)
                    {
                        TechObjectChIn newChIn = new TechObjectChIn();
                        newChIn.IndexCh  = Convert.ToInt32(TmpDG.Rows[i][3]);
                        newChIn.DataType = Convert.ToInt32(TmpDG.Rows[i][1]);
                        newChIn.NameCh   = Convert.ToString(TmpDG.Rows[i][0]);
                        ChInList.Add(newChIn);
                    }
                    if (Convert.ToInt16(TmpDG.Rows[i][2]) == 2)
                    {
                        TechObjectChOut newChOut = new TechObjectChOut();
                        newChOut.IndexCh  = Convert.ToInt32(TmpDG.Rows[i][3]);
                        newChOut.DataType = Convert.ToInt32(TmpDG.Rows[i][1]);
                        newChOut.NameCh   = Convert.ToString(TmpDG.Rows[i][0]);
                        ChOutList.Add(newChOut);
                    }
                }

                //теперь отсортируем индексы входных каналов, чтобы расположение было как в скаде
                ChInList.Sort(delegate(TechObjectChIn in1, TechObjectChIn in2)
                              { return(in1.IndexCh.CompareTo(in2.IndexCh)); });

                //выходные каналы также отсортируем, плюс к этому, индексы должны начинаться с нуля
                ChOutList.Sort(delegate(TechObjectChOut out1, TechObjectChOut out2)
                               { return(out1.IndexCh.CompareTo(out2.IndexCh)); });

                tmpIndex = ChOutList[0].IndexCh;

                foreach (TechObjectChOut out1 in ChOutList)
                {
                    out1.IndexCh -= tmpIndex;
                }

                //создадим сам экземпляр блока
                obj = new TechObject();
                obj.TechObjectChInList  = ChInList;
                obj.TechObjectChOutList = ChOutList;
                obj.TypeObject          = name;
                obj.local      = true;
                obj.RefType    = false;
                obj.TIOCHType  = false;
                obj.NameObject = ""; // не забыть переприсвоение в методе определения var!!!
                obj.T11ID      = CounterT11Id;
                CounterT11Id++;      //обязательно увеличиваем счетчик объектов, чтобы не оказалось повторяющихся T11ID

                TmpDG.Clear();

                return(obj);

            case 2:

                string tmpPLCName    = "";
                string tmpResName    = "";
                string tmpObjectName = "";
                string tmpChName     = "";
                string tmpChChName   = "";                   //это канал блока ссылки, поэтому канал канала.
                string tmpStr        = "";                   //буферная переменная

                List <string> tmpList = new List <string>(); // лист для элементов подстроки

                //далее посимвольно разберем на лист
                for (int j = 0; j < name.Length; j++)
                {
                    if (name[j] == Convert.ToChar(@"\"))       //СОМНИТЕЛЬНЫЙ ПРИЁМ, ПРОВЕРИТЬ
                    {
                        tmpList.Add(tmpStr);
                        tmpStr = "";
                        continue;
                    }

                    tmpStr += name[j];
                }

                //заполняем элементы ссылки.
                if (tmpList.Count == 4)
                {
                    tmpPLCName    = tmpList[0];
                    tmpResName    = tmpList[1];
                    tmpObjectName = tmpList[2];
                    tmpChName     = tmpList[3];


                    // select cards.marka, cards.objtypeid, cards.plc_gr, cards.plc_id, objtypeparam.name, objtypeparam.valtype, objtypeparam.ismanual from cards, objtypeparam where cards.marka = 'E_KS7A_034_SEO1_XX4_ALR' and objtypeparam.name = '.In' and objtypeparam.pid = (select cards.objtypeid from cards where cards.marka = 'E_KS7A_034_SEO1_XX4_ALR');
                    //если прочитался, имя объекта и канал существуют, и можно выгрузить тип данных,
                    //select cards.marka, resources.name from cards, resources where cards.id = 439 and resources.id = 14;
                    //из результатов предыдущего запроса вставляем в 439 cards.plc_id, а в 14 - cards.plc_gr.
                    //Получив имя контроллера и ресурса, сравниваем с текстом ссылки и пляшем дальше.

                    //запрос для проверки канала и объекта
                    sql = "select cards.marka, cards.objtypeid, cards.plc_gr, cards.plc_id, objtypeparam.name, objtypeparam.valtype, objtypeparam.ismanual from cards, objtypeparam where cards.marka = '" + tmpObjectName + "' and objtypeparam.name = '" + tmpChName + "' and objtypeparam.pid = (select cards.objtypeid from cards where cards.marka = '" + tmpObjectName + "')";
                    // select cards.marka, cards.objtypeid, cards.plc_gr, cards.plc_id, objtypeparam.name, objtypeparam.valtype, objtypeparam.ismanual from cards, objtypeparam where cards.marka = 'E_KS7A_034_SEO1_XX4_ALR' and objtypeparam.name = '.In' and objtypeparam.pid = (select cards.objtypeid from cards where cards.marka = 'E_KS7A_034_SEO1_XX4_ALR');
                    connect.ConnectToBase(sql, BaseAddr);
                    TmpDG = connect.dt1;                                    //в результату получаем 7 столбцов в соответствии с запросом

                    string tmpPLC_GR = Convert.ToString(TmpDG.Rows[0][2]);  //id ресурса, полученный из запроса
                    string tmpPLC_ID = Convert.ToString(TmpDG.Rows[0][3]);  //id ПЛК полученный из запроса
                    int    dataType  = Convert.ToInt32(TmpDG.Rows[0][5]);   //тип данных, полученный из запроса
                    bool   isManual  = Convert.ToBoolean(TmpDG.Rows[0][6]); //флаг того, что ссылка позволяет в неё что-то записать

                    TmpDG.Clear();
                    //Если запрос комбинации марка + имя канала не существует, то ответ будет нулевым и программа крашнется
                    //надо потом сделать исключение


                    //Если ответ нормальный, то шлём следующий запрос для проверки принадлежности нужному ресурсу и контроллеру
                    sql = "select cards.marka, resources.name from cards, resources where cards.id = " + tmpPLC_ID + " and resources.id = " + tmpPLC_GR;
                    if ((tmpPLCName == Convert.ToString(TmpDG.Rows[0][0])) && (tmpResName == Convert.ToString(TmpDG.Rows[0][1])))
                    {
                        //создадим полноценный объект с каналами ввода/вывода
                        obj = new TechObject();
                        if (isManual)
                        {
                            TechObjectChIn chIn = new TechObjectChIn();
                            chIn.DataType = dataType;
                            chIn.IndexCh  = 0;
                            chIn.NameCh   = "In";    //временное название, пока неизвестно, что в реальности нужно
                            obj.TechObjectChInList.Add(chIn);
                        }

                        //всегда два выходных канала первый - это просто выход с такими же характеристиками как и вход.
                        TechObjectChOut chOut1 = new TechObjectChOut();
                        chOut1.DataType = dataType;
                        chOut1.IndexCh  = 0;
                        chOut1.NameCh   = "Out";

                        //второй канал всегда качество, типа int
                        TechObjectChOut chOut2 = new TechObjectChOut();
                        chOut2.DataType = 5;
                        chOut2.IndexCh  = 1;
                        chOut2.NameCh   = "Q";   //реальное имя канала

                        obj.TechObjectChOutList.Add(chOut1);
                        obj.TechObjectChOutList.Add(chOut2);

                        //создадим сам объект
                        obj            = new TechObject();
                        obj.NameObject = name;
                        obj.RefType    = true;
                        obj.T11ID      = CounterT11Id;
                        CounterT11Id++;

                        return(obj);
                    }
                    else
                    {
                        throw new Exception();
                    }
                }
                else
                {
                    throw new Exception();
                }

            case 3:

                //запрос для проверки канала и объекта
                sql = "select isacards.marka, isacards.classid, isacards.resid from isacards where isacards.name = '" + name + "'";
                // select isacards.marka, isacards.classid, isacards.resid from isacards where isacards.name = '[COM1013:16:31] mb_master_hr_int_out_v > êàíàë 0'
                connect.ConnectToBase(sql, BaseAddr);
                TmpDG = connect.dt1;     //в результату получаем 3 столбцов в соответствии с запросом

                if (Convert.ToInt32(TmpDG.Rows[0][2]) == ResID)
                {
                    obj = new TechObject();

                    string tmpMarka   = "";
                    int    tmpClassID = 0;
                    int    tmpResID   = 0;
                    //class id = 2 --> только выход, class id = 3 --> вход/выход
                    //если есть входной канал, то добавим его в объект
                    if (Convert.ToInt32(TmpDG.Rows[0][1]) == 3)
                    {
                        TechObjectChIn ChIn = new TechObjectChIn();
                        ChIn.IndexCh = 0;
                        ChIn.NameCh  = "In";
                        //newChIn.DataType =  ПРИСВАИВАТЬ В МЕТОДЕ ПОИСКА СОВПАДЕНИЙ
                        obj.TechObjectChInList.Add(ChIn);
                    }

                    //всег овозможно 4 выходных канала, присвоим их сразу

                    TechObjectChOut ChOut = new TechObjectChOut();
                    //Добавим 4 канала в объект вручную.
                    ChOut.IndexCh  = 0;
                    ChOut.NameCh   = "Status";
                    ChOut.DataType = 6;
                    obj.TechObjectChOutList.Add(ChOut);

                    ChOut.IndexCh  = 1;
                    ChOut.NameCh   = "ValueBOOL";
                    ChOut.DataType = 9;
                    obj.TechObjectChOutList.Add(ChOut);

                    ChOut.IndexCh  = 2;
                    ChOut.NameCh   = "ValueDINT";
                    ChOut.DataType = 6;
                    obj.TechObjectChOutList.Add(ChOut);

                    ChOut.IndexCh  = 3;
                    ChOut.NameCh   = "ValueREAL";
                    ChOut.DataType = 7;
                    obj.TechObjectChOutList.Add(ChOut);

                    //!!! В ЦИКЛЕ ДОБАВИТЬ СТОЛЬКО ЖЕ ВНУТРЕННИХ КАНАЛОВ, ЧТОБЫ
                    //ПОТОМ ОСТАВАЛОСЬ ТОЛЬКО ВЫБРАТЬ


                    obj.TIOCHType  = true;
                    obj.NameObject = Convert.ToString(TmpDG.Rows[0][0]);
                    obj.T11ID      = CounterT11Id;
                    CounterT11Id++;

                    return(obj);
                }
                else
                {
                    throw new Exception();
                }


            default:
                throw new Exception();
            }


            //отдельно для случая, когда объект локальный
            //отдкльно когда ссылка
            //отдкльно когда канал В/В
        }
Exemple #18
0
 public void LinkTech(TechObject techToLink)
 {
     this._linkedTech = techToLink;
 }
        //отдельный метод для создания тех объекта
        //надо чтобы создался тех объект со всеми вх/вых каналами (два листа)
        //надо как-то продумать приинадлежность объекта к цепочке, может в свойствах канала прописывать присваивание


        public TechObject CreateTechObject(string BaseAddr, string name, int TypeObj)
        {
            /*Расшифровка типов объектов:
             * 0 = объект имеющий марку
             * 1 = объект не имеющий марки, локальный
             * 2 = объект типа ссылка
             * 3 = объект типа TIOCH
             * */
            ConnectToDB connect = new ConnectToDB();  //создаем экземпляр класса для подключения к базе

            switch (TypeObj)
            {
            case 0:
                //запрос для случая, когда у нас объект с маркой
                string sql = "select isaobj.name, isaobjfields.name, isaobjfields.tid, isaobjfields.direction, isaobjfields.\"ORDER\" from isaobj, isaobjfields where isaobj.id = (select isacards.tid from isacards where isacards.marka = '" + name + "') and isaobjfields.isaobjid = (select isacards.tid from isacards where isacards.marka = '" + name + "') and isaobjfields.direction <> 3";
                //select isaobj.name, isaobjfields.name, isaobjfields.tid, isaobjfields.direction, isaobjfields."ORDER" from isaobj, isaobjfields where isaobj.id = (select isacards.tid from isacards where isacards.marka = 'E_KS7A_034_SEO1_ES1_QF37_L1') and isaobjfields.isaobjid = (select isacards.tid from isacards where isacards.marka = 'E_KS7A_034_SEO1_ES1_QF37_L1') and isaobjfields.direction <> 3

                connect.ConnectToBase(sql, BaseAddr);
                TmpDG = connect.dt1;     //в результату получаем пять столбцов в соответствии с запросом

                //обнаружено, что первый канал улетает в конец, поэтому код ниже работает с учетом этого

                List <TechObjectChIn>  ChInList  = new List <TechObjectChIn>();
                List <TechObjectChOut> ChOutList = new List <TechObjectChOut>();

                //заполним списки входных и выходных каналов для объекта
                for (int i = 0; i < TmpDG.Rows.Count; i++)
                {
                    if (Convert.ToInt16(TmpDG.Rows[i][3]) == 1)
                    {
                        TechObjectChIn newChIn = new TechObjectChIn();
                        newChIn.IndexCh  = Convert.ToInt32(TmpDG.Rows[i][4]);
                        newChIn.DataType = Convert.ToInt32(TmpDG.Rows[i][2]);
                        newChIn.NameCh   = Convert.ToString(TmpDG.Rows[i][1]);
                        ChInList.Add(newChIn);
                    }
                    if (Convert.ToInt16(TmpDG.Rows[i][3]) == 2)
                    {
                        TechObjectChOut newChOut = new TechObjectChOut();
                        newChOut.IndexCh  = Convert.ToInt32(TmpDG.Rows[i][4]);
                        newChOut.DataType = Convert.ToInt32(TmpDG.Rows[i][2]);
                        newChOut.NameCh   = Convert.ToString(TmpDG.Rows[i][1]);
                        ChOutList.Add(newChOut);
                    }
                }

                //теперь отсортируем индексы входных каналов, чтобы расположение было как в скаде
                ChInList.Sort(delegate(TechObjectChIn in1, TechObjectChIn in2)
                              { return(in1.IndexCh.CompareTo(in2.IndexCh)); });

                //выходные каналы также отсортируем, плюс к этому, индексы должны начинаться с нуля
                ChOutList.Sort(delegate(TechObjectChOut out1, TechObjectChOut out2)
                               { return(out1.IndexCh.CompareTo(out2.IndexCh)); });

                int tmpIndex = ChOutList[0].IndexCh;

                foreach (TechObjectChOut out1 in ChOutList)
                {
                    out1.IndexCh -= tmpIndex;
                }

                //создадим сам экземпляр блока
                TechObject obj = new TechObject();
                obj.TechObjectChInList  = ChInList;
                obj.TechObjectChOutList = ChOutList;
                obj.TypeObject          = Convert.ToString(TmpDG.Rows[0][0]);
                obj.local      = false;
                obj.RefType    = false;
                obj.TIOCHType  = false;
                obj.NameObject = name;
                obj.T11ID      = CounterT11Id;
                CounterT11Id++;     //обязательно увеличиваем счетчик объектов, чтобы не оказалось повторяющихся T11ID

                TmpDG.Clear();

                return(obj);

            case 1:

                //запрос для случая, когда у нас объект с маркой
                sql = "select isaobjfields.name, isaobjfields.tid, isaobjfields.direction, isaobjfields.\"ORDER\" from isaobjfields where isaobjfields.isaobjid = (select isaobj.id from isaobj where isaobj.name = '" + name + "') and isaobjfields.direction <> 3";
                //select isaobjfields.name, isaobjfields.tid, isaobjfields.direction, isaobjfields."ORDER" from isaobjfields where isaobjfields.isaobjid = (select isaobj.id from isaobj where isaobj.name = 'Next_AI_SS') and isaobjfields.direction <> 3
                connect.ConnectToBase(sql, BaseAddr);
                TmpDG = connect.dt1;     //в результату получаем 4 столбца в соответствии с запросом

                //обнаружено, что первый канал улетает в конец, поэтому код ниже работает с учетом этого...

                ChInList  = new List <TechObjectChIn>();
                ChOutList = new List <TechObjectChOut>();

                //заполним списки входных и выходных каналов для объекта
                for (int i = 0; i < TmpDG.Rows.Count; i++)
                {
                    if (Convert.ToInt16(TmpDG.Rows[i][2]) == 1)
                    {
                        TechObjectChIn newChIn = new TechObjectChIn();
                        newChIn.IndexCh  = Convert.ToInt32(TmpDG.Rows[i][3]);
                        newChIn.DataType = Convert.ToInt32(TmpDG.Rows[i][1]);
                        newChIn.NameCh   = Convert.ToString(TmpDG.Rows[i][0]);
                        ChInList.Add(newChIn);
                    }
                    if (Convert.ToInt16(TmpDG.Rows[i][2]) == 2)
                    {
                        TechObjectChOut newChOut = new TechObjectChOut();
                        newChOut.IndexCh  = Convert.ToInt32(TmpDG.Rows[i][3]);
                        newChOut.DataType = Convert.ToInt32(TmpDG.Rows[i][1]);
                        newChOut.NameCh   = Convert.ToString(TmpDG.Rows[i][0]);
                        ChOutList.Add(newChOut);
                    }
                }

                //теперь отсортируем индексы входных каналов, чтобы расположение было как в скаде
                ChInList.Sort(delegate(TechObjectChIn in1, TechObjectChIn in2)
                              { return(in1.IndexCh.CompareTo(in2.IndexCh)); });

                //выходные каналы также отсортируем, плюс к этому, индексы должны начинаться с нуля
                ChOutList.Sort(delegate(TechObjectChOut out1, TechObjectChOut out2)
                               { return(out1.IndexCh.CompareTo(out2.IndexCh)); });

                tmpIndex = ChOutList[0].IndexCh;

                foreach (TechObjectChOut out1 in ChOutList)
                {
                    out1.IndexCh -= tmpIndex;
                }

                //создадим сам экземпляр блока
                obj = new TechObject();
                obj.TechObjectChInList  = ChInList;
                obj.TechObjectChOutList = ChOutList;
                obj.TypeObject          = name;
                obj.local      = true;
                obj.RefType    = false;
                obj.TIOCHType  = false;
                obj.NameObject = ""; // не забыть переприсвоение в методе определения var!!!
                obj.T11ID      = CounterT11Id;
                CounterT11Id++;      //обязательно увеличиваем счетчик объектов, чтобы не оказалось повторяющихся T11ID

                TmpDG.Clear();

                return(obj);

            default:
                throw new Exception();
            }


            //отдельно для случая, когда объект локальный
            //отдкльно когда ссылка
            //отдкльно когда канал В/В
        }
//////////ПРОВЕРИТЬ/////////////////////////////////////////////////////////////////////////////////////////////////////
        //Проверка совпадения с объектом типа ссылка
        //на входе строка после исключеия групп и функциий
        //в процессе проверяется возможность существования такой ссылки и создается объект типа ссылка
        //продумать правила написания ссылок в ST коде
        //на выходе трансформированая строка
        public string LinkMatching(string s)
        {
            //сразу создавать адрес ссылки такой, который будет потом использоваться в xml файле
            //попробовать ннайти все данные по ссылке, чтобы облегчить создание xml файла
            //проверить, что объект по данной ссылке реальнно существует
            //не забывать про лог

            //ASUE_USO_22\Resource1\real_test\Значение\Out  - пример ссылки на контроллер
            //ModbusOPCServer\0\IInt1\Значение\Q - пример ссылки на ОРС

            //более конкртное описание:
            //Если нашли символ \, тогда начинаем считывать ссылку
            //записываем структуру ссылки, собирая объект, включающий в себя имя контроллера, ресурс, марка объекта, канал объекта.
            //Далее нужно сделать проверку того, реальна ли эта ссылка
            //составляем запрос, где учавствует ПЛК, ресурс, объект и канал, чтобы цепочкой всё проверить.
            //Если нет такого, то ошибка и останово
            //Если есть, то добавляем этот объект в список объектов типа ссылка, и подменяем текст в строке
            //НУЖЕН НОВЫЙ ТИП ОБЪЕКТА, ССЫЛОЧНЫЙ, там всегда каналы одинаковые, можно их сразу и прописать будет.
            //Отдельный объект для подмены и отдельный список для подмены в тексте

            // select cards.marka, cards.objtypeid, cards.plc_gr, cards.plc_id, objtypeparam.name, objtypeparam.valtype, objtypeparam.ismanual from cards, objtypeparam where cards.marka = 'E_KS7A_034_SEO1_XX4_ALR' and objtypeparam.name = '.In' and objtypeparam.pid = (select cards.objtypeid from cards where cards.marka = 'E_KS7A_034_SEO1_XX4_ALR');
            //если прочитался, имя объекта и канал существуют, и можно выгрузить тип данных,
            //select cards.marka, resources.name from cards, resources where cards.id = 439 and resources.id = 14;
            //из результатов предыдущего запроса вставляем в 439 cards.plc_id, а в 14 - cards.plc_gr.
            //Получив имя контроллера и ресурса, сравниваем с текстом ссылки и пляшем дальше.



            string s1     = s; //дублируем строку, чтобы её курочить
            string result = "";
            int    index  = 0; //индекс для циклов

            //разобьем строку на элементы по отдельности с разделителем ;
            List <string> sList = new List <string>();

            string tmp = "";

            for (int i = 0; i < s1.Length; i++)
            {
                if (s1[i] == ';')
                {
                    sList.Add(tmp);
                    tmp = "";
                    continue;
                }
                tmp += s1[i];
            }

            for (int i = 0; i < sList.Count; i++)
            {
                List <string> tmpList = new List <string>(); // лист для элементов подстроки

                //проводим поиск символа "\", если найден, то в цикле заполняем параметры ссылки
                string tmpChChName = "";

                if (sList[i].IndexOf(@"\") >= 0)
                {
                    //сперва отделим искусственный указатель на канал блока от самой ссылки
                    tmp = "";
                    for (int j = sList[i].Length; j >= 0; j--)
                    {
                        if (sList[i][j] == Convert.ToChar(@"\"))
                        {
                            tmpChChName = tmp;
                            sList[i]    = sList[i].Replace(tmpChChName, "");
                            break;
                        }
                        tmp.Insert(0, Convert.ToString(sList[i][j])); //добавляем каждый символ перед предыдущим
                    }

                    TechObject newObj = new TechObject();
                    newObj = CreateTechObject(BaseAddr, sList[i], 2);
                    bool createdObj = false;
                    //проверить, нет ли уже такого объекта.

                    foreach (TechObject obj in TechObjectList)
                    {
                        if (obj.NameObject == newObj.NameObject)
                        {
                            createdObj = true;
                            break;
                        }
                    }

                    //если нет, то добавим его в лист
                    if (!createdObj)
                    {
                        TechObjectList.Add(newObj);
                    }

                    //добавим ссылку в перечень ссылок с указанием, какой канал используется и подменим текст в строке исходной
                    Links newLink = new Links();
                    newLink.NameLink         = newObj.NameObject;
                    newLink.NameChannel      = tmpChChName;
                    newLink.NameLinkInString = "Link" + LinksList.Count.ToString() + "Result";
                    LinksList.Add(newLink);
                    sList[i] = newLink.NameLinkInString;
                }
            }

            //соберем строку обратно
            foreach (string st in sList)
            {
                result += st + ";";
            }

            return(result);
        }
        //Проверяется совпадение с тех объектом.
        //На входе строка после исключенния групп и функций
        //в процессе поиск совпадений с тех объектами и создание полноценного экземпляра с доб. в лист. (название с индексом)
        //На выходе трансформированная строка
        public string TechObjMatching(string s)
        {
            string s1     = s; //дублируем строку, чтобы её курочить
            string result = "";
            int    index  = 0; //индекс для циклов

            //разобьем строку на элементы по отдельности с разделителем ;
            List <string> sList = new List <string>();

            string tmp = "";

            for (int i = 0; i < s1.Length; i++)
            {
                if (s1[i] == ';')
                {
                    sList.Add(tmp);
                    tmp = "";
                    continue;
                }

                tmp += s1[i];
            }

            //проверяем совпадения с списком marka из словаря
            for (int i = 0; i < sList.Count; i++)
            {
                //игнорируем группы
                if ((sList[i].IndexOf("Group") == 0) && (sList[i].IndexOf("Result") > 0))
                {
                    continue;
                }

                //игнорируем функции
                if ((sList[i].IndexOf("Func") == 0) && (sList[i].IndexOf("Result") > 0))
                {
                    continue;
                }

                bool   match      = false; //флаг, говорящий о том, есть ли совпадение со списком марок
                bool   createdObj = false; //флаг, говорящий о том, что экземпляр этого объекта уже создан
                bool   correctCh  = false; //флаг того, что канал, который мы распознали по факту существует
                string tmpObjName = "";
                string tmpChName  = "";
                int    tmpIndex   = 0;

                //необходимо отделить имя канала и имя объекта, сравнивать сначала одно, потом другое
                //запись возможна только в виде objname.chname
                for (int j = 0; j < sList[i].IndexOf("."); j++)
                {
                    tmpObjName += sList[i][j];
                    tmpIndex    = j;
                }

                for (int j = tmpIndex + 2; j < sList[i].Length; j++)
                {
                    tmpChName += sList[i][j];
                }

                //имя объекта сравним со списком марок
                foreach (string st in dic.Marka.ResultList)
                {
                    if (tmpObjName == st)
                    {
                        match = true;
                        break;
                    }
                }

                TechObject newObj = new TechObject();

                //если есть совпадение проверим, нет ли уже созданного объекта
                if (match)
                {
                    foreach (TechObject obj in TechObjectList)
                    {
                        if (obj.NameObject == tmpObjName)
                        {
                            createdObj = true;
                            newObj     = obj;
                            break;
                        }
                    }
                }
                else
                {
                    continue;
                }

                //если нет созданного объекта, то создадим его и добавим в лист объектов

                if (!createdObj)
                {
                    newObj = CreateTechObject(BaseAddr, tmpObjName, 0);
                    TechObjectList.Add(newObj);
                }

                //после создания объекта проверим, корректно ли записан канал
                for (int j = 0; j < newObj.TechObjectChOutList.Count; j++)
                {
                    if (newObj.TechObjectChOutList[j].NameCh == tmpChName)
                    {
                        correctCh = true;
                        break;
                    }
                }

                if (!correctCh)
                {
                    throw new Exception();
                }

                //в случае успеха добавляем его в список
                ObjectInString NewObjInStr = new ObjectInString();
                NewObjInStr.NameObject         = newObj.NameObject;
                NewObjInStr.NameChannel        = tmpChName;
                NewObjInStr.NameObjectInString = "TechObj" + ObjectInStringList.Count.ToString() + "Result";
                ObjectInStringList.Add(NewObjInStr);

                //а также сделаем подмену в исходном тексте
                sList[i] = NewObjInStr.NameObjectInString;
            }

            //потом соберём строку обратно, не забыв про разделитель
            foreach (string st in sList)
            {
                result += st + ";";
            }

            return(result);
        }
        public string TIOCHMatching(string s, int ResID)
        {
            //Придумать правило записи выражения, чтобы небыло пробелов и ;.
            //Надо как-то понять, какой контроллер/ресурс сейчас используется, для этого нужно выдрать что-то из объектов, видимо.

            /*План:
             * 1. Прочитать из какого-нибудь объекта на каком контроллере и ресурсе мы находимся
             * 2. Ключевой символ ">", который указывает на этот тип объекта, разбиваем строку на элементы и ищем             *
             * 3. Разделить на часть названия и типа данных
             * 4. Найти в базе существование объекта, проверить тип записи
             * 5.
             *
             * */

            string s1     = s; //дублируем строку, чтобы её курочить
            string result = "";
            int    index  = 0; //индекс для циклов

            //разобьем строку на элементы по отдельности с разделителем ;
            List <string> sList = new List <string>();

            string tmp = "";

            for (int i = 0; i < s1.Length; i++)
            {
                if (s1[i] == ';')
                {
                    sList.Add(tmp);
                    tmp = "";
                    continue;
                }
                tmp += s1[i];
            }

            for (int i = 0; i < sList.Count; i++)
            {
                //проводим поиск символа ">", если найден, то в цикле заполняем параметры
                string tmpChName    = "";
                string tmpTIOCHName = "";
                tmp = "";

                if (sList[i].IndexOf(">") >= 0)
                {
                    for (int j = sList[i].Length; j >= 0; j--)
                    {
                        if (sList[i][j] == Convert.ToChar("."))
                        {
                            tmpChName = tmp;
                            sList[i]  = sList[i].Replace(tmpChName, "");
                            break;
                        }
                        tmp.Insert(0, Convert.ToString(sList[i][j]));  //добавляем каждый символ перед предыдущим
                    }
                    tmpTIOCHName = sList[i].Replace("|", " ");
                }

                TechObject newObj = new TechObject();
                newObj = CreateTechObject(BaseAddr, sList[i], 3);

                //укажем тип данных у входного канала, если такой есть, согласно выбранному пользователем
                if (newObj.TechObjectChInList != null)
                {
                    foreach (TechObjectChOut chOut in newObj.TechObjectChOutList)
                    {
                        if (tmpChName == chOut.NameCh)
                        {
                            newObj.TechObjectChInList[0].DataType = chOut.DataType;
                        }
                    }
                }


                //проверим, не создан ли уже такой объект, если создан, то переходим к созданию объекта строки
                //СНАЧАЛА ДОДЕЛАТЬ ЧАСТЬ В МЕТОДЕ ОПРЕДЕЛЕНИЯ ОБЪЕКТА
            }
        }