Просмотр полной версии : Проблема чтения ПР 200 дискретных входов функцией чтения 02 по протоколу ModBusRTU
guravlev-2
22.12.2021, 11:08
Добрый день. Я не сильно программист. ПР 200 в режиме мастер ModBusRTU по RS 485. Есть два разных китайских реле, управляемых по RS 485 modbus. У них есть дискретные входы (регистры Discrete Input Contacts), дискретные выходы и аналоговые входа и выхода. При настройке опроса такого устройства и управления им все работает замечательно, кроме опроса дискретных входов(функция чтения 02 , адрес в сети 1). При настройке опроса, ПР200 в порт посылает следующие строки (пишу без кода CRC):
-1 вход 01 02 0000 0001 в ПР200 настройки переменной bool, чтение 02, запись нет, регистр 0, бит 0
-2 вход 01 02 0001 0001 в ПР200 настройки переменной bool, чтение 02, запись нет, регистр 0, бит 1
-3 вход 01 02 0002 0001 в ПР200 настройки переменной bool, чтение 02, запись нет, регистр 0, бит 2
и т.д.
Если оставляю считывать только первый вход(активирую отражение на эране ПР200 только первой переменной = первый вход), все работает, ПР 200 его читает. Как только активирую считывание любого следующего входа, в ответ (при мониторинге порта) получаю от китайца ответ об ошибке код 02. Получается китаец не воспринимает команду 01 02 0001 0001 или 01 02 0002 0001, он видит только команды типа 01 02 0000 0001 или 01 02 0000 0002, 01 02 0000 0003 и т.д. то есть он видит только пакетное считывание начиная с 0-го адреса с заданием количества адресов считывания.
При этом с китайской панелью оператора это реле отлично работает, потому что при настройке опроса в панеле оператора нескольких битовых переменных, привязанных к входам реле (к примеру четырех), эта панель формирует к реле только один запрос 01 02 0000 0004.
Это происходит на обоих китайских реле. Они очень дешевые, интересно было бы их поэтому использовать.
Что я делаю не так? Или это особенность работы ПР200. Может китайцы используют старый протокол…
Может можно в лоджике поправить, чтобы при опросе регистров Discrete Input Contacts командой 02 он посылал только один запрос считывания для всех битовых переменных, начиная с нулевого адреса.
Спасибо за внимание.
P.S. У китайцев нашел еще такие реле, у которых все регистры памяти(все входа-выхода, находятся в области Holding Registers и конечно с ними при опросе с ПР200 нет проблем.
Средняя цена на такие устройства через алиэкспресс к примеру 8 DI и 8 DO около 1200 руб, столько же примерно стоит 4 AI и 2DO. Есть очень много разных модификаций с небольшим варьированием цены вопроса. С аналоговыми выходами стоят подороже.
Ревака Юрий
22.12.2021, 12:02
Добрый день. Я не сильно программист. ПР 200 в режиме мастер ModBusRTU по RS 485. Есть два разных китайских реле, управляемых по RS 485 modbus. У них есть дискретные входы (регистры Discrete Input Contacts), дискретные выходы и аналоговые входа и выхода. При настройке опроса такого устройства и управления им все работает замечательно, кроме опроса дискретных входов(функция чтения 02 , адрес в сети 1). При настройке опроса, ПР200 в порт посылает следующие строки (пишу без кода CRC):
-1 вход 01 02 0000 0001 в ПР200 настройки переменной bool, чтение 02, запись нет, регистр 0, бит 0
-2 вход 01 02 0001 0001 в ПР200 настройки переменной bool, чтение 02, запись нет, регистр 0, бит 1
-3 вход 01 02 0002 0001 в ПР200 настройки переменной bool, чтение 02, запись нет, регистр 0, бит 2
и т.д.
Если оставляю считывать только первый вход(активирую отражение на эране ПР200 только первой переменной = первый вход), все работает, ПР 200 его читает. Как только активирую считывание любого следующего входа, в ответ (при мониторинге порта) получаю от китайца ответ об ошибке код 02. Получается китаец не воспринимает команду 01 02 0001 0001 или 01 02 0002 0001, он видит только команды типа 01 02 0000 0001 или 01 02 0000 0002, 01 02 0000 0003 и т.д. то есть он видит только пакетное считывание начиная с 0-го адреса с заданием количества адресов считывания.
При этом с китайской панелью оператора это реле отлично работает, потому что при настройке опроса в панеле оператора нескольких битовых переменных, привязанных к входам реле (к примеру четырех), эта панель формирует к реле только один запрос 01 02 0000 0004.
Это происходит на обоих китайских реле. Они очень дешевые, интересно было бы их поэтому использовать.
Что я делаю не так? Или это особенность работы ПР200. Может китайцы используют старый протокол…
Может можно в лоджике поправить, чтобы при опросе регистров Discrete Input Contacts командой 02 он посылал только один запрос считывания для всех битовых переменных, начиная с нулевого адреса.
Спасибо за внимание.
P.S. У китайцев нашел еще такие реле, у которых все регистры памяти(все входа-выхода, находятся в области Holding Registers и конечно с ними при опросе с ПР200 нет проблем.
Средняя цена на такие устройства через алиэкспресс к примеру 8 DI и 8 DO около 1200 руб, столько же примерно стоит 4 AI и 2DO. Есть очень много разных модификаций с небольшим варьированием цены вопроса. С аналоговыми выходами стоят подороже.
Добрый день.
Подозреваю что проблема в задании адреса регистра для чтения, покажите Ваши сетевые настройки для регистров.
guravlev-2
22.12.2021, 15:26
сейчас попаду домой и сфоткую. Кстати на ваших видео очень много познал. Спасибо
сетевые настройки регистров это таблица с сетевыми переменными из лоджика?правильно я понял?
guravlev-2
22.12.2021, 15:45
у вас было видео с китайской релюшкой такого плана. вы на видео , чтобы включить выход, писали в переменную значение 255 для включения и 526 для выключения и говорили, что почему такие значения, а не 1 или 0 соответственно и говорили, что вам её кто то дал, а инструкции нет.
guravlev-2
22.12.2021, 16:34
вот сетевые переменные. IN - входы, OUT- выхода. Управление выходами работает.
Ревака Юрий
22.12.2021, 16:58
сейчас попаду домой и сфоткую. Кстати на ваших видео очень много познал. Спасибо
сетевые настройки регистров это таблица с сетевыми переменными из лоджика?правильно я понял?
Да. По скриншотам вроде похоже, если там действительно используется 0 регистр, еще бы скорость обмена узнать, если 9600 то таймаут и период опроса я бы увеличил до 500 и 1000 мс соответственно.
guravlev-2
22.12.2021, 17:05
скорость обмена 9600. о-ой регистр. попробую изменить время и таймаут
guravlev-2
22.12.2021, 17:49
изменил время и таймаут. подключал разные китайские релюшки. две из них шлют ошибку 02, третья, только что заметил, когда опрашивается только 1-й вход (01 02 0000 0001 CRC) работает, при попытке опросить другие входы, вообще ничего не отвечает, запрос есть, ответа нет, при опросе только 1-го входа все работает. как я и говорил, эти реле не понимают код функции 02, где опрос ведется не с 0-го адреса. вот такие китайские приблуды... выкину их нафиг. никто же не будет из-за этого править лоджиг. хотя логично, если в программе есть нескольких битовых переменных с одного адреса регистра из такого поля переменных, то отправлять только один запрос на пакетное чтение... у китайских плк так работает. китаец китайца видит из далека.
guravlev-2
22.12.2021, 18:07
понятно, что это не ошибка в лоджике, это у китайца урезан функционал модбаса. вот если в лоджике наравне с обычным чтением регистров данного типа была бы возможность считать значение всего этого регистра в целочисленную переменную, тогда бы вопрос был снят. я думаю, что многие сейчас покупают всякие китайские приблуды(интересная цена вопроса) и сталкиваются с такой проблемой.
было бы еще так:
переменная-целочисленная, функция чтения 02, адрес регистра 0, количество бит считывания 16 (1-16). и отправил бы он запрос к примеру 01 02 0000 0010 (считать 16 бит) и перевел бы полученный ответ в целочисленное десятичное число.
Ревака Юрий
23.12.2021, 09:11
понятно, что это не ошибка в лоджике, это у китайца урезан функционал модбаса. вот если в лоджике наравне с обычным чтением регистров данного типа была бы возможность считать значение всего этого регистра в целочисленную переменную, тогда бы вопрос был снят. я думаю, что многие сейчас покупают всякие китайские приблуды(интересная цена вопроса) и сталкиваются с такой проблемой.
было бы еще так:
переменная-целочисленная, функция чтения 02, адрес регистра 0, количество бит считывания 16 (1-16). и отправил бы он запрос к примеру 01 02 0000 0010 (считать 16 бит) и перевел бы полученный ответ в целочисленное десятичное число.
Я бы еще проверил через Modbus Poll, если биты входов/выходов там подряд идут, для лоджика можно еще два отдельных слейва создать с одинаковыми адресами но разными регистрами по одному в каждом и проверить такой вариант.
guravlev-2
24.12.2021, 09:56
вот инструкции к реле на ломанном русском
guravlev-2
24.12.2021, 11:16
вот сделал фотки с Modbus Poll.
Нумерация фоток в файле, где все работает
0 настройка
1 замкнут первый вход
2 замкнут второй и т.д.
Не работает
0 настройка, как в ПР 200 на считывание второго входа
1 при этой настройке, при этом замкнут первый вход. на замыкание других входов не реагирует
2 настройка, как в ПР 200 на считывание третьего входа
3 и при этой настройке сейчас замкнут первый вход, на замыкание других входов не реагирует
и т.д.
guravlev-2
24.12.2021, 11:19
получается с такими настройками как в ПР200 и Modbus Poll-ом прочитать нормально входы не получается. Может все таки обратить внимание разработчиков лоджика на эту проблему?
Ревака Юрий
24.12.2021, 11:37
вот сделал фотки с Modbus Poll.
Нумерация фоток в файле, где все работает
0 настройка
1 замкнут первый вход
2 замкнут второй и т.д.
Не работает
0 настройка, как в ПР 200 на считывание второго входа
1 при этой настройке, при этом замкнут первый вход. на замыкание других входов не реагирует
2 настройка, как в ПР 200 на считывание третьего входа
3 и при этой настройке сейчас замкнут первый вход, на замыкание других входов не реагирует
и т.д.
Да все должно работать, я проверил сейчас на битовых в качестве слейва сделал Modbus Slave, все OK, возможно у Вас нужно заменить 01 на 02 команды или наоборот.
guravlev-2
24.12.2021, 11:38
с реализацией пакетного опроса таких регистров функцией 02 будет работать на всех устройствах, и на китайских и некитайских...
Ревака Юрий
24.12.2021, 11:40
Проверил с обоими типами команд 02(1х) 01(0х) данные приходят на ПР корректно.
guravlev-2
24.12.2021, 12:00
да, с Modbus Slave все работает и ПР200 все воспринимает , и входа и выхода , я это проверил давно. А вот китайская релюшка не хочет, и Modbus Poll тоже с этой релюшкой не хочет. Ладно, большое спасибо за общение. Я вам уже наверное надоел. Кстати Modlook(отправил в фотке полное название) с релюшкой работает замечательно. Потому что он при настройке опроса четырех входов командой 02(1х) в порт посылает одну команду опроса типа 20 02 0000 0004 (CRC) , а не несколько команд типа 20 02 0000 0001 и 20 02 0001 0001 и 20 02 0002 0001 и т.д., поэтому от релюшки и получает адекватный ответ.
Кстати на сайте у этого китайца ebyte.com нашел и использовал уже интересные(и не дорогие) передатчики сигнала RS-485 на большие расстояния по радиоканалу по технологии LoRa. Ставишь контроллер где тебе удобно, и удаленно управляешь чем угодно. Покупал до 8 км, у меня производство, прокинул внутри здания, расстояние получилось метров двести со стенками и перегородками, все отлично работает, связь устойчивая, не захотел тянуть кучу проводов. Конечно, есть торможение на срабатывание входов-выходов примерно в 1-2 секунды (для моих задач не критично). Одно стоит примерно 1250 руб.
Ревака Юрий
24.12.2021, 12:18
да, с Modbus Slave все работает и ПР200 все воспринимает , и входа и выхода , я это проверил давно. А вот китайская релюшка не хочет, и Modbus Poll тоже с этой релюшкой не хочет. Ладно, большое спасибо за общение. Я вам уже наверное надоел. Кстати Modlook(отправил в фотке полное название) с релюшкой работает замечательно. Потому что он при настройке опроса четырех входов командой 02(1х) в порт посылает одну команду опроса типа 20 02 0000 0004 (CRC) , а не несколько команд типа 20 02 0000 0001 и 20 02 0001 0001 и 20 02 0002 0001 и т.д.
Не знаю почему они не реализовали чтение битовой маской 03/04, все эти 01 02 только сеть забивают ненужными запросами, смысла в них нет вообще, всегда стараюсь брать весь регистр, и дальше уже с ним работать.
guravlev-2
24.12.2021, 17:55
Можно задам последний вопрос (я предупреждал, что не программист). А к этим инпут регистрам можно обращаться только функцией 02 ? Или можно обратиться к регистру в области 1Х функцией 03 ? Тогда какой адрес будет у первого регистра этой области памяти для опроса функцией 03 ?
Наверное чушь спросил, а вдруг... Я плохо понял адресацию.
kondor3000
24.12.2021, 18:15
Можно задам последний вопрос (я предупреждал, что не программист). А к этим инпут регистрам можно обращаться только функцией 02 ? Или можно обратиться к регистру в области 1Х функцией 03 ? Тогда какой адрес будет у первого регистра этой области памяти для опроса функцией 03 ?
Наверное чушь спросил, а вдруг... Я плохо понял адресацию.
Не знаю как у китайцев, а в ПЛК можно читать нулевой регистр как функцией 03 и 04, так и функцией 01 и 02.
Попробуйте 03 (чтение Холдинг регистра) и функцию и 04, (чтение Инпут регистра). Если считает маску, то потом разложите на биты.58471
И 01 можно попробовать.
guravlev-2
24.12.2021, 20:55
у китайской релюшки дискретные входа находятся в области памяти Read Input Status. Считывать эти регистры можно только функцией 02. Насколько я понял, адрес регистра может быть одинаковый, но при считывании разными функциями(02 и 03) это будут совершенно разные регистры. функция чтения определяет область памяти считывания.
guravlev-2
24.12.2021, 20:58
если бы можно было считать маску, то и проблем бы не было. об этом я и писал выше. если бы в лоджике так бы сделали при чтении функцией 02...
Powered by vBulletin® Version 4.2.3 Copyright © 2026 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot