Страница 2 из 3

Работа ModBus в проектах FLProg

Добавлено: 19.12.2020{, 23:21}
Sancho
Вкратце напомню, как устроен обмен. Воможно, кто пользует, но не в курсе, бедет полезно.
Пакет запроса данных от слэйва, посылает мастер:
1 байт - адрес слэйва, у кого запрашиваем.
2 байт - номер функции, сообщаем, какие данные хотим получить, из какой области:флаги, Di, Ai, holding reg.
3 байт - старший байт от integer, определяющий адрес начального регистра
4 байт - младший байт от integer, определяющий адрес начального регистра
5 байт - старший байт от integer, определяющий количество запрашиваемых регистров. При правиле - максимум байт данных в пакете 253 равен 0.
6 байт - младший байт от integer, определяющий количество запрашиваемых регистров.
7 байт - старший байт CRC, контрольная сумма, выполненая с использованием всех предыдущих байт по алгоритму CRC16
8 байт - младший байт CRC
CRC к данным не относится, отсутствует при обмене по ТСР, это два дополнительных байта к упомянутым выше 253-м байтам.
Ответ от слэйва при запросе одного регистра.
1 байт - мой адрес, это у меня спрашивали, я и отвечаю.
2 байт - номер функции, на которую я отвечаю.
3 байт - сейчас будет вот такое количество байт из запрошенных регистров, 2 х количество регистров
4 байт - старший байт регистра
5 байт - младший байт регистра
6 байт - старший байт CRC
7 байт - младший байт CRC
Получаем, распределяем в соответствующие ячейки.
Это значит, для получения данных одного integer, самого распространённого у нас, мы отправляем 8 байт и получаем 7.
На два байта информации.
Вот так работает мастер модбас в Flprog, один в один.
При неполучении данных в установленное время, как правило, 1000мс, формируется новый запрос для следующего регистра.
Если у Вас в проекте несколько регистров в нескольких слэйвах, то при отключении одного устройства, его регистры продолжают
опрашиваться, умножая время "зависания", 1000мс, на количество регистров в устройстве.
Есть, конечно-же, возможность, получать данные с нескольких регистров сразу, в один запрос.
И слэйв FLProg это умеет!!!
Но вся проблема в том, что это не совсем будет корретно работать, из-за того, что пользователи не всегда создают регистры подряд.
Тогда, при запросе регистра, которого нет, слэйв вернёт ошибку.
Иногда пропуск регистра возникает из-за того, что пользователь его создал, но в проекте не использовал
- компилятор не вставит его в код программы, будет пропуск.
Однако, если нормально отнестись к созданию регистров, рациональному их использованию в программе - всё можно поправить.
Рационально - не слать флоаты, т.к. процес их разборки - сборки не слишком быстр, вместо них использовать х10 или 100 integer.
Собирать дискретные сигналы в вибе битов в integer, блоки то есть для сборки и разборки.
Для опроса нескольких регистров, иногда всех, с одного устройства в один запрос в других системах используют так называемые каналы.
Параметры канала: тип используемой функции, начальный адрес, количество регистров.
Привязку полученных данных регистров к переменных осуществляют отдельно.
Что получаем на выходе?
Например, опрашиваем 10 регистров, при отвале слэйва - задержка перед опросом следующего 1000мс.
Количество байт: запрос 8 байт(один!!!), ответ 25 байт(тоже один!). всё.
Как я вижу, сложность в связке данных в полученном массиве и переменных проекта - памяти у 328 не шибко. в stm32 проблем никаких.
Для примера приведу проект, сделанный по просьбе одного нашего форумчанина, в котором можно опрашивать несколько устройств,
задавая их адреса, начальные регистры через входы блоков, не константы. Опрашиваются по два регистра. На выходах данные в виде байтов.
При желании можно сделать вообще любого типа, и с любым количеством, но я считаю оптимальным тип integer - с ним можно всё.
Так-же там присутствует выход новые данные, 1 на 1 цикл. Можно использовать как сигнал "данные актуальны", можно как ....
Для упрощения построения алгоритма, и кода соответственно, использовать слэйвы с одинаковым количеством регистров,
ненужные обязательно задействовать на платах, хоть отдельно взятой, хоть для дублирования - главное, чтобы компилятор прописал их в коде.
Как использую данную концепцию я?
СпойлерПоказать
2020-12-19_16-30.png
Есть устройство от производителя, от которого у меня есть только карта регистров,
нужные мне разбросаны по всей, где-то рядом парочка другие через один-два,
И ещё - ВСЕГДА использовать модули связи без эха, а то посмотришь какие схемы 485 предлагают в нете, то аж жуть, как представлю, что
творится в буфере приёма.
Ещё один момент - отправка данных в слэйв.
Вопрос совсем не тривиальный, как кажется на первый взгляд, говорю по собственному опыту.
Для этого нужно встроить отправку в проццес опроса, прервав его на время отправки данных и получения подтверждения доставки.

