Нехватает сетевых регистров на ПР200 в режиме слейв. Можно ли их тоже по битам разбить целочисленные? с 512 по 575 нехватает переменных. Очень много датчиков у меня в проекте и включателей.
Вид для печати
Нехватает сетевых регистров на ПР200 в режиме слейв. Можно ли их тоже по битам разбить целочисленные? с 512 по 575 нехватает переменных. Очень много датчиков у меня в проекте и включателей.
Вам наверно для начала их собрать надо в один регистр, впрочем в ОЛ имеются обе функции, делайте что хотите!
И это позволит передать более тысячи дискретных сигналов, короче, проблема в чём?
Вложение 46235
Вложение 46236
Мне аналоговые сигналы нужны. Дискретные разобрался друг. Вот аналоговые если можно то вообще было бы здорово.
Если переменные флоат - преобразуйте в инт, сразу в два раза больше переменных поместятся!
И в принципе, если быстродействие не критично можно одним регистром до 128 интовых переменных передавать одним регистром, например один байт использовать для передачи данных, а другой для "синхронизации", передавать служебные значения в диапазоне 0-255, чтобы потом инт собрать из двух байтов, я ещё достаточно давно в одной из тем это предлагал!
И если булевы переменных соберёте в один регистр и передадите - они в 16 раз меньше места займут!
Скорость обновления обычно нужно побольше, это все хотят в динамичных системах. Превысить штатный объем буфера обмена слейва (128 байт!) можно только в ущерб скорости. Мой личный рекорд - снимать с ПР200 300 байт информации в секунду (панелью СП3хх) за счёт её мультиплексирования. При том что надо еще оставить часть буфера на 200 разных команд (булевых) обратно, это только кодами. Если Мастер может читать пакетами, то развить кажущийся эффективный объем такими ухищрениями можно, удвоить его можно относительно просто.
Обещали в перспективе удвоить объем буфера, это убрало бы в основном эту проблему. 128 байт это очень мало бывает когда ПР200 работает как терминал.
Афтор не указывает чем он читает, поэтому трудно советовать. Способы Сергея это при порегистровом чтении, совсем беда. Мультиплексировать массивы гораздо эффективнее.
Очень много -- это сколько? И каковы диапазоны этих чисел? Понятно, что одним регистром можно передать 16ти-разрядное целое число. Но ежели эти числа не больше 255, то можно и две штуки в один регистр запихтерить.
могу еще идею подкинуть. Если кто то еще помнит что cмcки можно отправлять на латинице длиннее в два раза чем на кириллице, это потому что они могут себе позволить не использовать один разряд для символа, таким образом ужимают инфу
Вы только про сжатие инфы. Я же о уровне когда это все эти способы уже исчерпаны (пустых мест в регистрах нет) и буфера всё равно не хватает. К тому же инфа часто предназначена для чтения с панелей, не имеющих вообще или скромные возможности обратной распаковки, поэтому сильно круто упаковывать обычно нельзя.
Если можно пример можете скинуть. а то боюсь долго буду разбираться в итоге не разберусь.) Просто 2 целых например датчика температуры разобрать.
Ежели это ко мне вопрос, то запихнуть 2 целочисленных переменных в один регистр можно как-нибудь так. Но нужно проследить, чтобы значения этих переменных были строго в диапазоне 0-255.Вложение 46239
Если нужен подобный пример, то он есть во втором посте, вариантов может быть много!
Этот второй пост можешь подсказать где находится? Буду благодарен
Это праздники виноваты?
На преведущей странице текущей темы: https://owen.ru/forum/showthread.php?t=32340
Все попытки передать одним регистром несколько переменных разобьются о возможности Scada систем. Потому что еще ту придутся долго и упорно учить не ошибаться и распихивать в разные регистры данные. Ну и скорость обмена точно пострадает..
хотя если использовать байт синхронизации то можно научить, некоторые даже наверное не очень сложно... Но полагаю, что автор уже выбрал Scada систему... :)
Доброго времени суток, у меня такая же проблема, не хватает сетевых переменных и решил воспользоваться Вашим способом, но тут появилась проблема. На том конце, мастер это СП307-Б, вот как его научить эту штуку правильно работать с этим, ума не приложу, куда копать в какую сторону?
А где можно взять эти ГМ? И еще вопрос, эти значения у меня редактируются и обратно передаются в пр200, как на сп собрать обратно?
Раньше, в ветке про панели, были две мои темы с готовыми ГМ(Графическими Макросами) , с описаниями и примерами использования.
Сначала для СП270 с 2013г,
а затем для СП300 с 2016г
Вложение 46596 Вложение 46597
11 апреля 2018 обе темы были "прибиты" модератором раздела.
Неблагодарное свинство, кому они мешали? А я ОВЕНУ столько добра сделал, фактически продвигал их СП270 с 2013 года.
Теперь из описаний осталось только плейлист на ютубе https://www.youtube.com/playlist?lis...pEiuGtORbhJe6T и гугл кэш
Где взять и как пользоваться Библиотекой - в описании к этому плейлисту. Самую последнюю версию можно определить по дате в названии архива Например, ГМ для СП300_26_02_19.rar - версия библиотеки от 26 февраля 2019г
Аналогично способу в ПР
Т.е. ст.байт умножить на 256, сложить с мл.байтом и отправить(записать) в ПР
Только нужно использовать промежуточные регистры, т.к. байты все время будут перезаписываться значениями из ПР (4х512)
Можно это сделать в ц.вводе, разделив элементы отображения и ввода
Вложение 46604
Включить уведомление
Вложение 46605
Математику делать ф.областями с запуском от бит уведомления
Вложение 46606
Скрытый текст:
Зы
Только если нужно в панели читать и писать отредактированное в один и тот же регистр ПР, то это
Вложение 46600
РАБОТАТЬ НЕ БУДЕТ
Нужен макрос SelChgI
Например, редактируем значения из панели и с экрана ПР
Вложение 46601
Вложение 46602
Спасибо большое, решил собирать и разбирать с помощью макроса, мне так проше. И тут встал вопрос, нигде не могу найти понятный для меня ответ. Может тут ответят. Все булевые переменные я из ПР200 передаю с помощью макроса который переводит 16 булевых переменных в число, в сп307 я это число получаю, а вот как с помощью макроса мне определить что сейчас записано например в 7 бите этого числа.
Для теста пробовал связку (Число)&0x01, (Число)&0x02, (Число)&0x03, но что то пошло не так и это не работает
вы немного непонятно выразились, в каком устройстве какой макрос что должен делать? может вам нужны макросы putbit и extractbit ? первый собирает булевы переменные в int, а второй распаковывает их обратно из inta
А зачем в СП307 нужен какой-то макрос?
Например в ПРке Вы упаковали 16 булевых переменных в число в сетевом регистре 512
Тогда в СП просто используйте нотацию 4х512.00 ... 4х512.15
Вложение 46785
А можно в СП читать отдельные биты из области 0х пример https://owen.ru/forum/showthread.php?t=32194
Все это я делаю, но появилась потребность работать именно с числом в сп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"
Все справедливо и для переменных, например 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 НЕ установлен, то
// сделать это
//сделать то-то
}
Кстати ..
В дополнение к "стандартным" макро определениям для работы с битами PSB
- GetPSBStatus(300);
- SetPSB(301);
- ResetPSB(301);
Вложение 46792
Использую такой макро для реверса бита PSB
Код:#define ReversPSB(PSB_No) PSB[(PSB_No) / 8] ^= (1 << ((PSB_No) % 8))