СПЕЦИФИКАЦИЯ ПРИКЛАДНОГО ПРОТОКОЛА MODBUS V1.1b3 Содержание 1 Введение.......................................................................................................................................................... 2 2 1.1 Область применения данного документа .......................................................................................... 2 Сокращения ..................................................................................................................................................... 2 3 Контекст ........................................................................................................................................................... 3 4 Общее описание ............................................................................................................................................. 3 5 4.1 Описание протокола ........................................................................................................................... 3 4.2 Кодирование данных........................................................................................................................... 5 4.3 Модель данных MODBUS ................................................................................................................... 6 4.4 Модель адресации MODBUS ............................................................................................................. 7 4.5 Определение транзакции MODBUS .................................................................................................. 8 Категории кодов функций ............................................................................................................................. 10 6 5.1 Определение кода общедоступной функции .................................................................................. 11 Описания кодов функций .............................................................................................................................. 11 7 01(0x01) Считывание катушек .......................................................................................................... 11 02 (0x02)Читать Дискретные входы........................................................................................... 12 03 (0x03)Читать Ведение реестров ........................................................................................... 15 04 (0x04)Читать Входные регистры ........................................................................................... 16 05 (0x05)НаписатьОдиночная катушка 17 6.6 06 (0x06)НаписатьЕдиный регистр 19 6.7 07 (0x07)Читать Статус исключения (только для серийной строки) ....................................... 20 6.8 08(0x08) Диагностика (последовательный портТолько строка) 21 6.8.1 Подфункционные коды, поддерживаемые устройствами последовательной линии .. 22 6.8.2 Пример и диаграмма состояний ...................................................................................... 24 6.9 11 (0x0B)Получить CСчетчик событий omm (последовательная линия ............................ только) 25 6.10 12 (0x0C)Получить журнал событий связи (только для последовательной линии) ................. 26 6.11 15 (0x0F) Запись нескольких катушек ............................................................................. 29 6.12 16 (0x10) Запись нескольких регистров ........................................................................... 30 6.13 17 (0x11)Идентификатор сервера отчетов (только для последовательной линии) ................. 31 6.14 20 (0x14) Чтение записи файла ................................................................................. 32 6.15 21 (0x15) Запись файла ........................................................................................ 34 6.16 22 (0x16) Регистр записи маски ................................................................................. 36 6.17 23 (0x17) Чтение/запись нескольких регистров ..................................................................... 38 6.18 24 (0x18) Чтение очереди FIFO.................................................................................. 40 6.19 43 (0x2B) Транспорт инкапсулированного интерфейса .............................................................. 41 6.20 43 / 13(0x2B/0x0D) Общий справочный запрос и ответ CANopen PDU ................................................................................................................................................... 42 6.21 43 / 14(0x2B/0x0E) Чтение идентификации устройства ................................................................. 43 Ответы на исключения MODBUS ................................................................................................................. 47 6.1 6.2 6.3 6.4 6.5 Приложение A (Информационное): MODBUS RESERVED FUNCTION CODES, SUBCODES AND MEI TYPES .............................................................................................................................................................. 50 Приложение B (Информационное): ОБЩЕЕ СПРАВОЧНОЕ КОМАНДОВАНИЕ CANOPEN .......................... 50 Введение 1 1.1 Область применения данного документа MODBUS - протокол обмена сообщениями прикладного уровня, позиционируемый на уровне 7 модели OSI, который обеспечивает клиент-серверную связь между устройствами, подключенными по разным типам шин или сетей. Являясь серийным стандартом де-факто в отрасли с 1979 года, MODBUS продолжает обеспечивать связь для миллионов устройств автоматизации. Сегодня поддержка простой и элегантной структуры MODBUS продолжает расти. Интернет-сообщество может получить доступ к MODBUS через зарезервированный системный порт 502 в стеке TCP/ IP. MODBUS является протоколом запросов/ответов и предлагает услуги, определяемые кодами функций. Коды функций MODBUS являются элементами блоков PDU запроса/ответа MODBUS. Целью этого документа является описание кодов функций, используемых в рамках транзакций MODBUS. MODBUS - это протокол обмена сообщениями прикладного уровня для связи клиент-сервер между устройствами, подключенными к шинам или сетям различных типов. В настоящее время он реализован с использованием: • TCP/ IP через Ethernet. См. руководство по внедрению MODBUS Messaging V1.0a. • • Асинхронная последовательная передача по различным носителям (по проводам: EIA/TIA-232-E, EIA-422, EIA/TIA-485-A; оптоволокно, радио и т.д.) MODBUS PLUS, высокоскоростная сеть передачи маркеров. Рисунок. 1: Коммуникационный стек Ссылки 1. RFC 791, Интернет-протокол, Sep81 DARPA 2Сокращения ADU блок прикладных данных HDLC высокоуровневое управление каналом передачи данных HMI человеко-машинного интерфейса IETF инженерная группа по Интернету Ввод-вывод IP протокол Интернета Управление доступом к MAC носителям MB протокол MODBUS MODBUS MBAP прикладной протокол MODBUS Блок данных протокола PDU PLC программируемый логический контроллер Протокол управления передачей TCP 3 Контекст Протокол MODBUS обеспечивает простую связь в рамках всех типов сетевых архитектур. Рисунок. 2: Пример сетевой архитектуры MODBUS Каждый тип устройств (PLC, HMI, панель управления, драйвер, управление движением, устройство ввода-вывода...) может использовать протокол MODBUS для инициирования удаленной операции. Та же связь может осуществляться по последовательной линии, что и в сетях Ethernet TCP/ IP. Шлюзы обеспечивают связь между несколькими типами шин или сетей по протоколу MODBUS. 4 4.1 Общее описание Описание протокола Протокол MODBUS определяет блок данных простого протокола (PDU) независимо от нижележащих уровней связи. Отображение протокола MODBUS на конкретных шинах или сети может вводить некоторые дополнительные поля в блок прикладных данных (ADU). Рисунок. 3: Общая полка MODBUS Блок прикладных данных MODBUS создается клиентом, который инициирует транзакцию MODBUS. Функция указывает серверу, какое действие необходимо выполнить. Прикладной протокол MODBUS устанавливает формат запроса, инициированного клиентом. Поле кода функции блока данных MODBUS кодируется одним байтом. Допустимые коды находятся в диапазоне от 1... 255 десятичных (диапазон 128 - 255 зарезервирован и используется для ответов исключений). При передаче сообщения от клиента на устройство сервера поле кода функции сообщает серверу, какое действие необходимо выполнить. Недопустимый код функции «0». Коды подфункций добавляются к некоторым кодам функций для определения нескольких действий. Поле данных сообщений, передаваемых от клиента на серверные устройства, содержит дополнительную информацию, которую сервер использует для выполнения действия, определенного кодом функции. Сюда могут входить такие элементы, как дискретные и регистровые адреса, количество элементов, подлежащих обработке, и количество действительных байтов данных в поле. Поле данных может отсутствовать (нулевой длины) в определенных видах запросов, в этом случае сервер не требует никакой дополнительной информации. Действие указывается только в коде функции. Если не происходит ошибки, связанной с функцией MODBUS, запрошенной в правильно принятой MODBUS ADU поле данных ответа сервера клиенту содержит запрошенные данные. Если происходит ошибка, связанная с запрашиваемой функцией MODBUS, поле содержит код исключения, который серверное приложение может использовать для определения следующего действия, которое должно быть выполнено. Например, клиент может считывать состояния ВКЛ/ВЫКЛ группы дискретных выходов или входов или он может считывать/записывать содержимое данных группы регистров. Когда сервер отвечает клиенту, он использует поле кода функции, чтобы указать либо нормальный (безошибочный) ответ или то, что произошла какая-то ошибка (называемая исключением ответ). Для нормального ответа сервер просто повторяет на запрос исходный код функции. Рисунок. 4. Транзакция MODBUS (без ошибок) Для ответа на исключение сервер возвращает код, который эквивалентен исходному коду функции из запроса PDU с его старшим битом, установленным в logic 1. ................................ .. ................................................................................... ........................................... Примечание: Желательно уложиться в тайм-аут, чтобы не бесконечно ждать ответа, который, возможно, никогда не придет. Размер PDU MODBUS ограничен ограничением размера, унаследованным от первой реализации MODBUS в сети последовательной линии (макс. RS485 ADU = 256 байт). Рисунок. 5: Транзакция MODBUS (ответ на исключение) Поэтому: PDU MODBUS для связи по последовательной линии = 256 - адрес сервера (1 байт) - CRC (2 байта) = 253 байта. Следовательно: RS232/ RS485 ADU = 253 байта + Адрес сервера (1 байт) + CRC (2 байта) = 256 байт. TCP ADU MODBUS = 253 байта + MBAP (7 байтов) = 260 байтов. Протокол MODBUS определяет три блока PDU. Это: • • • PDU запроса MODBUS, mb_req_pdu MODBUS Response PDU, mb_rsp_pdu PDU отклика на исключение MODBUS, mb_excep_rsp_pdu Этот mb_req_pdu определяется следующим образом: mb_req_pdu = {function_code, request_data}, где function_code = [1 байт] Код функции MODBUS, request_data = [n байт] Это поле зависит от кода функции и обычно содержит такую информацию, как ссылки на переменные, количество переменных, смещения данных, коды подфункций и т.д. Этот mb_rsp_pdu определяется следующим образом: mb_rsp_pdu = {function_code, response_data}, где function_code = [1 байт] код функции MODBUS response_data = [n байт] Это поле зависит от кода функции и обычно содержит такую информацию, как ссылки на переменные, количество переменных, смещения данных, коды подфункций и т.д. Этот mb_excep_rsp_pdu определяется следующим образом: mb_excep_rsp_pdu = {exception-function_code, request_data}, где exception-function_code = [1 байт] Код функции MODBUS + 0x80 exception_code = [1 байт] Код исключения MODBUS Определен в таблице «Коды исключений MODBUS» (см. раздел7). 3.1 Кодирование данных • MODBUS использует представление «big-Endian» для адресов и элементов данных. Это означает, что при передаче числовой величины, превышающей один байт, сначала отправляется старший байт. Так, например 16 - биты Значение размера регистра 0x1234 первый отправленный байт 0x12, затем 0x34 Примечание: Для получения более подробной информации см. [1]. Модель данных MODBUS 3.2 MODBUS основывает свою модель данных на серии таблиц, которые имеют отличительные характеристики. Четыре основные таблицы: Первичные таблицы Тип объекта Тип Дискретный ввод Одноразрядный Только для чтения Катушки Одноразрядный Читайте - Пишут Входные регистры 16-битное слово Только для чтения Ведение реестров 16-битное слово Читайте - Пишут Комментарии Этот тип данных может предоставляться системой ввода-вывода. Этот тип данных может быть изменен прикладной программой. Этот тип данных может предоставляться системой ввода-вывода Этот тип данных может быть изменен прикладной программой. Различия между входными и выходными данными, а также между элементами данных, адресуемыми битами и словами, не подразумевают какого-либо поведения приложения. Вполне допустимо и очень часто рассматривать все четыре таблицы как наложенные друг на друга, если это наиболее естественная интерпретация на рассматриваемой целевой машине. Для каждой из первичных таблиц протокол допускает индивидуальный выбор 65536 элементов данных, и операции считывания или записи этих элементов предназначены для того, чтобы охватывать множество последовательных элементов данных вплоть до предела размера данных, который зависит от кода функции транзакции. Очевидно, что все данные, обрабатываемые через MODBUS (биты, регистры), должны находиться в памяти приложения устройства. Но физический адрес в памяти не следует путать со ссылкой на данные. Единственное требование - связать ссылку на данные с физическим адресом. Номера логических ссылок MODBUS, используемые в функциях MODBUS, являются целыми индексами без знака, начинающимися с нуля. • Примеры реализации модели MODBUS В приведенных ниже примерах показаны два способа организации данных в устройстве. Возможны различные организации, но не все они описаны в этом документе. Каждое устройство может иметь свою собственную организацию данных в соответствии со своим применением Пример 1: Устройство, имеющее 4 отдельных блока В приведенном ниже примере показана организация данных в устройстве, имеющем цифровые и аналоговые входы и выходы. Каждый блок является отдельным, поскольку данные из разных блоков не имеют корреляции. Каждый блок, таким образом, доступен с различными функциями MODBUS. Рис. 6 Модель данных MODBUS с отдельным блоком Пример 2: Устройство, имеющее только 1 блок В этом примере устройство имеет только 1 блок данных. Одни и те же данные могут быть получены с помощью нескольких функций MODBUS либо через 16-битовый доступ, либо через бит доступа. Рис. 7 Модель данных MODBUS с одним блоком 1 3.3 Модель адресации MODBUS Прикладной протокол MODBUS точно определяет PDU правила адресации. В PDU MODBUS каждая информация адресуется от 0 до 65535. Он также четко определяет модель данных MODBUS, состоящую из 4 блоков, которые содержат несколько элементов, пронумерованных от 1 до n. В модели данных MODBUS каждый элемент в блоке данных пронумерован от 1 до n. После этого модель данных MODBUS должна быть привязана к приложению устройства (объекту IEC-61131 или другой модели приложения). Предварительное отображение между моделью данных MODBUS и приложением устройства полностью зависит от производителя устройства. Рис. 8. Модель адресации MODBUS На предыдущем рисунке показано, что данные MODBUS с номером X адресуются в PDU MODBUS X-1. 3.4 Определение транзакции MODBUS Следующая диаграмма состояний описывает общую обработку транзакции MODBUS на стороне сервера. Рис. 9 Схема состояний транзакций MODBUS После обработки запроса сервером формируется ответ MODBUS с использованием соответствующей транзакции сервера MODBUS. В зависимости от результата обработки строятся два типа ответа: ■ Положительный ответ MODBUS: ■ ■ код функции ответа = код функции запроса Ответ на исключение MODBUS (см. раздел7): ■ цель состоит в том, чтобы предоставить клиенту соответствующую информацию, касающуюся ошибки, обнаруженной во время обработки; код функции исключения = код функции запроса + 0x80; ■ код исключения предоставляется для указания причины ошибки. ■ 5 Категории кодов функций Существует три категории кодов функций MODBUS. Это: Коды функций общего пользования • Являются хорошо определенными кодами функций, • гарантированно быть уникальным, • подтверждено сообществом MODBUS.org, • публично задокументировано • есть доступный тест соответствия, • включает как определенные общедоступные назначенные функциональные коды, так и неназначенные функциональные коды, зарезервированные для будущего использования. Коды пользовательских функций • существует два диапазона кодов определяемых пользователем функций: От 65 до 72 и от 100 до 110 десятичных. • пользователь может выбрать и реализовать код функции, который не поддерживается спецификацией. • нет гарантии, что использование выбранного кода функции будет уникальным • если пользователь хочет повторно позиционировать функциональность как общедоступный код функции, он должен инициирует RFC для внесения изменений в категорию public и присвоения нового кода функции public. • MODBUS Organization, Inc явно оставляет за собой право на разработку предлагаемого RFC. Зарезервированные коды функций Коды функций, которые в настоящее время используются некоторыми компаниями для старых продуктов и которые недоступны для публичного использования. • Информационное примечание: Читателя просят обратиться к Приложению A (Информационное) MODBUS ЗАРЕЗЕРВИРОВАННЫЕ КОДЫ ФУНКЦИЙ, СУБКОДЫ И ТИПЫ MEI. Рис. 10 Категории кодов функций MODBUS • 5.1 Определение кода общедоступной функции Физические дискретные Считывание дискретных входных входы данных Считывание катушек Битовый Внутренние биты или доступ Физические катушки Записать одну катушку Запись нескольких катушек Коды функций кодекс Субкод (шест надца терич 02 02 ный) Физические входные Чтение входного регистра регистры Чтение регистров хранения Доступ к данным 16-битный Внутренние регистры Записать один регистр доступ или физические Запись нескольких регистров выходные регистры Чтение/запись нескольких регистров Регистр записи маски Чтение очереди FIFO Чтение записи файла Доступ к записям файлов Запись файла Состояние исключения чтения Диагностический Диагностика Получить счетчик событий Com Получить журнал событий COM Идентификатор сервера отчетов Прочитать идентификацию устройства Другое Транспорт инкапсулированного интерфейса Общая ссылка CANopen 6 Раздел 6.2 01 05 15 01 05 0F 6.1 6.5 6.11 04 04 6.4 03 03 6.3 06 06 6.6 16 23 22 24 20 21 07 08 11 12 17 43 43 14 13,14 10 17 16 18 14 15 07 08 ОБЬ 0C 11 2B 2B 6.12 6.17 6.16 6.18 6.14 6.15 6.7 6.8 6.9 6.10 6.13 6.21 6.19 13 2B 6.20 43 00-18,20 Описания кодов функций 6.1 01 (0x01) Катушки считывания Этот код функции используется для считывания от 1 до 2000 смежных состояний катушек в удаленном устройстве. В PDU запроса указывается начальный адрес, т.е. адрес первой указанной катушки и количество катушек. В PDU катушки адресуются, начиная с нуля. Поэтому катушки с номерами 1-16 адресуются как 0-15. Катушки в ответном сообщении упакованы как одна катушка на бит поля данных. Состояние указывается как 1 = ON и 0 = OFF. LSB первого байта данных содержит выходные данные, адресуемые в запросе. Другие катушки следуют к концу высокого порядка этого байта и от низкого порядка к высокому в последующих байтах. Если возвращаемое выходное количество не кратно восьми, оставшиеся биты в конечном байте данных будут дополнены нулями (по направлению к верхнему концу байта). Поле Byte Count указывает количество полных байтов данных. Запрос Ответ Код функции Начальный адрес Количество катушек 1 байт 2 байта 2 байта 0x01 0x0000 для 0xFFFF 1-2000 (0x7D0) Код функции Количество байтов Состояние катушки 1 байт 1 байт n Байт 0x01 N* n = N или N + 1 * N = количество выводов/8, если остаток отличается от 0 ^ N = N + 1 Ошибка Код функции Код исключения 1 байт 1 байт Код функции + 0x80 01 или 02 или 03 или 04 Вот пример запроса на считывание дискретных выходных данных 20-38: Запрос Имя поля Функция Начальный адрес Hi Начальный адрес Lo Количество выходов Hi Количество выходов Lo (шестнадца теричный) 01 00 13 00 13 Ответ Имя поля Функция Число байтов Состояние выходов 27-20 Состояние выходных данных 35-28 Состояние выходных данных 38-36 (шестнадца теричный) 01 03 CD 6B 05 Состояние выходов 27 -20 отображается как значение байта CD шестнадцатеричное или двоичное 1100 1101. Выход 27 является MSB этого байта, а выход 20 является LSB. По соглашению биты в байте отображаются слева от MSB, а справа от LSB. Таким образом, выходными данными в первом байте являются «27-20», слева направо. Следующий байт имеет выходы «от 35 до 28», слева направо. Поскольку биты передаются последовательно, они перетекают из LSB в MSB: 20... 27, 28 . . . 35 и так далее. В последнем байте данных состояние выходов 38-36 показано как значение байта 05 шестнадцатеричное, или двоичное 0000 0101. Выход 38 находится в позиции шестого бита слева, а выход 36 является LSB этого байта. Пять оставшихся старших битов заполнены нулями. c § =... ............... .................................................................................................... Примечание.Пять оставшихся битов (в направлении конца высокого порядка) заполнены нулями. Рисунок. 11: Диаграмма состояний 5.1 считывающих катушек 02 (0x02) Считывание дискретных входов Этот код функции используется для считывания от 1 до 2000 последовательных состояний дискретных входов в удаленном устройстве. В PDU Request указывается начальный адрес, т.е. адрес первого указанного входа, и количество входов. В PDU дискретные входы адресуются, начиная с нуля. Поэтому дискретные входы с номерами 1-16 адресуются как 0-15. Дискретные входные сигналы в ответном сообщении упаковываются как один входной сигнал на бит поля данных. Состояние указывается как 1 = ON; 0 = ВЫКЛ. LSB первого байта данных содержит входные данные, адресуемые в запросе. Другие входные данные следуют к концу высокого порядка этого байта и от низкого порядка к высокому в последующих байтах. Если возвращаемое входное количество не кратно восьми, оставшиеся биты в конечном байте данных будут дополнены нулями (по направлению к верхнему концу байта). Поле Byte Count указывает количество полных байтов данных. Запрос Код функции 1 байт 0x02 Начальный адрес 2 байта 0x0000 для 0xFFFF Количество вводимых ресурсов 2 байта 1-2000 (0x7D0) Ответ Код функции 1 байт 0x02 Количество байтов 1 байт N* Состояние ввода N * x 1 байт * N = количество вводов/8, если остаток отличается от 0 ^ N = N + 1 Ошибка 0x82 Код ошибки 1 байт Код исключения 1 байт 01 или 02 или 03 или 04 Здесь приведен пример запроса на считывание дискретных входных данных 197-218: Запрос Имя поля Функция Начальный адрес Hi Начальный адрес Lo Количество вводов Hi Количество вводов Lo (шестнадца теричный) 02 00 С4 00 16 Ответ Имя поля Функция Число байтов Входы Статус 204-197 Состояние входов 212-205 Состояние входов 218-213 (шестнадца теричный) 02 03 ПЕРЕМ ЕННЫЙ БД ТОК35 Состояние дискретных входов 204-197 показано как значение байта AC hex, или двоичный 1010 1100. Вход 204 является MSB этого байта, а вход 197 является LSB. Состояние дискретных входов 218-213 показано как значение байта 35 шестнадцатеричное или двоичное 0011 0101. Вход 218 находится в положении третьего бита слева, а вход 213 является LSB. .. . . ..................................................................... „ ............................... Примечание.Два оставшихся бита (на стороне высшего порядка) заполнены нулями. Рисунок. 12: Считывание диаграммы состояний дискретных входов 5.2 03 (0x03) Чтение удерживающих регистров Этот код функции используется для считывания содержимого непрерывного блока удерживающих регистров на удаленном устройстве. В PDU Request указывается адрес начального регистра и количество регистров. В PDU регистры адресуются, начиная с нуля. Поэтому регистры с номерами 1-16 адресуются как 0-15. Данные регистра в ответном сообщении упаковываются как два байта на регистр, причем право двоичного содержимого выравнивается в пределах каждого байта. Для каждого регистра первый байт содержит биты Запрос Код функции Начальный адрес Количество регистров 1 байт 2 байта 2 байта 0x03 0x0000 для 0xFFFF От 1 до 125 (0x7D) Код функции Количество байтов Значение регистра 1 байт 1 байт N * x 2 байта 0x03 2xN* Ответ Ошиб ка высокого порядка, а второй - биты низкого порядка. Код ошибки Код исключения 1 байт 1 байт 0x83 01 или 02 или 03 или 04 Ниже приведен пример запроса на чтение регистров 108-110: Запрос Имя поля (шестнадца теричный) 03 00 Функция Начальный адрес Hi 6B Начальный адрес Lo * N = количество регистров00 Нет. Регистров Hi 03 Нет. Регистров Ло Ответ Имя поля Функция Число байтов Регистровое значение Hi (108) Значение регистра Lo (108) Значение регистра Hi (109) Значение регистра Lo (109) Значение регистра Hi (110) Значение регистра Lo (110) (шестнадца теричный) 03 06 02 2B 00 00 00 64 Содержимое регистра 108 показано как два байтовых значения из 02 2B шестнадцатеричных, или 555 десятичных. Содержимое регистров 109-110 - 00 00 и 00 64 hex, или 0 и 100 decimal, соответственно. Рисунок. 13: Диаграмма состояний регистров удержания чтения 6.4 04 (0x04) Чтение входных регистров Этот код функции используется для считывания от 1 до 125 смежных входных регистров в удаленном устройстве. В PDU Request указывается адрес начального регистра и количество регистров. В PDU регистры адресуются, начиная с нуля. Поэтому входные регистры с номерами 1-16 адресуются как 0-15. Данные регистра в ответном сообщении упаковываются как два байта на регистр, причем право двоичного содержимого выравнивается в пределах каждого байта. Для каждого регистра первый байт содержит биты высокого порядка, а второй - биты низкого порядка. Ответ Код функции Количество байтов Входные регистры 1 байт 1 байт N * x 2 байта 0x04 2xN* Затребовать __________________________________________________________ Код функции Начальный адрес Количество входных регистров Ошибка Код ошибки * N = количество входных регистров Код исключения 1 байт 2 байта 2 байта 0x04 0x0000 для 0xFFFF С 0x0001 по 0x007D 1 байт 1 байт 0x84 01 или 02 или 03 или 04 Ниже приведен пример запроса на чтение входного регистра 9: Запрос Имя поля Функция Начальный адрес Hi Начальный адрес Lo Количество входных рег. Hi (шестнадца теричный) 04 00 08 00 Ответ Имя поля Функция Число байтов Вход рег. 9 Hi Входной рег. 9 Lo (шестнадца теричный) 04 02 00 0A 1 Количество входного рег. ло. 01 II 1 Содержимое входного регистра 9 показано в виде двухбайтовых значений 00 0A шестнадцатеричных или десятичных 10. Рисунок. 14. Диаграмма состояний входных регистров чтения 6.5 05 (0x05) Записать одну катушку Этот код функции используется для записи одного выхода либо в ON, либо в OFF на удаленном устройстве. Запрошенное состояние ON/OFF определяется константой в поле данных запроса. Значение FF 00 шестнадцатеричный требует, чтобы выход был ON. Значение 00 00 требует, чтобы он был OFF. Все остальные значения недопустимы и не влияют на выходные данные. В PDU Request указывается адрес катушки, подлежащей принудительной передаче. Обращение к катушкам начинается с нуля. Поэтому катушка с номером 1 адресуется как 0. Запрашиваемое состояние ON/OFF определяется константой в поле Coil Value. Значение 0XFF00 запрашивает включение катушки. Значение 0X0000 запрашивает выключение катушки. Все остальные значения недопустимы и не влияют на катушку. Нормальный ответ - это эхо запроса, возвращаемое после записи состояния катушки. Требуемая e_st _________________ _____________________________________ Код функции Адрес вывода Выходное значение 1 байт 2 байта 2 байта 0x05 0x0000 для 0xFFFF 0x0000 или 0xFF00 Код функции Адрес вывода 1 байт 2 байта 0x05 0x0000 для 0xFFFF Ответ Ошиб ка Выходное значение 2 байта 0x0000 или 0xFF00 Код ошибки Код исключения 1 байт 1 байт 0x85 01 или 02 или 03 или 04 Вот пример запроса на запись Coil 173 ON: Запрос Имя поля Функция Выходной адрес Hi Выходной адрес Lo Выходное значение Hi Выходное значение Lo (шестнадца теричный) 05 00 ПЕРЕМЕНН ЫЙFF ТОК 00 Ответ Имя поля Функция Выходной адрес Hi Выходной адрес Lo Выходное значение Hi Выходное значение Lo (шестнадца теричный) 05 00 ПЕРЕМ ЕННЫЙ FF ТОК00 6,6 Рисунок. 15. Запись схемы состояний одиночного 06 (0x06) Запись выхода одного регистра Этот код функции используется для записи одного регистра хранения в удаленном устройстве. В PDU Request указывается адрес записываемого регистра. Адреса регистров начинаются с нуля. Поэтому регистр с номером 1 адресуется как 0. Запрос Код функции Адрес регистра Значение регистра 1 байт 2 байта 2 байта 0x06 0x0000 для 0xFFFF 0x0000 для 0xFFFF Код функции Адрес регистра Значение регистра 1 байт 2 байта 2 байта 0x06 0x0000 для 0xFFFF 0x0000 для 0xFFFF Ответ Обычный ответ - это эхо запроса, возвращаемое после записи содержимого регистра. Ошибка Код ошибки Код исключения 1 байт 1 байт 0x86 01 или 02 или 03 или 04 Вот пример запроса на запись регистра 2 в 00 03 hex: Запрос Имя поля Функция Регистрация Адрес Привет Зарегистрировать адрес Lo Значение регистра Hi Значение регистра Lo (шестнадца теричный) 06 00 01 00 03 Ответ Имя поля Функция Регистрация Адрес Привет Зарегистрировать адрес Lo Значение регистра Hi Значение регистра Lo (шестнадца теричный) 06 00 01 00 03 Рисунок. 16. Запись диаграммы состояний одиночного регистра 6.7 07 (0x07) Статус исключения чтения (только для последовательной линии) Этот код функции используется для считывания содержимого восьми выходов Exception Status на удаленном устройстве. Функция предоставляет простой метод доступа к этой информации, потому что ссылки Exception Output известны (ссылка на вывод в функции не требуется). Обычный ответ содержит состояние восьми выходов Exception Status. Выходные данные упаковываются в один байт данных с одним битом на выход. Состояние самой низкой выходной ссылки содержится в младшем значащем бите байта. Содержимое восьми выходов Exception Status зависит от конкретного устройства. Запрос Код функции 1 байт 0x07 Код функции Выходные данные 1 байт 1 байт 0x07 От 0x00 до 0xFF Код ошибки Код исключения 1 байт 1 байт 0x87 01 или 04 Ответ Ошиб ка Вот пример запроса на чтение статуса исключения: Запрос Имя поля Функция (шестнадца теричный) 07 Ответ Имя поля Функция Выходные данные (шестнадца теричный) 07 6D В этом примере выходными данными являются шестнадцатеричные 6D (двоичные 0110 1101). Слева направо выходы находятся в состоянии OFF-ON-ON-OFF-ON-ON-OFF-ON. Состояние отображается от самого высокого до самого низкого адресного выхода. Рисунок. 17: Диаграмма состояний состояния исключения чтения 6.8 08 (0x08) Диагностика (только для последовательной линии) Код функции MODBUS 08 предоставляет серию тестов для проверки системы связи между клиентским устройством и сервером или для проверки различных внутренних условий ошибок на сервере. Функция использует двухбайтовое поле кода подфункции в запросе для определения типа выполняемого теста. Сервер повторяет как код функции, так и код подфункции в нормальном ответе. Некоторые диагностические данные вызывают возврат данных от удаленного устройства в поле данных нормального ответа. Как правило, выдача функции диагностики удаленному устройству не влияет на выполнение пользовательской программы на удаленном устройстве. Пользовательская логика, такая как дискретные и регистры, не доступна для диагностики. Некоторые функции могут дополнительно сбрасывать счетчики ошибок на удаленном устройстве. Однако серверное устройство может быть принудительно переведено в режим «Listen Only Mode», в котором оно будет контролировать сообщения в системе связи, но не отвечать на них. Это может повлиять на результат работы прикладной программы, если это зависит от дальнейшего обмена данными с удаленным устройством. Как правило, режим принудительно удаляет неисправное удаленное устройство из системы связи. Следующие диагностические функции предназначены для устройств последовательной линии. Обычным ответом на запрос Return Query Data является закольцовывание тех же данных. Также Запрос Код функции Подфункция Данные 1 байт 2 байта N x 2 байта 0x08 воспроизводятся код функции и коды подфункций. Ответ Код функции Подфункция 1 байт 2 байта 0x08 Данные N x 2 байта Ошибка Код ошибки Код исключения 6.8.1 1 байт 1 байт 0x88 01 или 03 или 04 Подфункционные коды, поддерживаемые устройствами последовательной линии Здесь приведен список кодов подфункций, поддерживаемых устройствами последовательной линии. Каждый код подфункции затем перечисляется с примером содержимого поля данных, которое будет применяться для этой диагностики. Код подфункции Ведьма Декабрь Имя 00 01 02 03 04 00 01 02 03 04 05.. 09 Вернуть данные запроса Параметр перезапуска связи Вернуть диагностический регистр Изменить разделитель ввода ASCII Принудительный режим только прослушивания Зарезервировано 0A 0B 0C 10 11 12 Очистить счетчики и диагностический регистр Число сообщений шины возврата Счетчик ошибок связи шины возврата 0D 0E 0F 10 13 14 15 16 Число ошибок исключения шины возврата Число возвращаемых сообщений сервера Счетчик отсутствия ответа сервера возврата Счетчик NAK сервера возврата 11 12 13 17 18 19 Счетчик занятости сервера возврата Число символов переполнения шины возврата Зарезервировано 14 Н.А. 20 21 ... 65535 Очистить счетчик переполнения и флаг Зарезервировано 00 Возврат данных запроса Данные, переданные в поле данных запроса, должны быть возвращены (закольцованы) в ответе. Все ответное сообщение должно быть идентично запросу. Подфункция Поле данных (запрос) Поле данных (ответ) 00 00 Любые данные эхо-запроса 01 Возможность перезапуска связи Последовательный порт удаленного устройства должен быть инициализирован и перезапущен, а все его счетчики событий связи сброшены. Если порт в настоящее время находится в режиме Listen Only, ответ не возвращается. Эта функция является единственной, которая выводит порт из режима Listen Only. Если порт в данный момент не находится в режиме Listen Only, возвращается обычный ответ. Это происходит до выполнения перезапуска. Когда удаленное устройство получает запрос, оно предпринимает попытку перезапуска и выполняет проверку надежности включения питания. Успешное завершение тестов позволит перевести порт в оперативный режим. Содержимое поля данных запроса FF 00 шестнадцатеричный также приводит к очистке журнала событий связи порта. Содержимое 00 00 оставляет журнал таким, каким он был до перезапуска. Подфункция Поле данных (запрос) Поле данных (ответ) 00 01 00 00 Данные эхо-запроса 00 01 FF 00 Данные эхо-запроса 02 Возврат диагностического регистра Содержимое 16-разрядного диагностического регистра удаленного устройства возвращается в ответе. Подфункция Поле данных (запрос) Поле данных (ответ) 00 02 00 00 Диагностический регистр Содержание 03 Изменение разделителя входных данных ASCII Символ «CHAR», переданный в поле данных запроса, становится концом разделителя сообщений для будущих сообщений (заменяя символ LF по умолчанию). Эта функция полезна в корпусах перевод строки не требуется в конце сообщений ASCII. Поле данных (запрос) Поле данных (ответ) Подфункция CHAR 00 Данные эхо-запроса 00 03 04 Принудительный режим только для прослушивания Переводит адресуемое удаленное устройство в режим Listen Only для связи MODBUS. Это изолирует его от других устройств в сети, позволяя им продолжать обмен данными без прерывания связи с адресуемым удаленным устройством. Ответ не возвращается. Когда удаленное устройство переходит в режим Listen Only, все активные элементы управления связью выключаются. Контрольный таймер Ready может истечь, блокируя элементы управления. Пока устройство находится в этом режиме, любые сообщения MODBUS, адресованные ему или широковещательные, контролируются, но никакие действия не будут предприняты, и ответы не будут отправлены. Единственной функцией, которая будет обработана после входа в режим, будет функция Restart Communications Option (код функции 8, подфункция 1). Подфункция Поле данных (запрос) Поле данных (ответ) 00 04 00 00 Ответ не возвращен 10 (0A шестнадцатеричный) Очистить счетчики и диагностический регистр Цель - очистить все счетчики и диагностический регистр. Счетчики также очищаются при включении питания. Подфункция Поле данных (запрос) Поле данных (ответ) 00 0A 00 00 Данные эхо-запроса 11 (0B шестнадцатеричный формат) Число сообщений шины возврата Поле данных ответа возвращает количество сообщений, обнаруженных удаленным устройством в системе связи с момента последнего перезапуска, операции сброса счетчиков или включения питания. Подфункция Поле данных (запрос) Поле данных (ответ) 00 0B 00 00 Общее число сообщений 12 (0C шестнадцатеричный) Счетчик ошибок связи шины возврата Поле данных ответа возвращает количество ошибок CRC, обнаруженных удаленным устройством с момента последнего перезапуска, операции очистки счетчиков или включения питания. Подфункция Поле данных (запрос) Поле данных (ответ) 00 0C 00 00 CRC Число ошибок 13 (0D шестнадцатеричный) Число ошибок исключения шины возврата Поле данных ответа возвращает количество ответов об исключениях MODBUS, возвращенных удаленным устройством с момента последнего перезапуска, операции сброса счетчиков или включения питания. Ответы на исключения описаны и перечислены в разделе7. Подфункция Поле данных (запрос) Поле данных (ответ) 00 0D 00 00 Число ошибок исключения 14 (0E шестнадцатеричное значение) Число возвращаемых сообщений сервера Поле данных ответа возвращает количество сообщений, адресованных удаленному устройству, или широковещательных сообщений, которые удаленное устройство обработало с момента последнего перезапуска, операции сброса счетчиков или включения питания. Подфункция Поле данных (запрос) Поле данных (ответ) 00 0E 00 00 Количество сообщений сервера 15 (0F шестнадцатеричный) Вернуть счетчик отсутствия ответа сервера Поле данных ответа возвращает количество сообщений, адресованных удаленному устройству, для которых оно не вернуло ответа (ни обычного ответа, ни ответа на исключение), с момента последнего перезапуска, операции сброса счетчиков или включения питания. Подфункция Поле данных (запрос) Поле данных (ответ) 00 0F 00 00 Счетчик отсутствия ответа сервера 16 (10 шестнадцатеричных знаков) Возврат счетчика NAK сервера Поле данных ответа возвращает количество сообщений, адресованных удаленному устройству, для которых оно возвратило ответ на исключение отрицательного подтверждения (NAK) с момента последнего перезапуска, операции сброса счетчиков или включения питания. Ответы на исключения описаны и перечислены в разделе7. Подфункция Поле 00 10 данных (запрос) Поле данных (ответ) 00 00 Счетчик NAK сервера 17 (11 шестнадцатеричных) Счетчик занятости сервера возврата Поле данных ответа возвращает количество сообщений, адресованных удаленному устройству, для которого оно вернуло ответ на исключение «Занято серверного устройства», с момента последнего перезапуска, операции сброса счетчиков или включения питания. Подфункция Поле данных (запрос) Поле данных (ответ) 00 11 00 00 Число занятых серверных устройств 18 (12 шестнадцатеричных знаков) Количество символов переполнения шины возврата Поле данных ответа возвращает количество сообщений, адресованных удаленному устройству, которые оно не смогло обработать из-за переполнения символов с момента последнего перезапуска, операции сброса счетчиков или включения питания. Переполнение символов вызвано тем, что символы данных прибывают в порт быстрее, чем они могут быть сохранены, или потерей символа из-за аппаратного сбоя. Подфункция Поле данных (запрос) Поле данных (ответ) 00 12 00 00 Счетчик переполнения символов сервера 20 (14 шестнадцатеричных цифр) Сброс счетчика переполнения и флага Очищает счетчик ошибок переполнения и сбрасывает флаг ошибки. Подфункция Поле данных (запрос) Поле данных (ответ) 00 14 00 00 Данные эхо-запроса 6.8.2 Пример и диаграмма состояний Ниже приведен пример запроса к удаленному устройству на возврат данных запроса. При этом используется нулевой код подфункции (00 00 шестнадцатеричный в двухбайтовом поле). Возвращаемые данные отправляются в двухбайтовом поле данных (A5 37 hex). Запрос Имя поля Функция Подфункция Hi Подфункция Lo Данные Hi Данные Lo (шестнадца теричный) 08 00 00 A5 37 Ответ Имя поля Функция Подфункция Hi Подфункция Lo Данные Hi Данные Lo (шестнадца теричный) 08 00 00 A5 37 Поля данных в ответах на запросы других типов могут содержать счетчики ошибок или другие данные, запрашиваемые кодом подфункции. Рисунок. 18: Диаграмма диагностики 6.9 состояния 11 (0x0B) Получение счетчика событий связи (только для последовательной линии) Этот код функции используется для получения слова состояния и счетчика событий из счетчика событий связи удаленного устройства. Выбирая текущий счет до и после серии сообщений, клиент может определить, были ли сообщения обработаны нормально удаленным устройством. Счетчик событий устройства увеличивается один раз при каждом успешном завершении сообщения. Оно не увеличивается для ответов на исключения, команд опроса или команд выборки счетчика событий. Счетчик событий может быть сброшен с помощью функции Diagnostics (код 08), с подфункцией Restart Communications Option (код 00 01) или Clear Counters and Diagnostic Register (код 00 0A). Обычный ответ содержит двухбайтовое слово состояния и двухбайтовое число событий. Слово состояния будет состоять только из единиц (FF FF hex), если ранее выданная команда программы все еще обрабатывается удаленным устройством (существует состояние занятости). В противном случае слово состояния будет состоять только из нулей. Запрос Ответ Код функции Статус Код функции 1 байт 2 байта 1-байтовая 0x0B 0x0000 для 0xFFFF 0x0B Число событий 2 байта 0x0000 для 0xFFFF Код ошибки Код исключения 1 байт 1 байт 0x8B 01 или 04 Ошибка Вот пример запроса на получение счетчика событий связи в удаленном устройстве: Запрос Ответ Имя поля Функция (шестнадца теричный) 0B Имя поля Функция Статус Hi Статус Lo Число событий Hi Число событий Lo (шестнадца теричный) 0B FF FF 01 08 В этом примере слово состояния - FF FF hex, указывающее, что в удаленном устройстве все еще выполняется программная функция. Счетчик событий показывает, что 264 (01 08 шестнадцатеричных) события были подсчитаны устройством. Рисунок. 19. 6.10 Получение диаграммы состояний счетчика событий связи 12 (0x0C) Получение журнала событий связи (только для последовательной линии) Этот код функции используется для получения с удаленного устройства слова состояния, количества событий, количества сообщений и поля байтов событий. Счетчики слов состояния и событий идентичны счетчикам, возвращаемым функцией Get Communications Event Counter (11, 0B шестнадцатеричном формате). Счетчик сообщений содержит количество сообщений, обработанных удаленным устройством с момента его последнего перезапуска, операции очистки счетчиков или включения питания. Это число идентично числу, возвращаемому функцией Diagnostic (код 08), подфункцией Return Bus Message Count (код 11, шестнадцатеричный код 0B). Поле event bytes содержит 0-64 байта, причем каждый байт соответствует состоянию одной операции отправки или приема MODBUS для удаленного устройства. Удаленное устройство вводит события в поле в хронологическом порядке. Байт 0 является самым последним событием. Каждый новый байт удаляет из поля самый старый байт. Обычный ответ содержит двухбайтовое поле слова состояния, двухбайтовое поле счетчика событий, двухбайтовое поле счетчика сообщений и поле, содержащее 0-64 байта событий. Поле подсчета байтов определяет общую длину данных в этих четырех полях. Запрос Код функции 1-байтовая 0x0C Ответ Код функции Число байтов Статус Число событий Число сообщений События 1 байт 1 байт 2 байта 2 байта 2 байта (N-6) x 1 байт 0x0C N* 0x0000 для 0xFFFF 0x0000 для 0xFFFF 0x0000 для 0xFFFF * N = количество событий + 3 x 2 байта, (длина состояния, число событий и число сообщений) Ошиб ка Код ошибки Код исключения 1 байт 1 байт 0x8C 01 или 04 Вот пример запроса на получение журнала событий связи на удаленном устройстве: Запрос Имя поля Функция (шестнадца теричный) 0C Ответ Имя поля Функция Число байтов Статус Hi Статус Lo Число событий Hi Число событий Lo Число сообщений Hi Число сообщений Lo Событие 0 Событие 1 (шестнадца теричный) 0C 08 00 00 01 08 01 21 20 00 В этом примере слово состояния - 00 00 hex, указывающее, что удаленное устройство не обрабатывает программную функцию. Счетчик событий показывает, что удаленное устройство подсчитало 264 (01 08 шестнадцатеричных) события. Счетчик сообщений показывает, что 289 (01 21 шестнадцатеричное число) сообщений были обработаны. Последнее событие связи отображается в байте Event 0. Его содержимое (20 шестнадцатеричных цифр) показывает, что удаленное устройство недавно перешло в режим Listen Only. Предыдущее событие отображается в байте Event 1. Его содержимое (00 hex) показывает, что удаленное устройство получило Communications Restart. Структура байтов событий ответа описана ниже. Что содержат байты событий Байт события, возвращаемый функцией Get Communications Event Log, может быть любого из четырех типов. Тип определяется битом 7 (старшим битом) в каждом байте. Он может быть дополнительно определен битом 6. Это объясняется ниже. • Удаленное устройство MODBUS Receive Event Удаленное устройство сохраняет этот тип байта события при получении сообщения запроса. Оно сохраняется до того, как удаленное устройство обработает сообщение. Это событие определяется битом 7, установленным в логическое «1». Другие биты будут установлены в логическую «1», если соответствующее условие ИСТИННО. Битовая компоновка: 0 1 2 3 4 Содержимое бита Не используется Ошибка связи Не используется Не используется Переполнение символов 5 6 7 В настоящее время находится в режиме только прослушивания Получено широковещательных сообщений 1 • Удаленное устройство MODBUS Send Event Удаленное устройство сохраняет этот тип байта события, когда оно заканчивает обработку сообщения запроса. Он сохраняется, если удаленное устройство вернуло обычный ответ или ответ об исключении, или нет ответа. Это событие определяется битом 7, установленным в логическое «0», с битом 6, установленным в «1». Другие биты будут установлены в логическую «1», если соответствующее условие ИСТИННО. Битовая компоновка: Содержимое бита 0 Отправлено исключение чтения (коды исключений 1-3) 1 Отправлено исключение прерывания сервера (код исключения 4) 2 Отправлено исключение при занятости сервера (коды исключений 5-6) 3 Отправлено исключение NAK серверной программы (код исключения 7) 4 Произошла ошибка времени ожидания записи 5 В настоящее время находится в режиме только прослушивания 6 1 7 0 Удаленное устройство вошло в режим только прослушивания Удаленное устройство сохраняет этот тип байта события при переходе в режим Listen Only. Событие определяется содержимым 04 hex. • Перезапуск связи, инициированный удаленным устройством Удаленное устройство сохраняет этот тип байта события при перезапуске своего коммуникационного порта. Удаленное устройство может быть перезапущено функцией диагностики (код 08) с подфункцией Restart Communications Option (код 00 01). Эта функция также переводит удаленное устройство в режим «Continue on Error» или «Stop on Error». Если удаленное устройство переводится в режим «Continue on Error», байт события добавляется в существующий журнал событий. Если удаленное устройство переводится в режим «Stop on Error», байт добавляется в журнал, а остальная часть журнала очищается до нулей. Событие определяется нулевым содержимым. • Рисунок. 20. 6.11 Получение диаграммы состояния журнала событий связи 15 (0x0F) Запись нескольких катушек Этот код функции используется для принудительного включения или выключения каждой катушки в последовательности катушек в удаленном устройстве. В PDU Request (Запрос) указываются ссылки на катушки, которые должны быть принудительно установлены. Обращение к катушкам начинается с нуля. Поэтому катушка с номером 1 адресуется как 0. Запрошенные состояния включения/выключения определяются содержимым поля данных запроса. Логический «» 1 «» в битовой позиции поля запрашивает, чтобы соответствующий выход был ON. Логический «» 0 «» запрашивает, чтобы он был OFF. Нормальный отклик возвращает код функции, начальный адрес и количество принудительных катушек. Запрос PDU ____________________ ___ ___________ ___________________ ___ Код функции Начальный адрес Количество выводов Число байтов Выходное значение 1 байт 2 байта 2 байта 1 байт N * x 1 байт 0x0F 0x0000 для 0xFFFF С 0x0001 по 0x07B0 N* * N = количество выводов/8, если остаток отличается от 0 ^ N = N + 1 Resp onse PDU__________________ _____________ _______________________ Код функции Начальный адрес Количество выводов 1 байт 2 байта 2 байта 0x0F 0x0000 для 0xFFFF С 0x0001 по 0x07B0 Ошибка Код ошибки Код исключения 1 байт 1 байт 0x8F 01 или 02 или 03 или 04 Ниже приведен пример запроса на запись последовательности из 10 катушек, начиная с катушки 20: Содержимое данных запроса - два байта: CD 01 шестнадцатеричный (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 Первый переданный байт (CD hex) адресует выходы 27-20, с наименьшим значащим битом обращение к наименьшему выходу (20) в этом наборе. Следующий переданный байт (01 шестнадцатеричный) адресует выходы 29-28, с наименьшим значащим битом обращение к наименьшему выходу (28) в этом наборе. Неиспользуемые биты в последнем байте данных должны быть заполнены нулями. Запрос Имя поля Функция Начальный адрес Hi Начальный адрес Lo Количество выходов Hi Количество выходов Lo Число байтов Выходное значение Hi Выходное значение Lo (шестнадца теричный) 0F 00 13 00 0A 02 CD 01 Ответ Имя поля Функция Начальный адрес Hi Начальный адрес Lo Количество выходов Hi Количество выходов Lo (шестнадца теричный) 0F 00 13 00 0A Рисунок 21: 6.12 Запись схемы состояний нескольких выходов 16 (0x10) Записать несколько регистров Этот код функции используется для записи блока смежных регистров (от 1 до 123 регистров) на удаленном устройстве. Запрошенные записанные значения указываются в поле данных запроса. Данные упаковываются по два байта на регистр. Обычный ответ возвращает код функции, начальный адрес и количество записанных регистров. Затребовать __________________________________________________________ Код функции Начальный адрес Количество регистров Число байтов Значение регистров 1 байт 2 байта 2 байта 1 байт N * x 2 байта 0x10 0x0000 для 0xFFFF С 0x0001 по 0x007B 2xN* значение * N = количество регистров Resp onse ______________________ Код функции Начальный адрес Количество регистров 1 байт 2 байта 2 байта 0x10 0x0000 для 0xFFFF От 1 до 123 (0x7B) Ошибка Код ошибки 1 байт 0x90 Код исключения 1 байт 01 или 02 или 03 или 04 Вот пример запроса на запись двух регистров, начинающихся от 2 до 00 0A и 01 02 hex: Запрос Имя поля Функция Начальный адрес Hi Начальный адрес Lo (шестнадца теричный) 10 00 01 Ответ Имя поля Функция Начальный адрес Hi Начальный адрес Lo (шестнадца теричный) 10 00 01 Количество регистров Hi Количество регистров Lo Число байтов Регистры Значение Hi Регистры Значение Lo Регистры Значение Hi Регистры Значение Lo 00 02 04 00 0A 01 02 Количество регистров Hi Количество регистров Lo 00 02 Рисунок 22: Запись схемы состояний нескольких регистров 6.13 17 (0x11) Идентификатор сервера отчетов (только для последовательной линии) Этот код функции используется для считывания описания типа, текущего состояния и другой информации, относящейся к удаленному устройству. Формат обычного ответа показан в следующем примере. Содержимое данных зависит от типа устройства. Запрос Код функции 1 байт 0x11 Код функции Число байтов Идентификатор сервера 1 байт 1 байт специфичные для устройства 0x11 Состояние индикатора выполнения Дополнительные данные 1 байт 0x00 = ВЫКЛ, 0xFF = ВКЛ Код ошибки Код исключения 1 байт 1 байт 0x91 01 или 04 Ответ Ошиб ка Вот пример запроса на сообщение идентификатора и состояния: Запрос Имя поля Функция (шестнадца теричный) 11 Ответ Имя поля Функция Число байтов (шестнадцатеричный) 11 Идентификатор сервера Дополнительные данные о состоянии индикатора выполнения Для конкретного устройства Для конкретного устройства 0x00 или 0xFF Для конкретного устройства 6.14 Рисунок. 23. Схема состояний идентификаторов серверов отчетов 20 (0x14) Чтение записи файла Этот код функции используется для выполнения считывания записи файла. Все длины данных запроса предоставляются в виде числа байтов, а все длины записей предоставляются в виде регистров. Файл - это организация записей. Каждый файл содержит 10000 записей с адресами от 0000 до 9999 десятичных разрядов или от 0X0000 до 0X270F. Например, запись 12 адресуется как 12. Функция может считывать несколько групп ссылок. Группы могут быть отдельными (несмежными), но ссылки в каждой группе должны быть последовательными. Каждая группа определяется в отдельном поле «sub-request», которое содержит 7 байт: Тип ссылки: 1 байт (должен быть указан как 6) Номер файла: 2 байта Номер начальной записи в файле: 2 байта Длина считываемой записи: 2 байта. Количество считываемых регистров в сочетании со всеми другими полями в ожидаемом отклике не должно превышать допустимой длины PDU MODBUS - 253 байта. Обычный ответ представляет собой ряд «суб-ответов», по одному на каждый «суб-запрос». Поле количества байтов - это общее количество байтов во всех «суб-ответах». Кроме того, каждый «подчиненный ответ» содержит поле, которое показывает свой собственный счетчик байтов. Затребовать ______________________ ____________ _____________________ Код функции Число байтов Подзапрос x, тип ссылки Подзапрос x, номер файла 1 байт 1 байт 1 байт 2 байта 0x14 От 0x07 до 0xF5 байт 06 С 0x0001 по 0xFFFF Подзапрос x, номер записи Подзапрос x, длина записи 2 байта 2 байта 0x0000 для 0x270F N Ответ Код функции Соотв. Длина данных Подзапрос x, File Resp. длина Подзапрос x, тип ссылки Подзапрос x, данные записи Подзапрос x + 1,... Ошиб ка 1 байт 1 байт 1 байт 1 байт N x 2 байта Подзапрос x + 1,... Код ошибки Код исключения 0x14 От 0x07 до 0xF5 От 0x07 до 0xF5 6 1 байт 1 байт 0x94 01 или 02 или 03 или 04 или 08 Хотя допускается, чтобы номер файла находился в диапазоне от 1 до 0xFFFF, следует отметить, что взаимодействие с устаревшим оборудованием может быть нарушено, если номер файла больше 10 (0x0A). Вот пример запроса на чтение двух групп ссылок с удаленного устройства: ■ Группа 1 состоит из двух регистров из файла 4, начиная с регистра 1 (адрес 0001). ■ Группа 2 состоит из двух регистров из файла 3, начиная с регистра 9 (адрес 0009). Запрос Имя поля Функция Число байтов Подзапрос 1, тип ссылки Подзапрос 1, номер файла Hi Подзапрос 1, номер файла Ло Подзапрос 1, номер записи Hi Подзапрос 1, Номер записи Lo Подзапрос 1, длина записи Hi Подзапрос 1, длина записи Ло Подзапрос 2, тип ссылки Подзапрос 2, номер файла Hi Подзапрос 2, номер файла Ло Подзапрос 2, номер записи Hi Подзапрос 2, Номер записи Ло Подзапрос 2, длина записи Hi Подзапрос 2, длина записи Ло (шестнадца теричный) 14 0E 06 00 04 00 01 00 02 06 00 03 00 09 00 02 Ответ Имя поля Функция Соотв. Длина данных Подзапрос 1, файл соотв. длина Подзапрос 1, тип ссылки Подзапрос 1, Register.Data Привет Подзапрос 1, Register.DataLo Подзапрос 1, Register.Data Привет Подзапрос 1, Register.DataLo Подзапрос 2, файл соотв. длина Подзапрос 2, тип ссылки Подзапрос 2, Register.Data H Подзапрос 2, Register.DataLo Подзапрос 2, Register.Data Привет Подзапрос 2, Register.DataLo (шестнадца теричный) 14 0C 05 06 0D FE 00 20 05 06 33 CD 00 40 Рисунок. 24. Диаграмма состояний записи файла чтения 6.15 21 (0x15) Запись файла записи Этот код функции используется для выполнения записи в файл. Все длины данных запроса предоставляются в виде количества байтов, а все длины записей предоставляются в виде количества 16-разрядных слов. Файл - это организация записей. Каждый файл содержит 10000 записей с адресами от 0000 до 9999 десятичных разрядов или от 0X0000 до 0X270F. Например, запись 12 адресуется как 12. Функция может записывать несколько групп ссылок. Группы могут быть отдельными, т.е. несмежными, но ссылки внутри каждой группы должны быть последовательными. Каждая группа определяется в отдельном поле «sub-request», которое содержит 7 байт плюс данные: Тип ссылки: 1 байт (должен быть указан как 6) Номер файла: 2 байта Номер начальной записи в файле: 2 байта Длина записываемой записи: 2 байта Записываемые данные: 2 байта на регистр. Количество регистров, которые должны быть записаны, в сочетании со всеми другими полями в запросе, не должно превышать допустимую длину PDU MODBUS: 253 байта. Обычный ответ - это эхо запроса. Требуемая e_st ____________________ ____________ _____________________ Код функции Длина данных запроса Подзапрос x, тип ссылки Подзапрос x, номер файла Подзапрос x, номер записи 1 байт 1 байт 1 байт 2 байта 2 байта 0x15 От 0x09 до 0xFB 06 С 0x0001 по 0xFFFF 0x0000 для 0x270F Подзапрос x, Длина записи Подзапрос x, запись данных Подзапрос x + 1,... 2 байта N x 2 байта N Ответ Ошиб ка Код функции Длина данных ответа Подзапрос x, тип ссылки Подзапрос x, номер файла Подзапрос x, Номер записи Подзапрос x, Длина записи 1 байт 0x15 1 байт От 0x09 до 0xFB 1 байт 06 2 байта С 0x0001 по 0xFFFF 2 байта 0x0000 для 0x270F 2 байта N N x 2 байта Подзапрос x, данные записи Подзапрос x + 1,... Код ошибки 1 байт 0x95 Код исключения 1 байт 01 или 02 или 03 или 04 или 08 Хотя допускается, чтобы номер файла находился в диапазоне от 1 до 0xFFFF, следует отметить, что взаимодействие с устаревшим оборудованием может быть нарушено, если номер файла больше 10 (0x0A). Вот пример запроса на запись одной группы ссылок в удаленное устройство: • Группа состоит из трех регистров в файле 4, начиная с регистра 7 (адрес 0007). Запрос Имя поля Функция Длина данных запроса Подзапрос 1, тип ссылки Подзапрос 1, номер файла Hi Подзапрос 1, номер файла Ло Подзапрос 1, номер записи Hi Подзапрос 1, Номер записи Lo Подзапрос 1, длина записи Hi Подзапрос 1, Длина записи Lo Подзапрос 1, данные регистра Хи Подзапрос 1, данные регистра Ло Подзапрос 1, данные регистра Хи Подзапрос 1, данные регистра Ло Подзапрос 1, данные регистра Хи Подзапрос 1, данные регистра Ло (шестнадца теричный) 15 0D 06 00 04 00 07 00 03 06 AF 04 БЫТЬ 10 0D Ответ Имя поля Функция Длина данных запроса Подзапрос 1, тип ссылки Подзапрос 1, номер файла Hi Подзапрос 1, номер файла Ло Подзапрос 1, номер записи Hi Подзапрос 1, Номер записи Lo Подзапрос 1, длина записи Hi Подзапрос 1, Длина записи Lo Подзапрос 1, данные регистра Хи Подзапрос 1, данные регистра Ло Подзапрос 1, данные регистра Хи Подзапрос 1, данные регистра Ло Подзапрос 1, данные регистра Хи Подзапрос 1, данные регистра Ло (шестнадца теричный) 15 0D 06 00 04 00 07 00 03 06 AF 04 БЫТЬ 10 0D Рисунок. 25. Диаграмма состояния записи 6.16 файла 22 (0x16) Регистр записи маски Этот код функции используется для изменения содержимого указанного регистра хранения с использованием комбинации маски И, маски ИЛИ и текущего содержимого регистра. Функция может использоваться для установки или очистки отдельных битов в регистре. Запрос определяет регистр хранения, который должен быть записан, данные, которые должны быть использованы в качестве маски И, и данные, которые должны быть использованы в качестве маски ИЛИ. Адреса регистров начинаются с нуля. Поэтому регистры 1-16 адресуются как 0-15. Алгоритм функции: Результат = (Текущее содержимое И And_Mask) ИЛИ (Or_Mask И (НЕ And_Mask)) Например: Ведь Набор из ма двух Текущее содержимое = 12 0001 0010 предметов And_Mask = F2 1111 0010 Or_Mask = 25 0010 0101 (НЕ And_Mask) = 0D 0000 1101 Результат = 17 0001 0111 Примечание: • Если значение Or_Mask равно нулю, результатом является просто логическое И текущего содержимого и And_Mask. Если значение And_Mask равно нулю, результат равен значению Or_Mask. • Содержимое регистра можно прочитать с помощью функции Read Holding Registers (код функции 03). Однако они могут быть изменены впоследствии, когда контроллер сканирует свою пользовательскую логическую программу. Запрос Код функции Адрес ссылки И Маска Или Маска 1 байт 2 байта 2 байта 2 байта 0x16 0x0000 для 0xFFFF 0x0000 для 0xFFFF 0x0000 для 0xFFFF Код функции Адрес ссылки И Маска Или Маска 1 байт 2 байта 2 байта 2 байта 0x16 0x0000 для 0xFFFF 0x0000 для 0xFFFF 0x0000 для 0xFFFF Ответ Обычный ответ - это эхо запроса. Ответ возвращается после записи регистра. Ошибка Код ошибки Код исключения 1 байт 1 байт 0x96 01 или 02 или 03 или 04 Вот пример записи маски для регистрации 5 на удаленном устройстве с использованием указанных выше значений маски. Рисунок. 26: Схема состояний регистра удержания записи маски 6.17 23 (0x17) Чтение/запись Несколько регистров Этот код функции выполняет комбинацию одной операции считывания и одной операции записи в одной транзакции MODBUS. Операция записи выполняется перед чтением. Регистры хранения адресуются, начиная с нуля. Поэтому удерживающие регистры 1-16 адресуются в PDU как 0-15. Запрос указывает начальный адрес и количество регистров хранения, которые должны быть считаны, а также начальный адрес, количество регистров хранения и данные, которые должны быть записаны. Счетчик байтов определяет количество байтов, которые должны следовать в поле данных записи. Обычный ответ содержит данные из группы считанных регистров. Поле подсчета байтов указывает Запрос Код функции Прочитать начальный адрес Количество для чтения Запись начального адреса Количество для записи Число записанных байтов Запись значения регистров 1 байт 2 байта 2 байта 2 байта 2 байта 1 байт N * x 2 байта 0x17 0x0000 для 0xFFFF С 0x0001 по 0x007D 0x0000 для 0xFFFF С 0x0001 по 0X0079 2xN* количество байтов, которые должны следовать в поле считывания данных. Ответ Код функции Число байтов Чтение значения регистров 1 байт 1 байт N '* x 2 байта 0x17 2 x N '* * N = количество для записи * N '= количество для чтения Ошибка Код ошибки Код исключения 1 байт 1 байт 0x97 01 или 02 или 03 или 04 Вот пример запроса на чтение шести регистров, начиная с регистра 4, и на запись трех регистров, начиная с регистра 15: Запрос Имя поля Функция Прочитать начальный адрес Привет Прочитать начальный адрес Lo Количество для чтения Привет Количество для чтения Lo Запись начального адреса Hi Запись начального адреса Lo Количество для записи Hi Количество для записи Lo Число записанных байтов Значение регистров записи Hi Запись значения регистра Lo Значение регистров записи Hi Запись значения регистра Lo Значение регистров записи Hi Запись значения регистра Lo (шестнадца теричный) 17 00 03 00 06 00 0E 00 03 06 00 FF 00 FF 00 FF Ответ Имя поля Функция Число байтов Чтение значения регистров Hi Чтение значения регистров Lo Чтение значения регистров Hi Чтение значения регистров Lo Чтение значения регистров Hi Чтение значения регистров Lo Чтение значения регистров Hi Чтение значения регистров Lo Чтение значения регистров Hi Чтение значения регистров Lo Чтение значения регистров Hi Чтение значения регистров Lo (шестнадца теричный) 17 0C 00 FE 0A CD 00 01 00 03 00 0D 00 FF Рисунок. 27. Диаграмма состояний нескольких регистров чтения/записи 6.18 24 (0x18) Чтение очереди FIFO Этот код функции позволяет считывать содержимое очереди FIFO регистра на удаленном устройстве. Функция возвращает количество регистров в очереди, за которыми следуют данные из очереди. Можно считать до 32 регистров: счетчик, плюс до 31 регистра данных в очереди. Сначала возвращается регистр подсчета очереди, за которым следуют регистры данных в очереди. Функция считывает содержимое очереди, но не очищает его. В обычном ответе счетчик байтов показывает количество байтов для отслеживания, включая байты счетчика очереди и байты регистра значения (но не включая поле проверки ошибок). Счетчик очереди - это количество регистров данных в очереди (не включая регистр подсчета). Если число очередей превышает 31, возвращается ответ исключения с кодом ошибки 03 (недопустимое значение данных). Ответ Код функции Число байтов Число ФИФО 1 байт 2 байта 2 байта Регистр значений ФИФО N * x 2 байта 0x18 < 31 Затребовать ___________________ _____________________________________ Код функции Адрес указателя FIFO 1 байт 2 байта 0x18 0x0000 для 0xFFFF Код ошибки Код исключения 1 байт 1 байт 0x98 01 или 02 или 03 или 04 Ошибка * N = Число FIFO Ниже приведен пример запроса чтения очереди FIFO на удаленное устройство. Запрос состоит в считывании очереди, начиная с регистра указателя 1246 (0x04DE): Запрос Имя поля Функция Адрес указателя FIFO Hi Адрес указателя FIFO Lo (шестнадца теричный) 18 04 DE Ответ Имя поля Функция Число байтов Hi Количество байтов Lo ФИФО Счет Привет ФИФО Count Lo Регистр значений FIFO Hi Регистр значений FIFO Lo Регистр значений FIFO Hi Регистр значений FIFO Lo (шестнадца теричный) 18 00 06 00 02 01 B8 12 84 В этом примере регистр указателя FIFO (1246 в запросе) возвращается со счетом очереди 2. Два регистра данных следуют за счетчиком очереди. Это: 1247 (содержимое 440 десятичное -- 0x01B8); и 1248 (содержание 4740 -- 0x1284). Рисунок. 28. Диаграмма состояний очереди чтения FIFO 6.19 43 (0x2B) Транспорт инкапсулированного интерфейса Информационное примечание: Пользователю (Информационное) MODBUS RESERVED КОДЫ ФУНКЦИЙ, СУБКОДЫ И ТИПЫ MEI. предлагается обратиться к Приложению A Код функции 43 и его MEI Type 14 для идентификации устройств является одним из двух видов транспорта инкапсулированного интерфейса, доступных в настоящее время в данной спецификации. Следующие коды функций и типы MEI не должны быть частью данной опубликованной спецификации, и эти коды функций и типы MEI специально зарезервированы: 43/0-12 и 43/15-255. MODBUS Encapsulated Interface (MEI) Transport - это механизм туннелирования запросов услуг и вызовов методов, а также их возврата внутри MODBUS PDU. Основной функцией транспорта MEI является инкапсуляция вызовов методов или запросов услуг, которые являются частью определенного интерфейса, а также возвращаемых данных вызова методов или ответов услуг. Рисунок. 29. Транспорт с инкапсулированным интерфейсом MODBUS Сетевой интерфейс может представлять собой любой коммуникационный стек, используемый для передачи PDU MODBUS, например, TCP/ IP или последовательный канал. Тип MEI является присвоенным номером MODBUS и поэтому будет уникальным. Значения от 0 до 255 зарезервированы в соответствии с Приложением A (информационное), за исключением MEI типа 13 и MEI типа 14. Тип MEI используется реализациями транспорта MEI для отправки вызова метода указанному интерфейсу. Так как транспортная служба MEI не зависит от интерфейса, интерфейс должен обеспечивать любое определенное поведение или политику, требуемую интерфейсом, например, обработку транзакций MEI, обработку ошибок интерфейса MEI и т.д. Требуемая e_st _________________ _____________ _______________________ Код функции Тип MEI * 1 байт 1 байт Данные, специфичные для типа MEI n Байт 0x2B 0x0D или 0x0E * MEI = интерфейс MODBUS с инкапсуляцией Resp onse ______________________ _______ Код функции Тип MEI 1 байт 1 байт Данные, специфичные для типа MEI n Байт 0x2B эхо типа MEI Запрос в Ошибка Код функции 1 байт Код исключения 1 байт 0xAB: Fc 0x2B + 0x80 01 или 02 или 03 или 04 В качестве примера см. Read device identification request. 6.20 43/13 (0x2B/ 0x0D) CANopen Общий справочный запрос и ответ PDU Общая справочная команда CANopen представляет собой инкапсуляцию служб, которые будут использоваться для доступа (чтения или записи) к записям словаря объектов устройств CAN-Open, а также для управления и мониторинга системы и устройств CANopen. MEI типа 13 (0x0D) - это присвоенный MODBUS номер, лицензированный CiA для общей ссылки CANopen. Система предназначена для работы в рамках ограничений существующих сетей MODBUS. Поэтому информация, необходимая для запроса или изменения словарей объектов в системе, преобразуется в формат сообщения MODBUS. У PDU будет ограничение в 253 байта как в сообщении Request, так и в сообщении Response. Информативно: Пожалуйста, обратитесь к Приложению B для ссылки на спецификацию, которая обеспечивает информация о МЭИ типа 13. 43/14 (0x2B/ 0x0E) Чтение идентификации устройства 6.21 Этот код функции позволяет считывать только идентификационные данные и дополнительную информацию, относящуюся к физическому и функциональному описанию удаленного устройства. Интерфейс идентификации устройства считывания моделируется как адресное пространство, состоящее из набора адресуемых элементов данных. Элементы данных называются объектами, и их идентифицирует идентификатор объекта. Интерфейс состоит из 3 категорий объектов: ■ Базовая идентификация устройства. Все объекты этой категории являются обязательными: VendorName, Код продукта и номер редакции. Обычная идентификация устройства. В дополнение к объектам основных данных устройство ■ обеспечивает дополнительные и необязательные объекты данных идентификации и описания. Все объекты этой категории определены в стандарте, но их реализация не является обязательной. Расширенная идентификация устройства. Помимо обычных объектов данных, устройство предоставляет дополнительные и необязательные идентификационные и описательные приватные ■ Запрос Код функции Тип MEI * Чтение кода идентификатора устройства Идентификатор объекта 1 байт 1 байт 1 байт 0x2B 0x0E 01 / 02 / 03 / 04 1 байт От 0x00 до 0xFF данные о самом физическом устройстве. Все эти данные зависят от устройства. Идентиф Имя/описание объекта икатор объекта 0x00 Наименование поставщика 0x01 0x02 0x03 0x04 0x05 0x06 0x07 Тип Строка ASCII Строка ASCII Строка ASCII Строка ASCII Строка ASCII Строка ASCII Строка ASCII Код продукта MajorMinorRevision (МажорнаяМинорнаяРевизия) URL-адрес поставщика Название продукта Имя модели Имя _ приложения _ пользователя Зарезервировано 0x7F 0x80 Частные объекты могут быть определены опционально. 0xFF Диапазон [0x80 - 0xFF] зависит от продукта. * MEI = интерфейс MODBUS с инкапсуляцией Resp onse _____________________ ________ 1 байт 1 байт 1 байт 1 байт 0x01 или 0x02 или 0x03 или 0x81 или 0x82 или 0x83 Больше следует Следующий идентификатор объекта Количество объектов 1 байт 1 байт 1 байт 00/FF Идентификационный номер объекта 0x2B 0x0E 01 / 02 / 03 / 04 Список Ошибка 1 байт 1 байт Длина объекта категория Обязательны Основной й Обязательны й Обязательны й Регулярный Дополнительн ый Дополнительн ый Дополнительн ый Дополнительн ый Дополнительн ый зависимость от Дополнительн Расширенны й устройства ый Код функции Тип MEI Чтение кода идентификатора устройства Уровень соответствия Идентификатор объекта Длина объекта Значение объекта M/O В зависимости от идентификатора объекта Код функции 1 байт 0xAB: Fc 0x2B + 0x80 Код исключения 1 байт 01 или 02 или 03 или 04 Описание параметров запроса: Назначенный номер 14 инкапсулированного интерфейса MODBUS идентифицирует запрос на считывание идентификации. Параметр «Read Device ID code» позволяет определить четыре типа доступа: 01: запрос на получение базовой идентификации устройства (потоковый доступ) 02: запрос на получение обычной идентификации устройства (потоковый доступ) 03: запрос на получение расширенной идентификации устройства (потоковый доступ) 04: запрос на получение одного конкретного объекта идентификации (индивидуальный доступ) Код исключения 03 посылается обратно в ответе, если считывание кода идентификатора устройства является незаконным. В случае ответа, не умещающегося в единый ответ, необходимо сделать несколько транзакций (запрос/ответ). Байт Object Id дает идентификацию первого объекта для получения. Для первой транзакции клиент должен установить Object Id в 0, чтобы получить начало данных идентификации устройства. Для следующих транзакций клиент должен установить идентификатор объекта на значение, возвращенное сервером в предыдущем ответе. Примечание: Объект неделим, поэтому любой объект должен иметь размер, соответствующий размеру ответа транзакции. Если идентификатор объекта не соответствует ни одному из известных объектов, сервер отвечает так, как будто указан объект 0 (перезапуск в начале). В случае индивидуального доступа: ReadDevId code 04, Object Id в запросе дает идентификацию объекта для получения, а если Object Id не совпадает ни с одним известным объектом, сервер возвращает ответ исключения с кодом исключения = 02 (Illegal data address). Если серверное устройство запрашивает уровень описания (readDevice Code) выше, чем его уровень соответствия, оно должно ответить в соответствии со своим фактическим уровнем соответствия. Описание параметра ответа: Код функции: Код функции 43 (десятичный) 0x2B (шестнадцатеричный) Тип MEI 14 (0x0E) Назначенный номер типа MEI для идентификации устройства Интерфейс Код ReadDevId: Уровень соответствия Больше следует Следующий идентификатор объекта Количество объектов Object0. Id Совпадает с кодом ReadDevId запроса: 01, 02, 03 или 04 Уровень соответствия идентификации устройства и тип поддерживаемого доступа 0x01: базовая идентификация (только потоковый доступ) 0x02: обычная идентификация (только потоковый доступ) 0x03: расширенная идентификация (только потоковый доступ) 0x81: базовая идентификация (потоковый доступ и индивидуальный доступ) 0x82: обычная идентификация (потоковый доступ и индивидуальный доступ) 0x83: расширенная идентификация (потоковый доступ и индивидуальный доступ) В случае кодов ReadDevId 01, 02 или 03 (потоковый доступ), Если идентификационные данные не укладываются в один ответ, может потребоваться несколько транзакций запроса/ответа. 0x00: больше нет доступных объектов 0xFF: другие объекты идентификации доступны и далее Требуются транзакции MODBUS В случае кода ReadDevId 04 (индивидуальный доступ) в этом поле должно быть установлено значение 00. Если «MoreFollows = FF», идентификация следующего запрашиваемого объекта . Если «MoreFollows = 00», необходимо установить значение 00 (бесполезно) Номер объекта идентификации, возвращенного в ответе (для индивидуального доступа, количество объектов = 1) Идентификация первого объекта, возвращенного в PDU (потоковый доступ), или запрашиваемого объекта (индивидуальный доступ) Object0. Длина Object0.Value Длина первого объекта в байтах значение первого объекта (Object0.Length байтах) ObjectN.Id Идентификация последнего объекта (в рамках ответа) ObjectN. Длина Длина последнего объекта в байтах ObjectN.Value Значение последнего объекта (ObjectN.Length байт) Пример запроса Read Device Identification для «Basic device identification»: В этом примере вся информация отправляется в одном PDU ответа. Запрос Имя поля Функция MEI Типа чтение кода Dev Id Идентификатор объекта Значение 2B 0E 01 00 Ответ Имя поля Функция MEI Типа Read Dev Id Code Уровень соответствия More Follows NextObjectId Количество объектов Идентификатор объекта Длина объекта Значение объекта Идентификатор объекта Длина объекта Значение объекта Идентификатор объекта Длина объекта Значение объекта Значение 2B 0E 01 01 00 00 03 00 16 «Идентификация компании» «Text» «All» 01 0D «Код продукта XX» «Text» «All» 02 05 «V2.11» В случае устройства, которое потребовало нескольких транзакций для отправки ответа, инициируются следующие транзакции. Первая транзакция: Запрос Имя поля Функция Тип MEI Чтение кода идентификатора разработчика Идентификатор объекта Ответ Значение Имя поля 2B Функция 0E Тип MEI 01 Прочитать идентификационный код 00 Уровень соответствия разработчика Больше следует NextObjectId Количество объектов Идентификатор объекта Длина объекта Значение объекта Идентификатор объекта Длина объекта Значение объекта Значение 2B 0E 01 01 FF 02 03 00 16 «Идентификация компании» «Text» «All» 01 1С «Код продукта XXXXXXXXXXXXXXXX» «Text» «All» Вторая транзакция: Запрос Имя поля Функция Тип MEI Прочитать идентификационный код разработчика Идентификатор объекта Значение 2B 0E 01 02 Ответ Имя поля Функция MEI Типа Read Dev Id Code Уровень соответствия More Follows NextObjectId Количество объектов Object Id Object Length Object Значение объекта Значение 2B 0E 01 01 00 00 03 02 05 «V2.11» Рисунок. 30. Диаграмма состояний идентификации устройства 7 откликов об исключении MODBUS Когда клиентское устройство отправляет запрос серверному устройству, оно ожидает нормальный ответ. Запрос клиента может вызвать одно из четырех возможных событий: • Если серверное устройство принимает запрос без ошибки связи и может нормально обработать запрос, оно возвращает нормальный ответ. • Если сервер не получает запрос из-за ошибки связи, ответ не возвращается. Клиентская программа в итоге обработает условие тайм-аута для запроса. • Если сервер получает запрос, но обнаруживает ошибку связи (четность, LRC, CRC,...), ответ не возвращается. Клиентская программа в итоге обработает условие тайм-аута для запроса. • Если сервер получает запрос без ошибки связи, но не может его обработать (например, если запрос заключается в чтении несуществующего вывода или регистра), сервер вернет ответ об исключении, информирующий клиента о характере ошибки. Сообщение ответа на исключение имеет два поля, которые отличают его от обычного ответа: Поле кода функции: В нормальном ответе сервер перекликается с кодом функции исходного запроса в поле кода функции ответа. Все коды функций имеют старший бит (MSB) 0 (все их значения ниже 80 шестнадцатеричных). В ответе на исключение сервер устанавливает MSB кода функции равным 1. Это делает значение кода функции в ответе на исключение точно на 80 шестнадцатеричных больше, чем значение было бы для нормального ответа. С помощью набора MSB кода функции прикладная программа клиента может распознавать exception response и может исследовать поле данных для кода исключения. Поле данных: В обычном ответе сервер может вернуть данные или статистику в поле данных (любую информацию, которая была запрошена в запросе). В ответе на исключение сервер возвращает код исключения в поле данных. Определяет условие сервера, вызвавшее исключение. Пример запроса клиента и ответа на исключение сервера Запрос Имя поля Функция Начальный адрес Hi Начальный адрес Lo Количество выходов Hi Количество выходов Lo (шестнадца теричный) 01 04 A1 00 01 Ответ Имя поля Функция Код исключения (шестнадца теричный) 81 02 В этом примере клиент адресует запрос устройству сервера. Код функции (01) предназначен для операции Read Output Status. Он запрашивает состояние вывода по адресу 1185 (04A1 шестнадцатеричном формате). Следует отметить, что считывается только один выход, как определено полем (0001) количества выходов. Если адрес вывода не существует в устройстве сервера, сервер возвратит ответ об исключении с кодом исключения, показанным (02). Указывает недопустимый адрес данных для сервера. Список кодов исключений начинается со следующей страницы. Коды исключений MODBUS Кодекс 01 Имя НЕДОПУСТИМАЯ ФУНКЦИЯ 02 НЕДОПУСТИМЫЙ АДРЕС ДАННЫХ 03 НЕДОПУСТИМОЕ ЗНАЧЕНИЕ ДАННЫХ 04 ОТКАЗ СЕРВЕРНОГО УСТРОЙСТВА 05 ПРИЗНАТЬ Значение Полученный в запросе код функции не является допустимым действием для сервера. Возможно, код функции применим только к более новым устройствам и не был реализован в выбранном устройстве. Это также может указывать на то, что сервер находится в неправильном состоянии для обработки запроса этого типа, например, из-за того, что он не настроен и ему требуется вернуть значения регистра. Адрес данных, полученный в запросе, не является допустимым адресом для сервера. Еще в частности, комбинация номера ссылки и длины передачи является недопустимой. Для контроллера со 100 регистрами PDU обращается к первому регистру как к 0, а к последнему - как к 99. Если запрос подается с начальным адресом регистра 96 и количеством регистров 4, то этот запрос будет успешно работать (по меньшей мере, на уровне адреса) на регистрах 96, 97, 98, 99. Если запрос представленный с начальным адресом регистра 96 и количеством регистров 5, то этот запрос не будет выполнен с кодом исключения 0x02 «Недопустимый адрес данных», поскольку он пытается работать с регистрами 96, 97, 98, 99 и 100, и нет регистра с адресом 100. Значение, содержащееся в поле данных запроса, не является допустимым значением для сервера. Это указывает на ошибку в структуре оставшейся части сложного запроса, например на неправильную предполагаемую длину. В частности, это НЕ означает, что элемент данных, представленный для хранения в регистре, имеет значение, выходящее за рамки ожидания прикладной программы, поскольку протокол MODBUS не знает о значении какого-либо конкретного значения какого-либо конкретного регистра. При попытке сервера выполнить запрошенное действие произошла неустранимая ошибка. Специализированное использование в сочетании с программированием команд. Сервер принял запрос и обрабатывает его, но для этого потребуется длительное время. Этот ответ возвращается для предотвращения ошибки тайм-аута в клиенте. Затем клиент может выдать сообщение о завершении опроса программы, чтобы определить, завершена ли обработка. 06 СЕРВЕРНОЕ УСТРОЙСТВО ЗАНЯТО 08 ОШИБКА ЧЕТНОСТИ ПАМЯТИ Специализированное использование в сочетании с программированием команд. Сервер занят обработкой длительной команды программы. Клиент должен повторить передачу сообщения позже, когда сервер освободится. Специализированное использование в сочетании с кодами функций 20 и 21 и типом ссылки 6 для указания того, что расширенная область файла не прошла проверку согласованности. Сервер попытался прочитать файл записи, но обнаружил ошибку четности в памяти. Клиент может повторить запрос, но может потребоваться обслуживание на устройстве сервера. 0A ПУТЬ К ШЛЮЗУ НЕДОСТУПЕН 0B НЕ ОТВЕЧАЕТ Специализированное использование в сочетании со шлюзами указывает на то, что шлюз не смог выделить внутренний канал связи от входного порта к выходному порту для обработки запроса. Обычно означает, что шлюз настроен неправильно или перегружен. ШЛЮЗОВОЕ ОКОНЕЧНОЕ Специализированное использование в сочетании со УСТРОЙСТВО. шлюзами указывает на то, что ответ от оконечного устройства получен не был. Обычно означает, что устройство отсутствует в сети. Приложение A (Информационное): MODBUS RESERVED FUNCTION CODES, SUBCODES AND MEI TYPES Следующие функциональные коды и субкоды не являются частью данной опубликованной спецификации, и эти функциональные коды и субкоды специально зарезервированы. Формат - код функции/субкод или просто код функции, где все субкоды (0-255) зарезервированы: 8/19; 8/2165535, 9, 10, 13, 14, 41, 42, 90, 91, 125, 126 и 127. Код функции 43 и его MEI Type 14 для идентификации устройств и MEI Type 13 для CANopen General Reference Request and Response PDU являются доступными в настоящее время транспортами инкапсулированного интерфейса в этой спецификации. Следующие коды функций и типы MEI не должны быть частью данной опубликованной спецификации, и эти коды функций и типы MEI специально зарезервированы: 43/0-12 и 43/15-255. В этой спецификации не поддерживается код определяемой пользователем функции, имеющий тот же или подобный результат, что и транспорт инкапсулированного интерфейса. MODBUS является зарегистрированным товарным знаком Schneider Automation Inc. Приложение B (Информационное): ОБЩЕЕ СПРАВОЧНОЕ КОМАНДОВАНИЕ CANOPEN Пожалуйста, обратитесь к веб-сайту MODBUS или CiA (CAN in Automation) для получения копии и условий использования, которые охватывают код функции 43 MEI Type 13.