Понедельник, 25 Ноября 2024, 09:55

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Чтение и Запись в Цикле
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=Найти;
}
}

Подскажите где может быть ошибка пожалуйста или что добавить!? lovegcup


Сообщение отредактировал 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; // текущее заданное время

Польза строчки сопоставима с моим текущим ответом, похоже :D

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#?

Вот у меня тоже на этом этапе пропало желание разбираться в его коде :D
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); //а так работает deal начальное время 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


От души благодарю за помощь! respect
Немного сдвинулся процесс. Сумматор работает.
Надо было с архива точные минутные значения извлекать. (а остальные секундные ненужны). а потом сложить их и дальнейшие манипуляции!

Часть скрипта победил! Суммируются значения и записываются в новый архив как нужно.
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг