Просмотр полной версии : Время в ПЛК
aaaSashaMGGU
28.09.2026, 12:27
Добрый
Для ведения логов в БД использую системное время контроллера
Беру его: stRtc.dtDateAndTime
На каждом цикле делаю вот так, чтобы получить реальное время: GetCurDateTime_DT := DINT_TO_DT(DT_TO_DINT(stRtc.dtDateAndTime) - 10800);
Видимо, это смещение UTC
Но несколько десятков раз в сутки всё равно это время уходит на 3 часа меньше, чем на самом деле
Если бы я просто выводил это время на экран - проблем нет, что 100мс время на экране неверное. Этого даже никто не заметит
Но я пишу БД - и у меня постоянно выскакивают эти даты на 3 часа меньше, чем нужно.
Так какое время брать, чтобы всё было нормально?
90521
90522
Спасибо
Евгений Кислов
28.09.2026, 12:37
Добрый день.
1. Выполняется ли данное требование?
90524
2. Используется ли в проекте компонент OwenArchiver?
aaaSashaMGGU
28.09.2026, 12:42
Добрый день.
1. Выполняется ли данное требование?
90524
2. Используется ли в проекте компонент OwenArchiver?
2. Нет
1. Видимо, нет. MainTask 100мс, ModbusTask 5мс. Время пытаюсь получить в программе внутри MainTask
90526
Евгений Кислов
28.09.2026, 13:26
Попробуйте получать время в контексте ModbusTask.
Если нужно использовать его и в контексте MainTask - то в контексте ModbusTask копируйте его в промежуточную глобальную переменную, и уже ее используйте в других задачах.
aaaSashaMGGU
28.09.2026, 13:44
Попробуйте получать время в контексте ModbusTask.
Если нужно использовать его и в контексте MainTask - то в контексте ModbusTask копируйте его в промежуточную глобальную переменную, и уже ее используйте в других задачах.
Да, я это по описанию уже понял...
Проблема в том, что у меня это не код в таске, а функция. И эта функция вызывается и из MainTask, и из мнемосхем, и ещё не пойми откуда, где я уже даже и не помню
Если "Date And Time" имеет такую особенность со сноской - то можно ведь использовать Format date + Format time?
aaaSashaMGGU
28.09.2026, 14:14
В общем, сделал пока так, буду наблюдать:
FUNCTION GetCurDateTime_DT: DT //Функция получения значения текущей даты-времени в виде переменной даты-времени
//Внутренние параметры
VAR
Год : STRING(4); //Год
Месяц : STRING(2); //Месяц
День : STRING(2); //День
Время : STRING(8); //Время
END_VAR
//Год, месяц, день, время
Год := Right(stRtc.sGetFormatDate, 4);
Месяц := USINT_TO_STRING(stRtc.usiGetMonth);
День := USINT_TO_STRING(stRtc.usiGetDay);
Время := stRtc.sGetFormatTime;
//Вычисляем итоговый DT
GetCurDateTime_DT := STRING_TO_DT(CONCAT(CONCAT(CONCAT(CONCAT(CONCAT(CO NCAT(CONCAT('DT#', Год), '-'), Месяц), '-'), День), '-'), Время));
Евгений Кислов
28.09.2026, 15:01
Да, я это по описанию уже понял...
можно ведь использовать Format date + Format time?
Да, можно.
kondor3000
28.09.2026, 15:35
GetCurDateTime_DT := DINT_TO_DT(DT_TO_DINT(stRtc.dtDateAndTime) - 10800);
Почему вы использовали знаковое DINT вместо беззнаковых UDINT (DWORD ) в присвоении ?
aaaSashaMGGU
28.09.2026, 16:20
Почему вы использовали знаковое DINT вместо беззнаковых UDINT (DWORD ) в присвоении ?
В 2038м году поменял бы на UDINT :)
Ну а так-то, конечно, это было неправильно, согласен
aaaSashaMGGU
06.10.2026, 11:16
В общем, сделал пока так, буду наблюдать:
FUNCTION GetCurDateTime_DT: DT //Функция получения значения текущей даты-времени в виде переменной даты-времени
//Внутренние параметры
VAR
Год : STRING(4); //Год
Месяц : STRING(2); //Месяц
День : STRING(2); //День
Время : STRING(8); //Время
END_VAR
//Год, месяц, день, время
Год := Right(stRtc.sGetFormatDate, 4);
Месяц := USINT_TO_STRING(stRtc.usiGetMonth);
День := USINT_TO_STRING(stRtc.usiGetDay);
Время := stRtc.sGetFormatTime;
//Вычисляем итоговый DT
GetCurDateTime_DT := STRING_TO_DT(CONCAT(CONCAT(CONCAT(CONCAT(CONCAT(CO NCAT(CONCAT('DT#', Год), '-'), Месяц), '-'), День), '-'), Время));
По прошествии недели - полёт нормальный
Больше время случайным образом не отпрыгивает назад
Powered by vBulletin® Version 4.2.3 Copyright © 2026 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot