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