Holding registers modbus что это
Перейти к содержимому

Holding registers modbus что это

  • автор:

Modbus-устройства

Настройка Modbus  в  АСУД.SCADA может быть выполнена двумя способами:

  • регистрация устройства непосредственно  в Tekon OPC-сервер
    • это новый способ доступный с версии АСУД.SCADA 2.6.3
    • целесообразно использовать на всех новых объектах где добавляются Modbus-устройства
    • при этом варианте не используется БД original.gdb все настройки выполняются непосредственно в ОРС-сервере
    • поддерживается практически полный фунционал настройки, аналогичный ASUDBase
      • исключение — возможность выполнить запись в регистр по другому адресу (отличному от адреса чтения) доступна пока только при регистрации в ASUDBase
      • целесообразно использовать, если у вас уже есть Modbus-устройства, зарегистрированные в программе ASUDBase
      • опрос осуществляется программой KCSLogger

      Данная статья ориентируется на настройку Modbus-устройств непосредственно в OPC-сервере версии 2.7.2 (и выше) и не расматривает возможность настройки устройств в программе ASUDBase

      Если, по каким-то причинам вы планируете выполнять настройку устройств в программе ASUDBase, либо  в АСУД.SCADA 2.5.х и ранее , а также настройку Modbus c конценратором  КЦС-М смотри предыдщую редакцию статьи.

      АСУД-248 позволяет реализовать взаимодействие с ЛЮБЫМИ устройствами, поддерживающимипротокол Modbus.

      Modbus-устройства могут быть подключены к концентраторам:

      • КЦС-IPM / КУН-IPM
      • КЦС-М (есть ограничения в типе поддерживаемых устройств, подробнее см. тут)
      • напрямую по компьютерной сети.

      Тракт передачи данных:

      Поддерживаются спецификации Modbus-RTU, Modbus TCP
      Чтение данных одиночное, групповое
      Запись данных одиночная
      Число подключаемых устройств до 255* на каждом интерфейсе

        * — подробнее см. спецификацию подключаемого устройства и интерфейса подключения.

      • Требуется наличие USB-ключа защиты АСУД.SCADA.
        В ключе защиты ПО АСУД.SCADA должно быть прописано число драйверов EXT-модуля, соответствующее общему числу подключаемых приборов.
        Для тестового опроса устройства в конфигураторе ОРС-сервера драйвер не требуется.
      • Следует придерживаться следующего правила при адресации Modbus-устройств: устройства, подключаемые к одному IP-концентратору должны иметь уникальные адреса (RS-идентификаторы).

      Прямое подключение по компьютерной сети

      Тракт передачи данных:

      Остальное аналогично случая подключения к КЦС-IPM / КУН-IP, рассматриваемому далее

      Modbus-протокол. Общая информация

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

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

      Есть несколько модификаций данного протокола:

      • Modbus RTU
      • Modbus TCP
      • Modbus ASCII (в настоящее время не поддерживается в АСУД-248)

      Само слово «Modbus» — ничего не говорит об интерфейсе между устройствами.

      Протокол Modbus может работать поверх интерфейсов RS-485/RS-232, компьютерной сети и других.

      С точки зрения доступа к данным устройство Modbus представляет собой таблицу, примерно следующего вида

      Адрес регистра Атрибуты Параметр Значение
      1 R/W, Целое число Уставка температуры 15
      2 R, Целое число * 10 Температура наружного воздуха -156
      301 R, Дробное число Частота сети 49,8
      • Адрес регистра — уникальный идентификатор параметра, по которому осуществляется запрос значения параметра
        Идентификатор находится в диапазоне 0 .. 65536.
      • Атрибуты — атрибуты параметра
        • R — параметр можно читать
        • W — параметр можно записывать
        • Целое число — параметр представляет собой целое число
        • Целое число * 10 — параметр следует разделить на 10 для получения реального значения
        • Дробное число — параметр представляет собой дробное число

        Для некоторых типов Modbus-устройств, например: свободно программируемых контроллеров, таблица может зависеть от проекта, зашитого в контроллер.
        Т.е. может быть сформирована в штатном ПО контроллера только после создания файла-проекта (см. например PIXEL).

        Все регистры Modbus-устройства доступные на чтение / запись условно хранятся в 4-х таблицах:

        (см. параметр AW далее)

        • это ячейка размером в 2-байта.
        • имеет уникальный адрес.

        В зависимости от типа Modbus-устройва адресное пространство таблиц может быть объединено, т.е.  регистр с адресом 0 в таблице HoldReg, аналогичен (полностью соответствует) адресу 0 в таблице InpReg (это можно понять либо из документации, либо при тестовом опросе устройства).

        Если вы затрудняетесь с тем, какой тип регистра указывать — используйте HoldReg.

        Иногда в документации на устройство можно увидеть, что адреса регистров  обозначаются 6-ти значными числами: логическими адресами. 

        Старшая цифра логического адреса при этом обозначает тип регистра, а остальные цифры — физический адрес регистра.

        Старшая цифра логического адреса Начальный логический адрес Тип данных
        0 000001 Coil
        1 100001 DiscInp
        3 300001 InpReg
        4 400001 HoldReg

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

        Например: логический адрес = 40568

        • Тип регистра 4 = HoldReg
        • Физический адрес регистра = 568 — 1 = 567

        Замечание!
        При регистрации устройства единицу все время вычитать не нужно, вы просто указываете в настройках устройства значение базового регистра = 1.

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

        Поддерживаются следующие типы данных:

        Может быть использован для выделения сигнала из битовой маски, которая записана в регистре.
        Из регистра будет считано целое число, затем в этом числе будет проаназирован указанный бит.
        Номер анализируемого бита указывается в настройке Блок / Бит
        Если в регистр будет производится запись, то предварительно прочитается текущее значение регистра, выполнится установка или сброс указанного бита, и далее полученное значение будет записано в регистр.

        Signed byte,
        Short Integer

        Целые числа -2147483648..2147483647

        (запрашиваемое число регистров будет равно половине указанному)

        Также важен формат представления числа в регистре. Он определяет порядок перестановки полу-байт в регистрах.

        Обычное значение поля Формат:

        • Для типов данных в 1 регистр — 1
        • Для типов данных в 2 регистра — 4 (или значение 2)
        • Для типов в 4 регистра — 14 (или значение 12) 
          Для данного типа существуют дополнительные значения формата с 11 до 14:
          • формат с 1 до 4 — дополнительно меняют местами левые-правые 2-регистра
          • формат с 11 до 14 — аналог 1 — 4, но не выполняется перестановка.

          Если при успешном опросе устройства, вы получаете в регистрах непонятные значения, попробуйте поменять Формат.

          Комментарий по полю Формат (при первом чтении данный раздел можно пропустить).

          Рассмотрим пример влияния значения поля Формат на вычисленный результат (см. программу KCS DEMO).

          Предположим мы считываем целочисленное значение типа INTEGER (целое число, занимающее 2 регистра = 4 байта данных), по начальному адресу, например: 2054 (0x0806). Пусть нам известно, что в этом регистре должно хранится значение = 0х12345678 (значение в 16-ричной кодировке или 305419896 в привычной нам 10-ричной кодировке,  преобразование вы можете выполнить в калькуляторе Windows).

          Значения регистров передаются начиная с указанного адреса, по два байта на регистр, старший байт каждого регистра передаётся первым.

          • 0х12 0х34 — первый регистр ( адрес 2054); байты 3, 2
          • 0х56 0х76 — второй регистр ( адрес 2055); байты 1, 0

          Т.е. для регистров устройства данного типа корректное значение формата — 4.

          Предположим мы считываем целочисленное типа WORD, которое хранится в 1-м регистре (2 байта данных) по адресу, например: 2. Пусть мы значение что значение — 0х08.

          Полученные данные
          последовательность байт
          Формат Правило перестановки Результат
          00 08 1 1_0 0x0008
          00 08 2 0_1 0x0800

          Т.е. для регистров устройства данного типа корректное значение формата — 1.

          Регистрация Modbus-устройств в Tekon OPC-сервер

          Добавьте Modbus-устройство в конфигурациюOPC-сервера.
          Если Modbus-устройство было зарегистрировано в программе ASUDBase, вы можете создать конфигурационный файл сервера, нажав в окне настройки Modbus-устройства в ASUDBase кнопку Экспорт.

          Если устройство подключено

          • напрямую по компьютерной сети
            • Добавьте DA \ Компьютерная сеть \ Modbus TCP
            • Добавьте DA \ Концентратор  КЦС-IPM или  КУН-IPM \ Modbus RTU
            • Добавьте DA \ IP-RS преобразователь \ Modbus RTU

            Modbus opc 1.PNG

            Выполните двойной клик на созданном устройстве.

            Modbus OPC 1 1.PNG

            Если вы выбрали Да — следует указать в латинице имя устройства, например: pixel

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

            Modbus opc 2.PNG

            На рисунке отображен пример окна настройки устройства, подключенного к концентратору КЦС-IPM, КУН-IPM.

            Для каждой ячейки доступна информационная подсказка (хинт).

            Строки имеют следующий смысл:

            1. название столбцов таблицы
            2. тип протокола устройства [RTU, TCP]
              Если вы подлючаете устройство по RS-485, то почти всегда это RTU-протокол. Если по компьютерной сети — TCP.
            3. поля конфигурации устройства
              1. 0 — базовый регистр, указывает сдвиг регистров при запросе (обычно 0 или 1)
              2. 1 — количество регистров читаемых в одном запросе, по умолчанию 1.
                Большее значение параметра увеличивает скорость опроса устройства. 
                Но имеет смысл, если запрашиваемые регистры идут подряд.
                Если в документации не указано сколько можно читать — попробуйте указать 10 и провести тестовой опрос устройства.
                Если ошибок нет — оставляйте указанное значени. Иначе верните значение 1.
              3. 0 — не разрешать пропуски при чтении. Допустимые значения [0,1]
                Некоторые устройства позволяют опрашивать несколько регистров, если они расположены неподряд.
                Это также увеличивает скорость опроса устройства.
              4. [0, 1] — стартовый бит в байте, по-умолчанию 1. 

              Для редактирования таблицы следует нажать  Редактировать. 

              При этом по правому клику мышки, доступно меню добавления новых строк.

              Описание столбцов настройки:

              • Регистр — тип регистра из выпадающего меню
              • Адрес - адрес регистра (в десятичной системе счисления)
                Вы можете указывать адрес в 16-ричной кодировке, для этого добавьте в начале знак $. Например: $10, $FA и т.п.
              • Тип данных — тип указанный в документации на устройство
              • Блок/Бит
                • для типа данных BIT, BITInv  указывается анализируемый бит (от 1 до 16) в слове. Бит 1 — младший, 16 — старший.
                • для типа данных BIТ4 указывается анализируемый бит (от 1 до 32) в слове. Бит 1 — младший, 32 — старший.
                • для типа STRING — размер блока данных в байтах (обычно размер строки в документации на устройство указывается кратным двум байтам).
                • для других типов данных - не используется.

                Множитель учитывается для всех типов кроме BIT, BITInv, BOOL, BOOLInv, BIT4, STRING

                Минимальное значение Множителя 0,0001.
                Внимание!
                При указании в качестве Множителя значений 2, 3, 4, 5, 6, 7, 8, 9 — реальное значение множителя определяется по формуле

                • AW  — данный параметр разрешает запись значений в регистр, например для изменения уставок устройства или управления устройством из SCADA. 
                  Актуально только для регистров типа Coils / HoldReg.
                  Возможные значения:
                  0 — запись в регистр запрещена
                  1 — запись в регистр разрешена. Для регистров HoldReg будет использоваться функция $10 для записи
                  6 — для регистров HoldReg будет использоваться функция $06 для записи   (для исп. данного значения требуется доп. обновление для версии 2.7.5)
                  10 -  аналог значения 1. Для регистров HoldReg будет использоваться функция $10 для записи (для исп. данного значения требуется доп. обновление для версии 2.7.5)
                • Тег — имя тега, которое будет отображено в SCADA.
                  Имя тега должно быть уникально в рамках устройства.
                  В имени Тега не следует использовать символ точка.
                • Название — наименование сигнала (неисправности), которое будет отображаться в журнале событий в программе SCADA.

                Для сохранения изменений, нажать кнопку Сохранить.

                Начиная с версии 2.7.14 добавлена поддержка выражений для постобработки считанного из регистра значения, аналогично, как это сделано в функционале Переменных или Тext-функции

                Выражение добавляется в конце поля Название после символа #, например:

                Modbus parseExpr.PNG

                • Регистр65 — это название, которое будет проброшено в SCADA
                • X*10 — это выражение постобработки

                В примере выше, реальное значение регистра равно 8, при этом после постобработки получаем:

                • X * 10  = 8 * 10 = 80
                • BITS(X:1:4) = BITS(8:1:4) = 4

                Постобработка разрешена только для числовых регистров с AW = 0.

                Следует отметить, что: 

                • BITS допускает только полную запись (с указанием Х): BITS(X:1:4),  а не  BITS(1:4);
                • символом разделителем является двоеточие (:), а не точка с запятой (;);
                • при анализе выражения учитывается номер стартового бита в байте (0 или 1), указанный в настройках Modbus-устройства.

                Замечание!
                Начиная с версии 2.7.5 в свойствах Modbus-устройства появилась настройка Дополнительный сдвиг адреса — это настройка может быть применена, например: при регистрации контроллеров сплит-систем, когда адреса регистров внутренних блоков системы кондиционирования сдвинуты относительно общей карты на число, соответствующее номеру внутреннего блока.
                Т.е. вы регистрируете и настраиваете Modbus-устройство с адресами первого блока. Затем добавляете второе Modbus-устройство, указываете файл настроек первого, но дополнительно указываете настройку сдвиг адресов.   

                Замечание!
                Поле Версия устройства — не используется (всегда отображает —)

                Тестовый опрос устройства 

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

                Кнопка Лог  — отобразит лог последнего обмена  данными с устройством. Расшировку кодов возможных ошибок см. в описании программы KCS DEMO.EXE 

                Вы также можете выполнить тестовый опрос одного регистра, нажав правой кнопкой мыши и выбрав меню Опросить.

                Тестовая запись значения регистра

                Если вы указали для регистра значение AW > 0, вы можете выполнить тествую запись непосредственно в окне настройки. 

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

                Нельзя выполнять запись значений для регистров типа:  [mbString, mbDouble, mbINT64, mbBit4]

                Особенности представления значений Modbus-регистров 

                Для настроенных Modbus-регистров ОРС-сервер создает следующие типы сигналов, которые будут доступны в SCADA: 

                • Дискретный сигнал -  если регистр имеет тип BIT (BITInv, BOOL, BOOLInv, BIT4) и AW = 0
                  • в SCADA вы сможете использовать стандартные примитивы типа Дискретный сигнал или LED, Изображение
                  • Вы можете использовать инвертирование дискретного сигнала, если в конце названия Тега допишите _INV, например: «А1_INV»
                    Начиная с версии 2.7.5 вместо _INV — вы можете использовать типы BITInv, BOOLInv.
                  • в SCADA вы сможете использовать стандартные примитивы типа Канал управления или Изображение
                  • при этом подразумевается, что значение регистра может быть только 0 или 1. В противном случае не следует использовать данный тип сигнала

                  Если регистр имеет тип BIT (BITInv, BOOL, BOOLInv, BIT4), но вы не хотите, чтобы сигнал был представлен в SCADA, как дискретный датчик, вам следует:

                  • изменить тип с BIT  (BITInv, BOOL, BOOLInv) на Word  — если регистр может иметь только значения 0,1  (и не представляет собой битовую маску)
                  • изменить тип с BIT4 на DWord  — если регистр может иметь только значения 0,1  (и не представляет собой битовую маску)
                  • или добавить к имени тега «_$», т.е. например: вместо  «Tag1» указать «Tag1_$»

                  Как регистрировать битовую маску ошибок

                  Если, исходя из описания устройства, регистр представляет собой битовую маску ошибок, как его регистрировать? 

                  • 520.01  — авария насоса 
                  • 520.02  — неиспраность датчика температуры 
                  • 520.03  — перепад давления

                  Запись типа 520.01 — означает, что для получения сигнала «Авария насоса» следует прочитать регистр 520  и проверить факт установки в значении регистра 1-го (младшего бита).

                  Т.е в значении  регистра 520  хранится несколько сигнальных (аварийных)  событий. Допустим вы читаете регистр и получаете значение = 5. 

                  Переводим это значение в двоичный код (например, с помощью Калькулятора Windows)  и получаем значение  5 (DEC)  =  101 (BIN),  т.е. в регистре 520  установлены 1 и 3 биты, есть авария насоса и перепад давления.

                  Исходя из этого, следует определить, нужны ли в SCADA все ошибки по отдельности (отдельными примитивами типа Дискретный датчик) или только сигнал обощенной ошибки с текстовым описанием активных ошибок? 

                  Если все по отдельности — то для каждой ошибки делаете отдельную запись в таблице регистров:

                  • Адрес — одинаков
                  • Тип  — BIT, если битовая маска лежит в одном Modbus-регистре  или BIT4 — если в нескольких
                  • Блок/Бит — 1, 2, 3, и т.д  — тот бит, который отвечает за конкретную ошибку 
                  • Название — Название ошибки
                  • В SCADA на каждую ошибку будет отображен свой Дискретный примитив

                  Если достаточно только обобщенной ошибка (т.е. факта того, что есть какая-то ошибка), то региструете только одну запись:

                  • Адрес — адрес битовой маски 
                  • Тип — WORD или DWORD
                  • В SCADA используйте  (подробнее см. ниже)
                    • Переменную для отображения Аварийного сигнала обощенной аварии или примитив LED-индикатор
                    • Текстовое поле + Text-функцию для отображения описания активных ошибок

                    Настройка SCADA

                    В АСУД.SCADA для визуализации данных Modbus-устройств можно использовать следующие примитивы:

                       - быстрая визуализация в табличном виде в одном месте ситуационного плана без визуально-звуковой индикации: 

                      • числовых данных
                      • состояний работы устройства (преобразование числа в надпись с помощью Text-функций)
                      • расшифровка кодов ошибок   (преобразование числа в надпись с помощью Text-функций)

                      Замечание! Для того чтобы реализовать возможность записи введенного пользователем значения в Modbus-устройство, необходимо чтобы:

                      • Регистр  относится к типу HoldReg или Coils
                      • Значение поля AW (Allow Write) было > 0

                      Рассмотрим пример визуализации значения регистра, представляющего собой битовую маску ошибок, если этот регистр был настроен в ОРС-сервере, как числовое значение (а не набор типов BIT).

                      Пример 1. 
                      Необходимо визуализировать с помощью Дискретных примитивов состояние регистра «Авария», где значение регистра представляет собой битовую маску кодов аварий

                      • 1  — авария насоса 
                      • 2  — неиспраность датчика температуры 
                      • 3  — перепад давления

                      Создаем несколько переменных  (по числу аварийный событий), например: 

                      • Имя — 1
                      • Журнал событие — Авария насоса 
                      • Журнал адрес — Котельная
                      • Задержка (с.) — 0
                      • Тип -  ВЫРАЖЕНИЕ
                      • Выражение — BIT (X;1)
                      • Добавлям Тег регистра «Авария»
                      • Имя — 2
                      • Журнал событие — Неиспраность ДТ 
                      • Журнал адрес — Котельная
                      • Задержка (с.) — 0
                      • Тип -  ВЫРАЖЕНИЕ
                      • Выражение — BIT (X;2)
                      • Добавлям Тег регистра «Авария»
                      • Имя — 3
                      • Журнал событие — Перепад давления
                      • Журнал адрес — Котельная
                      • Задержка (с.) — 0
                      • Тип -  ВЫРАЖЕНИЕ
                      • Выражение — BIT (X;3)
                      • Добавлям Тег регистра «Авария»

                      Размещаем на ситуационном плане примтивы типа Дискретный датчик, в настройке Тег вручную указываем  имена переменных VAR.1, VAR.2, VAR.3.

                      Пример 2.  Необходимо визуализировать с помощью Дискретного датчика обобщенную аварию  регистра «Авария» из предыдущего примера.

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

                       Создаем переменную VAR.Total:

                      • Имя — Total
                      • Журнал событие — Авария
                      • Журнал адрес — Котельная
                      • Задержка (с.) — 0
                      • Тип -  <> 0
                      • Добавлям Тег регистра «Авария»

                      Размещаем на ситуационном плане примтив типа Дискретный датчик, в настройке Тег вручную указываем  VAR.Total.

                      Если значение тега «Авария» будет отлично от 0 (т.е. будет установлен флаг любой из аварий), то примтив Дискретный датчик перейдет в сигнальное состоения.

                      При этом расшифроку Аварий, удобно реализовать с помощью  примитивов Таблица Тегов или Текстовое поле, связав их с тегом «Авария» (не переменной, а тегом!),  и создав Text-фукцию (см. пример 3 Функция BITSTR в описании)

                      Протокол Modbus. Обзор, описание и примеры использования.

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

                      Modbus — самый широко распространенный промышленный протокол для организации обмена данными между различными устройствами (межмашинное взаимодействие, Machine-to-Machine, M2M). Популярность объясняется многими факторами, среди которых простота реализации, отсутствие необходимости использовать дополнительные микросхемы, и, конечно же, открытость протокола.

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

                      В то же время протокол Modbus не избавлен от некоторых недостатков:

                      • организация обмена данными по модели ведущий-подчиненный. При этом подчиненное устройство не может само инициировать отправку данных ведущему, а должно в обязательном порядке ожидать запроса.
                      • отсутствует механизм для определения обрыва линии связи.
                      • в одном запросе можно прочитать значения только последовательных регистров. Для чтения произвольных регистров необходимо отправлять несколько запросов, что увеличивает нагрузку на сеть.

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

                      Как уже было упомянуто, протокол Modbus использует обмен данными по модели ведущий-подчиненный (Master — Slave). Ведущий отправляет запросы, на которые могут отвечать подчиненные. Slave-устройство не может само начать обмен данными, только по команде от master’a.

                      В качестве физического уровня стандарт предусматривает использование интерфейсов RS-232, RS-422 и RS-485. Также существует реализация для TCP/IP — Modbus TCP. Но этот вариант мы сегодня будем затрагивать в меньшей степени.

                      Сеть Modbus может состоять из нескольких slave-устройств (от 1-го до 247-ми), но master должен быть только один. Каждое из подчиненных устройств имеет свой собственный адрес, соответственно, ведущий может адресовать свое сообщение или запрос конкретному slave-устройству.

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

                      На адреса slave накладываются некоторые ограничения:

                      • диапазон допустимых адресов — 1. 247. Значения адресов от 248 до 255 являются зарезервированными, а адрес 0 используется для передачи широковещательных сообщений.
                      • master адреса не имеет, он в сети и так один.
                      • два подчиненных устройства не могут иметь одинаковые адреса.

                      Вот как может выглядеть один из вариантов подключения устройств с использованием RS-485:

                      Пример сети Modbus.

                      Здесь у нас присутствует один master и три slave-устройства с адресами от 0x03 до 0x05.

                      Переходим дальше. Различают несколько логических уровней протокола:

                      Двоичный вариант кодирования данных. Разделителем между пакетами служит временной интервал. То есть сообщение должно начинаться и заканчиваться паузой в течение определенного промежутка времени. Это время не должно быть меньше, чем время передачи 3.5 символов при использующейся скорости передачи данных.

                      Кроме того, в процессе передачи пакета данных не должно быть пауз длительностью, превышающей время передачи 1.5 символов. Соответственно, Modbus RTU очень критичен к временным задержкам, но зато размер пакетов меньше, чем в Modbus ASCII.

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

                      Начало пакета — ASCII символ «:» (0x3A), конец — «CR + LF» (0x0D + 0x0A).

                      Протокол используется при передаче данных с использованием TCP/IP.

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

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

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

                      В стандарте Modbus принята следующая терминология:

                      • ADU (Application Data Unit) — полный пакет данных.
                      • PDU (protocol data unit) — часть пакета, содержащая непосредственно полезные данные.

                      Для расчета контрольной суммы используются разные алгоритмы: для Modbus RTU — CRC16, для ASCII — LRC8. В обоих случаях под контрольную сумму задействованы два байта.

                      Коды функций можно разделить на три группы:

                      • Стандартные коды команд, описанные в Modbus-IDA.
                      • Задаваемые пользователем (user-defined function codes) — 65. 72, 100. 110. Эти коды не описаны в спецификации стандарта и могут использоваться в конкретных изделиях для собственных функций.
                      • Зарезервированные (reserved). В эту группу входят коды 9, 10, 13, 14, 41, 42, 90, 91, 125, 126 и 127.

                      Но прежде, чем перейти к рассмотрению базовых/стандартных команд, необходимо рассмотреть использующуюся модель данных. Выполнение команд протокола Modbus подразумевает чтение и запись данных в регистры устройства. И различают 4 типа регистров, организованных в 4 таблицы данных:

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

                      Дискретные входы и регистры ввода доступны только для чтения данных, а, соответственно, дискретные выходы и регистры хранения — для чтения и записи.

                      Доступ к регистрам таблицы осуществляется при помощи 16-ти битного адреса. Первому элементу таблицы соответствует адрес 0. Таким образом, каждая из этих 4-х таблиц может включать в себя вплоть до 65536 регистров (адреса 0. 65535 — 16 бит).

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

                      • 0x01 (1) — чтение значений из нескольких регистров флагов — Read Coil Status.
                      • 0x02 (2) — чтение значений из нескольких дискретных входов — Read Discrete Inputs.
                      • 0x03 (3) — чтение значений из нескольких регистров хранения — Read Holding Registers.
                      • 0x04 (4) — чтение значений из нескольких регистров ввода — Read Input Registers.
                      • 0x05 (5) — запись значения одного флага — Force Single Coil.
                      • 0x06 (6) — запись значения в один регистр хранения — Preset Single Register.
                      • 0x07 (7) — чтение сигналов состояния — Read Exception Status.
                      • 0x08 (8) — диагностика — Diagnostic.
                      • 0x0B (11) — чтение счетчика событий — Get Com Event Counter.
                      • 0x0C (12) — чтение журнала событий — Get Com Event Log.
                      • 0x0F (15) — запись значений в несколько регистров флагов — Force Multiple Coils.
                      • 0x10 (16) — запись значений в несколько регистров хранения — Preset Multiple Registers.
                      • 0x11 (17) — чтение информации об устройстве — Report Slave ID.
                      • 0x14 (20) — чтение из файла — Read File Record.
                      • 0x15 (21) — запись в файл — Write File Record.
                      • 0x16 (22) — запись в один регистр хранения с использованием маски «И» и маски «ИЛИ» — Mask Write Register.
                      • 0x18 (24) — чтение данных из очереди — Read FIFO Queue.
                      • 0x2B (43) — Encapsulated Interface Transport.

                      И, конечно же, мы не можем не разобрать конкретные примеры запросов и ответов при работе по Modbus.

                      Протокол Modbus. Примеры команд.

                      Первым делом займемся чтением данных — коды функций 0x01, 0x02, 0x03, 0x04. В общем виде запросы ведущего и ответы подчиненного выглядят следующим образом (здесь мы рассматриваем только часть пакета — PDU):

                      Протокол Modbus, чтение данных.

                      Обратите внимание, что в запросе передается количество элементов(!), то есть ячеек таблиц данных (регистров). А в ответе для указания размера данных используются уже байты. Значения адреса и количество элементов передаются в виде 16-битных слов, при этом старший байт передается первым.

                      Пойдем дальше обобщенного описания формата и проанализируем команды для конкретного устройства. В качестве этого устройства я использую сервопривод серии ASDA-A2, который для обмена данными использует как раз-таки протокол Modbus, причем поддерживает и Modbus RTU, и Modbus ASCII.

                      Пусть нам надо прочитать данные, расположенные по адресам 0x0200 и 0x0201, slave-устройства с адресом 0x01. Запрос master’а для Modbus RTU будет таким:

                      Протокол Modbus RTU, команда чтения, пример запроса.

                      Здесь у нас в запросе, указано, что мы хотим прочитать значение двух элементов (регистров). И ответ slave:

                      Команда чтения, пример ответа.

                      А в ответе уже видим, что прочитано 4 байта, поскольку значение одного регистра — это 2 байта (16 бит), а регистров у нас тоже 2. Таким образом, полученные значения:

                      • Адрес 0x0200 — 0x00B1
                      • Адрес 0x0201 — 0x1F40

                      CRC Low и CRC High — это соответственно младший и старший байты 16-ти битной контрольной суммы.

                      В Modbus ASCII все несколько иначе, запрос выглядит так (в кавычках указаны ASCII символы):

                      ASCII, команда чтения, пример запроса.

                      Протокол Modbus ASCII, команда чтения, пример ответа.

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

                      При чтении битов регистров флагов или дискретных входов запрос выглядит точно также, а вот байты данных ответного сообщения иначе:

                      Чтение регистров флагов или дискретных входов.

                      Здесь одно значение флага или дискретного входа занимает один бит. И все эти биты упакованы в байты, а если число запрошенных флагов/входов не распределяется по байтам (не кратно 8), то «лишние» биты заполняются нулями. Как в последнем байте на этой схеме.

                      Переходим к записи. Для записи одного значения используются команды с кодами 0x05 и 0x06. Запрос в целом похож на уже рассмотренный (при чтении данных), только вместо количества элементов для чтения передаются данные, которые будут записаны:

                      Формат команды записи.

                      При записи значений флагов или дискретных входов число 0xFF00 соответствует включенному состоянию, 0x0000 — выключенному. В случае успешного выполнения запроса подчиненное устройство отправляет ведущему точную копию этого запроса.

                      С этим разобрались �� Но необходимо рассмотреть еще и случай записи нескольких значений (коды команд 0x10 и 0x0F). В общем виде формат запроса такой:

                      Modbus, запись нескольких элементов.

                      И, в обязательном порядке, рассмотрим практический пример. Пусть нам требуется записать значения 0x0BB8 и 0x0000 по адресам, начинающимся с 0x0112. Запрос и ответ Modbus RTU:

                      RTU, команда записи, пример запроса.

                      RTU, команда записи, пример ответа.

                      И для Modbus ASCII:

                      Протокол Modbus ASCII, команда записи, пример запроса.

                      Протокол Modbus ASCII, команда записи, пример ответа.

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

                      Holding registers modbus что это

                      MODBUS это протокол обмена сообщениями уровня приложения, позиционируемый как уровень 7 модели OSI (Open Systems Interconnection). Modbus предоставляет способ обмена данными типа клиент/сервер между устройствами, подключенных к различным типам шин или сетей. Непонятные термины и сокращения см. в разделе «Словарик», в конце статьи.

                      В индустрии широко применяются в основном 2 варианта соединения устройств — последовательный (с 1979 года, на основе RS-232), и через сеть стека TCP/IP, через порт 502.

                      Протокол MODBUS работает по принципу запрос/ответ, и предоставляет службы, определенных функциональными кодами. Функциональные коды MODBUS это элементы запроса/ответа PDU (Protocol Data Unit). Назначение этого документа (перевод спецификации [1]) — описать функциональные коды, используемые в рабочей среде транзакций MODBUS.

                      Как уже упоминалось, MODBUS работает на уровне приложений, для обмена по типу клиент/сервер между устройствами, подключенными к разным типам шин или сетей. В настоящий момент реализованы следующие виды сетей:

                      • TCP/IP over Ethernet [2].
                      • Асинхронное последовательное соединение через различные физические реализации (проводные: EIA/TIA-232-E, EIA-422, EIA/TIA-485-A; оптика, радио, и т. д.).
                      • MODBUS PLUS, высокоскоростная сеть с передачей маркеров (high speed token passing network).

                      MODBUS communication stack fig01

                      Рис. 1. Стек коммуникаций MODBUS.

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

                      MODBUS Network Architecture example fig02

                      Рис. 2: Пример архитектуры сети MODBUS.

                      Каждый тип устройствEvery type of devices (PLC, HMI, панель управления, драйвер, система управления движением, устройство I/O, . ) может использовать протокол MODBUS для инициирования сетевых (дистанционных) операций.

                      Один и тот же обмен данными может быть реализован как через последовательную линию связи (RS-232 и его производные), так и через сети Ethernet TCP/IP. Шлюзы позволяют осуществить коммуникацию между различными типами шин или сетей, используя протокол MODBUS.

                      [4. Общее описание протокола]

                      В протоколе MODBUS определена простая единица обмена данными (Protocol Data Unit, PDU), которая не зависит от нижележащих слоев обмена данными. Отображение протокола MODBUS на определенные шины или сети могут вводить дополнительные поля на единице обмена данных приложения (Application Data Unit, ADU).

                      MODBUS general frame fig03

                      Рис. 3. Основной фрейм MODBUS.

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

                      Поле кода функции элемента данных MODBUS кодируется в одном байте. Допустимы коды в диапазоне 1 .. 255 (диапазон 128 .. 255 зарезервирован, и используется для ответов на исключения). Когда сообщение отправляется от клиента к серверу, поле кода функции говорит серверу, какое действие нужно предпринять. Код функции 0 недопустим.

                      Для некоторых кодов функции добавлены субкоды, чтобы определить несколько действий.

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

                      Поле данных может отсутствовать (иметь нулевую длину) в определенных видах запросов — в этом случае сервер не требует дополнительную информацию. Код функции сам по себе определяет действие.

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

                      Например, клиент может прочитать состояния ON/OFF группы дискретных выходов или входов, или может прочитать/записать содержимое данных группы регистров.

                      Когда сервер отвечает клиенту, он использует поле кода функции, чтобы показать нормальный (безошибочный) ответ, или некоторый вид произошедшей ошибки (это называется ответ исключения, exception response). Для нормального ответа сервер просто как эхо выдает в ответ на запрос оригинальный код функции.

                      MODBUS transaction error free fig04

                      Рис. 4. Транзакция MODBUS (без ошибки).

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

                      MODBUS transaction exception response fig05

                      Рис. 5. Транзакция MODBUS (exception response, в случае ошибки).

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

                      Размер MODBUS PDU ограничен значением, унаследованным от реализации MODBUS на основе проводной последовательной сети (максимум RS485 ADU = 256 байт).

                      https://amdy.su/wp-admin/options-general.php?page=ad-inserter.php#tab-8

                      Таким образом, MODBUS PDU для последовательной линии обмена = 256 — адрес сервера (1 байт) — CRC (2 байта) = 253 байта.

                      RS232 / RS485 ADU = 253 байта + адрес сервера (1 байт) + CRC (2 байта) = 256 байт.
                      TCP MODBUS ADU = 253 байта + MBAP (7 байт) = 260 байт.

                      Протокол MODBUS определяет три вида PDU:

                      • MODBUS Request PDU (PDU запроса), mb_req_pdu .
                      • MODBUS Response PDU (PDU ответа), mb_rsp_pdu .
                      • MODBUS Exception Response PDU (PDU ответа исключения), mb_excep_rsp_pdu .

                      mb_req_pdu определен следующим образом:

                      function_code = [1 байт] код функции MODBUS
                      request_data = [n байт] это поле зависит от кода функции, и обычно содержит информацию, такую как ссылки на переменные, значения счетчиков, смещения данных, коды субфункций и т. п.

                      mb_rsp_pdu определен следующим образом:

                      function_code = [1 байт] код функции MODBUS
                      request_data = [n байт] это поле зависит от кода функции, и обычно содержит информацию, такую как ссылки на переменные, значения счетчиков, смещения данных, коды субфункций и т. п.

                      mb_excep_rsp_pdu определен следующим образом:

                      exception-function_code = [1 байт] код функции MODBUS + 0x80
                      exception_code = [1 байт] код исключения (MODBUS Exception Code), определенный в таблице кодов исключений MODBUS (см. секцию 7 в конце статьи).

                      4.2. Кодирование данных. MODBUS использует big-Endian представление для адресов и элементов данных. Это значит, что если числовое значение использует для кодирования и передачи больше одного байта, то тогда сначала передается самый старший байт (в памяти самый старший байт размещается первым, т. е. по самому младшему адресу). Например, если размер регистра 16 бит, и в нем находится значение 0x1234, то сначала передается байт 0x12, затем 0x34. Подробнее см. [3, 4].

                      4.3. Модель данных MODBUS. MODBUS базируется на модели данных из серии таблиц, обладающих разными характеристиками. 4 главные таблицы следующие:

                      Основные таблицы Тип объекта Режим доступа Комментарии
                      Discretes Input (цифровые входы) Одиночный бит Read-Only (только чтение) Этот тип данных может быть предоставлен подсистемой ввода/вывода.
                      Coils («обмотки», цифровые выходы) Одиночный бит Read-Write (чтение и запись) Этот тип данных программа приложения может изменять.
                      Input Registers (входные регистры) 16-битное слово Read-Only (только чтение) Этот тип данных может быть предоставлен подсистемой ввода/вывода.
                      Holding Registers (регистры хранения) 16-битное слово Read-Write (чтение и запись) Этот тип данных программа приложения может изменять.

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

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

                      Очевидно, что все данные, обрабатываемые через MODBUS (биты, регистры) должны находиться в памяти приложения устройства. Однако физическое размещение в памяти (адрес) не следует путать со ссылкой на данные. The only requirement is to link data reference with physical address.

                      Логические ссылочные номера MODBUS, которые используются в функциях MODBUS, это беззнаковые целочисленные индексы (uint16_t), начинающиеся с 0.

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

                      [Пример 1: в устройстве 4 отдельных блока данных]

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

                      MODBUS Data Model with separate block fig06

                      Рис. 6. Модель данных MODBUS с отдельными блоками.

                      [Пример 2: в устройстве только один блок данных]

                      В этом примере одни и те же данные могут быть доступны через разные функции MODBUS, либо через 16-битный доступ, либо через одноразрядный.

                      MODBUS Data Model with only 1 block fig07

                      Рис. 7. Модель данных MODBUS с одним блоком.

                      Модель адресации MODBUS. Протокол приложения MODBUS точно определяет правила адресации PDU. В MODBUS PDU каждые данные адресуется индексом от 0 до 65535.

                      Также ясно определена модель данных MODBUS, составленная из 4 блоков, каждый из которых пронумерован от 1 до n. Модели данных MODBUS каждый элемент в блоке нумеруется от 1 до n.

                      После этого модель данных MODBUS должна быть связана с приложением устройства (объект IEC-61131, или другая модель приложения). Предварительное отображение между моделью данных MODBUS и приложением устройства полностью определяется его производителем, и зависит от специфики устройства.

                      На рисунке ниже показано, как данные MODBUS с номером X адресованы в MODBUS PDU X-1.

                      MODBUS Addressing model fig08

                      Рис. 8. Модель адресации MODBUS.

                      Транзакция MODBUS. Следующая диаграмма состояний описывает традиционную обработку транзакции MODBUS на стороне сервера.

                      MODBUS transaction state diagram fig09

                      Рис. 9. Диаграмма состояний транзакции MODBUS.

                      Как только запрос был обработан сервером, он строит ответ с адекватной транзакцией MODBUS. В зависимости от результата обработки будет собран один из двух типов ответа:

                      • Положительный ответ MODBUS:
                      — Код функции ответа = коду функции запроса.

                      • Ответ исключения (MODBUS Exception response, см. секцию 7):
                      — Цель ответа предоставить клиенту подходящую информацию, описывающую ошибку, детектированную при обработке запроса.
                      — Код исключения (exception function code) = коду функции запроса + 0x80;
                      — Предоставляет код исключения, показывающий причину ошибки.

                      [5. Категории кода функции]

                      Существует 3 категории кодов функции MODBUS:

                      Публичные коды (Public Function Codes)

                      • Коды функций, которые хорошо определены.
                      • Гарантированно уникальные.
                      • Поддерживаются комьюнити MODBUS-IDA.org.
                      • Документация опубликована.
                      • Доступен тест совместимости.
                      • Включают как публично назначенные коды функций, так и не назначенные коды, зарезервированные для использования в будущем.

                      Пользовательские коды (User-Defined Function Codes)

                      • Два диапазона определяемых пользователем кдов, от 65 до 72 и от 100 до 110.
                      • Пользователь может выбрать и реализовать код функции, который не поддерживается спецификацией.
                      • Нет гарантии, что выбранный код функции будет уникальным.
                      • Если пользователь захочет сменить позиционирование функционала своего кода функции как публичного, он должен инициировать RFC, чтобы внести изменение в публичную категорию, в которой будет назначен новый функциональный код.
                      • Организация MODBUS, Inc явно оставляет за собой право разработки предлагаемого RFC.

                      Зарезервированные коды (Reserved Function Codes)

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

                      Дополнительно см. Приложение A «Зарезервированные коды MODBUS, субкоды и типы MEI» в конце этой документации.

                      MODBUS Function Code Categories fig10

                      Рис. 10. Категории кодов функции.

                      Публичные коды функций:

                      Функция Коды функций HEX Секция
                      Код Субкод
                      Данные Доступ
                      к битам
                      Физические дискретные
                      входы, внутренние биты
                      или физические выходы
                      («обмотки», coils)
                      Read Coils 01 01 6.1
                      Read Discrete Inputs 02 02 6.2
                      Write Single Coil 05 05 6.5
                      Write Multiple Coils 15 0F 6.11
                      16-битный
                      доступ
                      Физические входные регистры Read Input Registers 04 04 6.4
                      Внутренние регистры
                      или физические
                      выходные регистры
                      Read Holding Registers 03 03 6.3
                      Write Single Register 06 06 6.6
                      Write Multiple Registers 16 10 6.12
                      Read/Write Multiple Registers 23 17 6.17
                      Mask Write Register 22 16 6.16
                      Read FIFO queue 24 18 6.18
                      Файл Доступ к элементам файла Read File record 20 14 6.14
                      Write File record 21 15 6.15
                      Диагностика Read Exception status 07 07 6.7
                      Diagnostic 08 00-18, 20 08 6.8
                      Get Com event counter 11 0B 6.9
                      Get Com Event Log 12 0C 6.10
                      Report Slave ID 17 11 6.13
                      Read device Identification 43 14 2B 6.21
                      Другое Encapsulated Interface Transport 43 13, 14 2B 6.19

                      [6. Описания кодов функции]

                      6.1. 01 (0x01) Read Coils

                      Этот код функции используется для чтения от 1 до 2000 смежных состояний обмоток в сетевом устройстве. Запрос PDU задает начальный адрес, т. е. адрес первой обмотки, и количество обмоток. В PDU обмотки адресуются от нуля. Таким образом, обмотки с номерами 1 .. 16 адресуются как 0 .. 15.

                      Обмотки в сообщении ответа упакованы как один бит поля данных на обмотку. Состояние включено (ON) определяется лог. 1 бита и выключено (OFF) лог. 0. LSB первого байта данных содержит выход, адресованный в запросе. Другие обмотки следуют по битам дальше, к более старшим битам до конца байта, и снова начинаются с младшего бита дальше, в последующих байтах.

                      Если возвращаемое количество выходов не делится нацело на 8, то оставшиеся биты последнего байта данных будут дополнены нулями (в направлении к старшим битам, до конца байта). Поле количества байт (Byte Count) указывает количество полных байт данных.

                      Код функции 1 байт 0x01
                      Начальный адрес 2 байта 0x0000 .. 0xFFFF
                      Количество выходов (coils) 2 байта 1 .. 2000 (0x0000 .. 0x07D0)
                      Код функции 1 байт 0x01
                      Количество байт 1 байт N*
                      Статус обмоток n байт n = N или N+1

                      Примечание *: N = количество выходов / 8, и если остаток не равен 0, то N = N+1.

                      Код функции 1 байт Оригинальный код функции + 0x80
                      Код исключения (exception code) 1 байт Один из кодов от 01 до 04
                      Запрос Ответ
                      Имя поля HEX Имя поля HEX
                      Функция 01 Функция 01
                      Старший байт адреса 00 Количество байт 03
                      Младший байт адреса 13 Статус выходов 27..20 CD
                      Старший байт количества выходов 00 Статус выходов 35..28 6B
                      Младший байт количества выходов 13 Статус выходов 38..36 05

                      Статус выходов 27 .. 20 показан как значение байта 0xCD (hex), или бинарное значение 11001101. Выход 27 находится в MSB этого байта, и выход 20 в LSB.

                      По принятому соглашению биты в байте показаны с MSB слева, а LSB справа. Таким образом, выходы в первом байте от 27 до 20, слева направо. Следующий байт данных содержит выходы от 35 до 28, слева направо. Поскольку биты передаются последовательно, то их поток передает биты от LSB до MSB: 20, . 27, 28, . 35, и так далее.

                      В последнем байте данных статус выходов 38 .. 36 показан как байт со значением 0x05 (hex), или в двоичном виде 00000101. Выход 38 соответствует шестая позиции бита слева, и выход 36 соответствует LSB в этом байте. 5 оставшихся более старших бит заполнены нулями.

                      MODBUS Read Coils state diagram fig11

                      Рис. 11. Диаграмма состояний Read Coils.

                      6.2. 02 (0x02) Read Discrete Inputs

                      Этот код функции используется для чтения от 1 до 2000 смежных дискретных входов сетевого устройства. Запрос PDU задает начальный адрес, т. е. адрес первого заданного входа, и количество входов. В PDU Discrete Inputs адресация начинается с 0. Таким образом дискретные входы, пронумерованные 1 .. 16, адресуются как 0 .. 15.

                      Дискретные входы в сообщении ответа упакованы по одному входу на бит в поле данных. Состояние ON показывается как лог. 1, OFF как лог. 0. LSB первого байта данных содержит вход первый вход, адресованный в запросе. Другие входы помещаются в более старших битах, вплоть до конца байта, и снова начинаются с младших бит следующих байт.

                      Если возвращаемое количество входов не делится нацело на 8, то оставшиеся биты последнего байта данных будут дополнены нулями (в направлении к старшим битам, до конца байта). Поле количества байт (Byte Count) указывает количество полных байт данных.

                      Код функции 1 байт 0x02
                      Начальный адрес 2 байта 0x0000 .. 0xFFFF
                      Количество входов 2 байта 1 .. 2000 (0x0001 .. 0x07D0)
                      Код функции 1 байт 0x02
                      Количество байт 1 байт N*
                      Статус входов N* байт

                      Примечание *: N = Количество входов / 8, и если остаток отличается от 0, то N = N+1.

                      Код функции 1 байт 0x82
                      Код исключения (exception code) 1 байт Один из кодов от 01 до 04
                      Запрос Ответ
                      Имя поля HEX Имя поля HEX
                      Функция 02 Функция 02
                      Старший байт адреса 00 Количество байт 03
                      Младший байт адреса C4 Статус входов 204..197 AC
                      Старший байт количества входов 00 Статус входов 212..205 DB
                      Младший байт количества входов 16 Статус входов 218..213 35

                      Статус дискретных входов 204 .. 197 показан как байт со значением 0xAC (hex), или двоичное значение 10101100. Вход 204 соответствует MSB в этом байте, а 197 соответствует LSB.

                      Статус дискретных входов 218 .. 213 показан как байт со значением 0x35 (hex), или двоичное значение 00110101. Вход 218 соответствует третьей позиции бита слева и вход 213 соответствует LSB. Оставшиеся не используемые биты второго байта заполнены нулями.

                      MODBUS Read Discrete Inputs state diagram fig12

                      Рис. 12. Диаграмма состояний чтения входов (Read Discrete Inputs).

                      6.3. 03 (0x03) Read Holding Registers

                      Этот код функции используется для чтения содержимого блока смежных регистров временного хранения информации (holding registers) в сетевом устройстве. Запрос PDU задает начальный адрес регистра и количество регистров. В PDU регистры адресуются начиная с нуля. Таким образом, регистры с номерами 1 .. 16 адресуются как 0 .. 15.

                      Данные регистров в сообщении ответа упакованы как 2 байта на регистр, с двоичным содержанием, выравненным вправо в каждом байте. Для каждого регистра первый байт содержит старшие биты, и второй байт содержит младшие биты регистра.

                      Код функции 1 байт 0x03
                      Начальный адрес 2 байта 0x0000 .. 0xFFFF
                      Количество регистров 2 байта 1 .. 125 (0x0001 .. 0x007D)
                      Код функции 1 байт 0x03
                      Количество байт 1 байт 2 x N*
                      Значение регистров N* x 2 байт

                      Примечание *: N = количество регистров.

                      Код функции 1 байт 0x83
                      Код исключения (exception code) 1 байт Один из кодов от 01 до 04
                      Запрос Ответ
                      Имя поля HEX Имя поля HEX
                      Функция 03 Функция 03
                      Старший байт адреса 00 Количество байт 06
                      Младший байт адреса 6B Старший байт значения регистра 108 02
                      Старший байт количества регистров 00 Младший байт значения регистра 108 2B
                      Младший байт количества регистров 03 Старший байт значения регистра 109 00
                      Младший байт значения регистра 109 00
                      Старший байт значения регистра 110 00
                      Младший байт значения регистра 110 64

                      Содержимое регистра 108 показано как 2 байта 0x02 0x2B (hex), или 555 в десятичном значении. Содержимое регистров 109 .. 110 показано соответственно как 0x00 0x00 и 0x00 0x64 (hex), или 0 и 100 в десятичном значении.

                      MODBUS Read Holding Registers state diagram fig13

                      Рис. 13. Диаграмма состояний чтения регистров (Read Holding Registers).

                      6.4. 04 (0x04) Read Input Registers

                      Этот код функции используется для чтения 1 .. 125 смежных входных регистров сетевого устройства. Запрос PDU задает начальный адрес регистра и количество регистров. В PDU регистры адресуются начиная с нуля. Таким образом регистры, пронумерованные 1 .. 16 адресуются как 0 .. 15.

                      Данные регистров в сообщении ответа упакованы как 2 байта на регистр, с двоичным содержанием, выравненным вправо в каждом байте. Для каждого регистра первый байт содержит старшие биты, и второй байт содержит младшие биты регистра.

                      Код функции 1 байт 0x04
                      Начальный адрес 2 байта 0x0000 .. 0xFFFF
                      Количество входных регистров 2 байта 1 .. 125 (0x0001 .. 0x007D)
                      Код функции 1 байт 0x04
                      Количество байт 1 байт 2 x N*
                      Входные регистры N* x 2 байт

                      Примечание *: N = количество входных регистров.

                      Код функции 1 байт 0x84
                      Код исключения (exception code) 1 байт Один из кодов от 01 до 04
                      Запрос Ответ
                      Имя поля HEX Имя поля HEX
                      Функция 04 Функция 04
                      Старший байт адреса 00 Количество байт 02
                      Младший байт адреса 08 Старший байт значения регистра 9 00
                      Старший байт количества регистров 00 Младший байт значения регистра 9 0A
                      Младший байт количества регистров 01

                      Содержимое регистра 9 показано как 2 байта 0x00 0x0A (hex), или 10 в десятичном значении.

                      MODBUS Read Input Registers state diagram fig14

                      Рис. 14. Диаграмма состояний чтения входных регистров (Read Input Registers).

                      6.5. 05 (0x05) Write Single Coil

                      Этот код функции используется для записи одного выхода сетевого устройства в состояние ON или OFF. Запрошенное состояние ON/OFF задается константой в поле данных запроса. Значение запроса 0xFF 0x00 (hex) задает состояние ON выхода, а значение 0x00 0x00 задает OFF. Все другие значения недопустимы, и не влияют на выход.

                      Запрос PDU задает адрес обмотки, которая управляется. Обмотки адресуются начиная с нуля. Таким образом, обмотка с номером 1 адресуется как 0. Запрашиваемое состояние ON/OFF задается константой в поле Coil Value. Значение 0XFF00 соответствует ON, значение 0X0000 соответствует OFF. Все другие значения недопустимы, и не повлияют на состояние обмотки.

                      Нормальным ответом будет эхо запроса, возвращенное после того, как было записано состояние обмотки.

                      Код функции 1 байт 0x05
                      Адрес выхода 2 байта 0x0000 .. 0xFFFF
                      Значение выхода 2 байта 0 или 65280 (0x0000 или 0xFF00)
                      Код функции 1 байт 0x05
                      Адрес выхода 2 байта 0x0000 .. 0xFFFF
                      Значение выхода 2 байта 0 или 65280 (0x0000 или 0xFF00)
                      Код функции 1 байт 0x85
                      Код исключения (exception code) 1 байт Один из кодов от 01 до 04
                      Запрос Ответ
                      Имя поля HEX Имя поля HEX
                      Функция 05 Функция 05
                      Старший байт адреса 00 Старший байт адреса 00
                      Младший байт адреса AC Младший байт адреса AC
                      Старший байт значения выхода FF Старший байт значения выхода FF
                      Младший байт значения выхода 00 Младший байт значения выхода 00

                      MODBUS Write Single Output state diagram fig15

                      Рис. 15. Диаграмма состояний записи одного выхода.

                      6.6. 06 (0x06) Write Single Register

                      Этот код функции используется для записи одного регистра временного хранения в сетевом устройстве. Запрос PDU задает адрес записываемого регистра. Регистры адресуются начиная с 0. Таким образом регистр номер 1 адресуется как 0.

                      Нормальный ответ будет эхом запроса, возвращенным после того, как регистр был записан.

                      Код функции 1 байт 0x06
                      Адрес регистра 2 байта 0x0000 .. 0xFFFF
                      Значение регистра 2 байта 0x0000 .. 0xFFFF
                      Код функции 1 байт 0x06
                      Адрес регистра 2 байта 0x0000 .. 0xFFFF
                      Значение регистра 2 байта 0x0000 .. 0xFFFF
                      Код функции 1 байт 0x86
                      Код исключения (exception code) 1 байт Один из кодов от 01 до 04
                      Запрос Ответ
                      Имя поля HEX Имя поля HEX
                      Функция 06 Функция 06
                      Старший байт адреса 00 Старший байт адреса 00
                      Младший байт адреса 01 Младший байт адреса 01
                      Старший байт значения регистра 00 Старший байт значения регистра 00
                      Младший байт значения регистра 03 Младший байт значения регистра 03

                      MODBUS Write Single Register state diagram fig16

                      Рис. 16. Диаграмма состояний записи одного регистра.

                      6.7. 07 (0x07) Read Exception Status (только для последовательной линии)

                      Этот код функции используется для чтения восьми выходов состояния исключения (Exception Status) сетевого устройства.

                      Функция предоставляет простой метод доступа к этой информации, потому что ссылка на Exception Output известна (не нужно в функции задавать ссылку на выход).

                      Нормальный ответ содержит статус восьми выходов Exception Status. Выходы упакованы в один байт данных, по одному биту на выход. Статус младшего выход соответствует LSB байта.

                      Содержимое восьми выходов Exception Status специфично для устройства.

                      Код функции 1 байт 0x07
                      Код функции 1 байт 0x07
                      Выходные данные 1 байт 0x00 .. 0xFF
                      Код функции 1 байт 0x87
                      Код исключения (exception code) 1 байт 01 или 04
                      Запрос Ответ
                      Имя поля HEX Имя поля HEX
                      Функция 07 Функция 07
                      00 Выходные данные 6D

                      В этом примере выходные данные 0x6D (hex), или в двоичном виде 01101101. Слева направо состояние выходов OFF–ON–ON–OFF–ON–ON–OFF–ON. Показано состояние от старшего до младшего адресованного выхода.

                      MODBUS Read Exception Status state diagram fig17

                      Рис. 17. Диаграмма состояний Read Exception Status.

                      6.8. 08 (0x08) Diagnostics (только для последовательной линии)

                      Код функции 08 предоставляет серии текстов для проверки системы коммуникации между устройством клиента (Master, главное устройство) и устройством сервера (Slave, подчиненное устройство), или для проверки различных внутренних состояний ошибки сервера.

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

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

                      Однако устройство сервера может быть переведено в режим «только прослушивание» (Listen Only Mode), в котором оно будет мониторить сообщения системы коммуникации, но не будет отвечать на них. Это может повлиять на результат работы прикладной программы, если это зависит от дальнейшего обмена данными с удаленным устройством. Как правило, этот режим принудительно удаляет неисправное удаленное устройство из системы связи (чтобы оно не мешало обмену данными с другими устройствами).

                      Для устройств последовательной линии определены следующие диагностические функции. Нормальный ответ на запрос Return Query Data возвращаются те же самые данные. Также эхом отправляются код функции и код субфункции.

                      Код функции 1 байт 0x08
                      Код субфункции 2 байта
                      Данные N x байт
                      Код функции 1 байт 0x08
                      Код субфункции 2 байта
                      Данные N x байт
                      Код функции 1 байт 0x88
                      Код исключения (exception code) 1 байт 01, 03 или 04

                      В таблице ниже приведен список кодов субфункций, поддерживаемые устройствами последовательной линии. Затем каждый код субфункции приводится с примером содержимого поля данных, которое применимо для этой диагностики.

                      Код субфункции
                      Назначение
                      HEX DEC
                      00 00 Return Query Data (возврат запрошенных данных)
                      01 01 Restart Communications Option (перезапуск обмена данными)
                      02 02 Return Diagnostic Register (возврат регистра диагностики)
                      03 03 Change ASCII Input Delimiter (поменять ASCII-разделитель сообщений)
                      04 04 Force Listen Only Mode (перевести в неактивный режим коммуникаций, только прослушивание линии)
                      05 .. 09 Зарезервировано
                      0A 10 Clear Counters and Diagnostic Register (очистка счетчиков и регистра диагностики)
                      0B 11 Return Bus Message Count (возврат счетчика сообщений на шине)
                      0C 12 Return Bus Communication Error Count (возврат счетчика ошибок обмена данными)
                      0D 13 Return Bus Exception Error Count (возврат счетчика исключений шины)
                      0E 14 Return Slave Message Count (возврат количества сообщений подчиненного устройства)
                      0F 15 Return Slave No Response Count (возврат счетчика запросов, на которые не было ответа)
                      10 16 Return Slave NAK Count (возврат количества отрицательных подтверждений)
                      11 17 Return Slave Busy Count (возврат количества сообщений занятости подчиненного устройства)
                      12 18 Return Bus Character Overrun Count (возврат количества символьных переполнений)
                      13 19 Зарезервировано
                      14 20 Clear Overrun Counter and Flag (очистка счетчика количества символьных переполнений и флага)
                      21 .. 65535 Зарезервировано

                      00 Return Query Data

                      Данные, переданные в поле данных запроса, возвращаются обратно в ответе. Все сообщение ответа должно быть идентично запросу.

                      Субфункция Поле данных (запрос) Поле данных (ответ)
                      00 00 Любые данные Те же самые данные, что были в поле данных запроса

                      01 Restart Communications Option

                      Порт последовательной линии дальнего сетевого устройства должен быть инициализирован и перезапущен, и все коммуникационные счетчики событий очищены. Если порт в настоящее время находится в режиме «только прослушивание» (Listen Only Mode), то не этот субкод не последует ответа. Эта функция является единственной, которая выводит порт из режима «только прослушивание». Если порт находится не в режиме Listen Only, то последует нормальный ответ. Этот ответ будет отправлен перед рестартом последовательного порта.

                      Когда дальнее сетевое устройство приняло этот запрос, оно пытается перезапуститься и выполняет тесты проверки надежности рабочей среды при включении питания. Успешное завершение тестов переведет порт в рабочее состояние (online).

                      Если в поле данных запроса содержится 0xFF 0x00 (hex), то это приведет также к очистке лога событий обмена (Communications Event Log). Если в поле данных запроса 0x00 0x00, то содержимое лога останется неизменным, какое было до рестарта.

                      Субфункция Поле данных (запрос) Поле данных (ответ)
                      00 01 00 00 Те же самые данные, что были в поле данных запроса
                      00 01 FF 00 Те же самые данные, что были в поле данных запроса

                      02 Return Diagnostic Register

                      В ответе будет возвращено содержимое 16–битного регистра диагностики дальнего сетевого устройства.

                      Субфункция Поле данных (запрос) Поле данных (ответ)
                      00 02 00 00 Содержимое Diagnostic Register

                      03 Change ASCII Input Delimiter

                      Символ CHAR, переданный в поле данных запроса, становится маркером конца входного сообщения (разделителем сообщений) для всех будущих сообщений (заменяя этим символом символ LF по умолчанию). Эта функция полезна в случаях, когда LF (Line Feed, перевод строки 0x0A) не требуется в качестве маркера окончания сообщений ASCII.

                      Субфункция Поле данных (запрос) Поле данных (ответ)
                      00 03 CHAR 00 Те же самые данные, что были в поле данных запроса

                      04 Force Listen Only Mode

                      Принудительно переводит адресованное сетевое устройство в режим «только прослушивание» (Listen Only Mode) для коммуникаций MODBUS. Это изолирует устройство от других устройств в сети, позволяя им продолжать связь без прерывания связи из-за активности адресованного сетевого устройства. На этот субкод запроса не последует ответа.

                      Когда сетевое устройство переходит в режим Listen Only, выключаться все его активные блоки, управляющие обменом данными. Сторожевому таймеру готовности (Ready Watchdog) разрешено считать до таймаута, блокируя управление. Когда устройство находится в этом режиме, будут мониториться любые сообщения MODBUS, адресованные ему, а также широковещательные сообщения, однако никаких ответных действий предприниматься не будет, и ответ также посылаться не будет.

                      Единственная функция, которая будет обработана и выполнена после входа в этот режим — Restart Communications Option (код функции 8, код субфункции 1).

                      Субфункция Поле данных (запрос) Поле данных (ответ)
                      00 04 00 00 Нет никакого ответа

                      10 (0A Hex) Clear Counters and Diagnostic Register

                      Цель этой субфункции — очистить все счетчики и регистр диагностики. Счетчики также очищаются при включении питания.

                      Субфункция Поле данных (запрос) Поле данных (ответ)
                      00 0A 00 00 Те же самые данные, что были в поле данных запроса

                      11 (0B Hex) Return Bus Message Count

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

                      Субфункция Поле данных (запрос) Поле данных (ответ)
                      00 0B 00 00 Значение счетчика общего количества сообщений

                      12 (0C Hex) Return Bus Communication Error Count

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

                      Субфункция Поле данных (запрос) Поле данных (ответ)
                      00 0C 00 00 Счетчик ошибок CRC

                      13 (0D Hex) Return Bus Exception Error Count

                      Поле данных ответа возвратит количество ответов исключений (MODBUS exception response), которые были возвращены с момента его последнего рестарта, включения питания или операции по очистке счетчиков. Ответы исключения описаны и перечислены в секции 7.

                      Субфункция Поле данных (запрос) Поле данных (ответ)
                      00 0D 00 00 Счетчик ошибок исключений

                      14 (0E Hex) Return Slave Message Count

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

                      Субфункция Поле данных (запрос) Поле данных (ответ)
                      00 0E 00 00 Счетчик сообщений, обработанных подчиненным устройством (Slave Message Count)

                      15 (0F Hex) Return Slave No Response Count

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

                      Субфункция Поле данных (запрос) Поле данных (ответ)
                      00 0F 00 00 Счетчик сообщений, на которые подчиненное устройством не выдало ответ (Slave No Response Count)

                      16 (10 Hex) Return Slave NAK Count

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

                      Субфункция Поле данных (запрос) Поле данных (ответ)
                      00 10 00 00 Счетчик отрицательных подтверждений

                      17 (11 Hex) Return Slave Busy Count

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

                      Субфункция Поле данных (запрос) Поле данных (ответ)
                      00 11 00 00 Счетчик сообщений о занятости подчиненного устройства

                      18 (12 Hex) Return Bus Character Overrun Count

                      Поле данных ответа возвратит количество сообщений, адресованных сетевому устройству, которые оно не обработало из-за события символьного переполнения (Character Overrun) с момента его последнего рестарта, включения питания или операции по очистке счетчиков. Символьное переполнение происходит, когда в порт слишком быстро поступают символы данных, или когда неправильно работает аппаратура.

                      Субфункция Поле данных (запрос) Поле данных (ответ)
                      00 12 00 00 Счетчик символьных переполнений

                      20 (14 Hex) Clear Overrun Counter and Flag

                      Очищает счетчик ошибок переполнений и сбрасывает флаг ошибки.

                      Субфункция Поле данных (запрос) Поле данных (ответ)
                      00 14 00 00 Те же самые данные, что были в поле данных запроса

                      Здесь приведен пример запроса Return Query Data сетевому устройству. Запрос использует нулевой код субфункции, 0x00 0x00 (hex) в двухбайтном поле. Данные для возврата отправляются в двухбайтном поле данных: 0xA5 0x37 (hex).

                      Запрос Ответ
                      Имя поля HEX Имя поля HEX
                      Функция 08 Функция 08
                      Старший байт кода субфункции 00 Старший байт кода субфункции 00
                      Младший байт кода субфункции 00 Младший байт кода субфункции 00
                      Старший байт данных A5 Старший байт данных A5
                      Младший байт данных 37 Младший байт данных 37

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

                      MODBUS Diagnostic state diagram fig18

                      Рис. 18. Диаграмма состояний диагностики.

                      6.9. 11 (0x0B) Get Comm Event Counter (только для последовательной линии)

                      Этот код функции используется для получения слова статуса и счетчика событий коммуникаций (communication event counter) от сетевого устройства.

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

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

                      Счетчик событий может быть сброшен функцией диагностики (код функции 08), у которой код субфункции Restart Communications (код субфункции 00 01) или код субфункции Clear Counters and Diagnostic Register (код субфункции 00 0A).

                      Нормальный ответ содержит двухбайтное слово статуса и двухбайтный счетчик событий. Слово статуса будет всеми единичками FF FF (hex), если сетевым устройством все еще выполняется ранее выданная команда программы (состояние занятости). Иначе в слове статуса будут все нули.

                      Код функции 1 байт 0x0B
                      Код функции 1 байт 0x0B
                      Статус 2 байта 0x0000 .. 0xFFFF
                      Счетчик событий 2 байта 0x0000 .. 0xFFFF
                      Код функции 1 байт 0x8B
                      Код исключения (exception code) 1 байт 01 или 04
                      Запрос Ответ
                      Имя поля HEX Имя поля HEX
                      Функция 0B Функция 0B
                      Старший байт статуса FF
                      Младший байт статуса FF
                      Старший байт счетчика событий 01
                      Младший байт счетчика событий 08

                      В этом примере слово состояния 0xFF 0xFF (hex), что показывает выполняющуюся обработку в программе сетевого устройства. Счетчик событий показывает, что сетевым устройством было принято и подсчитано 264 (01 08 hex) события.

                      MODBUS Get Comm Event Counter state diagram fig19

                      Рис. 19. Диаграмма состояний Get Comm Event Counter.

                      6.10. 12 (0x0C) Get Comm Event Log (только для последовательной линии)

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

                      Слово статуса и счетчик событий идентичны тем, что возвращаются функцией Get Communications Event Counter function (11 0B hex).

                      Счетчик событий содержит количество сообщений, обработанных сетевым устройством с момента последнего рестарта. Этот счетчик идентичен тому, который возвращается функцией диагностики (код 08), субфункцией Return Bus Message Count (код 11, 0B hex).

                      Поле байт события содержит 0 .. 64 байт, где каждый байт соответствует статусу одной операции передачи или приема MODBUS сетевого устройства. Сетевое устройство вводит события в поле в хронологическом порядке. Байт 0 это самое свежее событие. Каждый новый байт выбрасывает самый старый байт из поля.

                      Нормальный ответ содержит двухбайтное поле слова статуса, двухбайтное поле счетчика событий и поле, содержащее 0 .. 64 байта событий. Поле количества байт содержит общую длину данных в этих четырех полях.

                      Код функции 1 байт 0x0C
                      Код функции 1 байт 0x0C
                      Количество байт 1 байт N*
                      Статус 2 байта 0x0000 .. 0xFFFF
                      Счетчик событий 2 байта 0x0000 .. 0xFFFF
                      Счетчик сообщений 2 байта 0x0000 .. 0xFFFF
                      События (N-6) байт

                      Примечание *: N = количество событий + 3 x 2 байт, (длина статуса, счетчик событий и счетчик сообщений).

                      Код функции 1 байт 0x8C
                      Код исключения (exception code) 1 байт 01 или 04
                      Запрос Ответ
                      Имя поля HEX Имя поля HEX
                      Функция 0C Функция 0C
                      Количество байт 08
                      Старший байт статуса 00
                      Младший байт статуса 00
                      Старший байт счетчика событий 01
                      Младший байт счетчика событий 08
                      Старший байт счетчика сообщений 01
                      Младший байт счетчика сообщений 21
                      Событие 0 20
                      Событие 1 00

                      В этом примере слово статуса 00 00 (hex), которое показывает, что сетевое устройство не занято обработкой функции программы. Счетчик событий показывает 264 (01 08 hex) события, которые подсчитало сетевое устройство. Счетчик событий показывает, что 289 (01 21 hex) сообщений было обработано.

                      Самое свежее событие коммуникации показано в байте Event 0. Его содержимое (20 hex) показывает, что сетевое устройство только что вошло в режим Listen Only.

                      Предыдущее событие показано байтом Event 1. Его содержимое (00 hex) показывает, что сетевое устройство приняло Communications Restart.

                      Ниже дано описание содержимого байт события.

                      Что содержат байты события (Event Bytes). Байт события, возвращенный функцией Get Communications Event Log, может быть любым из четырех типов. Тип определяется битом 7 (старшим битом) в каждом байте. Тип может быть далее уточнен битом 6. Как это происходит, показано дальше.

                      • Remote device MODBUS Receive Event

                      Сетевое устройство сохраняет этот тип события, когда принято сообщение запроса. Сохранение происходит до того, как сетевое устройство обработает сообщение. Это событие определяется битом 7, установленным в лог. 1. Другие биты будут установлены в лог. 1, если соответствующее условие TRUE. Назначение разрядов бит:

                      Бит Содержимое
                      0 Не используется
                      1 Ошибка обмена
                      2 Не используется
                      3 Не используется
                      4 Символьное переполнение (Character Overrun)
                      5 В настоящий момент действует режим Listen Only
                      6 Принято широковещательное сообщение (Broadcast)
                      7 1

                      • Remote device MODBUS Send Event

                      Сетевое устройство сохраняет этот тип события, когда оно завершило обработку сообщения запроса. Сохранение происходит, если устройство возвратило нормальный ответ или ответ исключения, или не ответило. Это событие определено битом 7, установленным в лог. 0 и с битом 6, установленным в лог. 1. Другие биты будут установлены в лог. 1, когда соответствующее условие TRUE. Назначение разрядов бит:

                      Бит Содержимое
                      0 Read Exception Sent (отправлено исключение чтения, коды исключений 1 .. 3)
                      1 Slave Abort Exception Sent (отправлено исключение обрыва связи подчиненного устройства, код исключения 4)
                      2 Slave Busy Exception Sent (отправлено исключение занятости, коды исключений 5 и 6)
                      3 Slave Program NAK Exception Sent (отправлено исключение отрицательного подтверждения, код исключения 7)
                      4 Write Timeout Error Occurred (произошла ошибка таймаута)
                      5 В настоящий момент действует режим Listen Only
                      6 1
                      7 0

                      • Remote device Entered Listen Only Mode

                      Сетевое устройство сохраняет этот тип события, когда оно входит в режим Listen Only. Это событие определено содержимым 0x04 (hex).

                      • Remote device Initiated Communication Restart

                      Сетевое устройство сохраняет этот байт типа события, когда коммуникационный порт перезапущен. Сетевое устройство может быть перезапущено функцией диагностики (код 08), субфункцией Restart Communications Option (код субфункции 00 01 hex).

                      Эта функция также поместит сетевое устройство в режим продолжения работы при ошибке (Continue on Error) или режим остановки работы при ошибке (Stop on Error). Если сетевое устройство переводится в режим «Continue on Error», то байт события добавляется в существующий лог событий. Если сетевое устройство переводится в режим «Stop on Error», то байт добавляется к логу, и остальная часть лога очищается записью нулей.

                      Событие определено нулевым байтом лога.

                      MODBUS Get Comm Event Log state diagram fig20

                      Рис. 20. Диаграмма состояний Get Comm Event Log.

                      6.11. 15 (0x0F) Write Multiple Coils

                      Этот код функции используется в сетевом устройстве для переключения его каждой обмотки в последовательности либо в состояние ON, либо в состояние OFF. Запрос PDU задает обмотки, которые управляются. Обмотки адресуются начиная с 0. Таким образом, обмотка номер 1 адресуется как 0.

                      Запрашиваемые состояния ON/OFF задаются содержимым поля данных. Лог. 1 в позиции бита запрашивает перевод соответствующего выхода в состояние ON. Лог. 0 запрашивает перевод выхода в состояние OFF.

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

                      Код функции 1 байт 0x0F
                      Начальный адрес 2 байта 0x0000 .. 0xFFFF
                      Количество выходов 2 байта 1 .. 1968 (0x0001 .. 0x07B0)
                      Количество байт 1 байт N*
                      Значение выхода N байт

                      Примечание *: N = Количество выходов / 8, если остаток отличается от 0, то N = N+1.

                      Код функции 1 байт 0x0C
                      Начальный адрес 2 байта 0x0000 .. 0xFFFF
                      Количество выходов 2 байта 1 .. 1968 (0x0001 .. 0x07B0)
                      Код функции 1 байт 0x8F
                      Код исключения (exception code) 1 байт 01 или 02 или 03 или 04

                      Содержимое данных в запросе представлено двумя байтами 0xCD 0x01 (hex), в двоичном виде 1100 1101 0000 0001. Биты соответствуют выходам следующим образом (черточки означают, что эти биты не используются для управления выходами):

                      Бит: 1 1 0 0 1 1 0 1 0 0 0 0 0 0 0 1
                      Выход: 27 26 25 24 23 22 21 20 — — — — — — 29 28

                      Первый передаваемый байт (0xCD hex) адресует выходы 27 .. 20, где LSB адресует самый младший управляемый выход (20).

                      Следующий передаваемый байт (01 hex) адресует выходы 29 и 28, где LSB адресует выход (28) в этой последовательности. Не используемые биты (их выходы обозначены черточками) должны быть обнулены.

                      Запрос Ответ
                      Имя поля HEX Имя поля HEX
                      Функция 0F Функция 0F
                      Старший байт начального адреса 00 Старший байт начального адреса 00
                      Младший байт начального адреса 13 Младший байт начального адреса 13
                      Старший байт количества выходов 00 Старший байт количества выходов 00
                      Младший байт количества выходов 0A Младший байт количества выходов 0A
                      Количество байт 02
                      Старший байт значения выходов CD
                      Младший байт значения выходов 01

                      MODBUS Write Multiple Outputs state diagram fig21

                      Рис. 21. Диаграмма состояний Write Multiple Outputs.

                      6.12. 16 (0x10) Write Multiple registers

                      Этот код функции используется для записи блока смежных регистров (1 .. 123 регистров) в сетевом устройстве.

                      Запрашиваемые записываемые значения задаются полем данных запроса. Данные упакованы как 2 байта на регистр.

                      Нормальный ответ вернет код функции, начальный адрес и количество записанных регистров.

                      Код функции 1 байт 0x10
                      Начальный адрес 2 байта 0x0000 .. 0xFFFF
                      Количество регистров 2 байта 1 .. 123 (0x0001 .. 0x007B)
                      Количество байт 1 байт 2 x N*
                      Значения регистров N x 2 байт

                      Примечание *: N = количество регистров.

                      Код функции 1 байт 0x10
                      Начальный адрес 2 байта 0x0000 .. 0xFFFF
                      Количество регистров 2 байта 1 .. 123 (0x0001 .. 0x007B)
                      Код функции 1 байт 0x90
                      Код исключения (exception code) 1 байт 01 или 02 или 03 или 04
                      Запрос Ответ
                      Имя поля HEX Имя поля HEX
                      Функция 10 Функция 10
                      Старший байт начального адреса 00 Старший байт начального адреса 00
                      Младший байт начального адреса 01 Младший байт начального адреса 01
                      Старший байт количества регистров 00 Старший байт количества регистров 00
                      Младший байт количества регистров 02 Младший байт количества регистров 02
                      Количество байт 04
                      Старший байт значения регистра 00
                      Младший байт значения регистра 0A
                      Старший байт значения регистра 01
                      Младший байт значения регистра 02

                      MODBUS Write Multiple Registers state diagram fig22

                      Рис. 22. Диаграмма состояний Write Multiple Registers.

                      6.13. 17 (0x11) Report Slave ID (только для последовательной линии)

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

                      Код функции 1 байт 0x11
                      Код функции 1 байт 0x10
                      Количество байт 1 байт Зависит от устройства
                      Slave ID Зависит от устройства
                      Run Indicator Status (индикатор активности устройства) 1 байт 0x00 OFF, 0xFF ON
                      Дополнительные данные Зависит от устройства
                      Код функции 1 байт 0x91
                      Код исключения (exception code) 1 байт 01 или 04

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

                      Запрос Ответ
                      Имя поля HEX Имя поля HEX
                      Функция 11 Функция 11
                      Количество байт Зависит от устройства
                      Slave ID Зависит от устройства
                      Run Indicator Status 0x00 или 0xFF
                      Дополнительные данные Зависит от устройства

                      MODBUS Report slave ID state diagram fig23

                      Рис. 23. Диаграмма состояний Report slave ID.

                      6.14. 20 (0x14) Read File Record

                      Этот код функции используется для чтения из файла. Все запросы длин данных (Request Data Lengths) предоставляются в единицах байт, и все запросы длин записей (Record Lengths) предоставляются в единицах регистров.

                      Файл это организация записей. Каждый файл содержит 10000 записей, адресованных десятичными значениями от 0000 до 9999 или HEX-значениями от 0x0000 до 0x270F. Например, запись 12 адресуется как 12.

                      Функция может прочитать несколько групп ссылок. Группы могут быть разделены (быть не смежными), однако элементы в каждой группе должны быть последовательными.

                      Каждая группа определяется отдельным полем субзапроса, которое содержит 7 байт:

                      Тип запроса: 1 байт (должен быть указан как 6)
                      Номер файла: 2 байта
                      Начальный номер записи в файле: 2 байта
                      Длина записи для чтения: 2 байта.

                      Количество регистров для чтения, в комбинации со всеми другими полями в ожидаемом ответе, не должно превышать допустимой длины MODBUS PDU: 253 байта.

                      Нормальный ответ это серия субответов, по одному на каждый субзапрос. Поле количества байт это общее скомбинированное количество байт во всех субответах. Дополнительно каждый субответ содержит поле, которое показывает свое количество байт.

                      Код функции 1 байт 0x14
                      Количество байт 1 байт 7 .. 245 (0x07 .. 0xF5)
                      Sub-Req. x, Reference Type 1 байт 06
                      Sub-Req. x, File Number 2 байта 0x0001 .. 0xFFFF
                      Sub-Req. x, Record Number 2 байта 0 .. 9999 (0x0000 .. 0x270F)
                      Sub-Req. x, Record Length 2 байта N
                      Sub-Req. x+1, .
                      Код функции 1 байт 0x14
                      Длина данных ответа 1 байт 7 .. 245 (0x07 .. 0xF5)
                      Sub-Req. x, длина файла в ответе 1 байт 7 .. 245 (0x07 .. 0xF5)
                      Sub-Req. x, Reference Type 1 байт 6
                      Sub-Req. x, Record Data N x 2 байт
                      Sub-Req. x+1, .
                      Код функции 1 байт 0x94
                      Код исключения (exception code) 1 байт 01 или 02 или 03 или 04 или 08

                      Примечание: хотя допускается задавать номер файла в диапазоне 1 .. 0xFFFF, следует заметить, что что совместимость с устаревшим оборудованием может быть нарушена, если номер файла превышает 10 (0x0A).

                      • Группа 1 состоит из двух регистров из файла 4, начиная с регистра 1 (адрес 0001).
                      • Группа 2 состоит из двух регистров из файла 2, начиная с регистра 9 (адрес 0009).

                      Запрос Ответ
                      Имя поля HEX Имя поля HEX
                      Функция 14 Функция 14
                      Количество байт 0E Длина данных ответа 0C
                      Sub-Req. 1, Ref. Type 06 Sub-Req. 1, длина ответа файла 05
                      Sub-Req. 1, старший байт номера файла 00 Sub-Req. 1, Ref. Type 06
                      Sub-Req. 1, младший байт номера файла 04 Sub-Req. 1, старший байт данных регистра 0D
                      Sub-Req. 1, старший байт номера элемента файла 00 Sub-Req. 1, младший байт данных регистра FE
                      Sub-Req. 1, младший байт номера элемента файла 01 Sub-Req. 1, старший байт данных регистра 00
                      Sub-Req. 1, старший байт длины элемента файла 00 Sub-Req. 1, младший байт данных регистра 20
                      Sub-Req. 1, младший байт длины элемента файла 02 Sub-Req. 2, длина ответа файла 05
                      Sub-Req. 2, Ref. Type 06 Sub-Req. 2, Ref. Type 06
                      Sub-Req. 2, старший байт номера файла 00 Sub-Req. 2, старший байт данных регистра 33
                      Sub-Req. 2, младший байт номера файла 03 Sub-Req. 2, младший байт данных регистра CD
                      Sub-Req. 2, старший байт номера элемента файла 00 Sub-Req. 2, старший байт данных регистра 00
                      Sub-Req. 2, младший байт номера элемента файла 09 Sub-Req. 2, младший байт данных регистра 40
                      Sub-Req. 2, старший байт длины элемента файла 00
                      Sub-Req. 2, младший байт длины элемента файла 02

                      MODBUS Read File Record state diagram fig24

                      Рис. 24. Диаграмма состояний Read File Record.

                      6.15. 21 (0x15) Write File Record

                      Этот код функции используется для выполнения записи в файл. Все длины данных запроса (Request Data Lengths) предоставляются в байтах, и все длины записей (Record Lengths) в единицах 16-битных слов.

                      Файл это организация записей. Каждый файл содержит 10000 записей, адресованных десятичными значениями от 0000 до 9999 или HEX-значениями от 0X0000 до 0X270F. Например, запись 12 адресуется как 12.

                      Функция может записать несколько групп ссылок. Группы могут быть разделены (быть не смежными), однако элементы в каждой группе должны быть последовательными.

                      Каждая группа определена в отдельном поле субзапроса, в котором 7 байт плюс данные:

                      Тип запроса: 1 байт (должен быть указан как 6).
                      Номер файла: 2 байта.
                      Начальный номер записи в файле: 2 байта.
                      Длина для записи: 2 байта.
                      Записываемые данные: по 2 байта на регистр.

                      Количество регистров для записи, в комбинации со всеми другими полями в ожидаемом ответе, не должно превышать допустимой длины MODBUS PDU: 253 байта.

                      Нормальный ответ будет эхом (копией) запроса.

                      Код функции 1 байт 0x15
                      Длина данных запроса 1 байт 9 .. 251 (0x09 .. 0xFB)
                      Sub-Req. x, Reference Type 1 байт 06
                      Sub-Req. x, File Number 2 байта 0x0001 .. 0xFFFF
                      Sub-Req. x, Record Number 2 байта 0 .. 9999 (0x0000 .. 0x270F)
                      Sub-Req. x, Record Length 2 байта N
                      Sub-Req. x, Record data N x 2 байт
                      Sub-Req. x+1, .
                      Код функции 1 байт 0x15
                      Длина данных запроса 1 байт 9 .. 251 (0x09 .. 0xFB)
                      Sub-Req. x, Reference Type 1 байт 06
                      Sub-Req. x, File Number 2 байта 0x0001 .. 0xFFFF
                      Sub-Req. x, Record Number 2 байта 0 .. 9999 (0x0000 .. 0x270F)
                      Sub-Req. x, Record Length 2 байта N
                      Sub-Req. x, Record data N x 2 байт
                      Sub-Req. x+1, .
                      Код функции 1 байт 0x95
                      Код исключения (exception code) 1 байт 01 или 02 или 03 или 04 или 08

                      Примечание: хотя допускается задавать номер файла в диапазоне 1 .. 0xFFFF, следует заметить, что что совместимость с устаревшим оборудованием может быть нарушена, если номер файла превышает 10 (0x0A).

                      Группа состоит из трех регистров в файле 4, начиная с регистра 7 (адрес 0007).

                      Запрос Ответ
                      Имя поля HEX Имя поля HEX
                      Функция 15 Функция 15
                      Длина данных запроса 0D Длина данных запроса 0D
                      Sub-Req. 1, Ref. Type 06 Sub-Req. 1, Ref. Type 06
                      Sub-Req. 1, старший байт номера файла 00 Sub-Req. 1, старший байт номера файла 00
                      Sub-Req. 1, младший байт номера файла 04 Sub-Req. 1, младший байт номера файла 04
                      Sub-Req. 1, старший байт номера элемента файла 00 Sub-Req. 1, старший байт номера элемента файла 00
                      Sub-Req. 1, младший байт номера элемента файла 07 Sub-Req. 1, младший байт номера элемента файла 07
                      Sub-Req. 1, старший байт длины элемента файла 00 Sub-Req. 1, старший байт длины элемента файла 00
                      Sub-Req. 1, младший байт длины элемента файла 03 Sub-Req. 1, младший байт длины элемента файла 03
                      Sub-Req. 1, старший байт данных регистра 06 Sub-Req. 1, старший байт данных регистра 06
                      Sub-Req. 1, младший байт данных регистра AF Sub-Req. 1, младший байт данных регистра AF
                      Sub-Req. 1, старший байт данных регистра 04 Sub-Req. 1, старший байт данных регистра 04
                      Sub-Req. 1, младший байт данных регистра BE Sub-Req. 1, младший байт данных регистра BE
                      Sub-Req. 1, старший байт данных регистра 10 Sub-Req. 1, старший байт данных регистра 10
                      Sub-Req. 1, младший байт данных регистра 0D Sub-Req. 1, младший байт данных регистра 0D

                      MODBUS Write File Record state diagram fig25

                      Рис. 25. Диаграмма состояний Write File Record.

                      6.16. 22 (0x16) Mask Write Register

                      Этот код функции используются для модификации содержимого регистра временного хранения (holding register), используя комбинацию маски И (AND), маски ИЛИ (OR) и текущего содержимого регистра. Эта функция может использоваться для установки или очистки отельных бит в регистре.

                      Запрос задает временный регистр хранения, который будет записываться, данные для маски AND и данные для маски OR. Регистры адресуются начиная с 0. Таким образом, регистры 1 .. 16 адресуются как 0 .. 15.

                      Результат = (текущее содержимое & маскаAND) | (маскаOR & (^маскаAND))

                      Компоненты операции HEX BIN
                      Текущее содержимое регистра 12 00010010
                      маскаAND F2 11110010
                      маскаOR 25 00100101
                      (^маскаAND) 0D 00001101
                      Результат 17 00010111

                      Примечание: если значение маскаOR равно 0, то результатом будет простое логическое И текущего содержимого регистра и значения маскаAND. Если значение маскаAND равно 0, то результат будет равен значению маскаOR. Содержимое регистра может быть прочитано функцией Read Holding Registers (код функции 03). Однако регистр (регистры) могут быть изменены впоследствии в результате работы логики программы пользователя.

                      Нормальный ответ будет эхом (копией) запроса.

                      Код функции 1 байт 0x16
                      Адрес регистра 2 байта 0x0000 .. 0xFFFF
                      маскаAND 2 байта 0x0000 .. 0xFFFF
                      маскаOR 2 байта 0x0000 .. 0xFFFF
                      Код функции 1 байт 0x16
                      Адрес регистра 2 байта 0x0000 .. 0xFFFF
                      маскаAND 2 байта 0x0000 .. 0xFFFF
                      маскаOR 2 байта 0x0000 .. 0xFFFF
                      Код функции 1 байт 0x96
                      Код исключения (exception code) 1 байт 01 или 02 или 03 или 04

                      Запись осуществляется в регистр 5 сетевого устройства, используя маски из примера выше:

                      Запрос Ответ
                      Имя поля HEX Имя поля HEX
                      Функция 16 Функция 16
                      Старший байт адреса 00 Старший байт адреса 00
                      Младший байт адреса 04 Младший байт адреса 04
                      Старший байт маскаAND 00 Старший байт маскаAND 00
                      Младший байт маскаAND F2 Младший байт маскаAND F2
                      Старший байт маскаOR 00 Старший байт маскаOR 00
                      Младший байт маскаOR 25 Младший байт маскаOR 25

                      MODBUS Mask Write Holding Register state diagram fig26

                      Рис. 26. Диаграмма состояний Mask Write Holding Register.

                      6.17. 23 (0x17) Read/Write Multiple registers

                      Этот код функции выполняет комбинацию одной операции чтения и одной операции записи в одной транзакции MODBUS. Операция записи выполняется перед операцией чтения.

                      Регистры временного хранения (holding registers) адресуются начиная с 0. Таким образом, регистры 1 .. 16 адресуются в PDU как 0 .. 15.

                      Запрос задает как начальный адрес и количество holding-регистров для чтения, так и начальный адрес и количество holding-регистров для чтения. Количество байт задает, сколько байт следует в поле записи данных.

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

                      Код функции 1 байт 0x17
                      Начальный адрес чтения 2 байта 0x0000 .. 0xFFFF
                      Количество читаемых регистров 2 байта 1 .. 125 (0x0001 .. 0x007D)
                      Начальный адрес записи 2 байта 0x0000 .. 0xFFFF
                      Количество записываемых регистров 2 байта 1 .. 121 (0x0001 .. 0X0079)
                      Количество записываемых байт 1 байт 2 x N*
                      Значения записываемых регистров N x 2 байт

                      Примечание *: N = количество регистров для записи.

                      Код функции 1 байт 0x17
                      Количество байт 1 байт 2 x N*
                      Значения прочитанных регистров N x 2 байт

                      Примечание *: N = количество регистров для чтения.

                      Код функции 1 байт 0x97
                      Код исключения (exception code) 1 байт 01 или 02 или 03 или 04

                      6 регистров считываются начиная с регистра 4, и записываются 3 регистра, начиная с регистра 15:

                      Запрос Ответ
                      Имя поля HEX Имя поля HEX
                      Функция 17 Функция 17
                      Старший байт начального адреса чтения 00 Количество байт 0C
                      Младший байт начального адреса чтения 03 Старший байт считанного регистра 00
                      Старший байт количества читаемых регистров 00 Младший байт считанного регистра FE
                      Младший байт количества читаемых регистров 06 Старший байт считанного регистра 0A
                      Старший байт начального адреса записи 00 Младший байт считанного регистра CD
                      Младший байт начального адреса записи 0E Старший байт считанного регистра 00
                      Старший байт количества записываемых регистров 00 Младший байт считанного регистра 01
                      Младший байт количества записываемых регистров 03 Старший байт считанного регистра 00
                      Количество записываемых байт 06 Младший байт считанного регистра 03
                      Старший байт записываемого регистра 00 Старший байт считанного регистра 00
                      Младший байт записываемого регистра FF Младший байт считанного регистра 0D
                      Старший байт записываемого регистра 00 Старший байт считанного регистра 00
                      Младший байт записываемого регистра FF Младший байт считанного регистра FF
                      Старший байт записываемого регистра 00
                      Младший байт записываемого регистра FF

                      MODBUS Read Write Multiple Registers state diagram fig27

                      Рис. 27. Диаграмма состояния Read/Write Multiple Registers.

                      6.18. 24 (0x18) Read FIFO Queue

                      Этот код функции позволяет прочитать содержимое очереди FIFO регистров сетевого устройства. Функция вернет количество регистров в очереди, за которым будут идти данные очереди. Можно прочитать до 32 регистров: количество плюс 31 данных поставленных в очередь регистров. Сначала возвращается количество регистров в очереди, за ним следуют данные регистров в очереди.

                      Функция считывает содержимое очереди, однако не очищает её.

                      В нормальном ответе количество байт (Byte Count) показывает, сколько байт будет идти дальше, включая количество байт очереди и значение байт регистра (но не включая поля проверки на ошибку).

                      FIFO Count это количество регистров данных в очереди (не включая регистра количества).

                      Если FIFO Count превышает 31, то будет возвращен ответ исключения с кодом ошибки 03 (Illegal Data Value).

                      Код функции 1 байт 0x18
                      Адрес указателя FIFO 2 байта 0x0000 .. 0xFFFF
                      Код функции 1 байт 0x18
                      Количество байт 2 байта
                      Количество регистров FIFO 2 байта ≤ 31
                      Значения регистров FIFO N* x 2 байт

                      Пример *: N = количеству регистров в FIFO.

                      Код функции 1 байт 0x98
                      Код исключения (exception code) 1 байт 01 или 02 или 03 или 04

                      Запрос выполнит чтение очереди, начиная с регистра указателя 1246 (0x04DE hex):

                      Запрос Ответ
                      Имя поля HEX Имя поля HEX
                      Функция 18 Функция 18
                      Старший байт указателя адреса FIFO 04 Старший байт количества байт 00
                      Младший байт указателя адреса FIFO DE Младший байт количества байт 06
                      Старший байт количества регистров FIFO 00
                      Младший байт количества регистров FIFO 02
                      Старший байт значения регистра FIFO 01
                      Младший байт значения регистра FIFO B8
                      Старший байт значения регистра FIFO 12
                      Младший байт значения регистра FIFO 84

                      В этом примере регистр указателя FIFO (1246) будет возвращен с количеством в очереди 2. За количеством идут два регистра данных очереди:

                      1247 (содержимое 440 десятичное, или 0x01B8 hex)
                      1248 (содержимое 4740 десятичное, или 0x1284 hex)

                      MODBUS Read FIFO Queue state diagram fig28

                      Рис. 28: Диаграмма состояний Read FIFO Queue.

                      6.19. 43 (0x2B) Encapsulated Interface Transport

                      Примечание: в Приложении A находится информация по зарезервированным кодам MODBUS, субкодам и типам MEI.

                      Код функции 43 и его тип MEI 14 для идентификации устройства это один из двух инкапсулированных транспорта интерфейса (Encapsulated Interface Transport), доступных сейчас в этой спецификации [1]. Следующие коды функций и типы MEI не входят как часть этой публичной спецификации и эти коды функций и типы MEI зарегистрированы специально: 43 / 0 .. 12 и 43 / 15 .. 255.

                      Транспорт MODBUS Encapsulated Interface (MEI) это механизм туннелирования запросов службы и запуска методов, а также их возвращаемых данных, внутри MODBUS PDU.

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

                      MODBUS Encapsulated Interface Transport fig29

                      Рис. 29: Транспорт MEI (MODBUS encapsulated Interface).

                      Сетевой интерфейс может быть любым коммуникационным стеком, использующимся для отправки MODBUS PDU, как например TCP/IP или последовательная линия связи.

                      MEI Type (тип MEI) это специально назначенный номер (MODBUS Assigned Number) и поэтому он будет уникальным, значение между 0 и 255 зарезервировано согласно Приложению A, кроме MEI Type 13 и MEI Type 14.

                      MEI Type используется реализациями транспорта MEI для диспетчеризации вызова метода на показанном интерфейсе.

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

                      Код функции 1 байт 0x2B
                      MEI Type 1 байт 0x0D или 0x0E
                      Специфические данные типа MEI n байт
                      Код функции 1 байт 0x2B
                      MEI Type 1 байт То же самое значение, что было в запросе
                      Специфические данные типа MEI n байт
                      Код функции 1 байт 0xAB (результат 0x2B + 0x80)
                      Код исключения (exception code) 1 байт 01 или 02 или 03 или 04

                      В качестве примера см. запрос Read Device Identification.

                      6.20. 43 / 13 (0x2B / 0x0D) CANopen General Reference Request and Response PDU

                      CANopen General reference Command это инкапсуляция служб, которые будут использоваться для доступа (на чтение или запись) элементов словаря объектов CANopen (CANopen Device Object Dictionary), а также для управления и мониторинга системы CANopen и её устройств.

                      MEI Type 13 (0x0D) это MODBUS Assigned Number, лицензированный CiA для CANopen General Reference.

                      Система предназначена для работы в пределах ограничений существующих сетей MODBUS. Поэтому информация, необходимая для запроса или изменения объектных словарей CANopen в системе, преобразуется в формат сообщения MODBUS. PDU будет ограничен 253 байтами как в сообщении запроса, так и в сообщении ответа.

                      На веб-сайте MODBUS-IDA или на веб-сайте CiA (CAN in Automation) можно ознакомиться с копиями и условиями использования, охватывающими код функции 43 MEI Type 13.

                      6.21 43 / 14 (0x2B / 0x0E) Read Device Identification

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

                      Интерфейс Read Device Identification смоделирован как адресное пространство, составленное из набора адресуемых элементов данных. Элементы данных называются объектами, и их идентифицирует object Id.

                      Интерфейс состоит из 3 категорий объектов:

                      • Basic Device Identification (базовая идентификация устройства). Все объекты в этой категории обязательны: имя производителя (VendorName), код изделия (Product code) и номер ревизии (revision number).
                      • Regular Device Identification (обычная идентификация устройства). В дополнение к базовым объектам данных, устройство предоставляет дополнительную и опциональную идентификацию и описание объектов данных. Все объекты в этой категории определены в стандарте, но их реализация не является обязательной.
                      • Extended Device Identification (расширенная идентификация устройства). В дополнение к обычным объектам данных, устройство предоставляет дополнительную и опциональную идентификацию и описание приватных данных о самом физическом устройстве. Все эти данные зависят от конкретного устройства.

                      Код функции 1 байт 0x2B
                      MEI Type 1 байт 0x0E
                      Read Device ID code 1 байт 01 / 02 / 03 / 04
                      Object Id 1 байт 0x00 или 0xFF
                      Код функции 1 байт 0x2B
                      MEI Type 1 байт 0x0E
                      Read Device ID code 1 байт 01 / 02 / 03 / 04
                      Conformity level 1 байт 0x01 или 0x02 или 0x03 или 0x81 или 0x82 или 0x83
                      Идет ли дальше что-то еще 1 байт 0x00 или 0xFF
                      Следующий Object Id 1 байт Номер Object ID
                      Количество объектов 1 байт
                      Список:
                      Object ID 1 байт
                      Длина объекта 1 байт
                      Значение объекта Длина объекта Зависит от Object ID
                      Код функции 1 байт 0xAB (результат 0x2B + 0x80)
                      Код исключения (exception code) 1 байт 01 или 02 или 03 или 04

                      MEI, назначенный на номер 14, идентифицирует запрос чтения идентификации (Read Identification Request).

                      Параметр «Read Device ID code» позволяет определит 4 типа доступа:

                      01: запрос для получения базовой идентификации устройства (потоковый доступ).
                      02: запрос для получения обычной идентификации устройства (потоковый доступ).
                      03: запрос для получения расширенной идентификации устройства (потоковый доступ).
                      04: запрос для получения одного из специфичных объектов идентификации (индивидуальный доступ).

                      Код исключения 03 будет отправлен обратно в ответе, если код Read device ID нелегальный.

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

                      Примечание: объект неделим, таким образом любой объект должен иметь размер, соответствующий размеру ответа транзакции.

                      Если Object Id не соответствует известному объекту, то сервер ответит так, как если бы было указание на объект 0 (перезапуск от начала).

                      В случае индивидуального доступа: ReadDevId code 04, Object Id в запросе дает идентификацию получаемого объекта, и если Object Id не соответствует любому известному объекту, то сервер возвратит ответ исключения с кодом исключения 02 (Illegal data address).

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

                      Function code: код функции 43 (десятичное) 0x2B (hex).

                      MEI Type: 14 (0x0E) тип MEI, назначенный для Device Identification Interface.

                      ReadDevId code: то же самое, как код запроса ReadDevId: 01, 02, 03 или 04.

                      Conformity Level: уровень соответствия идентификации устройства и тип поддерживаемого доступа.

                      0x01: базовая идентификация (только потоковый доступ).
                      0x02: обычная идентификация (только потоковый доступ).
                      0x03: расширенная идентификация (только потоковый доступ).
                      0x81: базовая идентификация (потоковый доступ и индивидуальный доступ).
                      0x82: обычная идентификация (потоковый доступ и индивидуальный доступ).
                      0x83: расширенная идентификация (потоковый доступ и индивидуальный доступ).

                      Что еще следует дальше: в случае кодов ReadDevId 01, 02 или 03 (потоковый доступ), если идентификационные данные не укладываются в одну транзакцию, то может потребоваться несколько транзакций запрос/ответ.

                      0x00: нет больше даных объекта.
                      0xFF: доступен другой объект идентификации, и требуется больше транзакций MODBUS.

                      В случае кода ReadDevId 04 (индивидуальный доступ) это поле должно быть установлено в 00.

                      Next Object Id: если «MoreFollows = FF», запрашивается идентификация следующего объекта. Если «MoreFollows = 00», то должно быть установлено в 00 (бесполезно).

                      Number Of Objects: количество объектов, возвращаемых в ответе (для индивидуального доступа Number Of Objects = 1).

                      Object0.Id: идентификация первого возвращаемого в PDU объекта (потоковый доступ) или запрошенный объект (индивидуальный доступ).

                      Object0.Length: длина первого объекта в байтах.

                      Object0.Value: значение первого объекта (Object0.Length байт).

                      ObjectN.Id: идентификация последнего объекта (в ответе).

                      ObjectN.Length: длина последнего объекта в байтах.

                      ObjectN.Value значение последнего объекта (ObjectN.Length байт).

                      В этом примере вся отправляемая информация помещается в один PDU ответа:

                      Запрос Ответ
                      Имя поля HEX Имя поля HEX
                      Функция 28 Функция 28
                      MEI Type 0E MEI Type 0E
                      Read Dev Id code 01 Read Dev Id Code 01
                      Object Id 00 Conformity Level 01
                      Идет ли что-нибудь дальше 00
                      NextObjectId 00
                      Количество объектов 03
                      Object Id 00
                      Длина объекта 16
                      Значение объекта «Company identification«
                      Object Id 01
                      Длина объекта 0D
                      Значение объекта «Product code XX«
                      Object Id 02
                      Длина объекта 05
                      Значение объекта «V2.11«

                      В случае, когда устройство требует нескольких транзакций для отправки ответа, инициируются следующие транзакции. Первая транзакция:

                      Запрос Ответ
                      Имя поля HEX Имя поля HEX
                      Функция 28 Функция 28
                      MEI Type 0E MEI Type 0E
                      Read Dev Id code 01 Read Dev Id Code 01
                      Object Id 00 Conformity Level 01
                      Идет ли что-нибудь дальше FF
                      NextObjectId 02
                      Количество объектов 03
                      Object Id 00
                      Длина объекта 16
                      Значение объекта «Company identification«
                      Object Id 01
                      Длина объекта 1C
                      Значение объекта «Product code XXXXXXXXXXXXXXXX«
                      Запрос Ответ
                      Имя поля HEX Имя поля HEX
                      Функция 28 Функция 28
                      MEI Type 0E MEI Type 0E
                      Read Dev Id code 01 Read Dev Id Code 01
                      Object Id 02 Conformity Level 01
                      Идет ли что-нибудь дальше 00
                      NextObjectId 00
                      Количество объектов 03
                      Object Id 02
                      Длина объекта 05
                      Значение объекта «V2.11«

                      MODBUS Read Device Identification state diagram fig30

                      Рис. 30. Диаграмма состояний Read Device Identification.

                      [7. Ответы исключений MODBUS]

                      Когда устройство-клиент (master) посылает запрос устройству-серверу (slave), от сервера ожидается нормальный ответ. Из-за запроса master может произойти одно из 4 событий:

                      • Если устройство-сервер приняло запрос без коммуникационной ошибки, то оно может обработать запрос нормальным образом, и вернуть нормальный ответ.
                      • Если сервер не принял запрос из-за коммуникационной ошибки, то ответ возвращен не будет. Программа клиента обработает таймаут для запроса.
                      • Если сервер принял запрос, но обнаружил коммуникационную ошибку (parity, LRC, CRC, . ), то ответ возвращен не будет. Программа клиента обработает таймаут для запроса.
                      • Если сервер принял запрос без коммуникационной ошибки, но не может обработать его (например, если был запрос на чтение несуществующего выхода или регистра), то сервер возвратит ответ исключения (exception response), информирующий клиента о природе ошибки.

                      Сообщение ответа исключения должно иметь два поля, которые отличают это сообщение от нормального ответа:

                      Поле кода функции. В нормальном ответе сервер как эхо посылает в ответе тот же код функции, который был в оригинальном запросе. Это все коды функции, у которых старший бит (MSB) в лог. 0 (их значения меньше 0x80 hex). В ответе исключения (exception response) сервер установит в лог. 1 MSB кода функции. Это делает код функции в ответе исключения однозначно больше на 0x80 (hex), чем значение кода функции в нормaльном ответе.

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

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

                      Запрос Ответ
                      Имя поля HEX Имя поля HEX
                      Функция 01 Функция 81
                      Старший байт начального адреса 04 Код исключения 02
                      Младший байт начального адреса A1
                      Старший байт количества выходов 00
                      Младший байт количества выходов 01

                      В этом примере клиент адресует запрос устройству сервера. Код функции (01) предназначен для операции Read Output Status. Он запрашивает статус выхода по адресу 1185 (0x04A1 hex). Обратите внимание, что считывается только один выход, как указано в поле количества выходов (0001).

                      Если такой адрес выхода не существует в устройстве сервера, то сервер вернет ответ исключения (exception response) с кодом исключения (02). Это указывает на недопустимый адрес данных для slave-устройства.

                      Список кодов исключений (MODBUS Exception Codes, коды указаны в HEX-формате) приведен в следующей таблице.

                      Код Имя Что означает
                      01 ILLEGAL FUNCTION Код функции, полученный в запросе, задает недопустимое действие для сервера (т. е. для подчиненного устройства MODBUS). Это может быть из-за того, что этот код функции применим только для более новых устройств, и он не реализован в выбранном устройстве. Также это может показывать, что сервер находится в неподходящем состоянии для обработки запроса этого типа, например из-за того, что он не сконфигурирован, и при этом с него запрашиваются значения регистров.
                      02 ILLEGAL DATA ADDRESS Адрес данных, принятый в запросе, недопустим для сервера. Другая специфическая ситуация — комбинация индекса (reference number) и количество данных в транзакции (transfer length) недопустимы. Для контроллера со 100 регистрами PDU адресует первый регистр как 0, и последний как 99. Если был выдан запрос, когда начальный адрес регистра 96, и количество запрашиваемых регистров 4, то этот запрос будет успешно выполнен (как минимум по соответствию адресов) для регистров 96, 97, 98, 99. Если запрос был выдан с начальным адресом 96, но количество регистров было задано 5, о этот запрос потерпит неудачу с кодом исключения 0x02 «Illegal Data Address», потому что была сделана попытка выйти за пределы рабочих адресов регистров — потребовалось прочитать регистры 96, 97, 98, 99 и 100, но регистр с адресом 100 не существует.
                      03 ILLEGAL DATA VALUE Значение, содержащееся в поле данных запроса, имеет недопустимое значение для сервера. Это показывает ошибку в остальной части структуры сложного запроса, например неправильную подразумеваемую длину. Это конкретно НЕ означает, что элемент данных, представленный для хранения в регистре, имеет значение, не соответствующее ожиданиям прикладной программы, поскольку протокол MODBUS не знает о смысле и значимости какого-либо конкретного значения какого-либо конкретного регистра.
                      04 SLAVE DEVICE FAILURE Произошла невосстановимая ошибка, кода сервер попытался выполнить запрошенное действие.
                      05 ACKNOWLEDGE Специализированное использование вместе с командами программирования. Сервер (подчиненное устройство) должен принять запрос и обработать его, но для этого требуется большой интервал времени. Этот ответ будет возвращен, чтобы предотвратить ошибку таймаута в клиенте (главном устройстве). Клиент может выдать следующее сообщение Poll Program Complete, чтобы определить, завершена ли обработка.
                      06 SLAVE DEVICE BUSY Специализированное использование вместе с командами программирования. Сервер (подчиненное устройство) занимается обработкой длительной команды программы. Клиент (главное устройство) должно повторно передать сообщение позже, когда сервер освободится.
                      08 MEMORY PARITY ERROR Специализированное использование вместе с кодами функции 20 и 21 и ссылочным типом 6. Показывает, что расширенная область файла не прошла проверку целостности. Сервер попытался прочитать элемент данных в файле, но в памяти детектирована ошибка четности. Клиент (главное устройство) может повторить запрос, однако возможно понадобится сервисное обслуживание (ремонт) сервера.
                      0A GATEWAY PATH UNAVAILABLE Специализированное использование вместе со шлюзами. Показывает, что шлюз не может выделить внутренний путь от входного коммуникационный путь от входного порта до выходного порта, что требовалось для обработки запроса. Обычно это означает, что шлюз неправильно сконфигурирован или перегружен.
                      0B GATEWAY TARGET DEVICE FAILED TO RESPOND Специализированное использование вместе со шлюзами. Показывает, что от целевого устройства не был получен ответ. Обычно означает, что устройство отсутствует в сети.

                      [Приложение A: зарезервированные коды функций MODBUS, субкоды и типы MEI]

                      Следующие коды функций и субкоды функций не входят в публичную спецификацию, и эти коды и субкоды функции специально зарезервированы. Формат представляет собой код/субкод или просто код функции, где зарезервированы следующие комбинации: 8 / 19; 8 / 21 .. 65535, 9, 10, 13, 14, 41, 42, 90, 91, 125, 126 и 127.

                      Эта спецификация в настоящий момент предоставляет код функции 43 и его MEI Type 14 для Device Identification и MEI Type 13 для CANopen General Reference Request и PDU ответа в качестве транспортов инкапсулированного интерфейса (Encapsulated Interface Transports).

                      Следующие коды функции и типы MEI не должны быть частью этой публичной спецификации, и эти коды функции и типы MEI специально зарезервированы: 43 / 0 .. 12 и 43 / 15 .. 255. В этой спецификации код функции пользователя (User Defined Function) дает тот же или подобный результат, как не поддерживаемый Encapsulated Interface Transport.

                      MODBUS является зарегистрированной торговой маркой Schneider Automation Inc.

                      [Словарик]

                      ADU Application Data Unit.

                      HDLC High level Data Link Control.

                      HMI Human Machine Interface.

                      IETF Internet Engineering Task Force.

                      I/O Input/Output, ввод/вывод.

                      IP Internet Protocol.

                      LSB Least Significant Bit, младший значащий бит.

                      MAC Medium Access Control.

                      MB MODBUS Protocol.

                      MBAP MODBUS Application Protocol.

                      MEI MODBUS Encapsulated Interface, дополнительный код функции, передаваемый за основным. Стандарт определяет MEI 13 (0x0D), предназначенный для инкапсуляции протокола CANopen. MEI 14 (0x0E) используется для получения информации об устройстве и MEI в диапазонах 0—12 и 15—255 зарезервированы.

                      MSB Most Significant Bit, старший значащий бит.

                      OSI Open Systems Interconnection, открытая модель организации обмена данными через сеть.

                      PDU Protocol Data Unit, элемент обмена данными.

                      PLC Programmable Logic Controller, программируемый логический контроллер.

                      RFC Request for Comments, рабочее предложение — документ из серии пронумерованных информационных документов Интернета, содержащих технические спецификации и стандарты, широко применяемые во всемирной сети (из Википедии).

                      TCP Transport Control Protocol.

                      клиент главное устройство (master) сети MODBUS, которое отправляет запросы/команды серверам MODBUS и получает от них ответы.

                      сервер подчиненное устройство (slave) сети MODBUS, которое принимает запросы/команды клиента MODBUS, выполняет их и отправляет соответствующие ответы клиенту MODBUS.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *