Страница 2 из 3 ПерваяПервая 123 ПоследняяПоследняя
Показано с 11 по 20 из 26

Тема: Как из REAL сделать 2 * WORD (для Modbus)?

  1. #11

    По умолчанию

    Цитата Сообщение от bogd67 Посмотреть сообщение
    //================================================== =//
    //================================================== =//
    FUNCTION_BLOCK REAL_TO_WW

    //================================================== =//

    FUNCTION_BLOCK WW_TO_REAL___________(*тут ФБ вместо функции*)

    _____________________________________ (* Нет присвоения выхода фунции*)

    //================================================== =//
    У вас ошибки во втором блоке, , это вообще функция, а не ФБ и нет присвоения выхода у функции.
    Кроме того это блоки больше для Овен лоджика подходят, в Codesys все делается через указатели в 3 строки
    или вообще без кода, проcто положив REAL в 2 последовательных WORD
    Последний раз редактировалось kondor3000; 19.02.2026 в 10:59.

  2. #12

    По умолчанию

    Дополняю, в первом блоке тоже ошибки, не верно работает на пределах от -0.99999 до -0.00001 и от 0.00001 до 0.99999

  3. #13

    По умолчанию

    //-----------------------
    Последний раз редактировалось bogd67; 20.02.2026 в 14:45.

  4. #14

    По умолчанию

    Цитата Сообщение от bogd67 Посмотреть сообщение
    Поправил, теперь считает корректно)) да, такой вариант это путь самурая, в третьем кодесис это делают через UNION или через указатели во втором, но не во всяком ST есть указатели и UNION. Сейчас, например, ОВЕН предлагает линейку ПЛК c российской средой ПОЛИГОН. Среда разработки очень перспективная, оперативная техподдержка, удобный интерфейс, есть возможность работаь на С++ и на ST. НО среда пока в процессе развития, и указатели пока не реализованы. К тому же пусть и давний вопрос в первом посте, но он так и висел без ответа))
    Опять ошибки в первом блоке, мало того, ещё и LINT, туда добавили, а в CDS 2.3 нет LINT.
    Вот ссылка на готовые решения в Овен Лоджик https://owen.ru/forum/showthread.php...l=1#post450146
    без указателей и прочего.

  5. #15

    По умолчанию

    //-------------------------------
    Последний раз редактировалось bogd67; 20.02.2026 в 14:45.

  6. #16
    Banned
    Регистрация
    25.02.2011
    Адрес
    Киров
    Сообщений
    10,664

    По умолчанию

    Цитата Сообщение от bogd67 Посмотреть сообщение
    Поправил, теперь считает корректно))
    видимо надо еще поправить, если спрсить ИИ
    Выявленные ошибки:

    1) Неполное выполнение алгоритма
    Код обрывается после блока ELSE в основной ветке. Отсутствует финальная сборка результата из компонентов (dwSign, dwExp, dwMant) и распределение по выходам wLow и wHigh.

    2) Проблемы с точностью вычислений
    Использование логарифмов (LOG) и степеней (EXPT) для вычисления экспоненты и мантиссы может привести к ошибкам округления. Это критично для точного преобразования в формат IEEE 754.

    3) Некорректная обработка субнормальных чисел
    Формула rAbs / 1.401298E-45 может давать значения вне диапазона DWORD.
    Не учитывается, что мантисса субнормальных чисел не имеет неявной единицы.

    4) Отсутствие обработки особых случаев
    Не обработаны:
    бесконечности (+INF, -INF);
    NaN (Not a Number).

    5) Потенциальное переполнение
    При преобразовании REAL_TO_DWORD может произойти переполнение, если результат выходит за диапазон 0…4294967295.

    6) Некорректное вычисление экспоненты
    Смещение экспоненты (bias) должно применяться строго по стандарту IEEE 754: значение экспоненты кодируется со смещением 127. В коде это реализовано неточно.

    7) Отсутствие инициализации
    Переменные wLow и wHigh не инициализированы. При ошибках преобразования они могут содержать неопределённые значения.

    8) Отсутствие маскировки битов
    При сборке dwResult не контролируется, что:
    экспонента занимает биты 30–23;
    мантисса — биты 22–0;
    знак — бит 31.


    Тестовые кейсы для валидации
    0.0 16#00000000 +0.0
    -0.0 16#80000000 -0.0 (знак сохранён)
    1.0 16#3F800000 Эталонное значение
    -2.5 16#C0200000 Отрицательное нормальное
    1.1754944e-38 16#00800000 Минимальное нормальное
    1.0E-40 субнормал Проверка ветки subnormal
    3.4028235E+38 16#7F7FFFFF MAX_REAL
    > MAX_REAL 16#7F800000 +Infinity
    Последний раз редактировалось capzap; 21.02.2026 в 13:17.

  7. #17

    По умолчанию

    //----------------------------
    Последний раз редактировалось bogd67; 20.02.2026 в 14:46.

  8. #18

    По умолчанию

    //-----------------------
    Последний раз редактировалось bogd67; 20.02.2026 в 14:46.

  9. #19

    По умолчанию

    Цитата Сообщение от bogd67 Посмотреть сообщение
    Ошибки во втором кодесис? У меня, к сожалению второго нет, есть третий и полигон. На них всё работает, ошибок нет. если не сложно, поправьте.
    Вы при копировании потеряли END_IF в конце кода.
    Просто 1 вариант был для CDS2.3, а второй вариант уже под 3.5 с использованием LINT, что удивительно.
    А рабочий код тут, примеры ниже и работают везде, даже где нет указателей, логарифмов и 64 битных переменных, типа LINT https://owen.ru/forum/showthread.php...l=1#post450141
    Последний раз редактировалось kondor3000; 20.02.2026 в 14:04.

  10. #20

    По умолчанию

    //------------------------------
    Последний раз редактировалось bogd67; 20.02.2026 в 14:46.

Страница 2 из 3 ПерваяПервая 123 ПоследняяПоследняя

Похожие темы

  1. Как передать значения REAL по modbus?
    от kat в разделе СПК1xx (архив)
    Ответов: 22
    Последнее сообщение: 29.08.2020, 22:34
  2. Перевод WORD в REAL в CFC.
    от Newcomer в разделе ПЛК1хх
    Ответов: 3
    Последнее сообщение: 16.01.2016, 10:11
  3. Упаковка переменных BOOL, INT, REAL в Modbus String
    от ПРОЕКТ-П в разделе ПЛК1хх
    Ответов: 15
    Последнее сообщение: 20.04.2015, 22:09
  4. Из двух WORD один REAL?
    от kholonkin в разделе СПК2xx (архив)
    Ответов: 1
    Последнее сообщение: 06.09.2013, 10:17
  5. modbus RTU, real, swap (перестановка слов)
    от vitiali в разделе ПЛК1хх
    Ответов: 9
    Последнее сообщение: 18.07.2011, 16:52

Ваши права

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