Modbus ошибка контрольной суммы

Это утверждённая версия страницы. Она же — наиболее свежая версия.

Основные понятия

Modbus — это протокол прикладного (седьмого) уровня модели OSI. Чаще всего он служит для обмена данными между устройствами автоматизации и реализован в виде «протокола ответов на запросы (request-reply protocol)».

В устройствах Wiren Board данные Modbus передаются по последовательным линиям связи RS-485. В последовательных линиях связи протокол RS-485 полудуплексный и работает по принципу «клиент-сервер». Каждое устройство в сети (кроме ведущего см. далее) имеет адрес от 1 до 247, адрес 0 используется для широковещательной передачи данных всем устройствам, а адреса 248–255 считаются зарезервированными согласно спецификации Modbus, их использование не рекомендуется.

Существует две спецификации протокола: Modbus RTU и Modbus ASCII. В Modbus RTU передается 11-битный символ, состоящий из 1 стартового бита, 8 бит данных (начиная с младшего бита), бит четности (необязателен) и 2 стоповых бита — если бит четности не передается, или 1 стоповый бит — если бит четности передается. Такой символ передает 1 байт данных. В устройствах Wiren Board по умолчанию бит контроля четности не передается и используется 2 стоповых бита. В Modbus ASCII каждый байт передается двумя символами, представляющими ASCII-коды младшей и старшей четырехбитной группы байта (пример). Modbus RTU передает больше информации при той же скорости последовательной линии, и в устройствах Wiren Board используется именно он. Все дальнейшее описание относится к Modbus RTU.

Ведущее устройство («мастер», или «клиент») периодически опрашивает «ведомое», или «сервер». Ведущее устройство не имеет адреса, передача сообщений от устройства-сервера ведущему без запроса ведущего в протоколе не предусмотрена.

Датаграмма Modbus в общем виде

Пакет данных Modbus выглядит, как это показано на рисунке. PDU (Protocol Data Unit) — общая часть пакета MODBUS, включающая код функции и данные пакета. ADU (Application Data Unit) — полный пакет MODBUS. Включает в себя специфичную для физического уровня часть пакета и PDU. Для последовательных линий в заголовке ADU передается адрес устройства, а в конце — контрольная сумма CRC16. Максимальный размер ADU в последовательных коммуникационных линиях составляет 253 байта (из максимальных, разрешенных спецификацией 256 байт вычитается 1 байт адреса и два байта контрольной суммы). Для справки — в Modbus TCP максимальная длина пакета составляет 260 байт.

Функция кодируется одним байтом и определяет, какое действие должно выполнить устройство-сервер. Значение кодов функций лежат в диапазоне от 1 до 255, причем коды от 128 до 255 зарезервированы для сообщений об ошибках со стороны устройства-сервера. Код 0 не используется. Размер блока данных может варьироваться от нуля до максимально допустимого. Если обработка запроса прошла без ошибок, то устройство-сервер возвращает пакет ADU, содержащий запрошенные данные.

  • Modbus-транзакция, прошедшая без ошибок

  • Modbus-транзакция с ошибками

При возникновении ошибки устройством возвращается код ошибки. При обычной транзакции код функции в ответе возвращается без изменений; при ошибке старший бит кода функции устанавливается в единицу (то есть код функции + 0x80). Так же есть таймаут ожидания ответа от ведомого устройства — бессмысленно долго ждать ответ, который, возможно, никогда и не придет.

Структуры данных Modbus

В Modbus принято кодировать адреса и данные в формате big-endian, то есть в формате, когда байты следуют, начиная со старшего: например, при передаче шестнадцатеричного числа 0x1234 сначала устройством будет принят байт 0x12, а затем — 0x34. Для передачи данных другого типа, например, чисел с плавающей запятой (float), текстовых строк, даты и времени суток и т.п. производитель может выбрать свой собственный способ кодирования — для расшифровки получаемых данных важно ознакомится со спецификацией производителя устройства.

Модель данных Modbus

Обмен данными с Modbus-устройствами происходит через регистры. В протоколе Modbus определяется четыре типа регистров, показанных в таблице:

Таблица Размер Доступ
Регистры флагов (Coils) 1 бит чтение и запись
Дискретные входы (Discrete Inputs) 1 бит только чтение
Регистры хранения (Holding Registers) 16-битное слово чтение и запись
Регистры ввода (Input Registers) 16-битное слово только чтение

