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

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

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



?наче просто сдвигается влево. Таким образом все установленные биты будут единицами в регистре MES, с сброшенные - нулями.

Функция get_mask генерирует маску И на первые DATACL бит. Результат помещается в регистр R25. Первые DATACL бит маски должны быть равны единицы, остальные - нулями. Для этого в регистр R25 изначально записывается 0. После этого DATACL помещается в стек, и в цикле, пока DATACL не равно нулю R25 сдвигается влево и инкрементируется. После цикла DATACL извлекается из стека.

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

В первую очередь функция чтения регистров проверяет, была ли посылка широковещательной, и если была, то функция не выполняется. После этого производится проверка значений startreg и startreg+DATACL. Если одно из этих значений превосходит 16, то отправляется исключение.

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

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

После цикла отправляется посчитанная контрольная сумма.

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

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

3.7 Запись флага

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

После проверки адреса выполняется проверка значения флага. Если записываемое значение не равно 0xFF00 или 0x0000, то также отправляется исключение.

Если адрес и значение записываемого флага корректно, то в регистровую пару Z загружается смещение переменной coils, и содержимое этой переменной загружается в регистр R17.

Далее, необходимо либо установить бит под номером startreg-1, либо его сбросить. Для обоих случаев используется маска, которая генерируется для startreg и записывается в регистр R18. В регистре R18 после работы функции bit_to_mask установлен только один бит под номером startreg-1.

Функция bit_to_mask сначала записывает в R18 значение 1. Далее она сдвигает единицу startreg-1 раз, таким образом получая в регистре R18 необходимую маску.

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

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

Функция send_echo последовательно отправляет данные в том же порядке, в котором она их принимала. Контрольная сумма в данном случае не считается, так как она будет одинаковой для принятого и отправляемого пакета.

3.8 Запись регистра

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

Значение смещения стартового регистра записывается в регистр R16. После успешной проверки адреса регистр R16 удваивается, так как необходимо работать с 16-битными регистрами. Адрес переменной hold_regs записывается в регистровую пару Z, после чего к ней добавляется смещение, записанное в регистре R16.

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

3.9 Обработка исключительных ситуаций

В данной реализации предусмотрены следующие типы исключительных ситуаций:

функция не поддерживается.

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

Значение флага не корректно.

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

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

После проверки флага функция инициализирует значение CRC, после чего отправляет последовательно код устройства, код функции, которая вызвала ошибку (для этого к коду функции прибавляется 0x80), код ошибки и контрольную сумму пакета. На этом обработка пакета завершается.

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

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

Алгоритм заключается в следующем: в начале обработки нового байта происходит исключающее или с уже имеющимся зна