Спасибо!-заработало. Но на скорости 9600. Поменять немогу- переходник rs-usb забыл отключить и он спалился (потеха, однако!)
Спасибо!-заработало. Но на скорости 9600. Поменять немогу- переходник rs-usb забыл отключить и он спалился (потеха, однако!)
Доброго времени суток! Разбираюсь с макросами в СП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/ПетрАртюков
Мой канал на РУТУБЕ
https://rutube.ru/channel/23641433/
Библиотека ГМ для СП300
https://disk.yandex.com/d/gHLMhLi8x1_HBg
Спасибо большое! Буду тестировать проверять)
Добрый день... Подскажите пожалуйста, у нас панель СП307 используется как SALVE, и при пропадании связи, естественно, переменные не обновляются... А как можно сделать, чтобы при пропадании связи с панелью, сама панель которая SLAVE писала что нет связи? Подключаемся по PLC порту.... Спасибо заранее...
Последний раз редактировалось kondor3000; 21.12.2019 в 12:55.
Последний раз редактировалось roman_1986; 23.12.2019 в 08:14.
Последний раз редактировалось Studiedlist; 21.12.2019 в 13:56. Причина: Забыл указать цитату
Нужно завести в панели бит квитирования
В панели каждую сек устанавливать бит и запускать таймер, например, на 3 сек.
В плк постоянно читать бит квитирования и если он установлен - сбрасывать его
В панели если время таймера истекло, а бит не сброшен - показать окно о потери связи.
Это можно сделать с помощью трех ф. областей, они должны быть глобальными!
Захват-7.png
Скрытый текст:
1. В панели каждую сек устанавливать бит
Захват-1.png Захват-2.png
2. запускать таймер, например, на 3 сек, если время таймера истекло, а бит не сброшен - показать окно о потери связи
Захват-3.png Захват-4.png
3. При восстановлении связи закрывать окно автоматически
Захват-5.png Захват-6.png
Пример окна
Захват-8.png
Последний раз редактировалось petera; 23.12.2019 в 12:40.
Мой канал на ютубе
https://www.youtube.com/c/ПетрАртюков
Мой канал на РУТУБЕ
https://rutube.ru/channel/23641433/
Библиотека ГМ для СП300
https://disk.yandex.com/d/gHLMhLi8x1_HBg