Страница 3 из 3 ПерваяПервая 123
Показано с 21 по 25 из 25

Тема: Сетевые регистры ПР200

  1. #21

    По умолчанию

    Спасибо большое, решил собирать и разбирать с помощью макроса, мне так проше. И тут встал вопрос, нигде не могу найти понятный для меня ответ. Может тут ответят. Все булевые переменные я из ПР200 передаю с помощью макроса который переводит 16 булевых переменных в число, в сп307 я это число получаю, а вот как с помощью макроса мне определить что сейчас записано например в 7 бите этого числа.
    Для теста пробовал связку (Число)&0x01, (Число)&0x02, (Число)&0x03, но что то пошло не так и это не работает

  2. #22

    По умолчанию

    вы немного непонятно выразились, в каком устройстве какой макрос что должен делать? может вам нужны макросы putbit и extractbit ? первый собирает булевы переменные в int, а второй распаковывает их обратно из inta

  3. #23
    Пользователь Аватар для petera
    Регистрация
    06.05.2011
    Адрес
    Минск
    Сообщений
    3,327

    По умолчанию

    Цитата Сообщение от Alisad Посмотреть сообщение
    Спасибо большое, решил собирать и разбирать с помощью макроса, мне так проше. И тут встал вопрос, нигде не могу найти понятный для меня ответ. Может тут ответят. Все булевые переменные я из ПР200 передаю с помощью макроса который переводит 16 булевых переменных в число, в сп307 я это число получаю, а вот как с помощью макроса мне определить что сейчас записано например в 7 бите этого числа.
    Для теста пробовал связку (Число)&0x01, (Число)&0x02, (Число)&0x03, но что то пошло не так и это не работает
    А зачем в СП307 нужен какой-то макрос?

    Например в ПРке Вы упаковали 16 булевых переменных в число в сетевом регистре 512
    Тогда в СП просто используйте нотацию 4х512.00 ... 4х512.15
    Захват-4.png

    А можно в СП читать отдельные биты из области 0х пример https://owen.ru/forum/showthread.php?t=32194
    Последний раз редактировалось petera; 22.01.2020 в 00:59.
    26 лет деятельности в области промышленной безопасности

  4. #24

    По умолчанию

    Цитата Сообщение от petera Посмотреть сообщение
    А зачем в СП307 нужен какой-то макрос?

    Например в ПРке Вы упаковали 16 булевых переменных в число в сетевом регистре 512
    Тогда в СП просто используйте нотацию 4х512.00 ... 4х512.15
    Захват-4.png

    А можно в СП читать отдельные биты из области 0х пример https://owen.ru/forum/showthread.php?t=32194
    Все это я делаю, но появилась потребность работать именно с числом в сп307 и именно макросом, в который пр200 пишит биты, без присвоения. То есть как я хочу. Получили число (он же набор бит), посмотрели, например 7 бит, и уже на основе этого делать что то. Сейчас приходится копировать бит из пр200 в psb сп307 и уже с этим работать. Почему то мне кажется что это не правильно.

  5. #25
    Пользователь Аватар для petera
    Регистрация
    06.05.2011
    Адрес
    Минск
    Сообщений
    3,327

    По умолчанию

    Цитата Сообщение от 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))
    Последний раз редактировалось petera; 22.01.2020 в 10:17.
    26 лет деятельности в области промышленной безопасности

Страница 3 из 3 ПерваяПервая 123

Похожие темы

  1. ПЛК 100, регистры и CRC
    от danko в разделе Помощь Разработчикам
    Ответов: 17
    Последнее сообщение: 21.02.2018, 11:52
  2. сетевые переменные ПР200
    от pwm100558 в разделе Программируемые реле
    Ответов: 59
    Последнее сообщение: 17.12.2017, 22:06
  3. Сетевые переменные ПР200.
    от Newcomer в разделе Программируемые реле
    Ответов: 6
    Последнее сообщение: 14.11.2017, 22:07
  4. ТРМ 251 регистры
    от polema в разделе Эксплуатация
    Ответов: 0
    Последнее сообщение: 18.01.2012, 14:22
  5. Регистры МВ 110-8ДФ
    от Певел в разделе Помощь Разработчикам
    Ответов: 8
    Последнее сообщение: 29.10.2011, 19:42

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •