Страница 1 из 2 12 ПоследняяПоследняя
Показано с 1 по 10 из 14

Тема: Установка нескольких бит в перем-ой типа WORD

  1. #1

    По умолчанию Установка нескольких бит в перем-ой типа WORD

    Доброго дня.

    Пытаюсь адаптировать функцию из C для одновременной установки нескольких бит переменной типа uint16_t для Codesys v2.3 и языка ST (Pascal):
    Код:
    void
    Текущая реализация для Codesys v2.3:
    Код:
    FUNCTION set_state_value_16b : WORD
    VAR_INPUT
        variable : POINTER TO WORD;
        mask : WORD;
        val : WORD;
    END_VAR
    VAR
    END_VAR
    
    void
    Пример использования:
    Код:
    set_state_value_16b(ADR(ERR), 16#0001, 16#0);
    , где ERR — это ярлык элемента подменю типа UINT в ПЛК63 (см. скриншот).


    Не могли бы вы помочь привести функцию к рабочему виду?
    Последний раз редактировалось stdenits; 25.04.2024 в 11:56.

  2. #2

    По умолчанию

    Чтобы не было ошибки, достаточно заменить на входе функции указатель UINT на WORD

    variable : POINTER TO UINT; на variable : POINTER TO WORD;

    То, что ERR — в конфигурации как тип UINT совсем не помешает.
    Последний раз редактировалось kondor3000; 23.04.2024 в 13:08.

  3. #3

    По умолчанию

    @kondor3000,
    Это я поправил.
    Она не работает, как должно: срабатывает один раз с маской 16#0001 и значением16#1, значение ERR изменяется на 1 и на этом всё - больше значение ERR не меняется при вызове функции с другими масками и значениями.

  4. #4

    По умолчанию

    Цитата Сообщение от stdenits Посмотреть сообщение
    @kondor3000,
    Это я поправил.
    Она не работает, как должно: срабатывает один раз с маской 16#0001 и значением16#1, значение ERR изменяется на 1 и на этом всё - больше значение ERR не меняется при вызове функции с другими масками и значениями.
    Никак не могу понять смысл работы этой функции, есть маска бит управления нагрузкой и маска аварий, зачем нужно ещё что-то формировать?
    Или надо исключать аварийные биты из маски рабочих бит?
    Последний раз редактировалось kondor3000; 23.04.2024 в 14:19.

  5. #5

    По умолчанию

    Цитата Сообщение от kondor3000 Посмотреть сообщение
    Никак не могу понять смысл работы этой функции
    Переменная ERR содержит флаги возникших ошибок вввиде битов, установленных в 1, например, при превышении уставки или при ошибке DECODE_FLOAT.
    Функция set_state_value_16b() позволяет без изменения остальных битов переменной variable устанавливать (обнулять или выставлять) новые значения только для определенных битов с использованием маски.

  6. #6
    Пользователь Аватар для capzap
    Регистрация
    25.02.2011
    Адрес
    Киров
    Сообщений
    10,257

    По умолчанию

    Цитата Сообщение от stdenits Посмотреть сообщение
    для определенных битов с использованием маски.
    А с использованием точки не хотите попробовать?
    Bad programmers worry about the code. Good programmers worry about data structures and their relationships

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

  7. #7

    По умолчанию

    Цитата Сообщение от stdenits Посмотреть сообщение
    Переменная ERR содержит флаги возникших ошибок вввиде битов, установленных в 1, например, при превышении уставки или при ошибке DECODE_FLOAT.
    Функция set_state_value_16b() позволяет без изменения остальных битов переменной variable устанавливать (обнулять или выставлять) новые значения только для определенных битов с использованием маски.

    Только всё равно не понятно, зачем, можно же любой бит в любой переменной включить, через точку.
    Последний раз редактировалось kondor3000; 23.04.2024 в 22:28.

  8. #8
    Пользователь
    Регистрация
    23.09.2008
    Адрес
    Центророссийск
    Сообщений
    2,251

    По умолчанию

    Да нормально все с функцией. Проблему ищите вне ее.

  9. #9

    По умолчанию

    Цитата Сообщение от capzap Посмотреть сообщение
    А с использованием точки не хотите попробовать?
    Можно пример, пожалуйста. Или как это обзывается правильно? (чтобы загуглить)

    Валенок подсказывает, что:
    Код:
    ERR.0 := FALSE;
    После точки идёт маска, если я парвильно понял, с помощью которой можно установить указанные биты в ОДНО определённое состояние за раз.

    С помощью функции же можно переключать биты, заданные маской, в различные состояния за раз.
    Последний раз редактировалось stdenits; 23.04.2024 в 16:01.

  10. #10
    Пользователь
    Регистрация
    23.09.2008
    Адрес
    Центророссийск
    Сообщений
    2,251

    По умолчанию

    Цитата Сообщение от stdenits Посмотреть сообщение
    Но она не работает. .
    Она - работает.

    Цитата Сообщение от stdenits Посмотреть сообщение
    Думал тут могут подсказать что не так.
    проект и ожидания от него ?

Страница 1 из 2 12 ПоследняяПоследняя

Похожие темы

  1. Word to bytes
    от Scream в разделе ПЛК1хх
    Ответов: 11
    Последнее сообщение: 10.04.2024, 11:31
  2. Ответов: 6
    Последнее сообщение: 25.02.2022, 12:35
  3. 2 WORD В DINT
    от А1дар в разделе СПК1хх
    Ответов: 5
    Последнее сообщение: 19.02.2021, 10:56
  4. WORD <-> BOOL
    от ASo в разделе Master SCADA 3
    Ответов: 1
    Последнее сообщение: 08.09.2013, 16:12
  5. Mscada не записыв. перем. в плк100, opc csys
    от Андрей Ш в разделе Master SCADA 3
    Ответов: 7
    Последнее сообщение: 26.04.2010, 14:38

Метки этой темы

Ваши права

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