Работа ModBus в проектах FLProg

Добавлено: 20.12.2020{, 01:51}
ecoins
Sancho писал(а):
19.12.2020{, 23:21}
Вопрос совсем не тривиальный, как кажется на первый взгляд, говорю по собственному опыту.
Для этого нужно встроить отправку в проццес опроса, прервав его на время отправки данных и получения подтверждения доставки.
Можно ли ожидать от Вам приемлемых и правильных ПБ FLProg для работы с ModBus с учетом того, что Вы в своих проектах добиваетесь положительных результатов?

Работа ModBus в проектах FLProg

Добавлено: 20.12.2020{, 07:40}
fsergei70
Sancho, Огромное спасибо за блоки. Попытался немного доработать проект, добавил в блок вход выбора типа регистров.
Сделал блок формирования из 4 байт выходной строки, значение в строке зависит от выбранного типа.
Меня выход типа String в блоке вполне устраивает, все равно ведь буду выводить на 1602.

Возник вопрос как у Float оставить 1 знак после запятой, и в какой последовательности соединять выходы твоего блока.

В планах сделать модбас индикатор, на 1602, ESP01 и китайского блока RS485 (у которого только RX и TX).
Настройку модбас сделать через веб морду. А WiFi включать по кнопке.
А так как портов у ESP01 всего 4 и все будут заняты, то кнопку повесить между RX и TX. Периодически раз в 3 сек. посылать в порт что то и если это же в порт и пришло врубать WIFi и точку доступа. И тут опять вопрос если замкнуть RX и TX то с ESP01 ничего не должно случиться а вот с китайского блока RS485 я неуверен.

Работа ModBus в проектах FLProg

Добавлено: 20.12.2020{, 11:06}
ecoins
fsergei70 писал(а):
20.12.2020{, 07:40}
Sancho, Огромное спасибо за блоки.
Не разглядел внизу Вашего поста пример.
Теперь и рассмотрел блоки, изучил их содержание.
Спасибо. Было бы замечательно, если бы Ваши наработки собрать в библиотеку.
Нет ли у Вас таких планов?
Еще вопрос - как-то мы с Вами его обсуждали и Вы меня убедили, что отправка в UART функцией Serialx.write() не тормозит процессор. Тогда это было проверено логическим анализатором и убедились наглядно.
Возможно ли миновать создания буфера (у Вас он MB_Buffer[16]) и писать сразу в кольцевой буфер UART (по умолчанию он вроде 64 байт). В предыдущих постах Вы описывали как-это работает - может у Вас уже есть такие наработки? Были бы очень полезны и мы с удовольствием бы ими воспользовались минуя промежуточные исследования.
Спасибо.

Работа ModBus в проектах FLProg

Добавлено: 28.12.2020{, 16:10}
Qwert855
Добры день.
Для только разбирающихся в этой теме, можете пож-та показать как сделать обмен данными по локальной сети (именно через домашний роутер) нескольких устройств ЕСП по TCP с дальнейшей отправкой информации с одной ЕСП в облако.

Не могу разобраться в зависимостях мастера, слейва, мастера РТУ и адресов слейвов. а так же выборе IP при создании облака и DHCP при подключении WIFI. при этом не прибегая к блокам "коммуникации" (что то при такой каше с облаками блоки стабильно не работают, либо что то настраиваю не корректно).
построение сети.png
Как передать в облако что то с одного ЕСП - этот момент понятен.
Как объединить ЕСП в сеть через роутер - понятно не до конца, вариант с блоком "коммуникации" хотелось бы не трогать, хоть с ним и ясно как он работает но работает почему то в такой связке не очень от слова совсем.
коммуникации.png
коммуникации.png (9.04 КБ) 2428 просмотров
Приоритет - работа с модбасом, но по причине выше не понятна настройка, предполагаю что необходимо использовать одни адрес ТСР для всей сети и разный адрес слейв.
Как объединить оба варианта - не понятно вовсе, т.к возникают нюансы по ТСР адресу облака, при этом WIFI ТСР может быть только DHCP.
И не мене актуальный вопрос, как можно паковать несколько запросов/ответов в один пакет? т.к ожидаю что тормоза будут от пробросов пакетов ощутимые.

