Сообщение от
Alisad
Все это я делаю, но появилась потребность работать именно с числом в сп307 и именно макросом, в который пр200 пишит биты, без присвоения. То есть как я хочу. Получили число (он же набор бит), посмотрели, например 7 бит, и уже на основе этого делать что то. Сейчас приходится копировать бит из пр200 в psb сп307 и уже с этим работать. Почему то мне кажется что это не правильно.
Я для работы с битами регистров использую такие макро определения
Код:
#define GetBit(Reg,bitno) ((Reg) & (1 << (bitno))) // Получить статус бита "bitno" в регистре "Reg"
#define ResetBit(Reg,bitno) ((Reg) &= ( ~ (1 << ((bitno))))) // Сбросить бит "bitno" в регистре "Reg"
#define SetBit(Reg,bitno) ((Reg) |= ( 1 << ((bitno)))) // Установить бит "bitno" в регистре "Reg"
#define ReversBit(reg, bitno) ((reg) ^= (1 << (bitno))) // Инвертировать бит "bitno" в регистре "Reg"
И использую эти макро наподобие функций, например
Код:
//Эти строчки в начале программы
#define GetBit(Reg,bitno) ((Reg) & (1 << (bitno)))
#define ResetBit(Reg,bitno) ((Reg) &= ( ~ (1 << ((bitno)))))
#define SetBit(Reg,bitno) ((Reg) |= ( 1 << ((bitno))))
#define ReversBit(reg, bitno) ((reg) ^= (1 << (bitno)))
//Далее в любом месте, где нужно работать с битами
//использую эти макро наподобие функций
if(GetBit(PSW[600],5)) { // Если "5" бит в регистре PSW[600] установлен, то
ResetBit(PSW[256],12); // Сбросить бит "12" в регистре PSW256
SetBit(PSW[300],7); // Установить бит "7" в регистре PSW300
ReversBit(PSW[500],3); // Инвертировать бит "3" в регистре PSW500
}
if(!GetBit(PSW[600],5)) { // Если "5" бит в регистре PSW[600] НЕ установлен, то
// сделать то-то
// сделать это
}
Все справедливо и для переменных, например WORD
Код:
#define GetBit(Reg,bitno) ((Reg) & (1 << (bitno)))
#define ResetBit(Reg,bitno) ((Reg) &= ( ~ (1 << ((bitno)))))
#define SetBit(Reg,bitno) ((Reg) |= ( 1 << ((bitno))))
#define ReversBit(reg, bitno) ((reg) ^= (1 << (bitno)))
WORD wBIT;
WORD TEST;
Read(PLC, 8, MODBUS_RTU_REG_4X, 555, 0, TYPE_WORD, &wBIT); //chtenie registra
if(GetBit(wBIT,5)) { // Если "5" бит в регистре wBIT установлен, то
ResetBit(TEST,12); // Сбросить бит "12" в регистре TEST
SetBit(TEST,7); // Установить бит "7" в регистре TEST
ReversBit(TEST, 3); // Инвертировать бит "3" в регистре TEST
}
if(!GetBit(wBIT,12)) { //Если "5" бит в регистре wBIT НЕ установлен, то
// сделать это
//сделать то-то
}
ЗЫ.
Кстати ..
В дополнение к "стандартным" макро определениям для работы с битами PSB
- GetPSBStatus(300);
- SetPSB(301);
- ResetPSB(301);
Захват-3.png
Использую такой макро для реверса бита PSB
Код:
#define ReversPSB(PSB_No) PSB[(PSB_No) / 8] ^= (1 << ((PSB_No) % 8))