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

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

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

#21

Сообщение Sancho » 19.12.2020{, 23:21}

Вкратце напомню, как устроен обмен. Воможно, кто пользует, но не в курсе, бедет полезно.
Пакет запроса данных от слэйва, посылает мастер:
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 предлагают в нете, то аж жуть, как представлю, что
творится в буфере приёма.
Ещё один момент - отправка данных в слэйв.
Вопрос совсем не тривиальный, как кажется на первый взгляд, говорю по собственному опыту.
Для этого нужно встроить отправку в проццес опроса, прервав его на время отправки данных и получения подтверждения доставки.
Для скачивания вложений Вы должны быть зарегистрированы.
Если не получится на контроллере - сделаю на тразисторах и 155/176...Научился, немного.
Поможем проекту вместе!

ecoins
Подполковник
Сообщения: 1305
Зарегистрирован: 12.02.2016{, 11:40}
Репутация: 219
Откуда: Шатура
Имя: Энвер

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

#22

Сообщение ecoins » 20.12.2020{, 01:51}

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

Аватара пользователя
fsergei70
Лейтенант
Сообщения: 676
Зарегистрирован: 17.11.2015{, 20:36}
Репутация: 48
Откуда: Ессентуки-Кисловодск
Имя: Сергей

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

#23

Сообщение fsergei70 » 20.12.2020{, 07:40}

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

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

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

ecoins
Подполковник
Сообщения: 1305
Зарегистрирован: 12.02.2016{, 11:40}
Репутация: 219
Откуда: Шатура
Имя: Энвер

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

#24

Сообщение ecoins » 20.12.2020{, 11:06}

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

Qwert855
Сержант
Сообщения: 136
Зарегистрирован: 19.12.2020{, 23:57}
Репутация: 4
Имя: Alex

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

#25

Сообщение Qwert855 » 28.12.2020{, 16:10}

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

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

Огромное спасибо за любую информацию, ссылки, примеры и тд.
Для скачивания вложений Вы должны быть зарегистрированы.

Аватара пользователя
Rovki
Полковник
Сообщения: 4105
Зарегистрирован: 22.04.2016{, 17:25}
Репутация: 195
Откуда: Чехов
Имя: Анатолий
Контактная информация:

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

#26

Сообщение Rovki » 28.12.2020{, 16:42}

Для начала нарисуйте квадратиками и линиями какую сеть хотите создать :smile427: (конфигурация ,архитектура)
Электронщик до мозга костей и не только

Qwert855
Сержант
Сообщения: 136
Зарегистрирован: 19.12.2020{, 23:57}
Репутация: 4
Имя: Alex

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

#27

Сообщение Qwert855 » 28.12.2020{, 18:24}

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

Аватара пользователя
Rovki
Полковник
Сообщения: 4105
Зарегистрирован: 22.04.2016{, 17:25}
Репутация: 195
Откуда: Чехов
Имя: Анатолий
Контактная информация:

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

#28

Сообщение Rovki » 28.12.2020{, 21:56}

Такая структура реализуется просто - Вот так делаете для есп , в 3есп нужно будет добавить мастера для работы с нано.
Для скачивания вложений Вы должны быть зарегистрированы.
Электронщик до мозга костей и не только

Qwert855
Сержант
Сообщения: 136
Зарегистрирован: 19.12.2020{, 23:57}
Репутация: 4
Имя: Alex

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

#29

Сообщение Qwert855 » 30.12.2020{, 21:48}

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

Аватара пользователя
Rovki
Полковник
Сообщения: 4105
Зарегистрирован: 22.04.2016{, 17:25}
Репутация: 195
Откуда: Чехов
Имя: Анатолий
Контактная информация:

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

#30

Сообщение Rovki » 30.12.2020{, 23:42}

По сети ТСР можно ставить везде одинаковый адрес (сетевой) , ибо IP у всех разный (свой), выдает роутер . Слейв ни куда сам не кидает и не читает данные , мастер читает и пишет данные со слейва.
Электронщик до мозга костей и не только