Огромное спасибо за любую информацию, ссылки, примеры и тд.

Работа ModBus в проектах FLProg

Добавлено: 28.12.2020{, 16:42}
Rovki
Для начала нарисуйте квадратиками и линиями какую сеть хотите создать :smile427: (конфигурация ,архитектура)

Работа ModBus в проектах FLProg

Добавлено: 28.12.2020{, 18:24}
Qwert855
Rovki писал(а):
28.12.2020{, 16:42}
Для начала нарисуйте квадратиками и линиями какую сеть хотите создать :smile427: (конфигурация ,архитектура)
нарисовал структуру предполагаемой сети.
пример.png

Работа ModBus в проектах FLProg

Добавлено: 28.12.2020{, 21:56}
Rovki
Такая структура реализуется просто - Вот так делаете для есп , в 3есп нужно будет добавить мастера для работы с нано.

Работа ModBus в проектах FLProg

Добавлено: 30.12.2020{, 21:48}
Qwert855
добрый день.
подскажите,как, точнее куда кидать пакеты? что означает Адес 1,2,3 и тд в модбасе как его применять?. и какие ставить TCP адреса, разные или все одинаковые? как указать одному слейв модбасу куда кидать и откуда принимать пакеты?

Работа ModBus в проектах FLProg

Добавлено: 30.12.2020{, 23:42}
Rovki
По сети ТСР можно ставить везде одинаковый адрес (сетевой) , ибо IP у всех разный (свой), выдает роутер . Слейв ни куда сам не кидает и не читает данные , мастер читает и пишет данные со слейва.

Работа ModBus в проектах FLProg

Добавлено: 16.01.2021{, 01:14}
Qwert855
Добрый день. в попытках объединить устройства по локальной и внешней сети, сталкиваюсь с одним и тем же вопросом.
При настройке проекта с локальной сетью по средствам обмена через
коммуникации.png
коммуникации.png (9.04 КБ) 2022 просмотра

все работает приемлемо. используется постоянный ip и все хорошо.

Как только перехожу в настройку внешней сети перестают уходить пакеты с устройства на котором настраиваю Каскаду при этом это устройство продолжает получать пакеты как и ранее от других МК. а именно при изменении параметра на DHCP,
построение сети1.png
построение сети1.png (8.54 КБ) 2022 просмотра



на сколько я понимаю только при выборе DHCP Каскада будет выходить в облако.

Собственно вынужден вернуться к прошлой поддержке.

- есть ли способ настроить ФЛП с облаком со статическим ip в этой графе
построение сети1.png
построение сети1.png (8.54 КБ) 2022 просмотра
- есть ли способ передавать пакеты между устройств другим методом кроме
коммуникации.png
коммуникации.png (9.04 КБ) 2022 просмотра
тк фантазия иссякла, прошу поделиться примером в лику или в ветку настройки нескольких устройств между собой через роуте и выход в облако.
Предполагаю что ответ кроется за модбасом, но что то не заводится он у меня.

Работа ModBus в проектах FLProg

Добавлено: 16.01.2021{, 08:29}
Sancho
Qwert855, Устройства в flp не поддерживают работу двух модбасов(МБ) по tcp. В ide не пробовал.
Выход:
- добавлять ещё одно wifi устройство, МБ мастер внутренней сети, при этом оно будет связано как слэйв МБ по uart с другим wifi, который будет связан с облаком каскады по МБ;
- отказаться от связи с каскадой по МБ, попробовать по mqtt, либо наоборот, внутри, но придётся подымать брокера где-то;
- проводить изыскания :)
Как-то так.

Работа ModBus в проектах FLProg

