Реализация протокола Modbus

Дипломная работа - Компьютеры, программирование

Другие дипломы по предмету Компьютеры, программирование



ё. Далее будут рассмотрены алгоритмы обработки запросов конкретных функций.

2.1 Чтение флагов

Функция чтения флагов выполняется, если посылка была не широковещательной. При чтении флагов в ответ входят:

S_ID

F_ID

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

Флаги, которые были считаны по запросу

CRC

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

2.2 Чтение дискретных входов

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

2.3 Чтение регистров хранения

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

S_ID

F_ID

Количество байт. Так как регистры 16-битные, количество байт - количество запрашиваемых регистров, умноженное на 2

Запрашиваемые регистры

CRC

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

2.4 Чтение регистров ввода

Функция чтения регистров ввода аналогична функции чтения регистров хранения. Отличие в том, что в данном случае запрашиваются значения РОН микроконтроллера. При этом старшая часть регистра ввода всегда равна 0, а младшая - значению РОН.

2.5 Запись одного флага

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

FF 00 - установить флаг

00 00 - сбросить флаг

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

2.6 Запись одного регистра хранения

Функция записи одного регистра хранения по структуре такая же, как и функция записи одного флага. Отличие в том, что устанавливается любое 16-битное значение для указанного регистра хранения.

2.7 Исключительная ситуация

Исключительная ситуация может возникнуть, если выполнилось одно из следующих условий:

Код функции не поддерживается. Код исключения 1.

Адреса запрашиваемых данных больше адресов предоставляемых. Код исключения 2.

Значение устанавливаемого флага не корректно. Код исключения 3.

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

S_ID

F_ID+0x80 -код функции символизирует о возникновении исключительной ситуации

Код ошибки

CRC

2.8 Контрольная сумма

Контрольная сумма считается в процессе приёма или отправки сообщения. В протоколе modbus используется CRC16 с многочленом 0xA001. Перед каждым новым вычислением контрольной суммы необходимо инициализировать её значение, установив его в 0xFFFF.

Блок-схема программы приведена в приложении А.

3. Разработка программы

Для корректной работы программы понадобится ряд переменных и массивов. Все они имеют такие структуру и имена, как описано ниже:

s_id - идентификатор устройства, является одним байтом оперативной памяти микроконтроллера.

f_id - идентификатор функции, является одним байтом оперативной памяти.

startreg - адрес начального регистра или флага. Является двумя байтами оперативной памяти.

crc - два байта оперативной памяти для хранения принятой контрольной суммы.

CRCH - старший байт высчитываемой контрольной суммы. Является РОН, специально выделенным для CRC.

CRCL - младший байт высчитываемой контрольной суммы. Является РОН, специально выделенным для CRC.

DATACH - старший байт для числа данных в случае чтения, или старший байт данных в случае записи. Является РОН, специально выделенным для хранения данных.

DATACL - младший байт для числа данных в случае чтения, или младший байт данных в случае записи. Является РОН, специально выделенным для хранения данных.

BYTENUM - счётчик принятых байтов в посылке. Является специально выделенным РОН.

TMP - временная переменная. Является РОН.

COUNTER - счётчик, используется в функции подсчёта CRC. Является РОН.

MES - регистр, в котором хранится принятый по UART байт, или байт, который необходимо отправить.

hold_regs - 32 байта оперативной памяти, которые выделены для хранения 16-ти регистров хранения

coils - 1 байт оперативной памяти, выделенный для хранения 8 флагов.

Программа состоит из нескольких блоков. Все блоки, кроме блока инициализация выполняются в режиме обработки прерывания от UART.

3.1 Инициализация

В блоке инициализация необходимо сделать 2 вещи: подготовить систему к новой посылке и инициализировать UART. Для того, чтобы подготовить систему к новой посылке, необходимо записать в регистры CRCH и CRCL значение 0xFF. Этого требует алгоритм расчёта CRC, и установить значение 7 регистру BYTENUM. Так как посылка имеет длину 8,