Страница 4 из 4 ПерваяПервая ... 234
Показано с 31 по 35 из 35

Тема: POINTER TO what?

  1. #31

    По умолчанию

    конвертируйте в DWord и добавляйте количество миллисекунд. потом обратно в дату.
    Часто задаваемые вопросы по кодесис
    1) Почему программа не работает - Следует выполнить "Онлайн ->Старт"
    2) Где скачать CoDeSys, таргеты, прошивки, библиотеки - http://www.owen.ru/catalog/codesys_v3/opisanie

  2. #32
    Пользователь
    Регистрация
    23.09.2008
    Адрес
    Златоглавая, ЮЗАО
    Сообщений
    2,346

    По умолчанию

    Тут с форматами намутено дай боже.

    Time - в мсек
    Date -в сек


    К Date прибавить Date нельзя. Это логично. Ведь Date - это конкретная точка. У неё нет размерности.
    А прибавить Time можно. Ведь Time - это интервал.

    А вот почему при КДС не могет фразу :

    DATE := DATE + TIME нормально преобразовать со скрытым преобразованием мсек в сек, это вопрос к Петрову И.

    И потому приходится извращатся типа :

    DATE := DATE + dword_to_time( time_to_dword( TIME ) / 1000 );

    PS
    Отвечал и открывал пивко - уже ответили ...

  3. #33
    Пользователь Аватар для drvlas
    Регистрация
    30.09.2010
    Адрес
    Киев
    Сообщений
    920

    По умолчанию закрыли тему времени

    С вашим пивком или без него, но оба ошиблись, уважаемые. В форматах дат (DATE и DT) время считается в секундах, а не в миллисиекндах. И слава Богу, потому что в миллисекундах дата 2010-12-31 выглядит где-то 13-разрядным десятичным числом и 4 байта DWORD не помещается.

    Поэтому правидьный ответ будет таким: прибавить 1 день к дате следует через прибаление 86400 секунд к ее выражению в виде DWORD:

    Код:
    dat := DWORD_TO_DATE(DATE_TO_DWORD( dat)  + 86400);

  4. #34
    Пользователь
    Регистрация
    23.09.2008
    Адрес
    Златоглавая, ЮЗАО
    Сообщений
    2,346

    По умолчанию

    Одно очко отыграли :

    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.

  5. #35
    Пользователь Аватар для drvlas
    Регистрация
    30.09.2010
    Адрес
    Киев
    Сообщений
    920

    По умолчанию подвожу итоги

    Итак. спасибо учителям, в вопросе разобрался.

    Моя задача была такова (отбрасываю оффтопиковые детали):

    Есть ряд переменных разного типа, разбросанных по областям CONSTANT, RETAIN и обычным VAR. Их свойства описываются структурой PARSCRIPT и существует массив таких структур. В этот массив входят все те переменные, которые я называю параметрами. В параметры я включаю те и только те переменные, для которых будет иногда использоваться инструмент единообразного доступа по чтению и записи этих переменных.

    В прилагаемом проекте показано возможное решение, основанное на использовании указателей на параметры и информации о типах. В ФБ чтения и записи GetPar и SetPar происходит выбор по CASE участка кода, где точно известно, какого типа извлекаемые-записываемые данные. И там, конечно, без всяких проблем это чтение-запись происходит.
    В программе PLC_PRG продемонстрировано, что значения правильно извлекаются, затем они для понту модифицируются и записываются назад.

    Собственно, решение простое, когда уже понимаешь, что к чему. По пути дров повалено много, но таков он, этот процесс познания.

    Кстати, для моей задачи множественные выходы ФБ GetPar и множественные входы SetPar вовсе и не нужны. Они скорее хороши для того, чтобы в PLC_PRG показать, что извлеклось правильно. А я буду использовать один выход Х (см. закомментированные участки GetPar) и аналогичный вход Х у SetPar (еще не написано). Ведь мне вся эта байда нужна для обмена с ИП320 через регистры, а туда вся инфо по значению параметра пойдет в виде 4-хбайтного регистра. И в момент передачи на или с ИП320 до лампочки различия в формате INT, DWORD, TIME, DATE. Все равно ИП320 ни хрена не понимает, кроме бита и ворда
    И красивое бортовое время придется нарезать на голы-очки-секунды, тьфу! на часы-минуты-секунды и передавать их туды через 3 регистра...

    Но это уже отдельная песнь.

    Так что еще раз хочу поблагодарить Учителя и всех остальных!
    Вложения Вложения

Страница 4 из 4 ПерваяПервая ... 234

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •