конвертируйте в DWord и добавляйте количество миллисекунд. потом обратно в дату.
конвертируйте в DWord и добавляйте количество миллисекунд. потом обратно в дату.
Часто задаваемые вопросы по кодесис
1) Почему программа не работает - Следует выполнить "Онлайн ->Старт"
2) Где скачать CoDeSys, таргеты, прошивки, библиотеки - http://www.owen.ru/catalog/codesys_v3/opisanie
Тут с форматами намутено дай боже.
Time - в мсек
Date -в сек
К Date прибавить Date нельзя. Это логично. Ведь Date - это конкретная точка. У неё нет размерности.
А прибавить Time можно. Ведь Time - это интервал.
А вот почему при КДС не могет фразу :
DATE := DATE + TIME нормально преобразовать со скрытым преобразованием мсек в сек, это вопрос к Петрову И.
И потому приходится извращатся типа :
DATE := DATE + dword_to_time( time_to_dword( TIME ) / 1000 );
PS
Отвечал и открывал пивко - уже ответили ...
С вашим пивком или без него, но оба ошиблись, уважаемые. В форматах дат (DATE и DT) время считается в секундах, а не в миллисиекндах. И слава Богу, потому что в миллисекундах дата 2010-12-31 выглядит где-то 13-разрядным десятичным числом и 4 байта DWORD не помещается.
Поэтому правидьный ответ будет таким: прибавить 1 день к дате следует через прибаление 86400 секунд к ее выражению в виде DWORD:
Код:dat := DWORD_TO_DATE(DATE_TO_DWORD( dat) + 86400);
Одно очко отыграли :
Петрову И. отбой. КДС оказался умен - мс в сек преобразовывает.DATE := DATE + TIME нормально преобразовать со скрытым преобразованием мсек в сек, это вопрос к Петрову И.
И потому приходится извращатся типа :
DATE := DATE + dword_to_time( time_to_dword( TIME ) / 1000 );
DATE := DATE + dword_to_time( time_to_dword( TIME ));
а значит просто
DATE := DATE + TIME; Работает. Только мс. теряет.
и Ваше
Заменяется на :dat := DWORD_TO_DATE(DATE_TO_DWORD( dat) + 86400);
dat := dat + T#1d;
Что же касается DATE + DATE
Это скорее философия. Между датами есть интервал. ( в сек)
И DATE1 минус DATE2 - имеет смысл. т.к. результат - интервал. (в сек)
А вот DATE1 + DATE2 - бессмысленно в принципе т.к. дата - точка осчета. а время - интервал.
Интервал можно умножить, разделить и др..
а дату нельзя. т.к. конечной результат будет зависеть от начальной точки.
толи Р.Х. , то ли 1970-1-1-1, толи 1961-4-12
Последний раз редактировалось Валенок; 04.12.2010 в 16:50.
Итак. спасибо учителям, в вопросе разобрался.
Моя задача была такова (отбрасываю оффтопиковые детали):
Есть ряд переменных разного типа, разбросанных по областям CONSTANT, RETAIN и обычным VAR. Их свойства описываются структурой PARSCRIPT и существует массив таких структур. В этот массив входят все те переменные, которые я называю параметрами. В параметры я включаю те и только те переменные, для которых будет иногда использоваться инструмент единообразного доступа по чтению и записи этих переменных.
В прилагаемом проекте показано возможное решение, основанное на использовании указателей на параметры и информации о типах. В ФБ чтения и записи GetPar и SetPar происходит выбор по CASE участка кода, где точно известно, какого типа извлекаемые-записываемые данные. И там, конечно, без всяких проблем это чтение-запись происходит.
В программе PLC_PRG продемонстрировано, что значения правильно извлекаются, затем они для понту модифицируются и записываются назад.
Собственно, решение простое, когда уже понимаешь, что к чему. По пути дров повалено много, но таков он, этот процесс познания.
Кстати, для моей задачи множественные выходы ФБ GetPar и множественные входы SetPar вовсе и не нужны. Они скорее хороши для того, чтобы в PLC_PRG показать, что извлеклось правильно. А я буду использовать один выход Х (см. закомментированные участки GetPar) и аналогичный вход Х у SetPar (еще не написано). Ведь мне вся эта байда нужна для обмена с ИП320 через регистры, а туда вся инфо по значению параметра пойдет в виде 4-хбайтного регистра. И в момент передачи на или с ИП320 до лампочки различия в формате INT, DWORD, TIME, DATE. Все равно ИП320 ни хрена не понимает, кроме бита и ворда
И красивое бортовое время придется нарезать на голы-очки-секунды, тьфу! на часы-минуты-секунды и передавать их туды через 3 регистра...
Но это уже отдельная песнь.
Так что еще раз хочу поблагодарить Учителя и всех остальных!