Чтение и Запись в Цикле
|
|
SSS22 | Дата: Суббота, 04 Апреля 2020, 21:09 | Сообщение # 1 |
был не раз
Сейчас нет на сайте
| Форумчане приветствую! Недавно изучаю С# поэтому возникают различные вопросы и проблемы. Прошу не ругать сильно!
Задача следующая: Необходимо за указанный промежуток времени (начало, конец) обрабатывать архивную переменную (запись в архиве рандом примерно +-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 |
|
| |
DivES | Дата: Суббота, 04 Апреля 2020, 22:07 | Сообщение # 2 |
заслуженный участник
Сейчас нет на сайте
| Ты его даже не удосужился к подобающему виду привести, а у нас помощи просишь? И да, C# не относится к ветке C/C++.
Код с отступами:
Код 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=Найти; } }
|
|
| |
DivES | Дата: Суббота, 04 Апреля 2020, 22:09 | Сообщение # 3 |
заслуженный участник
Сейчас нет на сайте
| Что за извращения с кириллическими обозначениями? Или это норма в C#?
Цитата TIMER2=TIMER2; // текущее заданное время Польза строчки сопоставима с моим текущим ответом, похоже
AddSeconds(...), AddMinutes(...) добавляют к таймеру время? Если добавляют, то зачем TIMER2=TIMER2.AddMinutes(1)? Разве нельзя сразу TIMER2.AddMinutes(1)?
Сообщение отредактировал DivES - Суббота, 04 Апреля 2020, 23:58 |
|
| |
drcrack | Дата: Воскресенье, 05 Апреля 2020, 00:15 | Сообщение # 4 |
старожил
Сейчас нет на сайте
| Цитата AddSeconds(...), AddMinutes(...) добавляют к таймеру время? Если добавляют, то зачем TIMER2=TIMER2.AddMinutes(1)? Разве нельзя сразу TIMER2.AddMinutes(1)? DateTime это иммутабельная структура, методы вроде AddMinutes возвращают новую копию
Цитата Что за извращения с кириллическими обозначениями? Или это норма в C#? Вот у меня тоже на этом этапе пропало желание разбираться в его коде
|
|
| |
SSS22 | Дата: Воскресенье, 05 Апреля 2020, 10:51 | Сообщение # 5 |
был не раз
Сейчас нет на сайте
| Цитата 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 |
|
| |
drcrack | Дата: Воскресенье, 05 Апреля 2020, 11:09 | Сообщение # 6 |
старожил
Сейчас нет на сайте
| Цитата работает только 1 цикл почему-то... с чего ты это решил?
Цитата TIMER2.AddMinutes(1); // в конце цикла прибавляем 1 минуту к условию было ведь правильно (TIMER2=TIMER2.AddMinutes(1)), зачем поменял?
|
|
| |
SSS22 | Дата: Воскресенье, 05 Апреля 2020, 11:40 | Сообщение # 7 |
был не раз
Сейчас нет на сайте
| Цитата 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 и его метку времени(((
сейчас прогружу весь компилятор всех скриптов...перезаргружусь....может глюк все же. Отпишусь потом.
|
|
| |
drcrack | Дата: Воскресенье, 05 Апреля 2020, 12:30 | Сообщение # 8 |
старожил
Сейчас нет на сайте
| Так а кто мешает отладчиком проверить на каком этапе возникает проблема? Зачем гадать?
|
|
| |
SSS22 | Дата: Воскресенье, 05 Апреля 2020, 13:50 | Сообщение # 9 |
был не раз
Сейчас нет на сайте
| Цитата drcrack ( ) Так а кто мешает отладчиком проверить на каком этапе возникает проблема? Зачем гадать? нет отладчика в компиляторе и в ПО. Приходится кодом псевдоотладчик изобретать)
После перегрузки немного все поменялось.
Теперь записывается только последнее значение с последней меткой времени) какой бы период не ставил.Добавлено (05 Апреля 2020, 13:51) --------------------------------------------- Может есть другие идеи как сделать?
|
|
| |
drcrack | Дата: Воскресенье, 05 Апреля 2020, 13:56 | Сообщение # 10 |
старожил
Сейчас нет на сайте
| Цитата Теперь записывается только последнее значение с последней меткой времени) какой бы период не ставил. Это логично ведь ты используешь одинаковый ключ для всех записей Попробуй так:
Код SetValue("Out_param"+i,new PinValue(Val,TIMER2));
|
|
| |
SSS22 | Дата: Воскресенье, 05 Апреля 2020, 14:12 | Сообщение # 11 |
был не раз
Сейчас нет на сайте
| Цитата drcrack ( ) SetValue("Out_param"+i,new PinValue(Val,TIMER2));
В этом случае, если кол-во записей будет например 96.......то будет 96 ключей?! т.е. новую запись в новую переменную?
|
|
| |
drcrack | Дата: Воскресенье, 05 Апреля 2020, 14:15 | Сообщение # 12 |
старожил
Сейчас нет на сайте
| Я не знаю что ты хочешь, если нужно все значения сложить в один ключ, склеивай их в строку в цикле и после цикла делай один раз SetValue
|
|
| |
SSS22 | Дата: Воскресенье, 05 Апреля 2020, 14:32 | Сообщение # 13 |
был не раз
Сейчас нет на сайте
| Цитата drcrack ( ) все значения сложить в один ключ
точно...вот как можно это сделать...?Добавлено (05 Апреля 2020, 15:02) ---------------------------------------------
Цитата SSS22 ( ) точно...вот как можно это сделать...? Val_2 - новая переменная сумматор после цикла Val_2=Val_2+Val ?
|
|
| |
drcrack | Дата: Воскресенье, 05 Апреля 2020, 15:14 | Сообщение # 14 |
старожил
Сейчас нет на сайте
| создай отдельную строковую переменную перед циклом и в нее добавляй значения вместо SetValue
|
|
| |
SSS22 | Дата: Воскресенье, 05 Апреля 2020, 17:16 | Сообщение # 15 |
был не раз
Сейчас нет на сайте
| Цитата drcrack ( ) создай отдельную строковую переменную перед циклом и в нее добавляй значения вместо SetValue
От души благодарю за помощь! Немного сдвинулся процесс. Сумматор работает. Надо было с архива точные минутные значения извлекать. (а остальные секундные ненужны). а потом сложить их и дальнейшие манипуляции!
Часть скрипта победил! Суммируются значения и записываются в новый архив как нужно.
|
|
| |