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

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

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

#1

Сообщение darik711 » 13.02.2018{, 23:57}

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

KSP
Лейтенант
Сообщения: 304
Зарегистрирован: 18.09.2015{, 14:00}
Репутация: 28
Откуда: Саратов
Имя: Сергей

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

#2

Сообщение KSP » 14.02.2018{, 08:40}

Попробуйте в каждом адресе считывать какой-то регистр, заранее известный и как только нужная информация считается значит стоп. Или пытаться записать и считать в каждый слейв в чистый адрес естественно рабочий, т.е. который в нем можно использовать без ущерба для слейва. Но проще пытаться считать можно даже заводской номер.
S

Аватара пользователя
Dev1
Майор
Сообщения: 1026
Зарегистрирован: 12.07.2016{, 18:04}
Репутация: 59
Откуда: Гондурас

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

#3

Сообщение Dev1 » 14.02.2018{, 09:10}

В любом запросе и ответе первый байт это адрес слейва в HEX. Как уже написали сверху создайте любую команду на считывание любого параметра и меняйте в нем первый байт. Если получили ответ, первый байт это и есть адрес слейва.
Win10-64 FLProg v7.5.2 Portable :fie:

darik711
Рядовой
Сообщения: 4
Зарегистрирован: 13.02.2018{, 23:06}
Репутация: 0
Имя: Ильдар

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

#4

Сообщение darik711 » 14.02.2018{, 13:18}

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

Отправлено спустя 51 минуту 11 секунд:
Dev1 писал(а):
14.02.2018{, 09:10}
В любом запросе и ответе первый байт это адрес слейва в HEX. Как уже написали сверху создайте любую команду на считывание любого параметра и меняйте в нем первый байт. Если получили ответ, первый байт это и есть адрес слейва.
А каким образом мне извлечь из считывания адреса его полный ответ (ID,FN,DATA,CRC)? В проге FLProg когда я беру адрес одного из HoldingRegistr и подцепляю его к дисплею 16х2, то на дисплее я вижу лишь DATA полученного с этого адреса

KSP
Лейтенант
Сообщения: 304
Зарегистрирован: 18.09.2015{, 14:00}
Репутация: 28
Откуда: Саратов
Имя: Сергей

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

#5

Сообщение KSP » 14.02.2018{, 14:23}

В регистр частотника записать у вас ничего не получится если команда только чтение Input Rtgisters.
S

Аватара пользователя
Sancho
Полковник
Сообщения: 4066
Зарегистрирован: 25.12.2015{, 17:32}
Репутация: 590
Откуда: Ярославль.
Имя: Александр
Контактная информация:

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

#6

Сообщение Sancho » 14.02.2018{, 14:31}

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

Отправлено спустя 18 минут :
Так-же есть блок "Последняя ошибка" - по ней, тайм-аут, 244, обнуляйте.
KSP писал(а):
14.02.2018{, 14:23}
В регистр частотника записать у вас ничего не получится если команда только чтение Input Rtgisters.
Но и без правки кода, а чисто в FLPog, тоже.
мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.

darik711
Рядовой
Сообщения: 4
Зарегистрирован: 13.02.2018{, 23:06}
Репутация: 0
Имя: Ильдар

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

#7

Сообщение darik711 » 14.02.2018{, 19:32}

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

Отправлено спустя 18 минут :
Так-же есть блок "Последняя ошибка" - по ней, тайм-аут, 244, обнуляйте.
KSP писал(а):
14.02.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
Лейтенант
Сообщения: 304
Зарегистрирован: 18.09.2015{, 14:00}
Репутация: 28
Откуда: Саратов
Имя: Сергей

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

#8

Сообщение KSP » 15.02.2018{, 09:01}

Правильно пишет блок "Последняя ошибка" у Вас привязан к конкретному номеру слейва , а этот номер отсутствует когда назначаете "Задание Slave адреса" . Я так думаю их вместе использовать нельзя.
S

Аватара пользователя
Sancho
Полковник
Сообщения: 4066
Зарегистрирован: 25.12.2015{, 17:32}
Репутация: 590
Откуда: Ярославль.
Имя: Александр
Контактная информация:

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

#9

Сообщение Sancho » 15.02.2018{, 09:26}

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

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

if (reset) _modbusMasterAddressTable_3_reg_1[Ваш регистр ] = 0; // ( _reg_1 - это при конфигурировании слэйва указан адрес 1)
мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.

darik711
Рядовой
Сообщения: 4
Зарегистрирован: 13.02.2018{, 23:06}
Репутация: 0
Имя: Ильдар

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

#10

Сообщение darik711 » 15.02.2018{, 18:39}

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

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

if (reset) _modbusMasterAddressTable_3_reg_1[Ваш регистр ] = 0; // ( _reg_1 - это при конфигурировании слэйва указан адрес 1)
Я сделал по иному, в частотнике есть время, считываю регистр где отсчитываются секунды, записываю один момент времени в переменную 1, через 2 секунды записываю второй момент времени. То есть когда связь есть эти две переменные отличаются друг от друга. Когда связь пропадает, через две секунды эти две переменные сравниваются в компараторе, он выдает разрешение на отсчет адресов слейва, как только находит верный адрес, то эти две переменные опять отличаются

KSP
Лейтенант
Сообщения: 304
Зарегистрирован: 18.09.2015{, 14:00}
Репутация: 28
Откуда: Саратов
Имя: Сергей

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

#11

Сообщение KSP » 16.02.2018{, 08:29}

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

Ответить

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