CANNY 7.3 Echo. Драйвер UART / Modbus
Общее описание
Контроллеры CANNY 7.3 Echo имеют два независимых интерфейса UART, поддерживающих работу в асинхронном полудуплексном режиме приема/передачи данных, который может быть использован для связи контроллеров друг с другом или с внешним оборудованием поддерживающим данный вид связи. Интерфейсы UART задействуют каналы ввода-вывода контроллера, которые задаются пользователем в функциональной диаграмме. Каналы могут быть задействованы независимо друг от друга и иметь индивидуальные настройки скорости передачи данных, типа и конфигурации используемого протокола.
Так как каналы ввода-вывода контроллера работают в режиме открытого коллектора, для работы в режиме UART им требуется внешняя подтяжка к положительному потенциалу.
Примечание: На оборотной стороне платы контроллера расположены специальные контактные площадки, замкнув которые (установив перемычку) можно организовать постоянную подтяжку канала к положительному потенциалу - напряжению питания контролера (индивидуально для каждого канала). По умолчанию, подтягивающие резисторы каналов контроллера установлены, но не подключены.
Контроль состояния канала передачи данных должен осуществляться пользователем из функциональной диаграммы. Если канал свободен, то устройство может начать передачу данных, в противном случае устройство должно дождаться освобождения линии. Наличие двух интерфейсов UART, способных работать в полудуплексном режиме, позволяет, при необходимости, организовать на их основе один интерфейс, работающий в дуплексном режиме.
Объем приемного и передающего буферов каждого из интерфейсов драйвера UART CANNY 7.3 Echo составляет 64 байта.
Протокол Modbus в контроллерах CANNY 7.3 Echo реализуется поверх UART в любом режиме его работы. В качестве ADU (Application Data Unit) используется компактный двоичный вариант - Modbus RTU. В этом режиме контроллер автоматически осуществляет расчет контрольной суммы (CRC), добавляя ее к пакету при передаче, либо сверяя с данными пакета при приеме. Размер пакета ограничен 64 байтами включая CRC.
Примечание: Для корректной работы интерфейсов UART необходимо, чтобы контакты GND устройств, совершающих обмен данными, были приведены к единому потенциалу («общая земля»).
Драйвер UART в своей работе использует ресурсы каналов контроллера, но имеет более высокий приоритет чем драйвер дискретного ввода-вывода. Таким образом, при активации того или иного интерфейса UART, для задействованных в его работе каналов, изменение значений в связанных с ними регистрах драйвера дискретного ввода-вывода будет проигнорировано контроллером.
Регистры драйвера
Ниже приведено описание допустимых и возвращаемых значений регистров управления работой драйвера.
Регистры конфигурации драйвера UART.
Регистр | Ожидаемые значения |
---|---|
Регистр конфигурации UARTx | 1…N = установить конфигурацию канала драйвера UART контроллера, определяющую текущий режим и параметры его работы (задается специальной константой из справочника констант); 0 = отключить канал от драйвера UART, вернуть управление каналом драйверу каналов ввода-вывода и разрешить изменения его состояния из функциональной диаграммы. |
Регистр установки таймаута приема сообщения UARTx, бит | 1…255 = прекращение приема данных, если в течении указанного времени, за которое может быть принято указанное число бит данных, на линии не было зафиксировано ни одного изменения потенциала и линия находится в пассивном состоянии; 0 = использовать значение по умолчанию (13 бит). |
Регистр номера канала ввода-вывода UARTx | 0…1 = передача указанного канала ввода-вывода под управление драйвера UART; использовать указанный канал ввода-вывода для работы с соответствующим интерфейсом UART; |
Примечание: При работе канала в режиме UART, один и тот же канал может быть использован как для передачи (TX), так и для приема (RX) данных, при этом данный интерфейс UART должен работать в полудуплексном режиме.
Конфигурация драйвера UART определяется константой, представляющей комбинацию параметров, определяющих скорость, режим, дополнительные параметры передачи данных и потенциал линии в пассивном режиме.
Параметр | Перечень допустимых значений |
---|---|
Скорость передачи данных, бод | 110; 150; 300; 600; 1200; 1800; 2400; 4800; 9600; 10400; 19200; 38400; 57600 |
Режим работы | UART (прием / передача) |
Количество бит данных | 8; 9 |
Контроль четности | N (no) — нет; O (odd) — нечетный; E (even) - четный |
Количество стоповых бит | 1; 2. |
Примечание: Для подтяжки линии UART к положительному потенциалу должно использоваться внешнее сопротивление или постоянная подключаемая подтяжка соответствующего канала контроллера.
Именованные константы, представляющие доступные пользователю комбинации параметров конфигурации UART, содержатся в разделе «Конфигурация UART» справочника констант CannyLab, доступ к которому осуществляется через контекстное меню констант на функциональной диаграмме.
Регистр | Возвращаемые значения |
---|---|
Регистр переполнения буфера приема UARTx | 1 = буфер UART переполнен; 0 = переполнения не зафиксировано. |
Регистр ошибки приема UARTx | 1 = во время приема данных UART произошла ошибка; 0 = драйвер работает в нормальном режиме. |
Регистр готовности буфера передачи данных UARTx | 1 = буфер передачи данных драйвера UART свободен; 0 = буфер передачи данных драйвера UART занят, передача данных невозможна. |
Регистр | Возвращаемые значения |
---|---|
Регистр наличия принятых данных UARTx | 1 = сообщение получено и помещено в буфер приема соответствующего канала драйвера UART; 0 = в буфере приема соответствующего канала драйвера UART отсутствуют актуальные данные. |
Регистр признака RTU буфера приема данных UARTx | 1 = полученное по соответствующему каналу сообщение UART является корректным сообщением Modbus RTU, контрольная сумма корректна; 0 = полученное по соответствующему каналу сообщение UART не является корректным сообщением Modbus RTU. |
Регистр длины принятого сообщения UARTx | 0…64 = значение, равное количеству байт данных, в принятом по соответствующему каналу драйвера UART пакете данных. |
Регистр принятого сообщения UARTx D1:D0 … Регистр принятого сообщения UARTx D63:D62 |
0…0xFFFF = значения соответствующих байт данных приемных буферов UART каждого канала, по два байта на регистр. |
Регистр | Ожидаемые значения |
---|---|
Регистр начала передачи UARTx | ≥ 1 = загрузить данные из регистров передачи в буфер передачи соответствующего канала драйвера UART; 0 = не загружать данные в буфер передачи соответствующего канала драйвера UART. |
Регистр признака RTU буфера передачи данных UARTx | ≥ 1 = команда драйверу дописать к сообщению в буфере передачи соответствующего канала драйвера UART контрольную сумму в формате Modbus RTU, сформировав для отправки пакет данных в соответствии с протоколом Modbus RTU; 0 = передавать данные буфера передачи соответствующего канала драйвера «как есть». |
Регистр длины сообщения передачи UARTx | 0…64 = количество байт данных, которое будет необходимо передать в линию, при получении команды на отправку соответствующего канала драйвера UART. |
Регистр сообщения передачи UARTx D1:D0 … Регистр сообщения передачи UARTx D63:D62 |
0…0xFFFF = значения соответствующих байт данных для передачи по соответствующему каналу драйвера UART, по два байта на регистр. |
Примечание: При работе в режиме Modbus регистр чтения длины UARTx содержит значение с учетом принятых байт контрольной суммы (CRC), т. е. на 2 байта больше чем длина полезной нагрузки сообщения. При отправке пакета Modbus значение регистра установки длины сообщения UARTx также должно быть увеличено на 2 байта для возможности размещения и пересылки CRC. Т.е. максимальная длина пакета, при обмене сообщениями Modbus, составляет 64 байта, включая CRC (для приема и для передачи).
Работа контроллера в режиме UART
Пример функциональной диаграммы для обмена данными по UART.
Контроллер, получив сообщение длиной 2 байта по интерфейсу UART1, сохраняет их в соответствующей именованной сети для дальнейшей обработки и на следующем цикле выполнения диаграммы отправляет обратно заранее подготовленные 2 байта данных.
Примечание: Особое внимание следует обратить на то, что для избежания коллизий, при отправке данных, необходимо строго контролировать регистр готовности буфера передачи данных канала UARTx: если буфер не готов, значит в данный момент драйвером выполняется прием данных — отправка данных должна быть отложена.
Реализация Modbus RTU
Драйвер UART включает в себя функционал автоматического формирования и проверки контрольной суммы по стандарту Modbus RTU, что упрощает включение контроллера в сеть работающую по данному протоколу. Управлять формированием контрольной суммы передаваемых сообщений и её проверкой при приёме можно через соответствующие регистры драйвера.
Примечание: При работе в режиме Modbus регистр чтения длины UARTx содержит значение с учетом принятых байт контрольной суммы (CRC), т. е. на 2 байта больше чем длина полезной нагрузки сообщения. При отправке пакета Modbus значение регистра установки длины сообщения UARTx также должно быть увеличено на 2 байта для возможности размещения и пересылки CRC. Т.е. максимальная длина пакета, при обмене сообщениями Modbus, составляет 64 байта, включая CRC (для приема и для передачи).
Пример функциональной диаграммы работы контроллера в режиме MASTER-узла Modbus.
Выполняя диаграмму, контроллер периодически отправляет SLAVE-узлу с адресом 0х20 запрос на получение от него значения из Modbus-регистра данных с адресом 0х0001. Получение ответа на свой запрос MASTER сопровождает коротким включением своего зеленого светодиода.
Строка запроса, при обмене данными между устройствами, будет выглядеть так:
-> 20 03 00 01 00 01 D3 7B
Адрес опрашиваемого устройства: 0x20 (байт D0 регистра приема сообщения UART2 D1:D0).
Функция: 0x03 - чтение значений из нескольких регистров хранения (байт D1 регистра приема сообщения UART2 D1:D0).
Номер первого запрашиваемого регистра: 0x0001 (байты D2 и D3 регистра приема сообщения UART2 D3:D2).
Число запрашиваемых регистров: 0x0001 (байты D4 и D5 регистра приема сообщения UART2 D5:D4).
Контрольная сумма: 0xD37B (байты D6 и D7 регистра приема сообщения UART2 D7:D6 — добавляются драйвером автоматически).
Пример функциональной диаграммы работы контроллера в качестве SLAVE-узла Modbus.
Получая от MASTERа запрос на передачу данных, контроллер в ответ передает состояние запрошенного регистра. Контроллер передает 2 байта данных (+2 байта CRC), т.к. регистры Modbus имеют разрядность 16 бит.
Строка ответа, при обмене данными между устройствами, будет выглядеть так:
<- 20 03 02 FA FA C6 A0
Адрес отвечающего устройства: 0x20 (байт D0 регистра сообщения передачи UART1 D1:D0).
Функция: 0x03 - результат чтения значений из нескольких регистров хранения (байт D1 регистра сообщения передачи UART1 D1:D0).
Число возвращаемых байт: 0x02 (байт D2 регистра сообщения передачи UART1 D3:D2).
Значение старшего байта запрашиваемого регистра: 0xFA (байт D3 регистра сообщения передачи UART1 D3:D2).
Значение младшего байта запрашиваемого регистра: 0xFA (байт D4 регистра сообщения передачи UART1 D5:D4).
Контрольная сумма: 0xC6A0 (байт D5 регистра приема сообщения UART1 D5:D4 и байт D6 регистра приема сообщения UART1 D7:D6 соответственно — добавляются драйвером автоматически).