Обмен данных между несколькими arduino по протоколу ModBus

Использование протоколов Modbus, SPI, I2c и прочих, проблемы и решения
Ответить
HurryUp
Рядовой
Сообщения: 9
Зарегистрирован: 10.07.2017{, 14:01}
Репутация: 0

Обмен данных между несколькими arduino по протоколу ModBus

#1

Сообщение HurryUp » 10.07.2017{, 14:09}

Всем доброго времени суток!
У меня вот такая задача.

использую Arduino Mega2650 + W5100 по витой паре

протокол ModBus

Master TCP

Slave_1
Slave_2
Slave_3

Slave_n

Master собирает переменные со всех Slave 

Это все работает, но проблема вот в чем я не могу понять как мне реализовать
получение и запись данных на мастер в переменную отправленную другим Slave`ом
То есть у меня есть данные переданные на Master с Slave_1 о состоянии насоса (включен/выключен)
Я должен иметь возможность видеть это состояние на других контроллерах (на дисплей) и по необходимости
оправить команду на вкл/выкл этого насоса с любого Slave.

Знающие люди подскажите как это реализовать.
Нужна информация только по обмену переменными.

Спасибо!

PS Если я не правильно создал тему, то прошу прощения (это мой первый пост)

starshoy81
Лейтенант
Сообщения: 431
Зарегистрирован: 05.04.2016{, 23:30}
Репутация: 27
Откуда: Санкт-Петербург
Имя: Илья

Обмен данных между несколькими arduino по протоколу ModBus

#2

Сообщение starshoy81 » 11.07.2017{, 00:03}

HurryUp,  на мастере заведите локальную переменную в неё пишете состояние насоса, а затем считываете эту переменную в холдинг регистр мастера. Такой же регистр должен быть у всех слейвов.

HurryUp
Рядовой
Сообщения: 9
Зарегистрирован: 10.07.2017{, 14:01}
Репутация: 0

Обмен данных между несколькими arduino по протоколу ModBus

#3

Сообщение HurryUp » 11.07.2017{, 07:59}

Было бы классно увидеть пример в FLProg

С одним мастером и два-три слейва.
Я вроде представляю о чем идет речь, но все же.
Да и думаю не одного меня этот вопрос может посетить.

Конечно если не затруднительно для Вас.

Заранее благодарен.

Добавлено (11.07.2017, 07:59)
---------------------------------------------
И вот этот момент по подробнее

"а затем считываете эту переменную в холдинг регистр мастера. Такой же регистр должен быть у всех слейвов."

Спасибо

starshoy81
Лейтенант
Сообщения: 431
Зарегистрирован: 05.04.2016{, 23:30}
Репутация: 27
Откуда: Санкт-Петербург
Имя: Илья

Обмен данных между несколькими arduino по протоколу ModBus

#4

Сообщение starshoy81 » 11.07.2017{, 11:10}

HurryUp,  по позже покажу пример, сейчас компании нет под руками

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

Обмен данных между несколькими arduino по протоколу ModBus

#5

Сообщение Sancho » 11.07.2017{, 11:15}

Смотрите, пробуйте.
Кнопки на общиий, в проге инвертированы, т.е. не нажата - вход 1, в регистр 0.
R-Тригеры в мастере от зависаний слэйвов, возможны варианты.
Слэйвы различаются IP & ID, остальное одинаково. Настроите сами под свою сеть.
Вложения
Mega_2560_slave.flp
(75.06 КБ) 67 скачиваний
Mega_2560_maste.flp
(133.89 КБ) 79 скачиваний
Если не получится на контроллере - сделаю на тразисторах и 155/176...Научился, немного.
Поможем проекту вместе!

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

Обмен данных между несколькими arduino по протоколу ModBus

#6

Сообщение Sancho » 11.07.2017{, 11:39}

В предыдущем посте насос на мастере, теперь на 1 слэйве.
Главное - уловите идею....

Добавлено (11.07.2017, 11:39)
---------------------------------------------
Одновибраторы для защиты от зависаний при обрыве связи с каким-нибудь слэйвом, если он был в этот момент в 1. Я не знаю, какие значения остаются в Меге ТСР регистрах при потере связи - старые или обнуляются.
Отличия в проектах - во втором варианте при "связи хана" - локальное управление остаётся.
Вложения
5908084.flp
(76.13 КБ) 78 скачиваний
3773548.flp
(102.86 КБ) 75 скачиваний
7668398.flp
(120 КБ) 71 скачивание
Если не получится на контроллере - сделаю на тразисторах и 155/176...Научился, немного.
Поможем проекту вместе!

HurryUp
Рядовой
Сообщения: 9
Зарегистрирован: 10.07.2017{, 14:01}
Репутация: 0

Обмен данных между несколькими arduino по протоколу ModBus

#7

Сообщение HurryUp » 11.07.2017{, 15:15}

Sancho, спасибо!

Уже что-то проясняется. Хотя тема интересная и я далеко не все еще понял.
Буду рад если эту тему более подробно развернут, хотя твои примеры я посмотрел и мысль мне понятна.
Что бы мне посоветовали прочитать по данному направлению.

Спасибо

Добавлено (11.07.2017, 13:59)
---------------------------------------------
starshoy81, спасибо!

Буду рад получить информацию и от тебя.

Спасибо

Добавлено (11.07.2017, 15:15)
---------------------------------------------
И еще есть ли разница TCP и RTU с точки зрения: скорость передачи данных, стабильности, ограничения по количеству переменных?

Если я правильно понимаю, то RTU не более 32 устройств, не более 1200 м
                                               TCP ограничение только в наличии кабеля UTP (витой пары) ?

А еще какая разница для проекта в деревне с множеством контроллеров (Mastet и 8 Slave) ?

Спасибо.

PS Если вопрос не особо умный, то извините.

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

Обмен данных между несколькими arduino по протоколу ModBus

#8

Сообщение Sancho » 11.07.2017{, 15:55}

HurryUp писал(а):И еще есть ли разница TCP и RTU с точки зрения: скорость передачи данных, стабильности, ограничения по количеству переменных?
Скрость - разница СУЩЕСТВЕННАЯ!!!
Стабильность - прямые руки при монтаже(RTU), наличие промежуточных свичей, переходов между сетями оптика-кабель(ТСР).
Количество переменных -ограничено размером выделенной для этого памяти устройств.
HurryUp писал(а):Если я правильно понимаю, то RTU не более 32 устройств, не более 1200 м
32 на сектор, иногда меньше, зависит от конструкции 485 в устройстве, потом повторитель, плюсуем дальше.
При необходимости кладём RTU на ТСР IP(с помощью шлюза, не меняя протокол) - гоняем по оптике/кабелю.
Есть конверторы протоколов, которые образуют мост RTU<->TCP.

Добавлено (11.07.2017, 15:55)
---------------------------------------------
HurryUp писал(а):А еще какая разница для проекта в деревне с множеством контроллеров (Mastet и 8 Slave) ?
Цена драйвера 485/ethernet, важность скорости получения данных(ТСР можно опрашивать чаще 1сек, хотя эффект 50/50),  ethernet(lan) сеть может быть готова - создаёшь свою с другими IP...
Если не получится на контроллере - сделаю на тразисторах и 155/176...Научился, немного.
Поможем проекту вместе!

HurryUp
Рядовой
Сообщения: 9
Зарегистрирован: 10.07.2017{, 14:01}
Репутация: 0

Обмен данных между несколькими arduino по протоколу ModBus

#9

Сообщение HurryUp » 11.07.2017{, 15:59}

Sancho, спасибо.

То есть скорость по TCP выше чем в RTU ?

Значит имеет смысл в проектах со множеством переменных использовать
шилд W5100, а не модуль MAX485 (TTL в RS485)
Я правильно понимаю ?

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

Обмен данных между несколькими arduino по протоколу ModBus

#10

Сообщение Sancho » 11.07.2017{, 16:47}

HurryUp писал(а):То есть скорость по TCP выше чем в RTU ?Значит имеет смысл в проектах со множеством переменных использовать шилд W5100, а не модуль MAX485 (TTL в RS485)
Скорость и множество переменных - не обязательно связанные между собой критерии.
Я более чем уверен, что спустя две недели ты вообще забудешь какая скорость, какой тип протокола, особенно при RTU 115200.
В системе важно правильно распределить слэйв узлы.
Например, на одном из них висит датчик наружной температуры, которая(температура) передаётся постредством мастера трём другим для их алгоритмов. В данном случае скорость, в плане быстроты, не важна, т.к. не меняется быстро, а если вдруг данные не будут приходить, будет использовано последнее принятое значение..
Необходимо, по мере возможности, стараться распределить задачи в формате - один узел - максимум законченых алгоритмов с входами выходами, чтобы при падении сети они продолжили полноценно выполнять свои задачи.
Надёжность - вот главный критерий любой системы.
ИМХО.
Если не получится на контроллере - сделаю на тразисторах и 155/176...Научился, немного.
Поможем проекту вместе!

HurryUp
Рядовой
Сообщения: 9
Зарегистрирован: 10.07.2017{, 14:01}
Репутация: 0

Обмен данных между несколькими arduino по протоколу ModBus

#11

Сообщение HurryUp » 12.07.2017{, 08:40}

Sancho, спасибо за развернутый ответ.

А если с мастера всем слейвам передавать по модбасу время с часов установленных на мастере,
по в какую переменную писать правильнее в: Input Registers или Holding Registers?

И правильно ли будет передать с мастера на слейв (например каждую секунду) время, а затем при каждом событии с слейва на мастер вернуть событие в связке с временем и писать в лог файл на SD?
Или не заморачиваться и "плюсовать" время к каждому событию на мастере, а не гонять информацию о времени туда-сюда?

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

Обмен данных между несколькими arduino по протоколу ModBus

#12

Сообщение Sancho » 12.07.2017{, 11:24}

HurryUp писал(а):Или не заморачиваться и "плюсовать" время к каждому событию на мастере, а не гонять информацию о времени туда-сюда?
Вот рациональное мышление при решении задачи
Если не получится на контроллере - сделаю на тразисторах и 155/176...Научился, немного.
Поможем проекту вместе!

starshoy81
Лейтенант
Сообщения: 431
Зарегистрирован: 05.04.2016{, 23:30}
Репутация: 27
Откуда: Санкт-Петербург
Имя: Илья

Обмен данных между несколькими arduino по протоколу ModBus

#13

Сообщение starshoy81 » 13.07.2017{, 13:46}

HurryUp писал(а):Буду рад получить информацию и от тебя.
Общая идея такая:

На слейве1 включение насоса пишется в дискретинпут регистр, этот регистр читается мастером и пишется в локальную переменную на мастере "состояние насоса". Далее мастер читает эту переменную и пишет её значение в койл флаг слейва2. Слейв2, в свою очередь, получая от мастера состояние этого койл флага выполняет какую-либо операцию.
Далее в обратную сторону - слейв2 читает состояние своей "кнопки" и пишет его в дискретинпут, мастер, читая этот регистр из слейва2, пишет его в локальную переменную "запрос на запуск", далее мастер читает эту локальную переменную и пишет её состояние в койл флаг слейва1. Слейв1 получает от мастера состояние этого койл флага включает или выключает насос.
Вложения
2900368.png
3308720.png
8170792.png
Последний раз редактировалось starshoy81 13.07.2017{, 13:50}, всего редактировалось 1 раз.

Ответить

Вернуться в «Протоколы»

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

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