Установить дату

Просмотр 15 сообщений - с 1 по 15 (из 28 всего)
  • Автор
    Сообщения
  • #19883
    evg
    Участник

    Всем привет, а есть ли возможность, установить желаемую дату, во входной канал?
    Пробывал по разному, но не получается. В скаде нет возможности вводить дату, через канал управления, в формате дд.ММ.гггг ?

    #19885
    manjey73
    Участник

    Формулой текущую можно.
    Формулой, если выбрать тип команды «Бинарная» и вводить строкой День-Месяц-Год

    Входной канал имеет тип double. Формулой надо преобразовывать то, что вы вводите в данный формат

    • Этот ответ был изменен 2 года, 10 месяцев назад от manjey73.
    #19887
    manjey73
    Участник

    Пример формулы для входного канала, чтобы отображать текущую дату на мнемосхеме

    DateTime.Now.ToOADate()

    Формат — Время, Дата, ДатаВремя

    #19895
    Mikhail
    Модератор

    Добрый день!

    Точно можно реализовать, нужно только формулы подобрать.
    Вы хотите устанавливать дату из пользовательского интерфейса? Если да, то понадобится канал управления бинарного типа. Отправленная команда — это строка, её нужно преобразовать в дату и записать во входной канал с помощью формулы канала управления.

    Начните с отображения текущей даты через входной канал.

    #19903
    evg
    Участник

    Добрый день. Да, дата у меня отображается, через формулу во входном канале DateTime.Now.ToOADate(). Я смотрю есь в упаковке формула «EncodeDate» или это не то?
    По переводу строки в double у меня есть такая формула:

    public double _Convert(int n)
    {
    double x = Val(n);
    double _double;
    string _string;
    _string = ScadaUtils.DecodeAscii(x);
    _double = Double.Parse(_string.Replace(‘.’, ‘,’));
    return _double;
    }

    Вы хотите устанавливать дату из пользовательского интерфейса?

    Да, нужно чтобы из пользовательского интерфейса, была возможность установить дату, любую дату.

    #19905
    manjey73
    Участник

    Вам нужно создать формулу в Справочнике в которой должно быть.

    private DateTimeFormatInfo dtfi; // формат даты и времени, в котором хранятся данные, может будет нужен не private…
    dtfi = new DateTimeFormatInfo();
    dtfi.ShortDatePattern = «dd.MM.yyyy»; // Тут вы должны определить как у вас вводится дата, может быть так «dd-MM-yyyy» например. Поройтесь в нете что дают определения dd или D для дня и их комбинации.

    string formats = dtfi.ShortDatePattern; // и

    double d = DateTime.ParseExact(data, formats, dtfi).ToOADate(); // тут d это то, что вернуть надо в канал а data это то, что вы должны вбивать в команде.
    Команда должна быть Бинарная — Строка и вы в ней вбиваете как определите формат.
    Определите с точками день.месяц.год значит и вводить с точками.

    з.ы. пока некогда потестить, попробуйте набросать формулу и что получится.

    #19921
    Mikhail
    Модератор

    Нужно убедиться, что строка команды декодируется корректно.
    Формула для канала управления примерно такая:

    public byte[] GetDateStr()
    {
      string s = ScadaUtils.DecodeUnicode(Cmd);
      System.IO.File.WriteAllText(@"C:\SCADA\1.txt", s);
      return null;
    }

    Отправленная строка должна попадать в файл. Если всё нормально, то останется её перевести в дату и записать во входной канал, что уже не сложно.

    #19922
    Mikhail
    Модератор

    Продолжение формулы вместо записи в файл:

    DateTime dt = DateTime.Parse(s);
    SetVal(101, EncodeDate(dt));
    return null;

    Где 101 — номер входного канала.

    #19967
    evg
    Участник
    public byte[] GetDateStr()
    {
      string s = ScadaUtils.DecodeUnicode(Cmd);
      System.IO.File.WriteAllText(@"C:\SCADA\1.txt", s);
      return null;
    }

    Сам файл «1.txt» создался, но текст, который я ввёл нету =( В канале управления ставим «GetDateStr()» — я правильно понимаю? Тип Бинарный, Строка.

    #19975
    manjey73
    Участник

    string s = ScadaUtils.DecodeUnicode(Cmd);

    Если вместо этой строки указать string s = «Что нибудь»

    То строка записывается в файл. Тут ошибка в получении данных от Cmd явная

    #19990
    Mikhail
    Модератор

    ещё можно проверить так:
    string s = ScadaUtils.BytesToHex(Cmd);
    чтобы вывести данные команды побайтно в файл.

    • Этот ответ был изменен 2 года, 9 месяцев назад от Mikhail.
    #19999
    manjey73
    Участник

    Не сработает. Похожу тут Cmd всегда double, независимо, что указана команда как Бинарная.

    То ли в принципе это пропускает мимо ушей механизм формул при перезапуске сервера, то ли еще что. Тоже бьюсь сейчас над этим. При чем очень интересный эффект, ошибки, вызывающие не работоспособность отражаются и на другой формуле…

    #20000
    manjey73
    Участник

    А вызывается ли ScadaUtils вообще из формул ? а то есть подозрение, что нет…

    #20003
    manjey73
    Участник

    Очень интересно, один раз файл записался каким-то чудом. удалил его, и никаких файлов…

    #20019
    evg
    Участник

    string s = ScadaUtils.BytesToHex(Cmd);
    Ошибку выдаёт:
    http://d.radikal.ru/d28/2106/cf/79d3eabca32f.jpg

    • Этот ответ был изменен 2 года, 9 месяцев назад от evg.
    • Этот ответ был изменен 2 года, 9 месяцев назад от evg.
Просмотр 15 сообщений - с 1 по 15 (из 28 всего)
  • Вы должны авторизироваться для ответа в этой теме.