Регистры флагов (Coils) хранят однобитные значения — то есть могут находится в состоянии 0 или 1. Такие регистры могут обозначать текущее состояние выхода (включено реле). Название «coil» буквально и означает обмотку-актюатор электромеханического реле. Регистры флагов допускают как чтение, так и запись.

Дискретные входы (Discrete Inputs) также являются однобитными регистрами, описывающими состояние входа устройства (например, подано напряжение — 1). Эти регистры поддерживают только чтение.

Регистры хранения (Holding Registers) и регистры ввода (Input Registers) представлены двухбайтовым словом и могут хранить значения от 0 до 65535 (0x0000 — 0xFFFF).
Регистры ввода допускают только чтение (например, текущее значение температуры). Регистры хранения поддерживают как чтение, так и запись (для хранения настроек). В настоящее время во многих устройствах, в частности в устройствах Wiren Board, эти регистры не разделяются. Команды на чтение регистра хранения N и регистра ввода N обратятся к одному и тому же значению в адресном пространстве устройства.

Адреса регистров

Регистры в стандарте Modbus адресуются с помощью 16-битных адресов. Адресация начинается с нуля. Адрес регистра, таким образом, может принимать значения от 0 до 65535.

Адресные пространства регистров, также называемые таблицами иди блоками, могут быть различны для всех четырёх типов регистров. Это значит, что значения регистров с одинаковым адресом, но разным типом, в общем случае разные.

Например, при чтении регистра флагов (coil) номер 42, регистра дискретного входа (Discrete), регистров ввода и хранения (Input и Holding) с теми же адресами, можно получить четыре разных значения.

Нестандартная адресация

В документации на некоторые, особенно старые, устройства адреса элементов (регистров) указываются в формате, не соответствующем стандарту. В этом формате тип элемента кодируется первой цифрой адреса, а адресация начинается не с нуля.

Например, регистр хранения с адресом 0 может записываться как 40001 или 400001, а Coil с адресом 0 как 000001.

В таблице перевода адресов в стандартный формат показаны диапазоны для двух разных нестандартных типов указания адресов и соответствующие им типы данных и диапазоны стандартных адресов.

Тип данных Стандартные адреса Стандартные адреса (hex) Нестандартные адреса (5 цифр) Нестандартные адреса (6 цифр)
Флагов (Coils) 0-65535 0x0000 — 0xFFFF 00001 — 09999 000001 — 065536
Дискретных входов (Discrete) 0-65535 0x0000 — 0xFFFF 10001 — 19999 100001 — 165536
Регистры входов (Input Registers) 0-65535 0x0000 — 0xFFFF 30001 — 39999 300001 — 365536
Регистры хранения (Holding Registers) 0-65535 0x0000 — 0xFFFF 40001 — 49999 400001 — 465536

Признаки использования нестандартной адресации:

  • Адреса записываются в десятичном формате
  • Во всех адресах пять или шесть цифр
  • Адреса с недискретными данными (показания датчиков и т.п.) начинаются на 30 или 40

Часто рядом с нестандартными адресами указываются и адреса соответствующие стандарту, обычно в шестнадцатеричном формате.
Стоит отметить, что физически в пакете данных передаются адреса в стандартном формате, независимо от способа представления их в документации.

Пример описания регистров в документации

В готовых шаблонах устройств для контроллера Wiren Board есть шаблон для однофазного счетчика электроэнергии SDM220 (/usr/share/wb-mqtt-serial/templates/config-sdm220.json). В документации от производителя «Eastron SDM
220 Modbus Smart Meter Modbus Protocol Implementation V1.0» перечислены регистры и соответствующие им измеряемые параметры, например:

Address (Register) Description Units Modbus Protocol Start Address Hex (Hi Byte Lo Byte)
30001 Line to neutral volts. Volts 00 00
30007 Current. Amps. 00 06
30013 Active power Whatts 00 0C
30019 Apparent power VoltAmps 00 12
… …

Производитель в таблице приводит и логические, и физические адреса регистров, что позволяет нам с легкостью создать шаблон устройства и проиллюстрировать связь между логическими и физическими адресами Modbus-регистров.

Фрагмент шаблона счетчика SDM220

Коды функций чтения и записи регистров

В следующей таблице приведены наиболее распространенные коды функций Modbus:

