FaScan

База знаний

Запись переменных битами

Одна переменная может хранить не только обычное число, но и набор отдельных признаков. В промышленной автоматизации так часто передают состояния, аварии, разрешения, режимы работы и packed-флаги в Modbus-регистрах.

Бит как отдельный флаг

Каждый бит имеет номер и вес. Если бит равен 1, его вес добавляется к итоговому числу. Если бит равен 0, он ничего не добавляет. Для целочисленных типов это простая сумма степеней двойки.

Значение = бит0 x 20 + бит1 x 21 + бит2 x 22 + ... Например, если включены биты 0, 3 и 7, значение равно 1 + 8 + 128 = 137.
bit 727128
bit 62664
bit 52532
bit 42416
bit 3238
bit 2224
bit 1212
bit 0201

BYTE, WORD и DWORD

BYTE содержит 8 бит, WORD - 16 бит, DWORD - 32 бита. В картах Modbus один 16-битный holding register часто описывают как WORD: внутри него может быть одно значение 0...65535 или 16 независимых флагов.

ТипРазмерОбычное применение
BYTE8 битНебольшой набор флагов или значение 0...255.
WORD16 битОдин Modbus-регистр, status word, alarm word, control word.
DWORD32 битаДва Modbus-регистра, большая маска флагов или 32-битное число.

Signed-типы

В SHORT8, INT16 и DINT32 старший бит используется как часть знакового представления. Обычно применяется дополнительный код: если старший бит установлен, число считается отрицательным. Например, INT16 с битовым шаблоном 1111 1111 1111 1111 означает -1, а не 65535.

REAL: знак, экспонента и мантисса

REAL - это не просто сумма битов. В большинстве PLC и SCADA он хранится как 32-битное число IEEE-754 Float32: один бит знака, 8 бит экспоненты и 23 бита мантиссы. Поэтому одинаковые 32 бита можно прочитать как UDINT32 и как REAL, но смысл будет разный.

номер бита 0123456789101112131415
часть MANTISSA
содержание 1/211/221/231/241/251/261/271/281/291/2101/2111/2121/2131/2141/2151/216
значение бита 0000000000000000
номер бита 16171819202122232425262728293031
часть MANTISSA EXPONENT S
содержание 1/2171/2181/2191/2201/2211/2221/2232021222324252627+/-
значение бита 0000000000000000
Формула(-1)S x 1.M x 2E-127
МантиссаДробная часть числа. В нормализованном REAL перед ней подразумевается скрытая единица: 1.M.
ЭкспонентаХранится со смещением 127. Если поле экспоненты равно 127, реальная степень равна 0.
Знак0 - положительное число, 1 - отрицательное число.

Что важно в Modbus

Modbus передаёт регистры по 16 бит. Если переменная занимает 32 бита, она лежит в двух регистрах. Для DWORD, DINT32 и REAL важно знать порядок слов: старшее слово первым или младшее слово первым. Если порядок выбран неверно, биты будут те же, но число получится неправильным.

Практика Для быстрых проверок используйте битовый калькулятор: выберите тип, включите нужные биты или вставьте HEX-значение из регистра.

Частые вопросы по битовым переменным

Как понять, какой бит включён в WORD

Разложите значение на степени двойки. Например, если в WORD включён бит 3, его вес равен 2^3 = 8. Несколько включённых битов складываются, поэтому значение 9 означает биты 3 и 0.

Чем signed отличается от unsigned

В unsigned-типе все биты участвуют в положительном числе. В signed-типе старший бит становится битом знака, поэтому тот же набор битов может означать отрицательное значение. Для диагностики важно знать тип из карты устройства.

Почему REAL сложнее WORD и DWORD

REAL хранит число по IEEE-754 Float32: знак, экспоненту и мантиссу. Здесь нельзя просто сложить веса битов как для флагов. Нужно учитывать формулу, порядок слов в Modbus и способ отображения числа в программе.