РЕШЕНО Modbus без парсинга и ошибок.

Тема в разделе "Глядите, что я сделал", создана пользователем Алопеций Шнифт, 4 мар 2026.

  1. Вы утверждаете, что slave, читающий только одним блоком, нарушает спецификацию Modbus.

    Это не так.

    Спецификация не требует поддержки произвольных поддиапазонов. Код 02 (Illegal Data Address) возникает, если запрос выходит за пределы поддерживаемого диапазона. Если slave поддерживает только блок целиком — любой запрос с количеством не 10 или адресом не 0 выходит за эти пределы. Всё корректно.

    Siemens, ABB, Schneider, WAGO и тп так делают. Стандартными функциями, без пользовательских кодов.

    Поэтому:

    • В стандарте такого требования нет.

    • Ваше утверждение о нарушении спецификации — ошибочно.
    Если найдёте в спецификации пункт, обязывающий slave отвечать на любые поддиапазоны в любом порядке — покажите. Я поблагодарю и исправлюсь (как исправил уже отсутствие исключений). Пока не найдёте — прошу не вводить людей в заблуждение.
     
  2. parovoZZ

    parovoZZ Гуру

    slave ничего не читает. Slave обязан отдать то, что запросили.
    И Siemens, и Schneider, и AlienBredley, и Beckhoff предоставляют библиотеки (разумеется, за денюжку), которые полностью удовлетворяют спецификации ModBus и работают так, как я описываю. Овен сюда же, но библиотека бесплатная. Siemens знаю как облупленного, поэтому про него ничего нового мне не расскажете.

    да пожалуйста (для функции 03. Для функции 04 ровно всё тоже самое):

    upload_2026-3-24_12-39-34.png
    Дословно: запрос должен содержать номер стартового регистра и количество регистров.
    Ответ ОБЯЗАН содержать количество байт, равное количеству запрошенных регистров * 2.
    Никаких ограничений, накладываемых слейвом (сервером), стандарт не приводит.
    И стартовый регистр, и количество регистров может быть любым из указанного диапазона.

    вот ошибка 02:
    upload_2026-3-24_12-37-20.png
    дословно:
    Для контроллера со 100 регистрами в PDU первый регистр адресуется как 0, а последний — как 99. Если отправлен запрос с начальным адресом регистра 96 и количеством регистров 4, то этот запрос будет успешно выполнен (по крайней мере, с точки зрения адресации) для регистров 96, 97, 98, 99.
    Т.е. запрашиваем откуда угодно и как угодно - укладываемся в диапазон - ошибки нет.
    Ошибки (публичной), связанной с некорректным запросом количества регистров, в стандарте просто нет.
     
  3. parovoZZ

    parovoZZ Гуру

    Мастхэв в индустрии - это программа ModBusPoll Slave. Она полностью соответствует спецификации.

    Если хотите играть по своим правилам, то в стандарте предусмотрены пользовательские коды:
    upload_2026-3-24_13-13-23.png
    Разумеется, что требования сnандарта к слою 1 OSI в это случае также необходимо соблюдать.
    И вот здесь в документации описываете, как необходимо работать с вашими кодами функций. Разумеется, что искать промышленных мастеров под ваш случай бессмысленно - про него никто более не знает.


    все публичные функции (кроме записывающих в отдельно взятые регистры) работаю ТОЛЬКО с ЕДИНЫМ блоком. На скрине выше это видно. Т.е. если в запросе 5 регистров, а, допустим, третий регистр слейвом не поддерживается, слейв возвращает ошибку 02.

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

    Я уже писал: промышленные мастера, например HMI от Weintek или Овен, запрашивают у слейва только то, что отображается на экране. Научить их запрашивать всё целиком весьма сложно - через скрипты. Но НИКТО этим не занимается. К примеру, надо на HMI передать 50 float значений. Это что, надо их запрашивать все? Зачем, если на экране отображается всего 4 из них. И все они с разными адресами, т.е. запросить их за один запрос не получается никак. Поэтому HMI делает 4 запроса и повлиять на это никак нельзя (ну кроме самописного скрипта). А главный вопрос - ЗАЧЕМ?

    В природе существует куча библиотек для реализации ModBus хоть на RTU, хоть на TCP. Все они вылизаны и с документацией. Гонимся за ОЗУ в embedded? Так она сегодня не стоит ничего.