Результаты поиска
|
|
SSS22 | Дата: Воскресенье, 05 Апреля 2020, 17:16 | Сообщение # 1 | Тема: Чтение и Запись в Цикле |
был не раз
Сейчас нет на сайте
| Цитата drcrack ( ) создай отдельную строковую переменную перед циклом и в нее добавляй значения вместо SetValue
От души благодарю за помощь! Немного сдвинулся процесс. Сумматор работает. Надо было с архива точные минутные значения извлекать. (а остальные секундные ненужны). а потом сложить их и дальнейшие манипуляции!
Часть скрипта победил! Суммируются значения и записываются в новый архив как нужно.
|
|
| |
SSS22 | Дата: Воскресенье, 05 Апреля 2020, 14:32 | Сообщение # 2 | Тема: Чтение и Запись в Цикле |
был не раз
Сейчас нет на сайте
| Цитата drcrack ( ) все значения сложить в один ключ
точно...вот как можно это сделать...?Добавлено (05 Апреля 2020, 15:02) ---------------------------------------------
Цитата SSS22 ( ) точно...вот как можно это сделать...? Val_2 - новая переменная сумматор после цикла Val_2=Val_2+Val ?
|
|
| |
SSS22 | Дата: Воскресенье, 05 Апреля 2020, 14:12 | Сообщение # 3 | Тема: Чтение и Запись в Цикле |
был не раз
Сейчас нет на сайте
| Цитата drcrack ( ) SetValue("Out_param"+i,new PinValue(Val,TIMER2));
В этом случае, если кол-во записей будет например 96.......то будет 96 ключей?! т.е. новую запись в новую переменную?
|
|
| |
SSS22 | Дата: Воскресенье, 05 Апреля 2020, 13:50 | Сообщение # 4 | Тема: Чтение и Запись в Цикле |
был не раз
Сейчас нет на сайте
| Цитата drcrack ( ) Так а кто мешает отладчиком проверить на каком этапе возникает проблема? Зачем гадать? нет отладчика в компиляторе и в ПО. Приходится кодом псевдоотладчик изобретать)
После перегрузки немного все поменялось.
Теперь записывается только последнее значение с последней меткой времени) какой бы период не ставил.Добавлено (05 Апреля 2020, 13:51) --------------------------------------------- Может есть другие идеи как сделать?
|
|
| |
SSS22 | Дата: Воскресенье, 05 Апреля 2020, 11:40 | Сообщение # 5 | Тема: Чтение и Запись в Цикле |
был не раз
Сейчас нет на сайте
| Цитата drcrack ( ) было ведь правильно (TIMER2=TIMER2.AddMinutes(1)), зачем поменял?
сори....проверял вариант и оставил в коде.Добавлено (05 Апреля 2020, 11:41) ---------------------------------------------
Код for (int i=1;i<=3;i++) //цикл n раза 1 цикл метка времени и поиск +1минута { foreach (var element in mas) // перебор и поиск в архиве { if (element.Time>TIMER2.AddSeconds(-1) && element.Time<TIMER2.AddSeconds(1)) //условие +/- 1секунда в указанное время { Val=Convert.ToDouble(element.Value); // конвертируем в переменную SetValue("Out_param1",new PinValue(Val,TIMER2)); //запись в архивную переменную Out_param1 TIMER2=TIMER2.AddMinutes(1); // в конце цикла прибавляем 1 минуту к условию } } Tim2=TIMER2; // так для проверки конечного времени }
Добавлено (05 Апреля 2020, 11:44) ---------------------------------------------
Цитата drcrack ( ) с чего ты это решил?
смотрю запись архива "INPUT" ...знаю какое значение лежит в 19:06:00.....19:07:00.....19:08:00...и т.д. а "Out_param1"....пишет значение с 19:06:00 и его метку времени(((
сейчас прогружу весь компилятор всех скриптов...перезаргружусь....может глюк все же. Отпишусь потом.
|
|
| |
SSS22 | Дата: Воскресенье, 05 Апреля 2020, 10:51 | Сообщение # 6 | Тема: Чтение и Запись в Цикле |
был не раз
Сейчас нет на сайте
| Цитата DivES ( ) Ты его даже не удосужился к подобающему виду привести В моем редакторе он конечно с отступами. скорей всего при копировании в форум так установилось.
Не придавал значение кириллическим обозначениям...дело привычки может...в простых реализациях они работают также как и не кириллические. Подправил на латиницу.
Код if (Var_Input==true && M==false && StartTime.HasValue && EndTime.HasValue && StartTime>EndTime) // условие начала { var elem = HostFB.InputGroup.GetPin("INPUT").TreePinHlp; var k=elem.DataArchiveItem; // переменная архива DateTime TIMER1=Время.Value; // время указанное DateTime TIMER2=TIMER1.ToUniversalTime(); DateTime EndTime1=EndTime.Value.ToUniversalTime(); //время конец DateTime StartTime1=StartTime.Value.ToUniversalTime(); //время начало var mas=k.Read(StartTime, EndTime, false); // чтение массива mas из переменной архива double? Val=null; DateTime? TimeStamp=null; for (int i=1;i<=3;i++) //цикл n раза 1 цикл метка времени и поиск +1минута { foreach (var element in mas) // перебор и поиск в архиве { if (element.Time>TIMER2.AddSeconds(-1) && element.Time<TIMER2.AddSeconds(1)) //условие +/- 1секунда в указанное время { Val=Convert.ToDouble(element.Value); // конвертируем в переменную SetValue("Out_param1",new PinValue(Val,TIMER2)); //запись в архивную переменную Out_param1 TIMER2.AddMinutes(1); // в конце цикла прибавляем 1 минуту к условию } } Tim2=TIMER2; // так для проверки конечного времени } } M=Var_Input; } } :crazy:
Добавлено (05 Апреля 2020, 10:56) --------------------------------------------- Интересует больше эта часть кода:
for (int i=1;i<=3;i++) //цикл n раза 1 цикл метка времени и поиск +1минута { foreach (var element in mas) // перебор и поиск в архиве { if (element.Time>TIMER2.AddSeconds(-1) && element.Time<TIMER2.AddSeconds(1)) //условие +/- 1секунда в указанное время { Val=Convert.ToDouble(element.Value); // конвертируем в переменную SetValue("Out_param1",new PinValue(Val,TIMER2)); //запись в архивную переменную Out_param1 TIMER2.AddMinutes(1); // в конце цикла прибавляем 1 минуту к условию } } Tim2=TIMER2; // так для проверки конечного времени }
что то здесь нетак или что добавить? работает только 1 цикл почему-то...что пропустил незнаю.
Добавлено (05 Апреля 2020, 11:04) ---------------------------------------------
Цитата drcrack ( ) DateTime это иммутабельная структура, методы вроде AddMinutes возвращают новую копию
TIMER2.AddMinutes(1); //...не работает так))) начальное время 19:06:00 после цикла 19:06:00
TIMER2=TIMER2.AddMinutes(1); //а так работает начальное время 19:06:00 после цикла 19:07:00
Сообщение отредактировал SSS22 - Воскресенье, 05 Апреля 2020, 11:11 |
|
| |
SSS22 | Дата: Суббота, 04 Апреля 2020, 21:09 | Сообщение # 7 | Тема: Чтение и Запись в Цикле |
был не раз
Сейчас нет на сайте
| Форумчане приветствую! Недавно изучаю С# поэтому возникают различные вопросы и проблемы. Прошу не ругать сильно!
Задача следующая: Необходимо за указанный промежуток времени (начало, конец) обрабатывать архивную переменную (запись в архиве рандом примерно +-1 каждую сек). В цикле необходимо: с архивной переменной считать значение за указанную метку времени. (Вход) Записать значение и текущую метку времени в другую архивную переменную. (Out_param1)
PS за промежуток времени (начало, конец) и с периодичностью (1 мин) может быть считаны и записаны данные.
В настоящее время имеется проблема что считывается и записывается только 1 раз. с первой меткой времени.
Начальные данные: Начало - 04/04/2020 19.00.00 Конец- 04/04/2020 19.10.00 Время - 04/04/2020 19.06.00 - время указанное пользователем
Результат после работы скрипта:
Tim2=время конечное 04/04/2020 19.07.00 (как-будто не увеличивает больше 1 раза) должно быть 04/04/2020 19.08.00 Out_param1=29.752 (значение с архива соответствует времени 19.06.00).....а метка времени тоже 04/04/2020 19.06.00
___В переменной Out_param1 в идеале должны быть значения за 19.06.00 / 19.07.00 /19.08.00 если указал 3 раза в цикле
Прилагаю ниже код скрипта:
Код using System; using MasterSCADA.Script.FB; using MasterSCADA.Hlp; using FB; using System.Linq;
public partial class ФБ : ScriptBase { bool? M=false; //для переднего фронта public override void Execute() { if (Найти==true && M==false && Начало.HasValue && Конец.HasValue && Конец>Начало) // условие начала // "Найти" (bool флаг начала) { var elem = HostFB.InputGroup.GetPin("Вход").TreePinHlp; //elem архивная переменная "Вход" var k=elem.DataArchiveItem; // переменная архива k DateTime TIMER1=Время.Value; // время указанное DateTime TIMER2=TIMER1.ToUniversalTime(); DateTime EndTime=Конец.Value.ToUniversalTime(); //время конец DateTime StartTime=Начало.Value.ToUniversalTime(); //время начало var mas=k.Read(StartTime, EndTime, false); // чтение массива mas из переменной архива double? Val=null; DateTime? TimeStamp=null;
for (int i=1;i<=3;i++) //цикл n раза 1 цикл метка времени и поиск +1минута { TIMER2=TIMER2; // текущее заданное время foreach (var element in mas) // перебор и поиск в архиве { if (element.Time>TIMER2.AddSeconds(-1) && element.Time<TIMER2.AddSeconds(1)) //условие +/- 1секунда в указанное время { Val=Convert.ToDouble(element.Value); // конвертируем в переменную SetValue("Out_param1",new PinValue(Val,TIMER2)); //запись в архивную переменную Out_param1 TIMER2=TIMER2.AddMinutes(1); // в конце цикла прибавляем 1 минуту к условию } }
Tim2=TIMER2; // так для проверки конечного времени } } M=Найти; } }
Подскажите где может быть ошибка пожалуйста или что добавить!?
Сообщение отредактировал SSS22 - Суббота, 04 Апреля 2020, 21:11 |
|
| |
SSS22 | Дата: Воскресенье, 02 Февраля 2020, 19:02 | Сообщение # 8 | Тема: Импульс + if условие С# |
был не раз
Сейчас нет на сайте
| Доброе время суток! Недавно стал изучать С# поэтому прошу вашей помощи в одном вопросе: Задача: нужно чтобы скрипт по входному импульсу (логический вход) считывал входную переменную DATA_now (?DateTime). а также по определенным условиям прибавлял к данной переменной 15 минут, после каждого нового входного импульса. Все это организовано в коде С#. Частично работает. Время считывается и прибавляет 15 минут.....НО....делает это автоматически, а не по условию! (то есть.... что я if употребляю в коде или нет...одинаково )
Вот код: (не ругайте строго)))
using System; using MasterSCADA.Script.FB; using MasterSCADA.Hlp; using FB; using FB.FBAttributes; using System.Linq;
[FBRetain] public partial class ФБ : ScriptBase { public override void Execute() { bool SIGNAL_DATA1 = Convert.ToBoolean(SIGNAL_DATA); // ?bool bool Error1 = Convert.ToBoolean(Error); // ?bool DateTime Dtime_now = Convert.ToDateTime(DATA_NOW); // ?DateTime DateTime Time4 = new DateTime(); DateTime Time2 = new DateTime(); DateTime Time3 = new DateTime(); DateTime Time1 = new DateTime(); if ((SIGNAL_DATA1==true) & (Error1==false)); { DateTime Timenow1 = Dtime_now; Time1 = Timenow1.AddDays(+1); Time2 = Timenow1.AddDays(+2); Time3 = Time1; Time4 = Timenow1; } if (SIGNAL_DATA1 & !Error1); //импульс запуска и отсутсвие ошибки { if ((Time3 >= Time1) &(Time3<=Time2)); //проверка промежутка времени { Time3= Time3.AddMinutes(+15); // /прибавим 15 минут тут все работает но прибавляет только 1 раз WORK_OUT=true; //готовность } } Dtime11=Time1; // ?DateTime выходная переменная времени Dtime12=Time2; // ?DateTime выходная переменная времени Dtime13=Time3; // ?DateTime выходная переменная времени Dtime14=Time4; // ?DateTime выходная переменная времени } }
|
|
| |
SSS22 | Дата: Воскресенье, 02 Февраля 2020, 18:46 | Сообщение # 9 | Тема: Время ToUniversalTime |
был не раз
Сейчас нет на сайте
| DateTime Time1 = Convert.ToDateTime(DATE_in) //так все работает разобрался сам
DATE_in - ?DateTime //тип условный
|
|
| |
SSS22 | Дата: Пятница, 24 Января 2020, 20:43 | Сообщение # 10 | Тема: Время ToUniversalTime |
был не раз
Сейчас нет на сайте
| День добрый! Подскажите начинающему в изучении C#:
имеется Параметр с временем (только чтение) (DATE_in) его нужно переопределить методом ToUniversalTime и записать в параметр DATA_out (только запись)
Код написал а компилятор ругается...подскажите пожалуйста что не так делаю?
using System; using MasterSCADA.Script.FB; using MasterSCADA.Hlp; using FB; using FB.FBAttributes; using System.Linq;
[FBRetain] public partial class ФБ : ScriptBase { public override void Execute() { DateTime Time1 = new DateTime(DATE_in); DATA_out = Time1.ToUniversalTime(); } }
|
|
| |
SSS22 | Дата: Суббота, 11 Января 2020, 09:14 | Сообщение # 11 | Тема: Как пропустить первую строку |
был не раз
Сейчас нет на сайте
| Цитата drcrack ( ) так у тебя line=file.ReadLine(); внутри for 1-3
)) точно подметили ..исправил все отлично стало ! Благодарствую!
|
|
| |
SSS22 | Дата: Пятница, 10 Января 2020, 23:06 | Сообщение # 12 | Тема: Как пропустить первую строку |
был не раз
Сейчас нет на сайте
| Цитата drcrack ( ) можно короче — просто добавить file.ReadLine():
работает!!! Спасибо! немного модифицировал еще код....нужно чтобы параметр1 обрабатывать...делить на 100000...сделал условие..но както неправильно...записываются в архив не каждая строка, а через две((( т.е. данные за 6:15 а потом сразу 7:00. а должно быть 6:15...6:30..6:45...7:00....и т.д. вот модифицированный код:
{ using(var file = new StreamReader(Файл)) //открытие файла для чтения { file.ReadLine(); //скрыть первую строку var line=file.ReadLine();
while (line!=null) { String[] substrings = line.Split(';'); //разбор строки на составляющие var Time = DateTime.Parse(substrings[0]); var Time1 = Time.ToUniversalTime(); for (int i=1;i<=3;i++) { if (i==1) { SetValue("Параметр"+i.ToString(), new PinValue(Double.Parse(substrings[i])/100000,Time1)); // делим } if (i==2) { SetValue("Параметр"+i.ToString(), new PinValue(Double.Parse(substrings[i]),Time1)); } if (i==3) { SetValue("Параметр"+i.ToString(), new PinValue(Double.Parse(substrings[i]),Time1)); } line=file.ReadLine();//считывание строк из файла } } } } .......
подскажите пожалуйста что неправильно наделал то? Нужно чтобы первый столбец (parametr1) делился на 100000, а другие 2 и 3 записывались как есть без матем. обработки.
|
|
| |
SSS22 | Дата: Пятница, 10 Января 2020, 12:39 | Сообщение # 13 | Тема: Как пропустить первую строку |
был не раз
Сейчас нет на сайте
| Цитата Ordan ( ) почему бы просто не начать читать сразу со второй? ну или можешь тупо объявить параметр а=0 а каждый цикл делать а++ и если у тебя а==0 то пропускай заход
логично конечно. так тоже думаю делать. но не силен в С# коде.
поэтому и прошу помочь в написании
|
|
| |
SSS22 | Дата: Четверг, 09 Января 2020, 14:19 | Сообщение # 14 | Тема: Как пропустить первую строку |
был не раз
Сейчас нет на сайте
| Добрый день форумчане! Недавно начал изучать C# требуется по ходу работы. Задача следующая: Считать данные из CSV файла (строки). Данные записать в архивную базу данных с меткой времени. Код который написал - рабочий. В архиве все данные вижу корректно, но есть проблемы корректировки: Первая строка файла содержит некорректные данные - не числовые, типа заголовок файла. В коде нужно как-то пропускать первую строку в цикле((( в этом собственно проблема. Думаю использовать "continue" если строка == первой, но надо какимто образом считывать номер строки...((?или както подругому.
Вот данные CSV файла 1 строка: DATATIME;Parametr1;Parametr2;Parametr3 //вот эту строку пропускать нужно в цикле 2 строка: 08.01.2020 6:15:00;-1;103561;-1,7 3 строка: 08.01.2020 6:30:00;-1;58664;-1,1 4 строка: 08.01.2020 6:45:00;-4;25622;-1,9 .... 96 строка: 08.01.2020 19:45:00;-9;2562;-0,9
Вот сам код С#
using System; using MasterSCADA.Script.FB; using MasterSCADA.Hlp; using FB; using System.Linq; using System.IO;
public partial class ФБ : ScriptBase { bool? M=false; public override void Execute() { if (Считать==true && M==false && Файл!=string.Empty && Файл!=null) { Ошибка=false; try { using(var file = new StreamReader(Файл)) //открытие файла для чтения { var line=file.ReadLine();
while (line!=null) { String[] substrings = line.Split(';'); //разбор строки на составляющие var Time = DateTime.Parse(substrings[0]); // преобразую время for (int i=1;i<=3;i++) // считаю столбцы { SetValue("Параметр"+i.ToString(), new PinValue(Double.Parse(substrings[i]),Time)); // запись параметров } line=file.ReadLine();//считывание строк из файла } } } catch (Exception ex) { Ошибка=true; ReportError (ex.Message); //вызов метода для записи сообщения в лог } } M=Считать; } void ReportError (string Error) //данный метод записывает сообщения в лог { var ScriptName=HostFB.TreeItemHlp.ToString(); //имя скрипта HostFB.TreeItemHlp.Project.ErrorTracer.ReportError(string.Format("{0}: {1}",ScriptName,Error)); } }
подчеркнутым выделил где сам код считывания происходит. HELP PLEASE!) как пропустить первую строку данных файла
|
|
| |