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.
Ler conjuntos de Bits
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:
- Realiza a conversão diretamente na associação:
“… bit038 + bit24 + bit1*2 + bit0 “
- 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)
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)
Passei um tempo sem continuar com o projeto, as respostas resolveram exatamente o que necessitava.
Agradecido pelo tempo dedicado.