Qwert855
Сержант
Сообщения: 136
Зарегистрирован: 19.12.2020{, 23:57}
Репутация: 4
Имя: Alex

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

#31

Сообщение Qwert855 » 16.01.2021{, 01:14}

Добрый день. в попытках объединить устройства по локальной и внешней сети, сталкиваюсь с одним и тем же вопросом.
При настройке проекта с локальной сетью по средствам обмена через
коммуникации.png

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

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



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

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

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

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

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

#32

Сообщение Sancho » 16.01.2021{, 08:29}

Qwert855, Устройства в flp не поддерживают работу двух модбасов(МБ) по tcp. В ide не пробовал.
Выход:
- добавлять ещё одно wifi устройство, МБ мастер внутренней сети, при этом оно будет связано как слэйв МБ по uart с другим wifi, который будет связан с облаком каскады по МБ;
- отказаться от связи с каскадой по МБ, попробовать по mqtt, либо наоборот, внутри, но придётся подымать брокера где-то;
- проводить изыскания :)
Как-то так.
Если не получится на контроллере - сделаю на тразисторах и 155/176...Научился, немного.
Поможем проекту вместе!

Qwert855
Сержант
Сообщения: 136
Зарегистрирован: 19.12.2020{, 23:57}
Репутация: 4
Имя: Alex

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

#33

Сообщение Qwert855 » 17.01.2021{, 16:17}

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

Аватара пользователя
Rovki
Полковник
Сообщения: 4105
Зарегистрирован: 22.04.2016{, 17:25}
Репутация: 195
Откуда: Чехов
Имя: Анатолий
Контактная информация:

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

#34

Сообщение Rovki » 17.01.2021{, 19:05}

Qwert855,
Зачем вы используете коммуникации из встроенных ФБ ? Я же показал - используйте коммуникации в дереве (слева). Позвоните по телефону на сайте hmi-kascada.ru для оперативного ответа .А то скоро месяц мучаетесь ...
Электронщик до мозга костей и не только

Qwert855
Сержант
Сообщения: 136
Зарегистрирован: 19.12.2020{, 23:57}
Репутация: 4
Имя: Alex

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

#35

Сообщение Qwert855 » 17.01.2021{, 22:39}

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

Аватара пользователя
Rovki
Полковник
Сообщения: 4105
Зарегистрирован: 22.04.2016{, 17:25}
Репутация: 195
Откуда: Чехов
Имя: Анатолий
Контактная информация:

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

#36

Сообщение Rovki » 17.01.2021{, 23:46}

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

Qwert855
Сержант
Сообщения: 136
Зарегистрирован: 19.12.2020{, 23:57}
Репутация: 4
Имя: Alex

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

#37

Сообщение Qwert855 » 18.01.2021{, 16:02}

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

Аватара пользователя
Rovki
Полковник
Сообщения: 4105
Зарегистрирован: 22.04.2016{, 17:25}
Репутация: 195
Откуда: Чехов
Имя: Анатолий
Контактная информация:

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

#38

Сообщение Rovki » 18.01.2021{, 16:39}

Навязываться не буду , скрин с коммуникациями привел . :smile427:
Электронщик до мозга костей и не только

Qwert855
Сержант
Сообщения: 136
Зарегистрирован: 19.12.2020{, 23:57}
Репутация: 4
Имя: Alex

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

#39

Сообщение Qwert855 » 26.01.2021{, 18:28}

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

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

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

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

#40

Сообщение Sancho » 27.01.2021{, 09:37}

Qwert855,
Qwert855 писал(а):
26.01.2021{, 18:28}
пример "зародыша" проекта где один МК модбасит другому с выходом в облако
В флрог такое на WiFi не собрать - нет возможности.
Только ручками в коде допиливать.
Или думать применение другого опроса слэйвов, mqtt например.
Если не получится на контроллере - сделаю на тразисторах и 155/176...Научился, немного.
Поможем проекту вместе!

Ответить

Вернуться в «Букварь»