Ler conjuntos de Bits

Boa tarde, tenho um problema com um registro com formato de 16Bits, onde do Bit00 ao Bit07 corresponde ao valor que estou requerendo “porcentagem restante da Bateria” e do Bit08 ao Bit15 corresponde a outro valor que não preciso.
Eu quero tomar a informação apenas desde o Bit00 ao Bit07, mais não estou conseguindo, alguma ideia de como fazer isto?
PD: A opção UserBitFields está ativada.
Agradecido desde já, Eduardo.

Eduardo, bom dia.

Basicamente, você tem duas alternativas para ler a palavra baixa (primeiros oito bits) e a palavra alta (últimos 8 bits), sendo as duas formas por aplicativo.

Primeiros 8 bits:

  1. Realiza a conversão diretamente na associação:

“… bit038 + bit24 + bit1*2 + bit0 “

  1. Faz um deslocamento de bits diretamente na associação:

“Driver1.Tag1.Value AND 255”

A partir daí, basta utilizar essa informação na fórmula principal.

Últimos 8 bits:

A palavra ‘baixa’ vai ter que ser feito o cálculo direto na associação mesmo:

Abs(Driver1.Tag1.Bit08 *256 + Driver1.Tag1.Bit09 *512 + Driver1.Tag1.Bit10 *1024 + Driver1.Tag1.Bit11 *2048 + Driver1.Tag1.Bit12 *4096 + Driver1.Tag1.Bit13 *8192 + Driver1.Tag1.Bit14 *2048 + Driver1.Tag1.Bit15 *16384 + Driver1.Tag1.Bit16 *32768)

1 Like

Boa tarde,

A maneira mais simples de se fazer isto, ao meu ver é:

Bit00 ao Bit07:
=> Tag.Value AND 255
“Os bits fora do intervalo de 0-255 são zerados quando faz a operação AND bitwise.”

Bit08 ao Bit15:
=> BShr(Tag.Value, 8)
“A função BShr faz o deslocamento dos bits para a direita.”

Exemplo:
Valor do Tag Word (16 bits):
58197: Equivalente binário 11100011 01010101

58197 AND 255 resulta em 85: Equivalente binário 01010101 (bits de 00 a 07 do Tag Original)

BShr(58197, 8) resulta em 227: Equivalente binário 11100011 (bits de 08 a 15 do Tag Original)

1 Like

Passei um tempo sem continuar com o projeto, as respostas resolveram exatamente o que necessitava.
Agradecido pelo tempo dedicado.