Просмотр полной версии : Установка нескольких бит в перем-ой типа WORD
stdenits
23.04.2024, 09:30
Доброго дня.
Пытаюсь адаптировать функцию из 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 (см. скриншот (https://drive.google.com/)).
Не могли бы вы помочь привести функцию к рабочему виду?
kondor3000
23.04.2024, 09:53
Чтобы не было ошибки, достаточно заменить на входе функции указатель UINT на WORD
variable : POINTER TO UINT; на variable : POINTER TO WORD;
То, что ERR — в конфигурации как тип UINT совсем не помешает.
stdenits
23.04.2024, 10:07
@kondor3000,
Это я поправил.
Она не работает, как должно: срабатывает один раз с маской 16#0001 и значением16#1, значение ERR изменяется на 1 и на этом всё - больше значение ERR не меняется при вызове функции с другими масками и значениями.
kondor3000
23.04.2024, 14:08
@kondor3000,
Это я поправил.
Она не работает, как должно: срабатывает один раз с маской 16#0001 и значением16#1, значение ERR изменяется на 1 и на этом всё - больше значение ERR не меняется при вызове функции с другими масками и значениями.
Никак не могу понять смысл работы этой функции, есть маска бит управления нагрузкой и маска аварий, зачем нужно ещё что-то формировать?
Или надо исключать аварийные биты из маски рабочих бит?
stdenits
23.04.2024, 15:10
Никак не могу понять смысл работы этой функции
Переменная ERR содержит флаги возникших ошибок вввиде битов, установленных в 1, например, при превышении уставки или при ошибке DECODE_FLOAT.
Функция set_state_value_16b() позволяет без изменения остальных битов переменной variable устанавливать (обнулять или выставлять) новые значения только для определенных битов с использованием маски.
kondor3000
23.04.2024, 15:43
Переменная ERR содержит флаги возникших ошибок вввиде битов, установленных в 1, например, при превышении уставки или при ошибке DECODE_FLOAT.
Функция set_state_value_16b() позволяет без изменения остальных битов переменной variable устанавливать (обнулять или выставлять) новые значения только для определенных битов с использованием маски.
Только всё равно не понятно, зачем, можно же любой бит в любой переменной включить, через точку.
Да нормально все с функцией. Проблему ищите вне ее.
stdenits
23.04.2024, 15:48
А с использованием точки не хотите попробовать?
Можно пример, пожалуйста. Или как это обзывается правильно? (чтобы загуглить)
Валенок подсказывает, что:
ERR.0 := FALSE;
После точки идёт маска, если я парвильно понял, с помощью которой можно установить указанные биты в ОДНО определённое состояние за раз.
С помощью функции же можно переключать биты, заданные маской, в различные состояния за раз.
Но она не работает. .
Она - работает.
Думал тут могут подсказать что не так.
проект и ожидания от него ?
stdenits
23.04.2024, 16:06
проект и ожидания от него ?
Отправил позорный проект в личку.
Пока меня очень интересует обработка ошибок.
kondor3000
23.04.2024, 22:25
Переменная ERR содержит флаги возникших ошибок вввиде битов, установленных в 1, например, при превышении уставки или при ошибке DECODE_FLOAT.
Функция set_state_value_16b() позволяет без изменения остальных битов переменной variable устанавливать (обнулять или выставлять) новые значения только для определенных битов с использованием маски.
Вроде так должно быть и функция начинает работать 75357
FUNCTION set_state_value_16b : WORD
VAR_INPUT
variable : POINTER TO WORD;
mask : WORD;
val : WORD;
END_VAR
VAR
END_VAR
set_state_value_16b := (variable^ AND NOT mask) OR (val AND mask);
stdenits
25.04.2024, 12:40
@kondor3000,
Остановился на варианте с возвращением результата работы функции.
Для выставления одного бита буду пользовать точку.
Спасибо за помощь.
Powered by vBulletin® Version 4.2.3 Copyright © 2025 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot