Страница 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
    Пользователь Аватар для capzap
    Регистрация
    25.02.2011
    Адрес
    Киров
    Сообщений
    10,636

    По умолчанию

    Цитата Сообщение от 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.
    Bad programmers worry about the code. Good programmers worry about data structures and their relationships

    среди успешных людей я не встречала нытиков
    Барбара Коркоран

  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

Ваши права

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