Добавлено: 17.01.2021{, 16:17}
Qwert855
Sancho писал(а):
16.01.2021{, 08:29}
Qwert855, Устройства в flp не поддерживают работу двух модбасов(МБ) по tcp. В ide не пробовал.
Выход:
- добавлять ещё одно wifi устройство, МБ мастер внутренней сети, при этом оно будет связано как слэйв МБ по uart с другим wifi, который будет связан с облаком каскады по МБ;
- отказаться от связи с каскадой по МБ, попробовать по mqtt, либо наоборот, внутри, но придётся подымать брокера где-то;
- проводить изыскания :)
Как-то так.
добрый день.
на сколько я понимаю это две подсети получится, в одной внутренний обмен между МК, во второй выход типа моста по TX RX во внешнюю сеть?
если это так, то очень печально. такие городишки городить совсем не хочется. легко запутаться в переменных и их пробросах.

Работа ModBus в проектах FLProg

Добавлено: 17.01.2021{, 19:05}
Rovki
Qwert855,
Зачем вы используете коммуникации из встроенных ФБ ? Я же показал - используйте коммуникации в дереве (слева). Позвоните по телефону на сайте hmi-kascada.ru для оперативного ответа .А то скоро месяц мучаетесь ...

Работа ModBus в проектах FLProg

Добавлено: 17.01.2021{, 22:39}
Qwert855
Rovki писал(а):
17.01.2021{, 19:05}
Qwert855,
Зачем вы используете коммуникации из встроенных ФБ ? Я же показал - используйте коммуникации в дереве (слева). Позвоните по телефону на сайте hmi-kascada.ru для оперативного ответа .А то скоро месяц мучаетесь ...
Добрый вечер.
У меня не получилось, я потому и попросил пример построения сети. Я не погу понять как направить переменную. На фото ранее зеленым стрелками были отмечены места которые вызывали вопросы т.к назначениеине их не понятно.

Работа ModBus в проектах FLProg

Добавлено: 17.01.2021{, 23:46}
Rovki
Qwert855 писал(а):
17.01.2021{, 22:39}
Rovki писал(а):
17.01.2021{, 19:05}
Qwert855,
Зачем вы используете коммуникации из встроенных ФБ ? Я же показал - используйте коммуникации в дереве (слева). Позвоните по телефону на сайте hmi-kascada.ru для оперативного ответа .А то скоро месяц мучаетесь ...
Добрый вечер.
У меня не получилось, я потому и попросил пример построения сети. Я не погу понять как направить переменную. На фото ранее зеленым стрелками были отмечены места которые вызывали вопросы т.к назначениеине их не понятно.
Я ж говорю, зачем ходить туда , где не понятно . Не ходите вправо , идите влево (дерево проекта). А то уже месяц играете в пинг понг

Работа ModBus в проектах FLProg

Добавлено: 18.01.2021{, 16:02}
Qwert855
Rovki писал(а):
17.01.2021{, 23:46}
Я ж говорю, зачем ходить туда , где не понятно . Не ходите вправо , идите влево (дерево проекта). А то уже месяц играете в пинг понг
с игрой в пин понг приходят вопросы а с ними опыт и мне в моих походах видимо поможет только образец, который пока не могу найти в сети. так же обратил внимание далеко не многие углубляются в тему модбаса и построение сетей (относительно более сложных чем esp + uart arduino).

Работа ModBus в проектах FLProg

Добавлено: 18.01.2021{, 16:39}
Rovki
Навязываться не буду , скрин с коммуникациями привел . :smile427:

Работа ModBus в проектах FLProg

Добавлено: 26.01.2021{, 18:28}
Qwert855
Rovki писал(а):
18.01.2021{, 16:39}
Навязываться не буду , скрин с коммуникациями привел . :smile427:
Добрый день.
как можно видеть по последующим вопросам скрин с того года мне не помог :smile44:
настройка одной ЕСП и облако или ЕСП + UART Ардуино и облако 'в этом нет вопросов, да и не было.

Вопрос в организации локальной сети и как указать ФЛП откуда нужно принять переменную и как ее отправить по модбас при обмене через роутер. Поражен на сколько не популярная тема среди форумчан :smile37:
Вместо тысячи слов помог бы один пример "зародыша" проекта где один МК модбасит другому с выходом в облако :smile198:

Работа ModBus в проектах FLProg

Добавлено: 27.01.2021{, 09:37}
Sancho
Qwert855,
Qwert855 писал(а):
26.01.2021{, 18:28}
пример "зародыша" проекта где один МК модбасит другому с выходом в облако
В флрог такое на WiFi не собрать - нет возможности.
Только ручками в коде допиливать.
Или думать применение другого опроса слэйвов, mqtt например.