Это - работает!
Захват-1.png
Захват-2.png
Вы свой не работающий вариант предъявите!
Это - работает!
Захват-1.png
Захват-2.png
Вы свой не работающий вариант предъявите!
Последний раз редактировалось petera; 10.12.2019 в 17:57.
Мой канал на ютубе
https://www.youtube.com/c/ПетрАртюков
Библиотека ГМ для СП300
https://disk.yandex.com/d/gHLMhLi8x1_HBg
Работает, на примере этом вижу. Но при "0" крутится же, что сбивает с толку. И как то очень нелинейно, заметно прибавляет обороты только выше 60, а туда не залезал. На глаз не видно различия в скорости для 0 и 30. Обычно частотник и работает в нижней половине, для такой визуализации незначительная разница. Думал будет заметнее. И при 0 наверное не надо крутиться,
У вентилятора всего 10 скоростей, диапазон, который задаются в настройках (0...100 или другой) линейно масштабируется к значению 0...9, назавём это - Задание. По этому большого смысла делать 0-100 нет, можно делать 0-9
Внутри генератор, который генерит импульсы смены фаз с периодом (10 - Задание)*100мс
По этому минимальное значение интервала одной фазы (10 -0)*0,1=1сек - Ваше "при "0" крутится же"
Последний раз редактировалось petera; 10.12.2019 в 21:17.
Мой канал на ютубе
https://www.youtube.com/c/ПетрАртюков
Библиотека ГМ для СП300
https://disk.yandex.com/d/gHLMhLi8x1_HBg
Доброго времени суток! Разбираюсь с макросами в СП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 (собственно проблема в этом условии)
{
Последний раз редактировалось petera; 13.12.2019 в 17:17.
Мой канал на ютубе
https://www.youtube.com/c/ПетрАртюков
Библиотека ГМ для СП300
https://disk.yandex.com/d/gHLMhLi8x1_HBg
Спасибо большое! Буду тестировать проверять)
Посоветуйте как временно погасить изображения функциональных областей. Нужно для снимка экранов.
СODESYS V3.5: Repository Archive V3.5 SP4 (необходим для старых СПК) / Раздел CDS V3.5 на сайте
Форум: Вопросы и ответы / Визуализация / Настройка обмена с другими устройствами
Web-панель ВП110 / Modbus-индикатор СМИ2-М
Telegram: @JuneSmellsLikeBlood | e-mail: e.kislov@owen.ru | oscat.ru | Как обратиться в техподдержку?
Как отлаживать ошибки | Отладка проектов в CODESYS V3.5 | XY problem | Как правильно задавать вопросы | AnyDesk
Последний раз редактировалось kondor3000; 15.12.2019 в 12:34.