Код функции HEX Название Действие
1 0x01 Read Coils Чтение значений нескольких регистров флагов
2 0x02 Read Discrete Inputs Чтение значений нескольких дискретных входов
3 0x03 Read Holding Registers Чтение значений нескольких регистров хранения
4 0x04 Read Input Registers Чтение значений нескольких регистров ввода
5 0x05 Write Single Coil Запись одного регистра флагов
6 0x06 Write Single Register Запись одного регистра хранения
15 0x0F Write Multiple Coils Запись нескольких регистров флагов
16 0x10 Write Multiple Register Запись нескольких регистров хранения

Команды условно можно разделить по типам: чтение значений — запись значений; операция с одним значением — операция с несколькими значениями.

Формат данных запросов и ответов Modbus

Рассмотрим подробнее, как происходит обмен данными между устройством-клиентом, отправляющим запрос, и устройством-сервером, отвечающим ему.
На следующем рисунке показан обмен данными контроллера с устройством с адресом 0x01. Мы хотим прочесть 8 coil-регистров, начиная с первого.

В качестве данных мы получили шестнадцатеричное число 0x2D, то есть состояние восьми coil-регистров в двоичном виде такое: 0b10110100.


В следующей таблице приведены структуры данных запросов и ответов для основных функций Modbus.

