Стартовая страница › Форумы › Понять, как работает ПО › Установить дату
- В этой теме 27 ответов, 3 участника, последнее обновление 2 года, 9 месяцев назад сделано Mikhail.
-
АвторСообщения
-
08.06.2021 в 09:04 #20024manjey73Участник
И будет ошибка так как несоответствие данных. Мне вот непонятно, почему у меня даже файл не создается, точнее создался один раз и все…
08.06.2021 в 09:34 #20027manjey73УчастникЛажа какая-то
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);
То будет ошибка08.06.2021 в 09:35 #20028manjey73УчастникОщущение, что не может система передать в формулу именно массив байт, как это делается в драйверах при Бинарной команде
08.06.2021 в 09:44 #20029manjey73УчастникОООООО. не Cmd надо, а CmdData — это байтовый массив. Ну и теперь надо поиграться, чтобы превратить его правильно в нужную строку.
08.06.2021 в 09:54 #20030manjey73Участник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 не подходят.08.06.2021 в 10:07 #20032manjey73Участник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 — все ок.08.06.2021 в 10:13 #20033manjey73УчастникEncoding.UTF8.GetString(CmdData);
поправочка. в файле после ввода строки
2021_06_08_Вторник
08.06.2021 в 16:20 #20043MikhailМодераторОООООО. не Cmd надо, а CmdData — это байтовый массив. Ну и теперь надо поиграться, чтобы превратить его правильно в нужную строку.
Точно, иногда всё же нужно заглянуть в документацию 🙂
так передает, но, всегда есть НО. 08-06-2021 — 10 символов и при передаче обрезает два символа
Нужно преобразовывать в DateTime или double (Unix time)
08.06.2021 в 16:48 #20050manjey73УчастникВ конце да, надо преобразовывать во время и именно в DateTime, или Scada сможет отобразить UNIX time без дополнительных преобразований ?
09.06.2021 в 17:46 #20063MikhailМодераторUnix-time затем всё равно потребуется переводить в DateTime.
10.06.2021 в 10:49 #20075evgУчастникВау работает, сразу не получалось — потому как во входном канале стояла формула 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 всё преобразуется коректно.
10.06.2021 в 11:02 #20077manjey73УчастникВероятно в DateTime.Parse заложены несколько форматов, которые понимаются, зависящие от параметров системы — язык, регион
Я бы добавил сюда try{}catch{} на случай опечатки оператором, не помешало бы.- Этот ответ был изменен 2 года, 9 месяцев назад от manjey73.
10.06.2021 в 17:42 #20085MikhailМодераторВ итоге код получился довольно простой. Пригодится.
Если формат неверный, то DateTime.Parse(s) выдаст исключение и формула просто не сработает. Об этом будет запись в логе сервера. Ничего критичного не произойдёт. Либо использовать DateTime.TryParse
-
АвторСообщения
- Вы должны авторизироваться для ответа в этой теме.