Данный CODESYS форум содержит архивную копию русской ветви только для чтения. Для создания сообщений пожалуйста используйте актуальную международную платформу CODESYS Forum. Close

DWORD в FLOAT

Общий
ihor
2011-04-16
2015-12-10
  • ihor

    ihor - 2011-04-16

    Подскажите, пожалуйста:
    Считываю по Modbus два регистра в которых сохраняется переменная типа FLOAT.
    У себя на контролере собираю етих два регистра типа WORD (или 4 байта в DWORD). А как теперь ету переменную перевести в FLOAT?
    Пробивал через онлайн калькулятор по IEEE754 перевести все работает отлично, но как в CodeSys отобразить ее переменой с плавающей точкой никак не могу разобраться

     
  • Safron

    Safron - 2011-04-16

    http://www.owen.ru/forum/showthread.php ... ight=Float
    Попробуй зависнуть на Овеновском форуме. Там проблемы с передачей флоат в панель.
    И есть кое-какие советы по преобразованию. Может там что найдёшь.

     
  • Igor Petrov

    Igor Petrov - 2011-04-16

    Собрать надо не в DWORD, а в REAL. Либо скопирорвать через указатель.

     
  • Avgur

    Avgur - 2011-04-18

    библиотека oscat, FUNCTION DW_TO_REAL.

     
  • ihor

    ihor - 2011-04-18

    Спасибо
    Решилось с помощью статьи,  по которой написал преобразование с IEEE 754 в REAL. Жаль что плохо искал в OSCATE а то б сэкономил много времени
    Ссылка с хорошим описанием, может когда не будь кому пригодится

    http://www.softelectro.ru/ieee754.html m

     
  • Igor Petrov

    Igor Petrov - 2011-04-18

    А стандартная операция в CoDeSys – DWORD_TO_REAL не подходит?

     
  • ihor

    ihor - 2011-04-21

    Почему то не подходит
    Может я что-то не так делаю,… но мне не подошла, давала совсем не правильной результат

     
  • Igor Petrov

    Igor Petrov - 2011-04-22

    Нет контроллера проверить, но сильно подозреваю, что значение уже лежит в памяти правильно, и ничего преобразовывать не надо.

    Регистр DWORD наверняка размещен в прямоадресуемой памяти I или M? На этот же адрес объявляем и переменную типа REAL. Все.

     
  • stskr

    stskr - 2014-09-23

    Столкнулся с такой же проблемой.

    У меня есть целочисленное значение 32 бит. Нужно преобразовать его в Real.
    Функция из Codesys DWORD_TO_REAL не подходит, т. к. при превышении значения 16#7FFFFFFF преобразование идет не корректно.

    Функция DW_TO_REAL не делает преобразование в Real, а переносит по битам значение.

    Это значение хранится во внутренней переменной, так что адресоваться по-другому я не могу.

    Как можно решить эту задачу?

     
  • stskr

    stskr - 2014-09-24

    Задачу решил, разбив слово на два при помощи DWORD_TO_WORD и
    затем преобразовав каждое слово в REAL по-отдельности.

     
  • Anonymous - 2015-12-10

    Originally created by: kropochev.alexander

    FUNCTION DW_TO_REAL : REAL
    VAR_INPUT
       DW : DWORD;
    END_VAR
    VAR
       pR : POINTER TO REAL;
    END_VAR
    pR := ADR(DW);
    DW_TO_REAL := pR^;