public void AddPrerequisite(TechObject techToAddAsPrerequisite) { if (this.Prerequisites.Any(reqTech => reqTech.TechSystemID == techToAddAsPrerequisite.TechSystemID) == false) { this.Prerequisites.Add(techToAddAsPrerequisite); } }
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); }
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); }
public ScrapCommandArgs([NotNull] TechObject @object) { if (@object == null) { throw new ArgumentNullException("object"); } _objects = new ArrayWrapper <TechObject>(new[] { @object }); SetInitialScrapValue(); }
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); }
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); }
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(); } }
/// <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(); } //отдельно для случая, когда объект локальный //отдкльно когда ссылка //отдкльно когда канал В/В }
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; } } } //проверим, не создан ли уже такой объект, если создан, то переходим к созданию объекта строки //СНАЧАЛА ДОДЕЛАТЬ ЧАСТЬ В МЕТОДЕ ОПРЕДЕЛЕНИЯ ОБЪЕКТА } }