Реализация протокола Modbus
Дипломная работа - Компьютеры, программирование
Другие дипломы по предмету Компьютеры, программирование
?.
Регистр хранения - 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 - для широковещательной посылки. Если посылка широковещательная, ответ не отправляется. Если ID не равен 0 и не равен ID устройства, посылка не обрабатывается.
F_ID - ID функцию, которую необходимо выполнить. Если Функция не поддерживается, отправляется исключение.
SR_HI - старшая часть смещения стартового регистра. В связи с использованием в данной реализации адресов, которые умещаются в 8 бит, не используется.
SR_LO - младшая часть смещения стартового регистра.
D_HI - старшая часть информации о данных. Для функций записи это старшая часть числа, которое нужно записать, для функций чтения - старшая часть количества запрашиваемых данных. Так как все адреса данных умещаются в 8 бит, в случае чтения этот байт не используется.
D_LO - младшая часть информации о данных. Для функций записи это младшая часть числа, которое нужно записать, для функций чтения - младшая часть количества запрашиваемых данных.
CRC_LO - младшая часть контрольной суммы CRC.
CRC_HI - старшая часть контрольной суммы CRC.
При поступлении прерывания от UART каждый раз выполняется действие, которое соответствует счётчику байтов. В конце обработки каждого байта, которая заключается в сохранении в памяти переданных данных, необходимо уменьшить счётчик на 1. Если выполняется обработка первых 6-ти байт, также пересчитывается CRC.
Когда счётчик байт дойдёт до 0, будет необходимо выполнить обработку всего запроса. После обработки запроса счётчик байт нужно будет сбросить (установить значение 7) и подготовить CRC к новой посылке (установить значение 0xFFFF).
Рассмотрим более подробно блок обработки запросов. В первую очередь необходимо проверить, направлялся ли данный пакет этому устройству. Если передача была широковещательной, то необходимо установить соответствующий флаг, так как ответ посылается только при уникальном запросе. Если посылка предназначалась другому устройству, она отбрасывается.
После проверки идентификатора устройства, необходимо проверить контрольную сумму. Эта проверка состоит из двух этапов: проверка старшей и младшей части. Это обусловлено тем, что CRC является 16-битным значением, а микроконтроллер AT Mega 128 работает только с 8-ми битными данными.
Если контрольная сумма совпала, то необходимо выполнить запрашиваемую функцию. Если запрашиваемая функция не поддерживается, отправляется исключение с соответствующим кодом. Если функция поддерживается, то программа выполняет е