Это - работает!
Вложение 46107
Вложение 46108
Вы свой не работающий вариант предъявите!
Вид для печати
Это - работает!
Вложение 46107
Вложение 46108
Вы свой не работающий вариант предъявите!
Работает, на примере этом вижу. Но при "0" крутится же, что сбивает с толку. И как то очень нелинейно, заметно прибавляет обороты только выше 60, а туда не залезал. На глаз не видно различия в скорости для 0 и 30. Обычно частотник и работает в нижней половине, для такой визуализации незначительная разница. Думал будет заметнее. И при 0 наверное не надо крутиться,
У вентилятора всего 10 скоростей, диапазон, который задаются в настройках (0...100 или другой) линейно масштабируется к значению 0...9, назавём это - Задание. По этому большого смысла делать 0-100 нет, можно делать 0-9
Внутри генератор, который генерит импульсы смены фаз с периодом (10 - Задание)*100мс
По этому минимальное значение интервала одной фазы (10 -0)*0,1=1сек - Ваше "при "0" крутится же" :rolleyes:
Доброго времени суток! Разбираюсь с макросами в СП315. Возникла загвоздка..
Сначала я копирую регистр приходящий с ПР200 в PSW[600] ()
WORD Bit;
int i;
Read(PLC, 8, MODBUS_RTU_REG_4X, 555, 0, TYPE_WORD, &Bit); //chtenie registra
PSW[600] = Bit;
Далее мне нужно сравнить состояния бит внутри регистра.. я конечно накидал код, но на второй итерации всё виснет.
Основная проблема в том, какой же правильный синтаксис чтения бита.
Вот мой набросок
for ( i = 0; i < 12; i++ ) //cikl perebora bit
{
if ( PSW[600] & ( 1 << i ) != 1 ) //uslovie (собственно проблема в этом условии)
{
PSW[601] = i; //
if (i = 1)
{
SetPSB(600); //green
ResetPSB(601);
ResetPSB(602);
ResetPSB(603);
}
else if (i = 2)
{
SetPSB(601); //green flashing
ResetPSB(600);
ResetPSB(602);
ResetPSB(603);
}
else if (i = 3)
{
SetPSB(602); //yellow
ResetPSB(600);
ResetPSB(601);
ResetPSB(603);
}
else
{
SetPSB(603); //red
ResetPSB(600);
ResetPSB(601);
ResetPSB(602);
}
Delay (3000);
}
}
ПОМОГИТЕ ПОЖАЛУЙСТА
Я для работы с битами регистров использую такие макро
И использую эти макро наподобие функций, напримерКод:#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"
Все справедливо и для переменных, например 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)))
//Далее в любом месте, где нужно работать с битами
//использую эти макро наподобие функций
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] НЕ установлен, то
// сделать то-то
// сделать это
}
ЗЫКод:#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 НЕ установлен, то
// сделать это
//сделать то-то
}
Насколько я понимаю, в Вашем варианте нужно так писать
if (! (PSW[600] & ( 1 << i ) )) //uslovie (собственно проблема в этом условии)
{
Спасибо большое! Буду тестировать проверять)
Посоветуйте как временно погасить изображения функциональных областей. Нужно для снимка экранов.
Делаю просто, правой кнопкой вызываю подменю, опустить на слой ниже и прячу под любым дисплеем, кнопкой или залитым цветом прямоугольником. Если функциональная область глобальная, она и так ниже слоем, просто перетаскиваю под дисплей. Либо дисплей ставлю слоем выше.