Modbus - определить RTU адрес Slave

На этом форуме Вы можете задать вопросы знатокам программы и автору.
Ответить
darik711
Рядовой
Сообщения: 4
Зарегистрирован: 13 фев 2018, 23:06
Имя: Ильдар

Modbus - определить RTU адрес Slave

Сообщение darik711 »

Приветствую всех, возникли у меня сложности в автоматическом поиске RTU адреса слейва мастером, протокол Modbus rtu. Работа такова: имеются частотные преобразователи (slave) (штук 400 на различных объектах) и на каждый нужно сделать RFID метку с помощью ардуино нано (master), рабочий подошел к частотнику, приложил карту, частотник дал доступ к своему меню и записал номер id карты в журнал событий, по которому после определяют кто там был. Эту часть сделал с помощью FLProg, подцепил ардуино нано к частотнику через 485 порт, с протоколом модбас, все работает, но так как к частотникам подсоединен операторский контроллер удаленного доступа к параметрам (только чтение), то каждый частотник имеет свой RTU adress, причем частотники могут переноситься на другие объекты и менять свой адрес. Тем самым очень сложно будет ходить с ноутбуком и заливать скетч со своим адресом, к тому же адрес может поменятся и необходимо будет ездить и перезаливать скетч на другой адрес. Так вот возможно ли автоматическое определение RTU адреса частотника ардуинкой. Сам попытался сделать таким образом: на вход блока "Задание Slave адреса" с помощью счетчика с паузой в 5 секунд подавал комбинацию чисел от 1 до 20, частотнику присвоил адрес 3, так вот когда счетчик выдавал число 3, то между ардуинкой и частотником происходил обмен, пока счетчик не выдавал 4 и последующие числа. Так и не смог понять как остановить счетчик на правильном адресе.
KSP
Лейтенант
Сообщения: 305
Зарегистрирован: 18 сен 2015, 14:00
Откуда: Саратов
Имя: Сергей
Поблагодарили: 1 раз

Modbus - определить RTU адрес Slave

Сообщение KSP »

Попробуйте в каждом адресе считывать какой-то регистр, заранее известный и как только нужная информация считается значит стоп. Или пытаться записать и считать в каждый слейв в чистый адрес естественно рабочий, т.е. который в нем можно использовать без ущерба для слейва. Но проще пытаться считать можно даже заводской номер.
S
Аватара пользователя
Dev1
Майор
Сообщения: 1045
Зарегистрирован: 12 июл 2016, 18:04
Откуда: Гондурас
Поблагодарили: 3 раза

Modbus - определить RTU адрес Slave

Сообщение Dev1 »

В любом запросе и ответе первый байт это адрес слейва в HEX. Как уже написали сверху создайте любую команду на считывание любого параметра и меняйте в нем первый байт. Если получили ответ, первый байт это и есть адрес слейва.
Win10-64 FLProg v8.2.3 Portable IDE 1.8.19, 2,x,x :shok:
darik711
Рядовой
Сообщения: 4
Зарегистрирован: 13 фев 2018, 23:06
Имя: Ильдар

Modbus - определить RTU адрес Slave

Сообщение darik711 »

KSP писал(а): 14 фев 2018, 08:40Попробуйте в каждом адресе считывать какой-то регистр, заранее известный и как только нужная информация считается значит стоп. Или пытаться записать и считать в каждый слейв в чистый адрес естественно рабочий, т.е. который в нем можно использовать без ущерба для слейва. Но проще пытаться считать можно даже заводской номер.
Считываю заранее известный регистр (его значение =32767) и сравниваю в блоке сравнения с числом 32767. После подачи питания на ардуино и несовпадении RTU адреса, значение считываемого регистра =0 и счетчик начинает перебирать RTU адреса, как только нужный RTU адрес нашелся, то значение считываемого регистра изменилось на 32767 и компаратор изменил лог выход остановив счетчик. Все ОК!!! Но если взять и изменить RTU адрес в частотнике, то обмен пропадает, но в считываемом нами регистре значение 32767 сохраняется и счетчик задания RTU адреса не включается. Как обнулить считываемый регистр, но только во время пропажи связи, а то ноль запишется в регистр частотника..

Отправлено спустя 51 минуту 11 секунд:
Dev1 писал(а): 14 фев 2018, 09:10В любом запросе и ответе первый байт это адрес слейва в HEX. Как уже написали сверху создайте любую команду на считывание любого параметра и меняйте в нем первый байт. Если получили ответ, первый байт это и есть адрес слейва.
А каким образом мне извлечь из считывания адреса его полный ответ (ID,FN,DATA,CRC)? В проге FLProg когда я беру адрес одного из HoldingRegistr и подцепляю его к дисплею 16х2, то на дисплее я вижу лишь DATA полученного с этого адреса
KSP
Лейтенант
Сообщения: 305
Зарегистрирован: 18 сен 2015, 14:00
Откуда: Саратов
Имя: Сергей
Поблагодарили: 1 раз

Modbus - определить RTU адрес Slave

Сообщение KSP »

В регистр частотника записать у вас ничего не получится если команда только чтение Input Rtgisters.
S
Аватара пользователя
Sancho
Полковник
Сообщения: 4066
Зарегистрирован: 25 дек 2015, 17:32
Откуда: Ярославль.
Имя: Александр
Поблагодарили: 5 раз
Контактная информация:

