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

Просмотр 13 сообщений - с 16 по 28 (из 28 всего)
  • Автор
    Сообщения
  • #20024
    manjey73
    Участник

    И будет ошибка так как несоответствие данных. Мне вот непонятно, почему у меня даже файл не создается, точнее создался один раз и все…

    #20027
    manjey73
    Участник

    Лажа какая-то

    public byte[] GetDateStr(double comm)
    {
      string s = ScadaUtils.BytesToHex(BitConverter.GetBytes(comm));
      System.IO.File.WriteAllText(@"E:\SCADA\2.txt", s);
      return null;
    }

    в файле нули — 0000000000000000
    Вызывать GetDateStr(Cmd)

    Если поставить GetDateStr(byte[] comm)
    и без BitConverter.GetBytes а сразу string s = ScadaUtils.BytesToHex(comm);
    То будет ошибка

    #20028
    manjey73
    Участник

    Ощущение, что не может система передать в формулу именно массив байт, как это делается в драйверах при Бинарной команде

    #20029
    manjey73
    Участник

    ОООООО. не Cmd надо, а CmdData — это байтовый массив. Ну и теперь надо поиграться, чтобы превратить его правильно в нужную строку.

    #20030
    manjey73
    Участник

    public byte[] GetDateStr()
    {
    string s = ScadaUtils.DecodeAscii(BitConverter.ToDouble(CmdData, 0));
    System.IO.File.WriteAllText(@»E:\SCADA\2.txt», s);
    return null;
    }

    так передает, но, всегда есть НО. 08-06-2021 — 10 символов и при передаче обрезает два символа…
    Нужны другие формулы Decode из ScadaUtils не подходят.

    #20032
    manjey73
    Участник
    public byte[] GetDateStr()
    {
      string s = Encoding.Default.GetString(CmdData);
      System.IO.File.WriteAllText(@"E:\SCADA\2.txt", s);
      return null;
    }

    Вот, потом полученную строку можно превратить во что угодно, задав формат ввода даты
    Формулу можно возвращать в канал не byte[] а double или даже bool типа 0 — ошибка ввода, 1 — все ок.

    #20033
    manjey73
    Участник

    Encoding.UTF8.GetString(CmdData);

    поправочка. в файле после ввода строки

    2021_06_08_Вторник

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

    ОООООО. не Cmd надо, а CmdData — это байтовый массив. Ну и теперь надо поиграться, чтобы превратить его правильно в нужную строку.

    Точно, иногда всё же нужно заглянуть в документацию 🙂

    так передает, но, всегда есть НО. 08-06-2021 — 10 символов и при передаче обрезает два символа

    Нужно преобразовывать в DateTime или double (Unix time)

    #20050
    manjey73
    Участник

    В конце да, надо преобразовывать во время и именно в DateTime, или Scada сможет отобразить UNIX time без дополнительных преобразований ?

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

    Unix-time затем всё равно потребуется переводить в DateTime.

    #20075
    evg
    Участник

    Вау работает, сразу не получалось — потому как во входном канале стояла формула DateTime.Now.ToOADate() Как только убрал заработало. Благодарю Mikhail и manjey73. Кому интресно вот код в собранном виде:

    public byte[] GetDateStr(int mn)
    {
      string s = Encoding.UTF8.GetString(CmdData);
      DateTime dt = DateTime.Parse(s);
      SetVal(mn, EncodeDate(dt));
      return null;
    }

    Кстати независимо от того каким форматом прописываю в поле ввода 09-06-2021 или 09.06.2021 или даже 09/06/2021 всё преобразуется коректно.

    #20077
    manjey73
    Участник

    Вероятно в DateTime.Parse заложены несколько форматов, которые понимаются, зависящие от параметров системы — язык, регион
    Я бы добавил сюда try{}catch{} на случай опечатки оператором, не помешало бы.

    • Этот ответ был изменен 5 месяцев, 3 недели назад от manjey73.
    #20085
    Mikhail
    Модератор

    В итоге код получился довольно простой. Пригодится.

    Если формат неверный, то DateTime.Parse(s) выдаст исключение и формула просто не сработает. Об этом будет запись в логе сервера. Ничего критичного не произойдёт. Либо использовать DateTime.TryParse

Просмотр 13 сообщений - с 16 по 28 (из 28 всего)
  • Вы должны авторизироваться для ответа в этой теме.