CANNY 7.2 MGX. Драйвер UART / RS-485 / Modbus / USB VCP
- Общее описание
- Регистры драйвера
- Работа контроллера в режиме UART
- Работа контроллера в режиме инвертированного UART
- Реализация Modbus RTU
- Работа контроллера в режиме RS-485
- Работа контроллера в режиме USB VCP
Общее описание
Драйвер UART позволяет контроллеру обмениваться данными с внешними устройствами, например ПК, в процессе выполнения пользовательской диаграммы. Для работы с драйвером могут быть использованы универсальные каналы ввода-вывода №9 и №10 (контакт №4 разъема №3 и контакт №2 разъема №6 соответственно).
Контроллер имеет четыре интерфейса UART, два из которых (UART1 и UART2) способны работать в полудуплексном режиме, что позволяет, при необходимости, организовать на их основе интерфейс, работающий в дуплексном режиме. Отдельный интерфейс UART (UART3) используется драйвером USB VCP. Интерфейс UART4 используется для работы с RS-485, в случае наличия у контроллера его поддержки (зависит от модификации).
Интерфейсы UART могут быть задействованы независимо друг от друга и иметь индивидуальные настройки скорости передачи данных, типа и конфигурации используемого протокола, подтяжки линии. Контроль состояния канала передачи данных должен осуществляться пользователем из функциональной диаграммы. Если канал свободен, то устройство может начать передачу данных, в противном случае устройство должно дождаться освобождения линии.
Интерфейс RS-485, при его наличии (зависит от модификации контроллера), для работы с которым могут использоваться контакт №1 (RS-485 линия B) и №2 (RS-485 линия A) разъема №1. В своей работе интерфейс RS-485 использует один из аппаратных интерфейсов UART контроллера CANNY 7.2 MGX.
USB Virtual COM-port (USB-VCP) позволяет подключать контроллер к внешним устройствам, например к ПК, с помощью имеющегося на его плате разъема USB Type-C и обмениваться с ними данными в процессе работы пользовательской диаграммы. Обмен данными происходит в дуплексном режиме, т.е. имеется возможность одновременно выполнять отправку и прием данных.
Объем приемного и передающего буферов каждого из интерфейсов драйвера UART CANNY 7.2 MGX составляет 64 байта.
Реализация инвертированного UART в контроллерах CANNY 7.2 MGX, при использовании двух отдельных каналов UART, позволяет организовать обмен данными с другим устройством в дуплексном режиме, т.е. по одному каналу выполнять отправку данных, а по другому одновременно осуществлять прием данных.
Протокол Modbus в контроллерах CANNY 7.2 MGX реализуется как поверх UART, так и поверх инвертированного UART. В качестве ADU (Application Data Unit) используется компактный двоичный вариант - Modbus RTU. Проверка целостности данных осуществляется с помощью автоматически рассчитываемой контрольной суммы (CRC). Размер пакета ограничен 64 байтами, включая CRC.
Примечание: Для корректной работы интерфейсов UART необходимо, чтобы контакты GND устройств, совершающих обмен данными, были приведены к единому потенциалу («общая земля»).
Примечание: Интерфейс UART3 (USB Virtual COM-port) не поддерживает работу с протоколом Modbus.
Драйвер UART в своей работе использует ресурсы каналов контроллера, но имеет более высокий приоритет чем драйвер дискретного ввода-вывода. Таким образом, при активации того или иного интерфейса UART, для задействованных в его работе каналов, изменение значений в связанных с ними регистрах драйвера дискретного ввода-вывода будет проигнорировано контроллером.
ВНИМАНИЕ! Драйвер Dallas 1-Wire использует для свой работы ресурсы драйвера UART1. Одновременное использование драйверов Dallas 1-Wire и UART1 невозможно.
Особенности работы драйвера
Для корректной работы USB Virtual COM-port контроллеров CANNY 7.2 MGX с операционной системой ПК может потребоваться установка специального драйвера, поставляемого в составе интегрированной среды разработки CannyLab (..\cannylab_vX_XX\drv\canny_vcp\cdcacm.inf).
Порядок установки драйвера USB Virtual COM-port
- Кликните правой кнопкой мыши на файле cdcacm.inf;
- В открывшемся контекстном меню выберите пункт “Установить”;
- Дайте операционной системе разрешение на установку драйвера;
- По окончании установки, нажмите кнопку “OK” открывшегося диалогового окна.
При правильно установленном драйвере USB VCP, при подключении работающего контроллера, с диаграммой, использующей Virtual COM-port, операционная система подаст звуковой сигнал и в Диспетчере устройств, в разделе Порты (COM и LPT), появится виртуальный порт, которому будет присвоен определенный номер.
ВНИМАНИЕ! В операционных системах Windows Vista и Windows 7, на устройствах некоторых производителей, могут наблюдаться проблемы с использованием штатного драйвера USB-VCP, связанные с ошибками в данных версиях операционных систем. В других версиях Windows (например: Windows XP, Windows 8.1, Windows 10) такой проблемы не наблюдается.
Указанная проблема не влияет на работу контроллера с CannyLab.
Регистры драйвера
Ниже приведено описание допустимых и возвращаемых значений регистров управления работой драйвера.
Регистр | Ожидаемые значения |
---|---|
Регистр конфигурации UART1 Регистр конфигурации UART2 Регистр конфигурации UART4 |
1…N = установить конфигурацию указанного интерфейса UART, которая определяет режим и параметры его работы (задается специальной константой из справочника констант); 0 = отключить указанный интерфейс UART, вернуть управление используемым для этого каналом драйверу каналов ввода-вывода и разрешить изменение его состояния из функциональной диаграммы. |
Регистр установки таймаута приема сообщения UART1, бит Регистр установки таймаута приема сообщения UART2, бит Регистр установки таймаута приема сообщения UART4, бит |
1…255 = прекращение приема данных, если в течении указанного времени, за которое может быть принято указанное число бит данных, на линии не было зафиксировано ни одного изменения потенциала и линия находится в пассивном состоянии; 0 = использовать значение по умолчанию (13 бит). |
Регистр номера канала ввода-вывода UART1 Регистр номера канала ввода-вывода UART2 |
9…10 = передача указанного канала ввода-вывода под управление драйвера UART; использовать указанный канал ввода-вывода для работы с соответствующим интерфейсом UART; |
Регистр включения режима USB VCP для UART3 | ≥ 1 = активировать режим USB VCP интерфейса UART3; 0 = отключить режим USB VCP интерфейса UART3. |
Примечание: При работе канала в режиме UART, один и тот же канал может быть использован как для передачи (TX), так и для приема (RX) данных, при этом данный интерфейс UART должен работать в полудуплексном режиме.
Примечание: При использовании режима USB VCP, устанавливать конфигурацию интерфейса UART3 (скорость передачи данных, четность и т.п.) не требуется.
Конфигурация драйвера UART определяется константой, представляющей комбинацию параметров, определяющих скорость, режим, дополнительные параметры передачи данных и потенциал линии в пассивном режиме.
Параметр | Перечень допустимых значений |
---|---|
Скорость передачи данных, бод | 110; 150; 300; 600; 1200; 1800; 2400; 4800; 9600; 10400; 19200; 38400; 57600; 115200 (только для RS-485) |
Режим работы | прямая полярность (UART); инверсная полярность (INV UART); USB VCP (только UART3); RS-485 (только UART4) |
Подтяжка в режиме UART | плюс; воздух |
Направление передачи в режиме UART и RS-485 | прием; передача; прием/передача |
Направление передачи в режиме INV UART | прием; передача |
Количество бит данных | 8; 9 |
Контроль четности | N (no) — нет; O (odd) — нечетный; E (even) - четный |
Количество стоповых бит | 1; 2. |
Именованные константы, представляющие доступные пользователю комбинации параметров конфигурации UART, содержатся в разделе «Конфигурация UART» справочника констант CannyLab, доступ к которому осуществляется через контекстное меню констант на функциональной диаграмме.
Регистр | Возвращаемые значения |
---|---|
Регистр переполнения буфера приема UARTx | 1 = буфер UART переполнен; 0 = переполнения не зафиксировано. |
Регистр наличия соединения USB VCP для UART3 | 1 = соединение контроллера с внешним устройством по USB VCP интерфейса UART3 установлено; 0 = соединение контроллера с внешним устройством по USB VCP интерфейса UART3 отсутствует. |
Регистр ошибки приема UARTx | 1 = во время приема данных UART произошла ошибка; 0 = драйвер работает в нормальном режиме. |
Регистр готовности буфера передачи данных UARTx | 1 = буфер передачи данных драйвера UART свободен; 0 = буфер передачи данных драйвера UART занят, передача данных невозможна. |
Регистр | Возвращаемые значения |
---|---|
Регистр наличия принятых данных UARTx | 1 = сообщение получено и помещено в буфер приема соответствующего канала драйвера UART; 0 = в буфере приема соответствующего канала драйвера UART актуальные данные отсутствуют. |
Регистр признака RTU буфера приема данных UART1 Регистр признака RTU буфера приема данных UART2 Регистр признака RTU буфера приема данных UART4 |
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 буфера передачи данных UART1 Регистр признака RTU буфера передачи данных UART2 Регистр признака RTU буфера передачи данных UART4 |
≥ 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: если буфер не готов, значит в данный момент драйвером выполняется прием данных — отправка данных должна быть отложена.
Работа контроллера в режиме инвертированного UART
Работая по инвертированному UART контроллер может использовать каждый из своих каналов передачи данных только в симплексном (однонаправленном) режиме. При использовании сразу обоих каналов UART, которые работают независимо друг от друга, возможно организовать дуплексный режим обмена информацией по двум проводам: один канал — только прием, второй — только передача.
Пример функциональной диаграммы для работы с инвертированным UART. Получая данные по каналу UART2, при условии, что значение полученных байтов D1:D0 равно «0хAAAA», контроллер отправляет, по каналу UART1, 2 байта данных, содержащих значение «0xBBBB».
Реализация Modbus RTU
Драйвер UART включает в себя функционал автоматического формирования и проверки контрольной суммы по стандарту Modbus RTU, что упрощает включение контроллера в сеть работающую по данному протоколу. Управлять формированием контрольной суммы передаваемых сообщений и её проверкой при приёме можно через соответствующие регистры драйвера.
Примечание: При работе в режиме Modbus регистр чтения длины UARTx содержит значение с учетом принятых байт контрольной суммы (CRC), т. е. на 2 байта больше чем длина полезной нагрузки сообщения. При отправке пакета Modbus значение регистра установки длины сообщения UARTx также должно быть увеличено на 2 байта для возможности размещения и пересылки CRC. Т.е. максимальная длина пакета, при обмене сообщениями Modbus, составляет 64 байта, включая CRC (для приема и для передачи).
Пример функциональной диаграммы работы контроллера в режиме MASTER-узла Modbus поверх инвертированного UART.
Выполняя диаграмму, контроллер периодически отправляет 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 поверх инвертированного UART.
Получая от 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 соответственно — добавляются драйвером автоматически).
Работа контроллера в режиме RS-485
Драйвер UART4 может быть сконфигурирован для приема и передачи данных через аппаратный трансивер RS-485, при его наличии (зависит от модификации контроллера), использующий контакты №1 и №2 разъема №1. Обмен данными происходит в полудуплексном режиме, т.е. в один момент активным на шине может быть только один передатчик.
Пример функциональной диаграммы для работы с RS-485.
Контроллер производит подсчет времени, прошедшего с момента подачи на него питания и по истечению каждых 1000мс отправляет в шину значение количества подсчитанных секунд. Подсчет ведется накопительным итогом, до 65535 секунд, с переполнением.
Пример функциональной диаграммы работы контроллера в качестве SLAVE-узла Modbus поверх RS-485.
Составной функциональный блок “ModBus RTU Slave” обрабатывает до 16 регистров чтения AI(WORD) и до 16 регистров записи AO(WORD).
Блок поддерживает следующие функции Modbus RTU:
- Функция 0x04 - команда Modbus RTU на чтение аналоговых вводов;
- Функция 0x10 - команда Modbus RTU на запись аналоговых выводов.
Функции 0х04 и 0х10 могут быть запрошены для произвольного числа регистров от 0 до 16 начиная с начального адреса AI и AO соответственно.
При запросе других функций блок вернет MASTERу ошибку Modbus 0x01. При запросе функций 0х04 и 0х10 для более чем 16 регистров или если адрес в запросе будет отличаться от начального адреса AI и AO соответственно, блок вернет MASTERу ошибку Modbus 0x02.
В примере показано как посредством данного функционального блока можно работать со значениями типа Word и упакованными в них значениями типа Bool, а также введена индикация работы, успешной обработки команды и ошибки.
Адрес SLAVE-узла Modbus задается в диаграмме и в данном случае равен 0x01. Запросы от MASTERа с другими адресами SLAVE-узлов контроллер будет игнорировать.
Работа контроллера в режиме USB VCP
Драйвер UART3, работая в режиме USB VCP, позволяет контроллеру устанавливать соединение с внешними устройствами для обмена данными с использованием разъема USB Type-C или miniUSB контроллера. Устанавливать параметры обмена данными в данном режиме не требуется. Настройки соединения могут быть заданы на внешнем устройстве. Обмен данными возможен на максимальной скорости, которую может обеспечить Virtual COM-port.
Пример функциональной диаграммы работы контроллера в режиме USB VCP. Получая по каналу UART3 6 байт данных, содержащих сообщение “Hello!” (в формате ASCII), контроллер отправляет 3 байта, содержащие сообщение “Hi!”. Подключение к внешнему устройству контроллер подтверждает включением красного встроенного светодиода. Получение сообщения от внешнего устройства контроллер индицирует кратковременным включением зеленого встроенного светодиода.