PDA

Просмотр полной версии : Установка нескольких бит в перем-ой типа 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 устанавливать (обнулять или выставлять) новые значения только для определенных битов с использованием маски.


Только всё равно не понятно, зачем, можно же любой бит в любой переменной включить, через точку.

Валенок
23.04.2024, 15:48
Да нормально все с функцией. Проблему ищите вне ее.

stdenits
23.04.2024, 15:48
А с использованием точки не хотите попробовать?

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

Валенок подсказывает, что:

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

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

Валенок
23.04.2024, 16:00
Но она не работает. .
Она - работает.


Думал тут могут подсказать что не так.
проект и ожидания от него ?

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,
Остановился на варианте с возвращением результата работы функции.
Для выставления одного бита буду пользовать точку.
Спасибо за помощь.