Страница 1 из 4 123 ... ПоследняяПоследняя
Показано с 1 по 10 из 34

Тема: DWORD_TO_REAL

  1. #1

    По умолчанию DWORD_TO_REAL

    Мне нужно перевести 4 байта (16#40 00 00 00) в формат REAL
    Так как порядок следования байт в REAL для СПК перепутан, пробую так:

    dword_to_real(16#4000)

    По идее это должно мне дать значение real равное 2.0 , но это не так.
    Получается что dword это такой же числовой тип как и uint!
    Спрашивается, зачем нужны два одинаковых типа?

    И существует ли в ST оператор, который может нормально перевести 16#4000 в real = 2.0 ?
    Изображения Изображения
    • Тип файла: jpg dword.jpg (11.5 Кб, Просмотров: 128)

  2. #2

    По умолчанию

    По сути, мне нужно решить задачу: корректно перевести переменную типа dword в real не используя память данных М в языке ST.
    Это вообще реально?

  3. #3
    Пользователь Аватар для _Mikhail
    Регистрация
    25.07.2013
    Адрес
    Ярославль
    Сообщений
    510

    По умолчанию

    На форуме уже не раз выкладывался пример получения переменной типа REAL в СПК. Просто оператора нет, нужно написать функцию перестановки байт.

  4. #4

    По умолчанию

    Цитата Сообщение от _Mikhail Посмотреть сообщение
    На форуме уже не раз выкладывался пример получения переменной типа REAL в СПК. Просто оператора нет, нужно написать функцию перестановки байт.
    Байты уже переставлены. Мне реал получить надо.

  5. #5

    По умолчанию

    Цитата Сообщение от capzap Посмотреть сообщение
    только через указатель, либо самому написать функцию
    Разве возможно написать такую функцию на ST?
    Где она будет хранить значения при перекидывании байт? (М память не предлагать)
    Функциональный блок тут конечно справится. Но это как из пушки по воробьям.
    Последний раз редактировалось @ND; 07.08.2015 в 07:32.

  6. #6

    По умолчанию

    Почему в других системах dword_to_real нормально работает, а в КДС так убого?

  7. #7

    По умолчанию

    Даже документации по dword_to_real нет.

  8. #8
    Пользователь
    Регистрация
    13.10.2011
    Адрес
    Златоуст
    Сообщений
    1,021

    По умолчанию

    Получается что dword это такой же числовой тип как и uint!
    По стандарту он не числовой ни разу, но ощущение, что на это забили вообще все.

    DWORD_TO_REAL делает как раз числовое преобразование. Вам нужно реинтерпретировать байты через указатель:

    d: DWORD;
    ptrReal: POINTER TO REAL;
    r: REAL;

    ptrReal := ADR(d);
    r := ptrReal^;

    Будь у меня свой кодесис, я бы запретил на фиг арифметику и неявные преобразования в число для типов, которые имеют в своём названии WORD, чтобы вот этой путаницы не возникало. И сделал бы операторы вроде DWORD_AS_REAL, чтобы обходиться без указателей.

  9. #9
    Пользователь Аватар для _Mikhail
    Регистрация
    25.07.2013
    Адрес
    Ярославль
    Сообщений
    510

    По умолчанию

    Цитата Сообщение от @ND Посмотреть сообщение
    Разве возможно написать такую функцию на ST?

    Где она будет хранить значения при перекидывании байт?

    Функциональный блок тут конечно справится. Но это как из пушки по воробьям.
    1. Конечно написать можно. Она очень простая
    real.jpg
    2. Функция не хранит данные, она пересчитывает и выдает результат
    3. Хотите ФБ пожалуйста, только для этой задачи достаточно функции

  10. #10

    По умолчанию

    Siemens step7
    DWORD_TO_REAL(W#16#40000000) даст 2.0

Страница 1 из 4 123 ... ПоследняяПоследняя

Ваши права

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