Реферат на тему:
Modbus — открытый коммуникационный протокол, основанный на архитектуре «клиент-сервер». Широко применяется в промышленности для организации связи между электронными устройствами. Может использовать для передачи данных через последовательные линии связи RS-485, RS-422, RS-232, а также сети TCP/IP (Modbus TCP).
Не следует путать MODBUS и MODBUS Plus. MODBUS Plus - проприетарный протокол принадлежащий Schneider Electric. Физический уровень уникальный, похож на Ethernet 10BASE-T, полудуплекс по одной витой паре, скорость 1Мбит/с. Транспортный протокол - HDLC, поверх которого специфицировано расширение для передачи MODBUS PDU.
Modbus был разработан компанией Modicon (в настоящее время принадлежит Schneider Electric) для использования в её контроллерах с программируемой логикой. Впервые спецификация протокола была опубликована в 1979 году.[1] Это был открытый стандарт, описывающий формат сообщений и способы их передачи в сети состоящей из различных электронных устройств.
Первоначально контроллеры MODICON использовали последовательный интерфейс RS-232.[1] Позднее стал применяться интерфейс RS-485, так как он обеспечивает более высокую надёжность, позволяет использовать более длинные линии связи и подключать к одной линии несколько устройств.
Многие производители электронного оборудования поддержали стандарт, на рынке появились сотни использующих его изделий.
В настоящее время развитием Modbus занимается некоммерческая организация Modbus-IDA[2].
MODBUS специфицирует 4 типа данных:
Стандарты MODBUS состоят из 3 частей:
Основные достоинства стандарта - открытость и массовость. Огромное количество датчиков и исполнительных устройств выпущено промышленностью. Практически все промышленные системы контроля и управления имеют программные драйвера для работы с MODBUS сетями.
Стандарт в своей основе был написан очень давно и многие актуальные для современных промышленных сетей вопросы не были учтены.
Контроллеры на шине Modbus взаимодействуют, используя клиент-серверную модель, основанную на транзакциях, состоящих из запроса и ответа.
Обычно в сети есть только один клиент, так называемое, «главное» (англ. master) устройство, и несколько серверов — «подчиненных» (slaves) устройств. Главное устройство инициирует транзакции (передаёт запросы). Главный может адресоваться индивидуально к подчиненному или инициировать передачу широковещательного сообщения для всех подчиненных устройств. Подчиненное устройство отвечает на запрос, адресованный именно ему. При получении широковещательного запроса ответ не формируется.
Спецификация Modbus описывает структуру запросов и ответов. Их основа — элементарный пакет протокола, так называемый PDU (Protocol Data Unit). Структура PDU не зависит от типа линии связи и включает в себя код функции и поле данных. Код функции кодируется однобайтовым полем и может принимать значения в диапазоне 1…127. Диапазон значений 128…255 зарезервирован для кодов ошибок. Поле данных может быть переменной длины. Размер пакета PDU ограничен 253 байтами.
1 байт | N < 253 (байт) |
Для передачи пакета по физическим линиям связи PDU помещается в другой пакет, содержащий дополнительные поля. Этот пакет носит название ADU (Application Data Unit). Формат ADU зависит от типа линии связи.
Существуют три основных реализации протокола Modbus, две для передачи данных по последовательным линиям связи, как медным EIA/TIA-232-E (RS-232), EIA-422, EIA/TIA-485-A (RS-485), так и оптическим и радио:
и для передачи данных по сетям Ethernet поверх TCP/IP:
Общая структура ADU следующая (в зависимости от реализации, некоторые из полей могут отсутствовать):
где
Максимальный размер ADU для последовательных сетей RS232/RS485 — 256 байт, для сетей TCP — 260 байт.
Для Modbus TCP ADU выглядит следующим образом:
где
Поле контрольной суммы в Modbus TCP отсутствует.
В действующей в настоящее время спецификации протокола определяются три категории кодов функций:
Стандартные команды Их описание должно быть опубликовано и утверждено Modbus-IDA. Эта категория включает в себя как уже определенные, так и свободные в настоящее время коды. Пользовательские команды Два диапазона кодов (от 65 до 72 и от 100 до 110), для которых пользователь может реализовать произвольную функцию. При этом не гарантируется, что какое-то другое устройство не будет использовать тот же самый код для выполнения другой функции. Зарезервированные В эту категорию входят коды функций, не являющиеся стандартными, но уже используемые в устройствах, производимых различными компаниями. Это коды 9, 10, 13, 14, 41, 42, 90, 91, 125, 126 и 127.Одно из типичных применений протокола — чтение и запись данных в регистры контроллеров. Спецификация протокола определяет четыре таблицы данных:
один бит | только чтение |
один бит | чтение и запись |
16-битное слово | только чтение |
16-битное слово | чтение и запись |
Доступ к элементам в каждой таблице осуществляется с помощью 16-битного адреса, первой ячейке соответствует адрес 0. Таким образом, каждая таблица может содержать до 65536 элементов. Спецификация не определяет, что физически должны представлять собой элементы таблиц и по каким внутренним адресам устройства они должны быть доступны. Например, допустимо организовать перекрывающиеся таблицы, В этом случае команды работающие с дискретными данными и с 16-битными регистрами будут фактически обращаться к одним и тем же данным.
Следует отметить, что со способом адресации данных связана определённая путаница. Modbus был первоначально разработан для контроллеров Modicon. В этих контроллерах для каждой из таблиц использовалась специальная нумерация. Например, первому регистру ввода соответствовал номер ячейки 30001, а первому регистру хранения — 40001. Таким образом, регистру хранения с адресом 107 в команде Modbus соответствовал регистр № 40108 контроллера. Хотя такое соответствие адресов больше не является частью стандарта, некоторые программные пакеты могут автоматически «корректировать» вводимые пользователем адреса, например, вычитая 40001 из адреса регистра хранения.
A1 | A0 | Q1 | Q0 | ||
N | D (N байт) | ||||
A1 | A0 | Q1 | Q0 | ||
N | D (N байт) | ||||
A1 | A0 | Q1 | Q0 | ||
N | D (N байт) | ||||
A1 | A0 | Q1 | Q0 | ||
N | D (N байт) | ||||
A1 | A0 | D1 | D0 | ||
A1 | A0 | D1 | D0 | ||
A1 | A0 | D1 | D0 | ||
A1 | A0 | D1 | D0 | ||
A1 | A0 | Q1 | Q0 | N | D (N байт) |
A1 | A0 | Q1 | Q0 | ||
A1 | A0 | Q1 | Q0 | N | D (N байт) |
A1 | A0 | Q1 | Q0 |
Для чтения значений из перечисленных выше таблиц данных используются функции с кодами 1—4 (шестнадцатеричные значения 0x01—0x04):
Запрос состоит из адреса первого элемента таблицы, значение которого требуется прочитать, и количества считываемых элементов. Адрес и количество данных задаются 16-битными числами, старший байт каждого из них передается первым.
В ответе передаются запрошенные данные. Количество байт данных зависит от количества запрошенных элементов. Перед данными передается один байт, значение которого равно количеству байт данных.
Значения регистров хранения и регистров ввода передаются начиная с указанного адреса, по два байта на регистр, старший байт каждого регистра передаётся первым:
RA,1 | RA,0 | RA+1,1 | RA+1,0 | … | RA+Q-1,1 | RA+Q-1,0 |
Значения флагов и дискретных входов передаются в упакованном виде: по одному биту на флаг. Единица означает включённое состояние, ноль — выключенное. Значения запрошенных флагов заполняют сначала первый байт, начиная с младшего бита, затем следующие байты, также от младшего бита к старшим. Младший бит первого байта данных содержит значение флага, указанного в поле «адрес». Если запрошено количество флагов, не кратное восьми, то значения лишних битов заполняются нулями:
FA+7 | FA+6 | FA+5 | FA+4 | FA+3 | FA+2 | FA+1 | FA | … | 0 | … | 0 | FA+Q-1 | FA+Q-2 | … |
Команда состоит из адреса элемента (2 байта) и устанавливаемого значения (2 байта).
Для регистра хранения значение является просто 16-битным словом.
Для флагов значение 0xFF00 означает включённое состояние, 0x0000 — выключенное, другие значения недопустимы.
Если команда выполнена успешно, ведомое устройство возвращает копию запроса.
Команда состоит из адреса элемента, количества изменяемых элементов, количества передаваемых байт устанавливаемых значений и самих устанавливаемых значений. Данные упаковываются так же, как в командах чтения данных.
Ответ состоит из начального адреса и количества изменённых элементов.
Ниже приведён пример команды ведущего устройства и ответа ведомого (для Modbus RTU).
Master→Slave | 0x01 | 0x0F | 0x00 | 0x13 | 0x00 | 0x0A | 0x02 | 0xCD | 0x01 | 0x72 | 0xCB |
Slave→Master | 0x01 | 0x0F | 0x00 | 0x13 | 0x00 | 0x0A | 0x24 | 0x09 |
Во время обмена данными могут возникать ошибки двух типов:
Ошибки первого типа обнаруживаются при помощи фреймов символов, контроля чётности и циклической контрольной суммы CRC-16-IBM (используется число-полином = 0xA001). При этом младший байт передается первым, в отличие от байтов адреса и значения регистра в PDU
В RTU режиме сообщение должно начинаться и заканчиваться интервалом тишины — временем передачи не менее 3,5 символов при данной скорости в сети. Первым полем затем передаётся адрес устройства.
Вслед за последним передаваемым символом также следует интервал тишины продолжительностью не менее 3,5 символов. Новое сообщение может начинаться после этого интервала.
Фрейм сообщения передаётся непрерывно. Если интервал тишины продолжительностью 1,5 возник во время передачи фрейма, принимающее устройство должно игнорировать этот фрейм как неполный.
Таким образом, новое сообщение должно начинаться не раньше 3,5 интервала, так как в этом случае устанавливается ошибка.
Немного об интервалах (речь идёт о Serial Modbus RTU): при скорости 9600 и 11 битах в кадре (стартовый бит + 8 бит данных + бит контроля чётности + стоп-бит): 3.5 * 11 / 9600 = 0,00401041(6), то есть более 4 мс; 1.5 * 11 / 9600 = 0,00171875, то есть более 1 мс. Для скоростей более 19200 бод допускается использовать интервалы 1,75 и 0,75 мс соответственно.
Для сообщений об ошибках второго типа протокол Modbus RTU предусматривает, что устройства могут отсылать ответы, свидетельствующие об ошибочной ситуации. Признаком того, что ответ содержит сообщение об ошибке, является установленный старший бит кода команды. Пример кадра при выявлении ошибки ведомым устройством, в ответ на запрос приведён в (Таблица 2-1).
1. Если Slave принимает корректный запрос и может его нормально обработать, то возвращает нормальный ответ.
2. Если Slave не принимает какого-либо значения, никакого ответа не отправляется. Master диагностирует ошибку по тайм-ауту.
3. Если Slave принимает запрос, но обнаруживает ошибку (parity, LRC, or CRC), никакого ответа не отправляется. Master диагностирует ошибку по тайм-ауту.
4. Если Slave принимает запрос, но не может его обработать (обращение к несуществующему регистру и т. д.), отправляется ответ содержащий в себе данные об ошибке.
Запрос (Master→Slave) | 0x01 | 0x77 | 0xDD | 0xC7 0xA9 |
Ответ (Slave→Master) | 0x01 | 0xF7 | 0xEE | 0xE6 0x7C |
wreferat.baza-referat.ru
Федеральное агентство по образованию
Государственное образовательное учреждение высшего профессионального образования
ГОУ ВПО ЮГОРСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ
Институт Систем Управления и Информационных Технологий
Кафедра Автоматизированные системы обработки информации и управления
ПОЯСНИТЕЛЬНАЯ ЗАПИСКА К КУРСОВОЙ РАБОТЕ
по дисциплине: Языки программирования низкого уровня
на тему Реализация протокола Modbus
Выполнил: Бирюков Н.А.
студент группы 1170
Специальность: 230102
Шифр: 117010
Проверил: преподаватель
С.Н. Горбунов
Ханты-Мансийск, 2011
Федеральное агентство по образованию
Государственное образовательное учреждение высшего профессионального образования
ЮГОРСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ
Институт Систем Управления и Информационных Технологий
Кафедра Автоматизированные системы обработки информации и управления
ЗАДАНИЕ
На курсовую работу по дисциплине Языки программирования низкого уровня
Тема курсовой работы: Реализация протокола Modbus для микроконтроллера семейства AVR
На языке Assembler создать программу, реализующую протокол Modbus в качестве Slave устройства для микроконтроллера семейства AVR.
Программа должна быть реализована для стенда СУ-МК-AVR (Контроллер At Mega 128) и выполнять следующие функции:
1.осуществлять приём/передачу сообщений по UART.
2.чтение нескольких флагов.
.чтение нескольких дискретных регистров.
.чтение регистров хранения.
.чтение нескольких регистров ввода.
.запись значения одного флага.
.запись значения в один регистр.
Задание выдал _______________ Горбунов С.Н.
Задание принял _______________Бирюков Н.А.
Содержание
Введение
. Анализ задания на курсовую работу
. Проектирование программы
.1 Чтение флагов
.2 Чтение дискретных входов
.3 Чтение регистров хранения
.4 Чтение регистров ввода
.5 Запись одного флага
.6 Запись одного регистра хранения
.7 Исключительная ситуация
.8 Контрольная сумма
. Разработка программы
.1 Инициализация
.2 Обработка прерываний
.3 Обработка запроса
.4 Чтение флагов
.5 Чтение регистров хранения
.6 Чтение регистров ввода
.7 Запись флага
.8 Запись регистра
.9 Обработка исключительных ситуаций
.10 Контрольная сумма
. Тестирование программы
Заключение
Список использованных источников
Приложение А
Приложение Б
Введение
Целью работы является проектирование и реализация протокола Modbus для микроконтроллера семейства AVR.- коммуникационный протокол, основанный на архитектуре клиент-сервер. Широко применяется в промышленности для организации связи между электронными устройствами. Может использовать для передачи данных последовательные линии связи RS-485, RS-422, RS-232, а также сети TCP/IP (Modbus TCP).
Существует множество решений для реализации Modbus протокола в качестве slave устройства. Представленное решение отличается простотой и наглядностью, при этом выполняются основные функции протокола.
Всего в протоколе Modbus предусмотрено более семидесяти функций, некоторые из них выполняют функции проверки ошибок. В данной реализации упор сделан на функции чтения/записи данных.
1. Анализ задания на курсовую работу
Существует три основных реализации протокола Modbus, две для передачи данных по последовательным линиям связи, как медным EIA/TIA-232-E (RS-232), EIA-422, EIA/TIA-485-A (RS-485), так и оптическим и радио:
Modbus RTU и
Modbus ASCII,
и одна для передачи данных по сетям Ethernet поверх TCP/IP:
Modbus TCP.
В данной курсовой работе представлен Modbus RTU, так как этот вариант наиболее подходит для программирования на микроконтроллере AVR, так как реализация стека TCP/IP необоснованно усложнило бы программу. Реализация ASCII не оправдана, так как формат сообщений Modbus RTU гораздо удобнее обрабатывать. Modbus ASCII использует 7 бит данных при передаче по последовательной линии, для идентификации начала и конца посылки используется дополнительные символы (: в начале строки и символы перевода строки в конце).
Рассмотрим формат сообщений ModBus RTU. Структура ModBus состоит из запросов и ответов. Их основа - элементарный пакет протокола, так называемый PDU (Protocol Data Unit). Структура PDU (Рисунок 1.1) не зависит от типа линии связи и включает в себя код функции (FCode) и поле данных (Data).
Рисунок 1.1 - Структура пакета PDU
Для передачи пакета по физическим линиям связи PDU помещается в другой пакет, содержащий дополнительные поля. Этот пакет носит название ADU (Application Data Unit). Общая структура ADU пакета для ModBus RTU представлена на рисунке 1.2.
Рисунок 1.2 - Общая структура ADU пакета для ModBus RTU
Пакет Modbus RTU ADU помимо PDU пакета включает в себя также Slave ID - адрес ведомого устройства и контрольную сумму CRC16 для проверки корректности пакета.
В данной реализации протокола Modbus используются следующие типы данных:
Флаг - один бит, регистр флагов доступны как на чтение, так и на запись. Флаги хранятся в оперативной памяти микроконтроллера. Для флагов выделен 1 байт, таким образом можно обращаться к 8 флагам.
Дискретный регистр - один бит, доступен только для чтения. Дискретный регистр является портом ввода. Дискретные регистры являются регистром статуса микроконтроллера, следовательно доступны 8 би
www.studsell.com
Статья посвящена промышленному протоколу ModBus — наиболее простому, а потому широко распространённому цифровому протоколу передачи данных.
Стандарт ModBus был изобретён ещё в 1979 году компанией Modicon (ныне Schneider Electric) и с того времени не утратил своей актуальности, а даже наоборот получил широкое распространение и большую популярность среди разработчиков АСУ ТП.
Преимущества:
Недостатки:
ModBus сеть объединяет одно ведущее (мастер) и несколько ведомых (слейвов). Обмен данными в сети происходит по инициативе мастера. Он может отправить запрос одному из подчинённых устройств или широковещательное сообщение сразу всем ведомым устройствам сети.
После отправки запроса мастер ожидает ответ в течение заданного времени («время таймаута»). Если в течение этого времени ответ не получен, мастер считает, что связь с ведомым отсутствует. На широковещательное сообщение ответ не предусмотрен.
Слейвы (ведомые устройства) не могут самостоятельно инициировать передачу данных. Они могут передать данные только после запроса мастера (и только те данные, которые мастер запросит).
Существует три разновидности протокола:
Для передачи ModBus сообщений используется последовательные асинхронные интерфейсы (RS232, RS485, RS422) в случае использования протоколов ASCII и RTU и Ethernet интерфейс для протокола ModBus TCP.
Использование стандартных интерфейсов делает ModBus удобным для пользователей и разработчиков.
Любой узел сети ModBus — это интеллектуальное устройство (контроллер, регулятор, датчик и др.). Согласно спецификации узел сети может иметь следующие структуры данных:
Указанные типы данных необязательны для всех устройств, поддерживающих ModBus. Например, Discrete Inputs и Coils характерны больше для ПЛК.
Производитель устройства сам решает, какой тип данных сделать доступным для чтения и записи по ModBus, и об этом написано в руководстве устройства. В большинстве случае пользуются типом Holding Registers, поскольку он самый универсальный.
Как уже было сказано, обмен данными по ModBus состоит из запросов и ответов. Ведущее устройство посылает запрос одному из подчинённых устройств, указывая в запросе его адрес, или всем устройствам сразу, указывая адрес 0.
Типовой запрос или ответ состоит из следующих блоков:
Состав данных блоков отличается для RTU и TCP реализаций ModBus. Далее мы подробно рассотрим каждый из них.
ModBus ASCII мы не будем подробно рассматривать, поскольку он используется крайне редко. Состав пакета в ModBus ASCII такой же как и ModBus RTU, и отличается только типом кодирования и способом разделения пакетов.
Номер функции определяет тип запрашиваемых данных и что с ними нужно сделать (прочитать/записать).
Функций ModBus достаточно много и они разделены на три категории:
Однако, это всё лирика… На практике в большинстве случаев используются всего несколько функций, мы подробно поговорим о них в отдельной статье, а в этой будем рассматривать всё на примере функции Read Holding Registers (чтение регистров общего назначения).
Функция Read Holding Registers (0x03)
Функция под номером 3 — одна из самых употребимых функций, предназначена для чтения регистров общего назначения устройства.
В запросе указывается количество регистров, которые нужно прочитать и адрес первого из них.
Ответ содержит количество байт (количество регистров умноженное на 2) и значения запрошенных регистров.
Количество байт в ответе помогает ведущему устройству по мере получения данных понять, когда все данные уже получены. То есть если мастер получил третий байт с числом 200 — это означает, что ему осталось получить еще 100 байт + 2 байта контроля целостности. Это позволит ему посчитать количество пришедших байт и закончить приём, не дожидаясь, когда закончится время таймаута, отведённое слейву на ответ.
Вместо нормального ответа, содержащего запрошенные данные, подчинённое устройство может ответить ошибкой. При этом к номеру функции в ответе добавляется код 0х80 в шестнадцатеричной системе исчисления.
Обратимся к предыдущему примеру. Там подчинённое устройство ответило без ошибки и второй байт в ответе был 0х03. Если бы ответ содержал код ошибки, то к номеру функции подчинённое устройство добавило бы 0х80 и получилось бы 0х83. Вот так:
В этом примере код ошибки 02 — это один из стандартных кодов. Вот какие они бывают:
01 — функция не поддерживается. Это значит, что, возможно, функция не стандартная или просто не реализована конкретно в этом устройстве.
02 — запрошенная область памяти не доступна. Каждое устройство содержит определённое количество данных определённого типа. Например, в устройстве доступно 100 регистров общего назначения. Если при этом запросить чтение 101 регистров — возникнет ошибка 02.
03 — функция не поддержит запрошенное количество данных. Например, функция №3 «Read Holding Registers» позволяет читать от 1 до 2000 регистров общего назначения. Поэтому, даже если в подчинённом устройстве доступно для чтения 10 000 регистров, при запросе более 2000 с помощью функции №3 — возникнет эта ошибка.
04 — функция выполнена с ошибкой. Такой код ошибки будет возвращён, если есть какое-то иное препятствие для нормального выполнения команды, не охваченное тремя предыдущими кодами ошибки. Проще говоря, это такая заглушка «на всякий случай», если что-то пошло не так, но в протоколе специального кода для такой ошибки не предусмотрено.
Нужно помнить, что существуют не только стандартные функции, но ещё и пользовательские и зарезервированные. Поэтому, производители устройств, которые дополнили протокол своими функциями, возможно заложили туда другие коды ошибок. Но это всё очень большая экзотика…
Как уже говорилось, в протоколе ModBus RTU данные передаются в виде сообщений, разделённых между собой временными паузами длиной в 3,5 символа при заданной скорости передачи.
В сообщении обязательно указывается адрес получателя (или 0, если сообщение широковещательное) и номер функции.Номер функции определяет какие данные содержит сообщение и как их интерпретировать.
За номером функции идут данные. Регистры данных в ModBus 32-битные, а передаются ввиде двух 16-битных сло. Сначала идёт старший байт, затем младший.
Пример. Допустим, мы хотим прочитать из удалённого модуля сбора данных 2 регистра, начиная с первого. Адрес удалённого модуля в сети ModBus «4». Для этого воспользуемся функцией №3 Read Holding Registers.
В ответе подчинённое устройство повторяет свой адрес и номер функции, далее следует количество полезных байт в ответе. Каждый регистр состоит из двух байт (сначала идёт старший, затем младший). Значение запрошенных регистров оказались равны 11 и 22 в десятичной системе исчисления (0B и 16 в шестнадцатеричной соответственно).
О том, как использовать другие ModBus функции мы выпустим отдельную статью.
В предыдущем примере за байтами данных идут два байта проверки целостности пакета. Они являются результатом вычисления кода CRC-16 для всего сообщения.
Мастер, передавая запрос, вычисляет CRC-код и добавляет его в конец сообщения. Слейв, получив сообщение, проверяет сообщение на целостность согласно алгоритму CRC-16. Затем подчинённое устройство составляет ответ, точно так же вычисляет для него CRC и добавляет в конец пакета.
Подробно рассматривать алгоритм CRC-16 мы не будем, т.к. мы стараемся быть ближе к практике… А на практике программисту практически никогда не приходится писать блок вычисления CRC — в любой среде программирования можно найти соответствующую функцию или функциональный блок.
В данной статье мы рассмотрели общую структуру протокола ModBus и его классическую разновидность ModBus RTU. Вообще говоря, ModBus RTU — это и есть «истинный Modbus» (если отбросить ModBus ASCII, который уже устарел).
В следующей статье мы поговорим о разновидности протокола ModBus TCP, который является «притягиванием за уши» классического ModBus с целью использования его в Ethernet-сетях, что, конечно же, накладывает определённые ограничения. Но об этом в следующей статье. Следите за обновлениями на LAZY SMART.
comments powered by HyperCommentslazysmart.ru
Modbus — коммуникационный протокол, основанный на архитектуре «клиент-сервер». Широко применяется в промышленности для организации связи между электронными устройствами. Может использовать для передачи данных последовательные линии связи RS-485, RS-422, RS-232, а также сети TCP/IP (Modbus TCP).
Modbus был разработан фирмой Modicon (в настоящее время принадлежит Schneider Electric) для использования в её контроллерах с программируемой логикой. Впервые спецификация протокола была опубликована в 1979 году.[1] Это был открытый стандарт, описывающий формат сообщений и способы их передачи в сети состоящей из различных электронных устройств.
Первоначально контроллеры MODICON использовали последовательный интерфейс RS-232.[1] Позднее стал применяться интерфейс RS-485, так как он обеспечивает более высокую надёжность, позволяет использовать более длинные линии связи и подключать к одной линии несколько устройств.
Многие производители электронного оборудования поддержали стандарт, на рынке появились сотни использующих его изделий. В настоящее время развитием Modbus занимается некоммерческая организация Modbus-IDA, созданная производителями и пользователями электронных приборов[2].
Modbus относится к протоколам прикладного уровня сетевой модели OSI.[3] Контроллеры на шине Modbus взаимодействуют, используя клиент-серверную модель, основанную на транзакциях, состоящих из запроса и ответа.
Обычно в сети есть только один клиент, так называемое, «главное» (англ. master) устройство, и несколько серверов — «подчиненных» (slaves) устройств. Главное устройство инициирует транзакции (передаёт запросы). Подчиненные устройства передают запрашиваемые главным устройством данные, или производят запрашиваемые действия. Главный может адресоваться индивидуально к подчиненному или инициировать передачу широковещательного сообщения для всех подчиненных устройств. Подчиненное устройство формирует сообщение и возвращает его в ответ на запрос, адресованный именно ему. При получении широковещательного запроса ответное сообщение не формируется.
Спецификация Modbus описывает структуру запросов и ответов. Их основа — элементарный пакет протокола, так называемый PDU (Protocol Data Unit). Структура PDU не зависит от типа линии связи и включает в себя код функции и поле данных. Код функции кодируется однобайтовым полем и может принимать значения в диапазоне 1...127. Диапазон значений 128...255 зарезервирован для кодов ошибок. Поле данных может быть переменной длины. Размер пакета PDU ограничен 253 байтами.
1 байт | N < 253 (байт) |
Для передачи пакета по физическим линиям связи PDU помещается в другой пакет, содержащий дополнительные поля. Этот пакет носит название ADU (Application Data Unit). Формат ADU зависит от типа линии связи.
Существуют три основных реализации протокола Modbus, две для передачи данных по последовательным линиям связи, как медным EIA/TIA-232-E (RS-232), EIA-422, EIA/TIA-485-A (RS-485), так и оптическим и радио:
и для передачи данных по сетям Ethernet поверх TCP/IP:
Общая структура ADU следующая (в зависимости от реализации, некоторые из полей могут отсутствовать):
где
Максимальный размер ADU для последовательных сетей RS232/RS485 — 256 байт, для сетей TCP — 260 байт.
Для Modbus TCP ADU выглядит следующим образом:
где
Поле контрольной суммы в Modbus TCP отсутствует.
В действующей в настоящее время спецификации протокола определяются три категории кодов функций:
Стандартные команды Их описание должно быть опубликовано и утверждено Modbus-IDA. Эта категория включает в себя как уже определенные, так и свободные в настоящее время коды.Пользовательские команды Два диапазона кодов (от 65 до 72 и от 100 до 110), для которых пользователь может реализовать произвольную функцию. При этом не гарантируется, что какое-то другое устройство не будет использовать тот же самый код для выполнения другой функции.Зарезервированные В эту категорию входят коды функций, не являющиеся стандартными, но уже используемые в устройствах, производимых различными компаниями. Это коды 9, 10, 13, 14, 41, 42, 90, 91, 125, 126 и 127.Одно из типичных применений протокола — чтение и запись данных в регистры контроллеров. Спецификация протокола определяет четыре таблицы данных:
один бит | только чтение |
один бит | чтение и запись |
16-битное слово | только чтение |
16-битное слово | чтение и запись |
Доступ к элементам в каждой таблице осуществляется с помощью 16-битного адреса, первой ячейке соответствует адрес 0. Таким образом, каждая таблица может содержать до 65536 элементов. Спецификация не определяет, что физически должны представлять собой элементы таблиц и по каким внутренним адресам устройства они должны быть доступны. Например, допустимо организовать перекрывающиеся таблицы, В этом случае команды работающие с дискретными данными и с 16-битными регистрами будут фактически обращаться к одним и тем же данным.
Следует отметить, что со способом адресации данных связана определённая путаница. Modbus был первоначально разработан для контроллеров Modicon. В этих контроллерах для каждой из таблиц использовалась специальная нумерация. Например, первому регистру ввода соответствовал номер ячейки 30001, а первому регистру хранения — 40001. Таким образом, регистру хранения с адресом 107 в команде Modbus соответствовал регистр № 40108 контроллера. Хотя такое соответствие адресов больше не является частью стандарта, некоторые программные пакеты могут автоматически «корректировать» вводимые пользователем адреса, например, вычитая 40001 из адреса регистра хранения.
A1 | A0 | Q1 | Q0 | ||
N | D (N байт) | ||||
A1 | A0 | Q1 | Q0 | ||
N | D (N байт) | ||||
A1 | A0 | Q1 | Q0 | ||
N | D (N байт) | ||||
A1 | A0 | Q1 | Q0 | ||
N | D (N байт) | ||||
A1 | A0 | D1 | D0 | ||
A1 | A0 | D1 | D0 | ||
A1 | A0 | D1 | D0 | ||
A1 | A0 | D1 | D0 | ||
A1 | A0 | Q1 | Q0 | N | D (N байт) |
A1 | A0 | Q1 | Q0 | ||
A1 | A0 | Q1 | Q0 | N | D (N байт) |
A1 | A0 | Q1 | Q0 |
Для чтения значений из перечисленных выше таблиц данных используются функции с кодами 1—4 (шестнадцатеричные значения 0x01—0x04):
Запрос состоит из адреса первого элемента таблицы, значение которого требуется прочитать, и количества считываемых элементов. Адрес и количество данных задаются 16-битными числами, старший байт каждого из них передается первым.
В ответе передаются запрошенные данные. Количество байт данных зависит от количества запрошенных элементов. Перед данными передается один байт, значение которого равно количеству байт данных.
Значения регистров хранения и регистров ввода передаются начиная с указанного адреса, по два байта на регистр, старший байт каждого регистра передаётся первым:
RA,1 | RA,0 | RA+1,1 | RA+1,0 | ... | RA+Q-1,1 | RA+Q-1,0 |
Значения флагов и дискретных входов передаются в упакованном виде: по одному биту на флаг. Единица означает включённое состояние, ноль — выключенное. Значения запрошенных флагов заполняют сначала первый байт, начиная с младшего бита, затем следующие байты, также от младшего бита к старшим. Младший бит первого байта данных содержит значение флага, указанного в поле «адрес». Если запрошено количество флагов, не кратное восьми, то значения лишних битов заполняются нулями:
FA+7 | FA+6 | FA+5 | FA+4 | FA+3 | FA+2 | FA+1 | FA | ... | 0 | ... | 0 | FA+Q-1 | FA+Q-2 | ... |
Команда состоит из адреса элемента (2 байта) и устанавливаемого значения (2 байта).
Для регистра хранения значение является просто 16-битным словом.
Для флагов значение 0xFF00 означает включённое состояние, 0x0000 — выключенное, другие значения недопустимы.
Если команда выполнена успешно, ведомое устройство возвращает копию запроса.
Команда состоит из адреса элемента, количества изменяемых элементов, количества передаваемых байт устанавливаемых значений и самих устанавливаемых значений. Данные упаковываются так же, как в командах чтения данных.
Ответ состоит из начального адреса и количества изменённых элементов.
Ниже приведён пример команды ведущего устройства и ответа ведомого (для Modbus RTU).
Master→Slave | 0x01 | 0x0F | 0x00 | 0x13 | 0x00 | 0x0A | 0x02 | 0xCD | 0x01 | 0x72 | 0xCB |
Во время обмена данными могут возникать ошибки двух типов:
Ошибки первого типа обнаруживаются при помощи фреймов символов, контроля чётности и циклической контрольной суммы CRC-16-IBM (используется число-полином = 0xA001).
В RTU режиме сообщение должно начинаться и заканчиваться интервалом тишины - временем передачи не менее 3.5 символов при данной скорости в сети. Первым полем затем передаётся адрес устройства.
Вслед за последним передаваемым символом также следует интервал тишины продолжительностью не менее 3.5 символов. Новое сообщение может начинаться после этого интервала.
Фрейм сообщения передаётся непрерывно. Если интервал тишины продолжительностью 1.5 возник во время передачи фрейма, принимающее устройство должно игнорировать этот фрейм как неполный.
Таким образом, новое сообщение должно начинаться не раньше 3.5 интервала, т.к. в этом случае устанавливается ошибка.
Немного об интервалах (речь идёт о Serial Modbus RTU): при скорости 9600 и 11 битах в кадре (стартовый бит + 8 бит данных + бит контроля чётности + стоп-бит): 3.5 * 11 / 9600 = 0,00401041(6), т.е. более 4 мс; 1.5 * 11 / 9600 = 0,00171875, т.е. более 1 мс. Для скоростей более 19200 бод допускается использовать интервалы 1,75 и 0,75 мс соответственно.
Для сообщений об ошибках второго типа протокол Modbus RTU предусматривает, что устройства могут отсылать ответы, свидетельствующие об ошибочной ситуации. Признаком того, что ответ содержит сообщение об ошибке, является установленный старший бит кода команды. Пример кадра при выявлении ошибки ведомым устройством, в ответ на запрос приведён в (Таблица 2-1).
1. Если Slave принимает корректный запрос и может его нормально обработать, то возвращает нормальный ответ.
2. Если Slave не принимает какого-либо значения, никакого ответа не отправляется. Master диагностирует ошибку по таймауту.
3. Если Slave принимает запрос, но обнаруживает ошибку (parity, LRC, or CRC), никакого ответа не отправляется. Master диагностирует ошибку по таймауту.
4. Если Slave принимает запрос, но не может его обработать (обращение к несуществующему регистру и т.д.), отправляется ответ содержащий в себе данные об ошибке.
Запрос (Master→Slave) | 0x01 | 0x77 | 0xDD | 0xC7 0xA9 |
Ответ (Slave→Master) | 0x01 | 0xF7 | 0xEE | 0xE6 0x7C |
sites.google.com
(Назад) (Cкачать работу)
Функция "чтения" служит для ознакомления с работой. Разметка, таблицы и картинки документа могут отображаться неверно или не в полном объёме!
Федеральное агентство по образованию
Государственное образовательное учреждение высшего профессионального образования
ГОУ ВПО ЮГОРСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ
Институт Систем Управления и Информационных Технологий
Кафедра «Автоматизированные системы обработки информации и управления» ПОЯСНИТЕЛЬНАЯ ЗАПИСКА К КУРСОВОЙ РАБОТЕ
по дисциплине: «Языки программирования низкого уровня»
на тему «Реализация протокола Modbus» Выполнил: Бирюков Н.А.
студент группы 1170
Специальность: 230102
Шифр: 117010
Проверил: преподаватель
С.Н. Горбунов Ханты-Мансийск, 2011
Федеральное агентство по образованию
Государственное образовательное учреждение высшего профессионального образования
ЮГОРСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ
Институт Систем Управления и Информационных Технологий
Кафедра «Автоматизированные системы обработки информации и управления» ЗАДАНИЕ
На курсовую работу по дисциплине «Языки программирования низкого уровня» Тема курсовой работы: «Реализация протокола Modbus для микроконтроллера семейства AVR»
На языке Assembler создать программу, реализующую протокол Modbus в качестве Slave устройства для микроконтроллера семейства AVR.
Программа должна быть реализована для стенда СУ-МК-AVR (Контроллер At Mega 128) и выполнять следующие функции:
1. осуществлять приём/передачу сообщений по UART.
2. чтение нескольких флагов.
. чтение нескольких дискретных регистров.
. чтение регистров хранения.
. чтение нескольких регистров ввода.
. запись значения одного флага.
. запись значения в один регистр.
Задание выдал _______________ Горбунов С.Н.
Задание принял _______________Бирюков Н.А.
Содержание Введение
. Анализ задания на курсовую работу
. Проектирование программы
.1 Чтение флагов
.2 Чтение дискретных входов
.3 Чтение регистров хранения
.4 Чтение регистров ввода
.5 Запись одного флага
.6 Запись одного регистра хранения
.7 Исключительная ситуация
.8 Контрольная сумма
. Разработка программы
.1 Инициализация
.2 Обработка прерываний
.3 Обработка запроса
.4 Чтение флагов
.5 Чтение регистров хранения
.6 Чтение регистров ввода
.7 Запись флага
.8 Запись регистра
.9 Обработка исключительных ситуаций
.10 Контрольная сумма
. Тестирование программы
Заключение
Список использованных источников
Приложение А
Приложение Б
Введение Целью работы является проектирование и реализация протокола Modbus для микроконтроллера семейства AVR.- коммуникационный протокол, основанный на архитектуре «клиент-сервер». Широко применяется в промышленности для организации связи между электронными устройствами. Может использовать для передачи данных последовательные линии связи RS-485, RS-422, RS-232, а также сети TCP/IP (Modbus TCP).
Существует множество решений для реализации Modbus протокола в качестве slave устройства. Представленное решение отличается простотой и наглядностью, при этом выполняются основные функции протокола.
Всего в протоколе Modbus предусмотрено более семидесяти функций, некоторые из них выполняют функции проверки ошибок. В данной реализации упор сделан на функции чтения/записи данных.
1. Анализ задания на курсовую работуСуществует три основных реализации протокола Modbus, две для передачи данных по последовательным линиям связи, как медным EIA/TIA-232-E (RS-232), EIA-422, EIA/TIA-485-A (RS-485), так и оптическим и радио:
· Modbus RTU и
· Modbus ASCII,
и одна для передачи данных по сетям Ethernet поверх TCP/IP:
· Modbus TCP.
В данной курсовой работе представлен Modbus RTU, так как этот вариант наиболее подходит для программирования на микроконтроллере AVR, так как реализация стека TCP/IP необоснованно усложнило бы программу. Реализация ASCII не оправдана, так как формат сообщений Modbus RTU гораздо удобнее обрабатывать. Modbus ASCII использует 7 бит данных при передаче по последовательной линии, для идентификации начала и конца посылки используется дополнительные символы («:» в начале строки и символы перевода строки в конце).
Рассмотрим формат сообщений ModBus RTU. Структура ModBus состоит из запросов и ответов. Их основа - элементарный пакет протокола, так называемый PDU (Protocol Data Unit). Структура PDU (Рисунок 1.1) не зависит от типа линии связи и включает в себя код функции (FCode) и поле данных (Data).
Рисунок 1.1 - Структура пакета PDU Для передачи пакета по физическим линиям связи PDU помещается в другой пакет, содержащий дополнительные поля. Этот пакет носит название ADU (Application Data Unit). Общая структура ADU пакета для ModBus RTU представлена на рисунке 1.2.
Рисунок 1.2 - Общая структура ADU пакета для ModBus RTU Пакет Modbus RTU ADU помимо PDU пакета включает в себя также Slave ID - адрес ведомого устройства и контрольную сумму CRC16 для проверки корректности пакета.
В данной реализации протокола Modbus используются следующие типы данных:
· Флаг - один бит, регистр флагов доступны как на чтение, так и на запись. Флаги хранятся в оперативной памяти микроконтроллера. Для флагов выделен 1 байт, таким образом можно обращаться к 8 флагам.
· Дискретный регистр - один бит, доступен только для чтения. Дискретный регистр является портом ввода. Дискретные регистры являются регистром статуса микроконтроллера, следовательно доступны 8 бит.
· Регистр хранения - 16-битный регистр, доступен для чтения и записи. В качестве регистров хранения выступают выделенные ячейки в оперативной памяти микроконтроллера. Для регистров хранения выделено 32 байта, таким образом, возможен доступ к 16-ти регистрам.
· Регистр ввода - 16-битный регистр, доступен только для чтения. В качестве регистров ввода используются РОН микроконтроллера. При этом старшие 8 бит регистра всегда равны «0», а младшие - содержимому запрашиваемого регистра. Для чтения доступны 32 регистра.
В данной курсовой работе реализованы следующие функции Modbus:
· 0x01 - чтение значений из нескольких регистров флагов.
· 0x02 - чтение значений из нескольких дискретных регистров.
· 0x03 - чтение из нескольких регистров хранения.
· 0x04 - чтение из нескольких регистров ввода.
Запрос состоит из адреса первого элемента таблицы, значение которого требуется прочитать, и количества считываемых элементов. Адрес и количество данных задаются 16-битными числами, старший байт каждого из них передается первым.
В ответе передаются запрошенные данные. Количество байт данных зависит от количества запрошенных элементов. Перед данными передается один байт, значение которого равно количеству байт данных.
· 0x05 - запись одного значения флага.
· 0x06 - запись значения в один регистр хранения.
Команда состоит из адреса элемента (2 байта) и устанавливаемого значения (2 байта). Для регистра хранения значение является просто 16-битным словом. Для флагов значение 0xFF00 означает включённое состояние, 0x0000 - выключенное, другие значения недопустимы. Если команда выполнена успешно, ведомое устройство возвращает копию запроса.
2. Проектирование программыРеализация протокола modbus состоит из приёма сообщений и последующей их обработки. Для необходимых функций modbus длина пакета постоянна и равна 8. Так как UART поддерживает передачу по одному байту, необходимо ввести счётчик, который будет проверять окончание посылки.
Для того чтобы осуществлять приём и передачу, необходимо инициализировать UART. Для работы с com-портом используется UART1 микроконтроллера, который подсоединяется при помощи интерфейса USB через преобразователь COM-порта. Так как в больших скоростях передачи нет необходимости, достаточно 9600 бит/с. Формат посылки следующий:
· 8 бит данных.
· 1 стоп бит.
· без контроля чётности
Кроме инициализации UART необходимо инициализировать счётчик байтов и CRC, а также разрешить прерывания.
Вся обработка сообщений и отправка ответов производится в обработке прерываний. Поэтому после инициализации системы запускается пустой бесконечный цикл, в котором происходит ожидание прерываний.
Самая важная часть программы находится в блоке обработки прерываний. Рассмотрим его более подробно. При поступлении прерывания от UART в зависимости от номера байта в посылке будут выполняться различные действия. Формат посылки приведён на рисунке 2.1.
Рисунок 2.1 - формат посылки
Где:
· S_ID - ID устройства, 0 - для
referat.co
Протокол Modbus RTU компании Modicon поддерживают многие фирмы-производители контроллеров . Протокол предполагает одно активное устройство в линии ( master), которое может обращаться к нескольким пассивным (slave). Синтаксис команд протокола позволяет адресовать 254 устройства, соединенных в одну линию.
Возможно применение протокола modbus в дуплексных и полудуплексных линиях связи. Физическим уровнем протокола modbus как правило является линия стандарта RS422/RS485,
однако при соединении точка-точка тот же формат команд может быть использован на любом последовательном асинхронном физическом интерфейсе, в том числе RS-232. Возможно применение протокола modbus в сетевой среде поверх транспортных протоколов UDP/TCP и IPX/SPX.
Протокол modbus подразумевает наличие в линии только одного ведущего устройства (master) и множества подчиненных устройств (slave). Инициатива проведения обмена всегда исходит от ведущего устройства, которое подает запрос (определенная последовательность байт) в линию и переходит в состояние прослушивания линии связи. Ведомое устройство отвечает на запрос, пришедший в его адрес.
Окончание ответной посылки мастер определяет, определяя временные интервалы между окончанием приема предыдущего байта и началом приема следующего. Если этот интервал превысил время, необходимое для приема двух байт на заданной скорости передачи, прием кадра ответа считается завершенным.
Кадры запроса и ответа по протоколу modbus имеют формат, приведенный в ( Таблица 1-1).
Поле кадра | Длина в байтах |
адрес подчиненного устройства | 1 |
номер функции | 1 |
данные | N < 254 |
контрольная сумма | 2 |
• | адрес подчиненного устройства - первое однобайтное поле кадра. Оно содержит адрес подчиненного устройства, к которому адресован запрос. Подчиненные устройства отвечают только на запросы, поступившие в их адрес. Ответ также начинается с адреса отвечающего устройства. Может изменяться от 1 до 254; |
• | номер функции - это следующее однобайтное поле кадра. Оно говорит подчиненному устройству, какие данные или выполнение какого действия требует от него ведущее устройство; |
• | данные - поле содержит информацию необходимую подчиненному устройству для выполнения заданной мастером функции или содержит данные передаваемые подчиненным устройством в ответ на запрос ведущего. Длина и формат поля зависит от номера функции; |
• | контрольная сумма - заключительное двухбайтное поле кадра, содержащее циклическую контрольную сумму CRC-16 всех предыдущих полей кадра. Контрольная сумма завершает кадры запроса и ответа. |
Во время обмена данными могут возникать ошибки двух типов. Первый тип - это ошибки, связанные с искажениями при передаче данных. Второй тип – логические ошибки.
Ошибки первого типа обнаруживаются при помощи фреймов символов, контроля четности и циклической контрольной суммы CRC16. Результат передается в линию связи с младшего байта.
Для сообщений об ошибках второго типа протокол Modbus RTU предусматривает, что устройства могут отсылать ответы, свидетельствующие об ошибочной ситуации. Признаком наличия сообщения об ошибке, является установленный старший бит кода команды. Кадр ответа с ошибкой приведен в ( Таблица 1-2).
Сетевой адрес | Код команды | Код ошибки | CRC - код |
01 | 81 | 02 | C1 91 |
Могут быть отправлены ответы, имеющие следующие коды (Таблица 1-3):
Код ошибки | Название | Комментарий |
01 | ILLEGAL FUNCTION | Команда не реализована (недопустимый номер функции) |
02 | ILLEGAL DATA ADDRESS | Некорректный адрес |
03 | ILLEGAL DATA VALUE | Некорректные данные |
04 | FAILURE IN ASSOCIATED DEVICE | |
05 | ACKNOWLEDGE | Данные не готовы |
06 | BUSY, REJECTED MESSAGE | Система занята |
07 | NAK-NEGATIVE ACKNOWLEDGMENT | |
08 | MEMORY PARITY ERROR |
В протокол Modbus можно выделить несколько подмножеств команд ( Таблица 1-4).
Подмножество команд | Диапазон кодов команд |
Стандартные команды | 1-21 |
Резерв для расширенных функций | 22-64 |
Пользовательские | 65-119 |
Резерв для внутренних нужд | 120-255 |
prom-electric.ru
Данная статья описывает основы работы с протоколом Modbus. В статье вы можете найти:
Modbus — коммуникационный протокол, основанный на клиент-серверной архитектуре. В данной статье мы рассмотрим основы протокола и базовые принципы работы. Кроме того, вы можете ознакомиться с конкретными примерами работы протокола Modbus, изучив описания контроллеров, использующих этот протокол, к примеру, OSM-17RA, а так же скачав программу Modbus Terminal, позволяющую удобно работать с различными регистрами Modbus.
Протокол Modbus разработан для использования в программируемых логических контроллерах, таких, как управление электроприводом. В настоящее время является очень распространенным протоколом, используемых в различных промышленных системах. К примеру, данный протокол используется в контроллерах шаговых двигателей Онитекс. Широко используется для передачи данных последовательные линии связи, основанных на интерфейсах RS-485, RS-422, RS-232. В начале развития применялся интерфейс RS-232, как один из наиболее простых промышленных интерфейсов для последовательной передачи данных. В настоящее время протокол часто используется поверх интерфейса RS-485, что позволяет добиться высокой скорости передачи, больших расстояний и объединения нескольких устройств в единую сеть, тем более что протокол Modbus поддерживает адресацию. Широкая распространенность протокола Modbus, обусловленная его простотой и надежностью, позволяет легко интегрировать устройства, поддерживающие Modbus, в единую сеть.
Основной особенностью протокола является наличие в сети одного ведущего устройства - master. Только ведущее устройство может опрашивать остальные устройства сети, которые являются ведомыми (slave). Подчиненное устройство не может самостоятельно инициировать передачу данных или запрашивать какие-либо данные у других устройств, работа сети строится только по принципу "запрос-ответ". Мастер может так же выдать широковещательный запрос, адресованный всем устройствам в сети, в таком случае ответное сообщение не посылается.
Существует три типа протокола Modbus: Modbus ASCII, Modbus RTU и Modbus TCP. Устройства Onitex поддерживают протокол Modbus RTU, поэтому мы в дальнейшем будем иметь в виду прежде всего этот протокол.
Пакет данных в Modbus выглядит следующим образом:
Адрес | Код функции | Данные | Контрольная сумма.
Адрес - это поле, содержащее номер устройства, которому адресован запрос. Каждое устройство в сети должно иметь уникальный адрес. Устройство отвечает только на те запросы, которые поступают по его адресу, во избежание конфликтов. При этом, ведомое устройство в своем ответе так же посылает поле Адрес, кроме широковещательного запроса (когда ответа от ведомого быть вообще не должно).
Код функции содержит номер функции модбаса (о функциях будет сказано ниже). Функция может запрашивать данные или давать команду на определенные действия. Коды функций являются числами в диапазоне от 1 до 127. Функции с номерами от 128 до являются зарезервированными для пересылки в ответном сообщении информации об ошибках.
В поле Данные содержится информация, которую передает мастер слэйву, либо наоборот в случае ответного сообщения. Длина этого поля зависит от типа передаваемых данных.
Поле Контрольная сумма является важным элементом протокола: в нем содержится информация, необходимая для проверки целостности сообщения и отсутствия ошибок передачи.
Максимальный размер пакета для сетей RS232/RS485 — 256 байт, для сетей TCP — 260 байт.
Существует три типа функций:
При использовании режима Modbus RTU сообщение начинается с так называемого интервала тишины, равного времени передачи 3.5 символов, при заданной скорости обмена. Первым полем передается адрес устройства. Вслед за последним передаваемым символом также следует интервал тишины продолжительностью не менее 3.5 символов. Новое сообщение может начинаться после этого интервала. Фрейм сообщения передаётся непрерывно. Если интервал тишины продолжительностью 1.5 возник во время передачи фрейма, принимающее устройство должно игнорировать этот фрейм как неполный. Если новое сообщение начнется раньше интервала 3.5 символа, принимающее устройство воспримет его как продолжение предыдущего сообщения. В этом случае устанавливается ошибка CRC (несовпадение контрольной суммы).
Типы данных протокола Modbus представлены в таблице:
Тип данных | Тип доступа | |
Дискретные входы (Discrete Inputs) | один бит | только чтение |
Регистры флагов (Coils) | один бит | чтение и запись |
Регистры ввода (Input Registers) | 16-битное слово | только чтение |
Регистры хранения (Holding Registers) | 16-битное слово | чтение и запись |
Для чтения значений из этих выше таблиц данных используются функции с кодами 1—4 (0x01—0x04):1 (0x01) — чтение значений из нескольких регистров флагов (Read Coil Status)2 (0x02) — чтение значений из нескольких дискретных входов (Read Discrete Inputs)3 (0x03) — чтение значений из нескольких регистров хранения (Read Holding Registers)4 (0x04) — чтение значений из нескольких регистров ввода (Read Input Registers)
Запрос состоит из адреса первого элемента таблицы, значение которого требуется прочитать, и количества считываемых элементов. Адрес и количество данных задаются 16-битными числами, старший байт каждого из них передается первым. В ответе передаются запрошенные данные. Количество байт данных зависит от количества запрошенных элементов. Перед данными передается один байт, значение которого равно количеству байт данных.
Запись одного значения происходит при помощи следующих функций:5 (0x05) — запись значения одного флага (Force Single Coil)6 (0x06) — запись значения в один регистр хранения (Preset Single Register)
Команда состоит из адреса элемента (2 байта) и устанавливаемого значения (2 байта). Если команда выполнена успешно, ведомое устройство возвращает копию запроса.
Запись нескольких значений задается функциями:15 (0x0F) — запись значений в несколько регистров флагов (Force Multiple Coils)16 (0x10) — запись значений в несколько регистров хранения (Preset Multiple Registers)
Команда состоит из адреса элемента, количества изменяемых элементов, количества передаваемых байт устанавливаемых значений и самих устанавливаемых значений. В ответе ведомый передает начальный адрес и количество изменённых элементов.
Рассмотрим работу протокола на примере контроллера шагового двигателя. В документации на контроллер описано назначение регистров Modbus, которые в нем использованы. Для управления двигателем необходимо задать параметры контроллера, параметры вращения и непосредственно команду. Вся работа с контроллером при использовании протокола Модбас сводится к работе с регистрами, то есть чтению и записи. Наш контроллер имеет всего один тип регистров: Holding Registers. Этот тип регистров предназначен как для чтения, так и для записи параметров. В контроллере использовано три типа регистров: 8, 16 и 32 бита. Таким образом, для работы с ним нам понадобится использование всего лишь нескольких функций: Read Holding Registers для чтения, Preset Single Register для записи регистров размерностью 8 и 16 бит, и Preset Multiple Registers для записи дначений в регистры длиной 32 бита.
Для начала работы с контроллером необходимо установить параметры контроллера и вращения. Делается это последовательной записью нужных параметров в регистры согласно документации, используя необходимые функции. При этом, каждая запись параметра вызывает соответствующий обработчик в контроллере, который по необходимости проверяет диапазоны значений или проводит другие необходимые действия. По сути, контроллер производит прерывание по изменению значения в регистре. Такая возможность существенно расширяет возможности применения протокола Modbus.
После записи всех параметров производится запись самой команды в соответствующий регистр. Такая организация работы с протоколом Modbus весьма удобна для практического применения, так как позволяет обходиться всего лишь тремя стандартными функциями. Во время выполнения команды доступ во все регистры сохраняется, в частности, мы можем прочитать значение счетчика позиции, при необходимости обнулить его, изменить скорость, либо задать новую команду, не дожидаясь выполнения старой. Еще одной особенностью применения протокола Modbus является то, что все регистры сохраняют свои значения до их перезаписи, поэтому, если нам необходимо повторить движение с теми же параметрами, мы протсо записываем команду движения в регистр команд и двигатель повторяет прошлое задание. Это не только упрощает управление, но и уменьшает траффик между контроллером двигателя и управляющим устройством.
Таким образом, использование протокола Modbus позволило сделать управление шаговым двигателем очень простым, качественным и надежным.
Для отладки устройств с протоколом Modbus нами разработана программа OSM Modbus Terminal. Данная программа позволяет быстро освоить основные принципы управления устройствами OSM MB по протоколу Modbus RTU, проверить корректную работу устройства и быстрее написать собственное программное обеспечение. Скачать программу можно в разделе Программное обеспечение на нашем сайте.
Программа представляет собой карту регистров, каждому из которых можно задать адрес, тип значения и название. В каждом регистре имеется возможность чтения и записи значения. В окне «LogOut» можно наблюдать вывод лога по результатам каждого действия, в т. ч. и возникшие ошибки.
Для начала работы с программой необходимо установить адрес порта ПК и адрес устройства, и нажать кнопку «Connect». После этого можно производить чтение и запись в требуемые регистры. При необходимости можно сохранить названия и адреса используемых регистров кнопкой «Save». Программа написана с использованием OsmModbusDriver_SDK и может служить примером использования SDK.
Все права защищены. Перепечатка материалов с сайта возможно только с разрешения администрации
onitex.ru