7. Функции GET_BIT и SET_BIT
Не во всех IDE есть обращение к биту в слове через точку.
В CoDeSys это обращение выглядит так: W.0, в TiaPortal так: W.%X0.
А где-то такой возможности нет, и что бы прочитать или записать бит в слово используются функции.
Функция GET_BIT(считать бит из слова) несложная: сдвигаем вправо исходное слово на нужно количество бит, сравниваем с WORD#1 (у нее все биты кроме крайнего правого равны 0) и результат записываем в наш бит. Код функции:
FUNCTION GET_BIT :BOOL
VAR_INPUT
IN :WORD;
NUM :WORD;
END_VAR
VAR
END_VAR
GET_BIT := WORD_TO_BOOL(1 AND SHR(IN, NUM));
В функции SET_BIT(запись бита в слово) нужно вернуть слово с измененным битом. Если бит равен true, то складываем исходное слово с единицей, смещенной на нужное количество бит. Если бит – false, то записываем в исходное слово 0 в нужном бите, инвертируя смещенную единицу на нужное количество бит. Код функции:
FUNCTION SET_BIT : WORD
VAR_INPUT
IN :WORD;
NUM :WORD;
X :BOOL;
END_VAR
VAR
END_VAR
IF X THEN
SET_BIT := IN OR SHL(WORD#1, NUM);
ELSE
SET_BIT := IN AND NOT SHL(WORD#1, NUM);
END_IF;
Применение: передача булевых переменных через холдинг регистры в протоколе MODBUS RTU. В коде использование функций GET_BIT и SET_BIT выглядит вот так:
(*xVarRead – бит, считаный из слова; wVar – слово из которого читаем бит, 10 – номер бита в слове*)
xVarRead := GET_BIT(wVar, 10);
(*wVar – слово в которое пишем бит; 10 – номер бита в слове; xVarWrite – бит, который записываем в слово*)
wVar := SET_BIT(wVar, 10, xVarWrite);
Код функций не мой, выкладываю с разрешения автора.
#Программирование #CoDeSys23
Группа в VK
Не во всех IDE есть обращение к биту в слове через точку.
В CoDeSys это обращение выглядит так: W.0, в TiaPortal так: W.%X0.
А где-то такой возможности нет, и что бы прочитать или записать бит в слово используются функции.
Функция GET_BIT(считать бит из слова) несложная: сдвигаем вправо исходное слово на нужно количество бит, сравниваем с WORD#1 (у нее все биты кроме крайнего правого равны 0) и результат записываем в наш бит. Код функции:
FUNCTION GET_BIT :BOOL
VAR_INPUT
IN :WORD;
NUM :WORD;
END_VAR
VAR
END_VAR
GET_BIT := WORD_TO_BOOL(1 AND SHR(IN, NUM));
В функции SET_BIT(запись бита в слово) нужно вернуть слово с измененным битом. Если бит равен true, то складываем исходное слово с единицей, смещенной на нужное количество бит. Если бит – false, то записываем в исходное слово 0 в нужном бите, инвертируя смещенную единицу на нужное количество бит. Код функции:
FUNCTION SET_BIT : WORD
VAR_INPUT
IN :WORD;
NUM :WORD;
X :BOOL;
END_VAR
VAR
END_VAR
IF X THEN
SET_BIT := IN OR SHL(WORD#1, NUM);
ELSE
SET_BIT := IN AND NOT SHL(WORD#1, NUM);
END_IF;
Применение: передача булевых переменных через холдинг регистры в протоколе MODBUS RTU. В коде использование функций GET_BIT и SET_BIT выглядит вот так:
(*xVarRead – бит, считаный из слова; wVar – слово из которого читаем бит, 10 – номер бита в слове*)
xVarRead := GET_BIT(wVar, 10);
(*wVar – слово в которое пишем бит; 10 – номер бита в слове; xVarWrite – бит, который записываем в слово*)
wVar := SET_BIT(wVar, 10, xVarWrite);
Код функций не мой, выкладываю с разрешения автора.
#Программирование #CoDeSys23
Группа в VK