Modbus - определить RTU адрес Slave

Сообщение Sancho »

darik711 писал(а): 14 фев 2018, 14:09Как обнулить считываемый регистр, но только во время пропажи связи, а то ноль запишется в регистр частотника.
А перезагрузить ардуинку что не позволяет. И начать сначала.

Отправлено спустя 18 минут :
Так-же есть блок "Последняя ошибка" - по ней, тайм-аут, 244, обнуляйте.
KSP писал(а): 14 фев 2018, 14:23В регистр частотника записать у вас ничего не получится если команда только чтение Input Rtgisters.
Но и без правки кода, а чисто в FLPog, тоже.
мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.
darik711
Рядовой
Сообщения: 4
Зарегистрирован: 13 фев 2018, 23:06
Имя: Ильдар

Modbus - определить RTU адрес Slave

Сообщение darik711 »

Sancho писал(а): 14 фев 2018, 14:49
darik711 писал(а): 14 фев 2018, 14:09Как обнулить считываемый регистр, но только во время пропажи связи, а то ноль запишется в регистр частотника.
А перезагрузить ардуинку что не позволяет. И начать сначала.

Отправлено спустя 18 минут :
Так-же есть блок "Последняя ошибка" - по ней, тайм-аут, 244, обнуляйте.
KSP писал(а): 14 фев 2018, 14:23В регистр частотника записать у вас ничего не получится если команда только чтение Input Rtgisters.
Но и без правки кода, а чисто в FLPog, тоже.
Попробовал отдельно изучить работу блока "Последняя ошибка", когда связи нет со слейвом из-за RTU адреса, то сигнал у меня с выхода блока "Последняя ошибка равна 254, а не 244. Но блок работает, когда связь есть, на выходе 0. Но стоит добавить блок "Задание Slave адреса" как при компиляции возникает ошибка:

exit status 1
the value of '_modbuseSetSlId1_SlId' is not usable in a constant expression

и выделяет и выделяет в скетче строчку: switch ( modbusTelegramm.slaveID ) {case _modbusSetSlId1_SlId:
KSP
Лейтенант
Сообщения: 305
Зарегистрирован: 18 сен 2015, 14:00
Откуда: Саратов
Имя: Сергей
Поблагодарили: 1 раз

Modbus - определить RTU адрес Slave

Сообщение KSP »

Правильно пишет блок "Последняя ошибка" у Вас привязан к конкретному номеру слейва , а этот номер отсутствует когда назначаете "Задание Slave адреса" . Я так думаю их вместе использовать нельзя.
S
Аватара пользователя
Sancho
Полковник
Сообщения: 4066
Зарегистрирован: 25 дек 2015, 17:32
Откуда: Ярославль.
Имя: Александр
Поблагодарили: 5 раз
Контактная информация:

Modbus - определить RTU адрес Slave

Сообщение Sancho »

Сделайте самописный блок, который будет сбрасывать в, например, ноль Ваш контрольный Input Reg.
Запускайте его периодически, например, через 3 сек, а так как опрос у Вас скорее всего 1 сек, он будет заново читаться.
Привяжите к этому регистру компаратор сравнения с 0, с него на TON, который сбросит "стоп" блоков смены адресов при нуле более 3 сек.

Код: Выделить всё

if (reset) _modbusMasterAddressTable_3_reg_1[Ваш регистр ] = 0; // ( _reg_1 - это при конфигурировании слэйва указан адрес 1)
мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.
darik711
Рядовой
Сообщения: 4
Зарегистрирован: 13 фев 2018, 23:06
Имя: Ильдар

Modbus - определить RTU адрес Slave

Сообщение darik711 »

Sancho писал(а): 15 фев 2018, 09:26Сделайте самописный блок, который будет сбрасывать в, например, ноль Ваш контрольный Input Reg.
Запускайте его периодически, например, через 3 сек, а так как опрос у Вас скорее всего 1 сек, он будет заново читаться.
Привяжите к этому регистру компаратор сравнения с 0, с него на TON, который сбросит "стоп" блоков смены адресов при нуле более 3 сек.

Код: Выделить всё

if (reset) _modbusMasterAddressTable_3_reg_1[Ваш регистр ] = 0; // ( _reg_1 - это при конфигурировании слэйва указан адрес 1)
Я сделал по иному, в частотнике есть время, считываю регистр где отсчитываются секунды, записываю один момент времени в переменную 1, через 2 секунды записываю второй момент времени. То есть когда связь есть эти две переменные отличаются друг от друга. Когда связь пропадает, через две секунды эти две переменные сравниваются в компараторе, он выдает разрешение на отсчет адресов слейва, как только находит верный адрес, то эти две переменные опять отличаются
KSP
Лейтенант
Сообщения: 305
Зарегистрирован: 18 сен 2015, 14:00
Откуда: Саратов
Имя: Сергей
Поблагодарили: 1 раз

Modbus - определить RTU адрес Slave

Сообщение KSP »

Любой алгоритм , имеет право на жизнь. Главное, что получилось и работает.
S
Ответить

Вернуться в «Спросить у знатоков»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 3 гостя