Код функции Запрос Ответ
1 (Read Coils) и 2 (Read Discrete Inputs)
  • Адрес первого регистра флагов или входного регистра (16 бит)
  • Количество данных (8 значений на байт) (16 бит)
    • Число передаваемых байт (8 бит)
    • Значения регистров флагов или входных регистров (8 значений на байт)
    3 (Read Holding Registers) и 4 (Read Input Registers)
    • Адрес первого регистра (16 бит)
    • Количество регистров, которые нужно прочесть
      • Число передаваемых байт (8 бит)
      • Значения регистров (16 бит на 1 регистр)
      5 (Write Single Coil)
      • Адрес регистра (16 бит)
      • Значение, которое нужно записать (0 — выключить, 0xFF00 — включить)
        Ответ аналогичен запросу
        6 (WriteSingle Register)
        • Адрес регистра(16 бит)
        • Новое значение регистра (16 бит)
        Ответ аналогичен запросу
        15 (WriteMultipleCoils)
        • Адрес первого регистра флагов для записи (16 бит)
        • Количество регистров флагов для записи (16 бит)
        • Количество передаваемых байт данных для регистров флагов (8 бит)
        • Данные (8 регистров флагов на байт)
        • Адрес первого coil-регистра (16 бит)
        • Количество записанных coil-регистров(16 бит)
        16 (Write Multiple register )
        • Адрес первого регистра хранения для записи (16 бит)
        • Количество регистров хранения для записи (16 бит)
        • Количество передаваемых байт данных для регистров (8 бит)
        • Данные (16 байт на регистр)
        • Адрес первого регистра хранения (16 бит)
        • Количество записанных регистров хранения(16 бит)

        Коды исключений (ошибки) Modbus

        Если запрос не может по той или иной причине быть обработан устройством-сервером, то в ответ он отправляет сообщение об ошибке. Соообщение об ошибке содержит адрес Modbus-устройства, код функции, при выполнении которой произошла ошибка, увеличенный на 0x80, код ошибки и контрольную сумму:

        Транзакция завершилась с ошибкой

        В этом случае мы попытались обратиться к несуществующему адресу регистра 0xFFFF и попытались прочесть 8 регистров флагов. В результате мы получили код ошибки 0x03 — «В поле данных передано неверное значение».

        Наиболее распространенные коды ошибок Modbus приведены в следующей таблице:

        Код ошибки Название ошибки Что означает
        1 Illegal Function В запросе был передан недопустимый код функции
        2 Illegal Data Address Указанный в запросе адрес не существует
        3 Illegal Data Value Неверный формат запроса, например количество байт в запросе не соответствует ожидаемому.

        Примечание: несмотря на название, эта ошибка не говорит о том, что само значение регистра неправильное или ошибочное, и должна использоваться только для ошибок формата запроса.

        4 Server Device Failure Произошла невосстановимая ошибка на устройстве при выполнении запрошенной операции
        5 Acknowledge Запрос принят, выполняется, но выполнение потребует много времени; необходимо увеличить таймаут.
        6 Server Device Busy Устройство занято обработкой предыдущего запроса.
        7 Negative Acknowledge Устройство не может выполнить запрос, необходимо получить от устройства дополнительную диагностическую информацию. Возможно, требуется тех. обслуживание.
        8 Memory Parity Error Ошибка четности при обращении к внутренней памяти устройства.

        Вычисление контрольной суммы Modbus

        Для протокола Modbus RTU 16-битная контрольная сумма (CRC) вычисляется по алгоритму, описанному в спецификации Modbus, в документе «Modbus Serial Line Protocol and Implementation Guide», раздел «CRC-generation». Передающее устройство формирует два байта контрольной суммы на основе данных сообщения, а принимающее устройство заново вычисляет контрольную сумму и сравнивает с полученной. Совпадение принятой и вычисленной контрольной суммы Modbus RTU считается индикатором успешного обмена данными.

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

        Расширение протокола Modbus от Wiren Board

        Мы производим устройства, которые работают по стандартному протоколу Modbus RTU. Но протокол очень старый и имеет ряд недостатков, которые мы решили устранить с помощью своего расширения протокола.

        Всё описываемое ниже справедливо только для Modbus-устройств Wiren Board.

        Торговое название расширения протокола «Быстрый Modbus».

        Настраиваемое время задержки ответа устройством

        Устройства работают по стандарту, поэтому отвечают master-устройству через 3.5 символа после конца кадра запроса.

        Но некоторые сторонние master-устройства могут не соблюдать стандарт и после отправки запроса продолжают удерживать приемопередатчик в режиме отправки некоторое время.

        В устройствах есть специальный регистр 113, в котором можно настроить время ответа slave-устройства в миллисекундах. Нужное значение подбирается опытным путём.

        Стопбиты

        Устройства всегда ожидают от мастера 1 стопбит, а отправляют ответ с 2.

        Благодаря этому невозможно неправильно настроить стопбиты в master- и в slave-устройстве. Передача ответов более надежная даже, если мастер ожидает 1 стопбит. В последних прошивках настройка стопбита в регистре 112 игнорируется.

        Режим сплошного чтения регистров

        Часто на устройствах регистры расположены с зазором, который не позволяет читать все необходимые регистры подряд одной командой.

        Мы добавили режим сплошного чтения, который активируется записью 1 в регистр 114. При активации можно запрашивать любой регион, который укладывается по длине в ограничения команды чтения.

        При таком запросе устройство вернёт пакет со значением регистров. Если регистры отсутствуют в устройстве, то для них будет возвращено значение 0xFFFE.

        Сканирование устройств на шине

        Обычно инсталляция содержит несколько slave-устройств в щите или в поле на одной шине RS-485. Каждое устройство имеет адрес, который пользователь может менять. Обычно при монтаже адреса slave-устройств переписываются с корпуса устройства и вносятся вручную в конфигурацию мастера. Это не очень удобно.

        Раньше для сканирования шины использовался специальный скрипт, который перебирал все возможные адреса на шине и ждал от них ответа в течение определённого времени. Процесс занимал несколько минут и зависел от настроек связи устройств: скорости, стоповых битов и т.п.

        В расширении протокола мы добавили возможность быстро сканировать шину без необходимости выжидать таймаут для каждого несуществующего адреса. Более того, при сканировании могут быть обнаружены устройства с одинаковыми адресами, которым можно задать новые адреса не отключая устройства от шины! Также функция сканирования способна обнаружить на одной шине устройства с разными настройками связи.

        Теперь можно собрать щит не обращая внимания на modbus-адреса устройств. В процессе сканирования будут прочитаны модели устройств, настройки связи, их серийные номера и адреса на шине. Притом, вы можете изменить адреса подключённых устройств, обращаясь к устройству по уникальному серийному номеру.

        Описание расширенных команд и референсная реализация утилиты сканирования доступны в репозитории.

        Поддержка быстрого Modbus в прошивках

        Устройство Версия прошивки с поддержкой «быстрого Modbus»
        WB-MRx, WB-MWAC 1.19.0
        WB-MDM3 2.6.0
        WB-LED, WB-MRGBW-D 3.2.0
        WB-MSx, WB-MSWx, WB-MIR, WB-M1W2 4.23.0
        WB-MAI11 не поддерживается
        WB-MAI6 2.0.0
        WB-MAO4 2.2.0
        WB-MAPx 2.4.0
        WB-MIO 1.6.0
        WB-REF-U 1.4.0
        WB-REF-DF 1.1.0

        megavolt86 писал(а):А разве не к определенному регистру надо обращаться?
        Судя по скриншотам непонятно какой запрос отсылается и какие регистры принимаются.

        С чего вы взяли? На первой картинке идёт запрос к устройству 0х02 по функции чтения 0х03 на чтение по адресу 0х071В регистров в количестве 1шт. Ответ — 0х0000.
        На втором запрос к тому же устройству, той же функцией, регистр опять же 1шт, но по адресу 0х0000. Ответ нормальный. Что вам тут «непонятно»?

        megavolt86 писал(а):
        Или для этих устройств какойто свой модбас?)
        Если есть таблица регистров параметров частотника то к нужным регистрам просто обращаетесь с панели…не?)

        Обычный вполне. Таблица вообще не важна пока. Проблемы на канальном уровне.
        Вы бы хоть немного вникли, прежде чем первое, что в голову пришло, писать.

        Alex question писал(а):Я конечно не специалист в этих делах,

        Так и не пишите

        Alex question писал(а):
        Могу посоветовать для начала изменить запрос. В данный момент вы запрашиваете кучу регистров и в этом ответе очень сложно разобраться что же пошло не так. Может где то вылазит за адресное пространство.

        Откуда вы это взяли? Запрашивается ОДИН регистр по функции 0х03. Вникнете хоть немного, прежде чем писать.

        Alex question писал(а):
        Далее на всякий случай нужно убедиться, что устройство поддерживает третью команду. Потому что иногда бывает так что поддерживается только четвертая команда, а на третью шлются ошибки (и наоборот кстати).

        Поддерживает. См. рисунок 1 и комментарий к нему (над рисунком. первое же предложение ТС)

        Андрей Васильевич, давайте подведём некоторые итоги и зафиксируем, что имеем. Я перечислю ряд утверждений и экспериментов. Подтвердите их или опровергните. Пожалуйста, каждое в отдельности. Пункты ниже. А пока я опишу, в чём я считаю проблема. И почему нужно провести описанные ниже эксперименты. Проблема точно на уровне RS485 (интерфейса), не на уровне протокола. Такое ощущение, что идёт рассогласование по частоте. Смотрите, когда идёт нормальный запрос, его начало — 02 03. В мусоре мы видим 02 06. Это значит, что второй байт сдвинулся на один бит. А потом вообще выделился несуществующий 0х3F. Почему 02 корректный? Потому что он идёт после паузы на линии и все устройства синхронизированы. Дальше по мере передаче это рассогласование в 1 бит на на дайте накапливается. Что мне не понятно, так это почему при запросу панель < — > РС, байты запроса выделяются корректно, а при работе панель < — > ПЧ тот же запрос распознаётся с мусором. Даже сквозь мусор видно, что ПЧ не вопринимает запрос и не отвечает на него, хотя от РС отвечал. Я думаю, что нужно более тщательно рассмотреть параметры передачи (скорость, битность, чётность). Либо это электрические проблемы и перекоммутация как-то влияет на сеть. Пункты ниже направлены именно на то, чтобы прояснить эти моменты.

        Расскажу пока случай который у нас был с Модбасом совсем недавно. Обнаружили, что один из слейвов некорректно отвечает на запросы чтения, если в них запрашивается более (не помню точно, пусть будет какая то примерная цифра) 5 регистров. Стали выяснять. Оказать, что производители это слейва, AEG к слову, поставил кварц, тактирующий центральный микропроцессор на с базовой частотой RS, например, 8.192. А с округлённой, например, 10. И получилось, что частота при делении получается не точно, скажем 9600, а чуть другая. И это «чуть» накапливается и в итоге при продолжительной непрерывной передаче выливается в рассинхронизацию. Мы это обошли более короткими запросами. Но осадок остался и общая производительность шины упала. Это не ваш случай. У вас идут проблемы уже на втором байте. Но что-то похожее. Я думаю стопы или 7/8.

        1) Сеть RS485, 2 провода. В неё подключены: панель (выступает Modbus мастером), ПЧ (всегда Modbus слейв с адресом 0х02), РС для проверки (в общем случае только слушает, в ряде экспериментов выступает мастером вместо панели). «+» всех 3-х устройств RS485 подключены вместе. «-» всех 3-х устройств RS485 подключены вместе.
        2) на всех устройствах параметры передачи (скорость, битность, стоп и чётность) задаются непосредственно в настройках. Нет авто определения.
        3) Расстояния сети небольшие, ПЧ не вращает двигателем, Влияние помех можно исключить.
        4) Я рекомендую проводить эксперименты не перебирая цепь сети. Возможно подключая для прослушки РС вы как то нарушаете обмен. В теории подключение в режиме прослушки не должно влиять на сеть (ну, то есть конечно может, но не при таких расстояниях и скоростях). Я рекомендую, назначить ПЧ адрес 0х02 (как сейчас), а РС, когда он прикидывается слейвом 0х04, это позволит проводить эксперимент панель < — > РС без отключения ПЧ. Для проведения эксперимента РС < — > ПЧ, с исключением панели можно попробовать залить в неё проект без опроса какого-либо подчинённого (не уверен, что при этом панель не будет гадить в линию).
        5) вы провели эксперимент: РС опрашивал ПЧ. Всё было впорядке, он отвечал. Это так?
        Я прошу повторить эксперимент, следуя рекомендации п.3. И выложите, пожалуйста, результаты. Прошу запрашивать, как вы и делали ранее, один регистр, но по одному и тому ж адресу всегда (например, 0х0000), чтобы исключить разночтения. Плюс в этом случае CRC будет одно и та же это упростит разбор, когда пойдёт каша. Когда выкладываете принтскрин, путь там будет только этот экспериметн. Видите люди путаются, не заставляйте нас выцеплять крупицы результатов и объёмных картинок.
        6) В проводили эксперимент: Панель опрашивала РС (он прикидывался слейвом). Всё было в порядке, РС отвечал. Это так?
        Я прошу повторить эксперимент, следуя рекомендации п.3. И выложите, пожалуйста, результаты с учётом замечаний по п.4.
        7) вы провели эксперимент: панель опрашивал ПЧ. РС в режиме прослушки линии. Тут панель сообщает, что связи нет. В прослушке видны какие-то постоянно появляющиеся 3F. Это так?
        Я прошу повторить эксперимент, следуя рекомендации п.3. И выложите, пожалуйста, результаты с учётом замечаний по п.4.
        8) вы пробовали менять формат передачи: количество стоп бит и чётность. Результаты по пп. 4,5,6 без изменений. Это так?. Выложите, пожалуйста, результаты «с мусором». Мусор по прежнему это 3F или другой. Он стоит в тех же местах или других? По прежнему запрос идёт 02 06, вместо 02 03? Нужны принт скрины результатов.
        Уверены ли вы, что параметры передачи на всех трёх устройствах действительно меняются (некоторые устройства нужно перегрузить по питанию, чтобы они восприняли изменение параметров передачи по сети. Относительно этого нужно свериться с инструкцией. У ПЧ очень большой внутренний конденсатор. и полное его отключение нужно контролировать по лампе CHARGE)?
        9) попробуйте, пожалуйста, изменить скорость на 19200 и 4800. И провести эксперименты по пп 4,5,6. Я думаю в одном из этих экспериментов, 3F, будет заменено на 7F или 1F. вопросы те же, что и в п. 7. Нужны принт скрины результатов.
        10) попробуйте, пожалуйста, при скорости 9600 поставить параметры обмена 7,1,NONE и 7,2,NONЕ. Вопросы такие же как в п.7. Нужны принт скрины результатов.
        11) при параметрах обмена 9600,8,1,NONE, проведите такой эксперимент. Пусть ПЧ будет слейв с адресом 0х02, а РС — слейвом 0х04. Путь панель опрашивает по функции 0х03 один регистр с ПЧ, и один с РС, оба по адресу 0х0000. Выложите пожалуйста принтскрин прослушки. Есть ли связь с панель < — > РС?
        12) при параметрах обмена 9600,8,1,NONE, проведите такой эксперимент. Пусть ПЧ будет слейв с адресом 0х02, и РС — слейвом 0х02. Но ПЧ пока отключите по питанию. Запустите опрос и покажите нормальный обмен. Далее остановите эмулятор слейва на РС (прослушка продалжает работать) и получите «обрыв связи» на панели. Включите питание ПЧ: пошёл мусор? Потом переключите обратно.

        AVeshnik писал(а):

        Совет поставить
        1) 9600,8,2,None, провести опыт
        2) потом 9600,8,2,Odd, провести опыт
        3) убедится, то все терминаторы отключены (их нет).

        Пробовал менять но ничего не дало. В обще в инструкции к ЧП написано что для Modbus RTU надо выбрать определенный параметр и когда я подключал ЧП к компу действительно только с ним связь и устанавливалась.

        Не очень понятно, что значит «ЧП написано что для Modbus RTU надо выбрать определенный параметр и когда я подключал ЧП к компу действительно только с ним связь и устанавливалась.». Поясните пожалуйста, о каких параметрах идёт речь?

        Alex.

        Во время обмена
        данными могут возникать ошибки двух
        типов:

        • ошибки, связанные
          с искажениями при передаче данных;

        • логические ошибки.

        Ошибки первого
        типа обнаруживаются при помощи фреймов
        символов, контроля чётности и циклической
        контрольной суммы CRC-16-IBM
        (используется число-полином
        = 0xA001).

        Rtu фрейм

        В RTU режиме сообщение
        должно начинаться и заканчиваться
        интервалом тишины — временем передачи
        не менее 3.5 символов при данной скорости
        в сети. Первым полем затем передаётся
        адрес устройства.

        Вслед за последним
        передаваемым символом также следует
        интервал тишины продолжительностью не
        менее 3.5 символов. Новое сообщение может
        начинаться после этого интервала.

        Фрейм сообщения
        передаётся непрерывно. Если интервал
        тишины продолжительностью 1.5 возник во
        время передачи фрейма, принимающее
        устройство должно игнорировать этот
        фрейм как неполный.

        Таким образом,
        новое сообщение должно начинаться не
        раньше 3.5 интервала, т.к. в этом случае
        устанавливается ошибка.

        Немного об интервалах
        (речь идёт о Serial Modbus RTU): при скорости
        9600 и 11 битах в кадре (стартовый бит + 8
        бит данных + бит контроля чётности +
        стоп-бит): 3.5 * 11 / 9600 = 0,00401041(6), т.е. более
        4 мс; 1.5 * 11 / 9600 = 0,00171875, т.е. не более 1 мс.
        Для скоростей более 19200 бод допускается
        использовать интервалы 1,75 и 0,75 мс
        соотвественно.

        Логические ошибки

        Для сообщений об
        ошибках второго типа протокол Modbus RTU
        предусматривает, что устройства могут
        отсылать ответы, свидетельствующие об
        ошибочной ситуации. Признаком того, что
        ответ содержит сообщение об ошибке,
        является установленный старший бит
        кода команды. Пример кадра при выявлении
        ошибки ведомым устройством, в ответ на
        запрос приведён в (Таблица 2-1).

        1. Если Slave принимает
        корректный запрос и может его нормально
        обработать, то возвращает нормальный
        ответ.

        2. Если Slave не
        принимает какого либо значения, никакого
        ответа не отправляется. Master диагностирует
        ошибку по таймауту.

        3. Если Slave принимает
        запрос, но обнаруживает ошибку (parity,
        LRC, or CRC), никакого ответа не отправляется.
        Master диагностирует ошибку по таймауту.

        4. Если Slave принимает
        запрос, но не может его обработать
        (обращение к несуществующему регистру
        и т.д.), отправляется ответ содержащий
        в себе данные об ошибке.

        Направление
        передачи

        адрес
        подчинённого устройства

        номер
        функции

        данные
        (или код ошибки)

        CRC

        Запрос
        (Master→Slave)

        0x01

        0x77

        0xDD

        0xC7
        0xA9

        Ответ
        (Slave→Master)

        0x01

        0xF7

        0xEE

        0xE6
        0x7C

        Таблица
        2-1. Кадр ответа (Slave→Master) при возникновении
        ошибки modbus RTU

        Стандартные коды ошибок

        01
        Принятый код функции не может быть
        обработан на подчиненном.

        02
        Адрес данных указанный в запросе не
        доступен данному подчиненному.

        03
        Величина содержащаяся в поле данных
        запроса является не допустимой

        величиной
        для подчиненного.

        04
        Невосстанавливаемая ошибка имела место
        пока подчиненный пытался выполнить

        затребованное
        действие.

        05
        Подчиненный принял запрос и обрабатывает
        его, но это требует много времени.

        Этот
        ответ предохраняет главного от генерации
        ошибки таймаута.

        06
        Подчиненный занят обработкой команды.

        Главный
        должен повторить сообщение позже, когда
        подчиненный освободится.

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

        Этот
        код возвращается для неудачного
        программного запроса, использующего

        функции
        с номерами 13 или 14.

        Главный
        должен запросить диагностическую
        информацию или информацию об

        ошибках
        с подчиненного.

        08
        Подчиненный пытается читать расширенную
        память, но обнаружил ошибку паритета.

        Главный
        может повторить запрос, но обычно в
        таких случаях требуется ремонт.

        Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]

        • #
        • #
        • #
        • #
        • #
        • #
        • #
        • #
        • #
        • #
        • #

        Протокол Modbus RTU компании Modicon поддерживают многие
        фирмы-производители контроллеров . Протокол
        предполагает одно активное устройство в линии ( master), которое
        может обращаться к нескольким пассивным (slave). Синтаксис команд протокола позволяет адресовать 254
        устройства, соединенных в одну линию. 

        Возможно применение протокола modbus в дуплексных и
        полудуплексных линиях связи. Физическим уровнем протокола modbus как правило
        является линия стандарта RS422/RS485,
        однако при соединении точка-точка тот же
        формат команд может быть использован на любом последовательном асинхронном
        физическом интерфейсе, в том числе RS232. Возможно применение протокола modbus в
        сетевой среде поверх транспортных протоколов UDP/TCP и IPX/SPX.

        Протокол modbus подразумевает наличие в линии только одного
        ведущего устройства (master) и множества подчиненных устройств
        (slave). Инициатива проведения обмена всегда исходит от ведущего устройства, которое подает запрос (определенная последовательность байт) в линию и переходит в состояние прослушивания линии
        связи. Ведомое устройство отвечает на запрос, пришедший в его адрес.

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

        Кадры запроса и ответа по протоколу modbus имеют формат, приведенный в ( Таблица
        1-1).

        Таблица
        1-1. Кадр
        посылки
        modbus

        Поле кадра

        Длина в байтах

        адрес подчиненного устройства

        1

        номер функции

        1

        Данные

        N < 254

        контрольная сумма

        2

        адрес подчиненного устройства — первое однобайтное поле
        кадра. Оно содержит адрес подчиненного устройства, к которому адресован запрос.
        Подчиненные устройства отвечают только на запросы, поступившие в их адрес. Ответ
        также начинается с адреса отвечающего устройства. Может изменяться от 1 до 254;

        номер функции — это следующее однобайтное поле кадра. Оно
        говорит подчиненному устройству, какие данные или выполнение какого действия
        требует от него ведущее устройство;

        данные — поле содержит информацию необходимую
        подчиненному устройству для выполнения заданной мастером функции или содержит
        данные передаваемые подчиненным устройством в ответ на запрос ведущего. Длина и
        формат поля зависит от номера функции;

        контрольная сумма — заключительное двухбайтное поле
        кадра, содержащее циклическую контрольную сумму CRC-16 всех предыдущих полей
        кадра. Контрольная сумма завершает кадры запроса и ответа.

        Во время обмена данными могут возникать ошибки двух типов.
        Первый тип — это ошибки, связанные с искажениями при передаче данных. Второй тип
        – логические ошибки.

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

        Для сообщений об ошибках второго типа протокол Modbus RTU
        предусматривает, что устройства могут отсылать ответы, свидетельствующие об
        ошибочной ситуации. Признаком наличия сообщения об ошибке,
        является установленный старший бит кода команды. Кадр ответа с ошибкой приведен
        в ( Таблица
        1-2).

        Таблица
        1-2. Кадр ответа с ошибкой modbus

        Сетевой адрес

        Код команды

        Код ошибки

        CRC — код

        01

        81

        02

        C1 91

        Могут быть отправлены ответы, имеющие следующие коды (Таблица
        1-3):

        Таблица
        1-3. Коды
        ошибок
        modbus.

        Код ошибки

        Название

        Комментарий

        01

        ILLEGAL FUNCTION

        Команда не реализована (недопустимый номер функции)

        02

        ILLEGAL DATA ADDRESS

        Некорректный адрес

        03

        ILLEGAL DATA VALUE

        Некорректные данные

        04

        FAILURE IN ASSOCIATED DEVICE

        05

        ACKNOWLEDGE

        Данные не готовы

        06

        BUSY, REJECTED MESSAGE

        Система занята

        07

        NAK-NEGATIVE ACKNOWLEDGMENT

        08

        MEMORY PARITY ERROR

        В протокол Modbus можно выделить несколько подмножеств команд (
        Таблица
        1-4).

        Таблица
        1-4.
        Подмножества команд
        modbus.

        Подмножество команд

        Диапазон кодов команд

        Стандартные команды

        1-21

        Резерв для расширенных функций

        22-64

        Пользовательские

        65-119

        Резерв для внутренних нужд

        120-255

        Ремонт преобразователей частоты

      • Mod organizer 2 не удалось запустить loot код ошибки 0x1
      • Mod manager total war attila выдает ошибку
      • Mod io ошибка 401
      • Mod conflict detector ошибка загрузки файлов
      • Mocom автоклав ошибка a360