На главную страницу Решения Полудуплексный интерфейс RS485

Smart Display с RS485 интерфейсом

September 10,2022

Описание

I. Введение:

Smart Display - это серия дисплеев в сочетании с микроконтроллером, который может выполнять сложную загрузку графики, а также настройку, отображение и даже ввод. Внешнее устройство (т.е. хост) может выполнять интерактивные операции с помощью простых команд, что очень подходит для различных нужд, и широко используется в различных областях, таких как: медицина, промышленность, автомобилестроение и т.д.

Smart Display поддерживает множество коммуникационных интерфейсов, но наиболее распространенными и популярными в настоящее время являются CAN/CANopen и RS485/Modbus. Своей популярностью применения в промышленных устройствах, простотой управления, доступностью и сравнительно недорогой ценой выделяется RS485 интерфейс.

Интерфейс имеет довольно простую структуру, поскольку для передачи и приёма данных требуется одна витая пара (RS485_A/RS485_B) через которую происходит обмен данными с помощью дифференциальных сигналов. Кроме того, протокол Modbus довольно понятен и прост в использовании, поэтому в качестве иллюстрации, в данной статье мы рассмотрим принципы и методику управления RS485/Modbus для создания кросплатформенных приложений.

II. Требуемые компоненты:

 

■ Smart Display_RS485

Для проверки требуется Smart Display с поддержкой RS485

■ RS485 Dongle

Dongle (электронный ключ) на RS685

Типы USB to RS485 Dongle

Рис. 2-1 Типы USB to RS485 Dongle

 

■ Рис. 2-1 Типы USB to RS485 Dongle

После того как мы подготовим все компоненты, у нас появится возможность выбора среды выполнения тестового стенда в качестве хоста. Единственным требуемым условием является возможность хоста читать и записывать через последовательный порт независимо от ОС: Windows, Mac OS, различные Linux (включая Raspbian для Raspberry Pi) или одноплатный компьютер, Arduino и т. д.

В качестве образца используется одноплатный компьютер (SBC) со встроенным портом RS485, который можно использовать непосредственно в качестве хост-устройства.

WUACLB120V0000N0NX01

Model No. WUACLB120V0000N0NX01

 

III. Проверка интерфейса управления:
 

■ Проверка интерфейса управления:

Чтобы понять как связать Smart Display с хостом, прежде всего нам нужно получить код управления, и для этого нам поможет программа GUI Builder. GUI Builder является отличным программным обеспечением для работы со Smart Display, которое позволяет создавать собственный дизайн интерфейса и отображать его без необходимости написания какой-либо программы. С помощью функций данной программы можно создать свой идеальный пользовательский интерфейс путем перетаскивания иконок на дисплей для отображения. Кроме всего прочего, встроенный симулятор и Smart Display используют одинаковый исходный код!

Contact for Smart Display GUI Builder

Smart Display GUI Builder

Рис. 3-1 Smart Display GUI Builder

 

Запустите программу GUI Builder в Windows OS и ввведите желаемое имя проекта в строке «Project Name». Если Вы создавали проект ранее, то можно выбрать сохраненный проект нажав на иконку «Open Project» в меню на правой стороне интерфейса. После выбираем иконку Device Type 5’’ TFT, затем нажмите на иконку «Create» для создания нового проекта.

Создание проекта

Рис. 3-2 Создание проекта

 

После создания проекта в первую очередь выберите интерфейс

Выбор интерфейса

Рис. 3-3 Выбор интерфейса

 

Задать параметры интерфейса

Рис. 3-4 Задать параметры интерфейса

 

В качестве интерфейса по-умолчанию нужно выбрать RS485. Порт хоста RS485 должен быть установлен как фактический порт для подключения Dongle (электронный ключ). Проверить имя порта можно через диспетчер устройств, а значение Baudrate нужно оставить без изменений - 115200.

Отображение порта в диспетчере устройств

Рис. 3-5 Отображение порта в диспетчере устройств

 

Если на руках образца Smart Display RS485 еще нет, то можно запустить GUI Builder в режиме симуляции для изучения возможностей программы.

Кликните Simulator и выберите Simulator with GUI для запуска режима симуляции:

запуск режима симуляции

Рис. 3-6 запуск режима симуляции

 

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

Изменение контента для получения кода

Рис. 3-7 Изменение контента для получения кода

 

Каждая операция будет выводить две команды TX/RX, так как устройство отображения отправит обратно ту же подтвержденную команду после получения команды, чтобы сообщить, что она была получена.

Имеется возможность записать несколько разных значений для разных объектов и использовать для управления физическим устройством.

Коды управления

Коды управления

■ Подключение выводов:

RS485 использует дифференциальную пару для передачи и приема сигналов, и если эти два провода подсоединены, заземляющий провод не требуется. Имя сигнальной линии RS485 — A/B (A соедините A, B соедините B).

Подключение

Рис. 3-8 Подключение

 

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

1. Перед тестированием проверьте имена COM-портов, поскольку в разных операционных системах они различаются.

Имена COM-портов в различных операционных системах

Имена COM-портов в различных операционных системах

 

2. COM-портыв некоторых операционных систем не назначены по умолчанию, и требует предварительной настройки. В качестве примера возьмем Linux/Ubuntu; если имя COM-порта - ttyUSB0, и в терминале нужно назначить права:

sudo chmod 666 /dev/ttyUSB0

 

Два метода тестирования:

 

■ Управление терминалом последовательного порта

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

Отправка кода управления в терминал

Рис. 3-9 Отправка кода управления в терминал

 

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

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

■ Использование Python

Следующие программы выполняются с использованием python3. Требуется записать три набора кодов управления на последовательный порт подавая сигнал каждую секунду.

import serial
from time import sleep

"""
The name of Com Port varies according to the operating system, For example:
Raspberry Pi: /dev/ttyUSBn (e.g. /dev/ttyUSB0)
Windows: COMn (e.g. COM22)
"""
# Raspberry Pi / Rasbian
# COM_PORT = '/dev/ttyUSB0'
COM_PORT = 'COM22'

v000 = bytes.fromhex('7B06000600006251')
v050 = bytes.fromhex('7B0600060032E384')
v100 = bytes.fromhex('7B060006006463BA')

ser = serial.Serial(COM_PORT, 115200)
while True:
ser.write(v000)
sleep(1.0)
ser.write(v050)
sleep(1.0)
ser.write(v100)
sleep(1.0)
ser.write(v050)
sleep(1.0)

Исходный код Python может выполняться на различных платформах, и если последовательный порт назван правильно, то он должен корректно работать с тестовым стендом.

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

IV. Анализ кодов управления

 

■ Сравнительный анализ

Сравнение команд с разными значениями для одного и того же объекта:

Table

Значения выделенные синим — это значение установленного нами объекта.

Сравнение разных объектов с одинаковой командой значения

Table

Значения, выделенные синим, относятся к индексу или адресу объекта.
Что касается последних двух байтов данных, то тут вроде правил нет, но что означают эти сообщения?

■ Анализ кодов управления

На самом деле содержимое этих 8 байт и есть так называемое сообщение Modbus. Таблица с кодовыми обозначениями показана ниже:

Рис. 4-1

Рис. 4-1

 

ID
Каждое Modbus устройство должно иметь идентификационный код. Идентификационный код Smart Display - 0x7B = 123

Код функции
Код функции указывающий назначение сообщения (например 06) —Запись единого регистра, который также записывает значение в указанное место.

Адрес регистра
Aдрес регистра — это место назначения для записи (то есть адрес объекта)

Данные
Записываемая информация (значение объекта)

Циклический избыточный код
Результат CRC (циклический избыточный код) первых 6 байтов используемый для проверки наличия ошибок в процессе передачи данных.

Do you have some concepts? If you want to know more, you have to look at what Modbus is.

V. Modbus Введение

 

■ Протокол Modbus

Протокол Modbus на самом деле является форматом данных, и в основном определяет коммуникационное содержание архитектуры ведущий-ведомый.

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

■ Концептуальная модель

Modbus рассматривает передачу данных как доступ к «Регистрации», так как каждое устройство должно определить свой собственный тип регистра и адрес для внешней ссылки. Так называемая передача данных на устройство — это запись в указанный регистр, а чтение данных — это чтение указанного регистра (16-бит).

■ Код функции

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

Функии кодов Modbus

Функии кодов Modbus

 

Для управления Smart Display чаще всего используется 06: запись значения единого регистра в указанное место (запись 16-битного значения) и, чтение регистров временного хранения (чтение значения нескольких регистров).

■ CRC (Циклический избыточный код)

CRC - циклический избыточный код, иногда называемый также контрольным кодом. По своей сути — это просто вычисленное на основе исходного передаваемого сообщения число (или можно сказать код), которое передаётся вместе с самим сообщением (дописывается в конец информационной части) и служит для контроля его безошибочной передачи.

VI. Контроль объектов Smart Display

 

Каждому Modbus требуется определить тип и адрес регистра, и ниже мы разберем данную тему.

■ Классификация регистров

Регистры Smart Display можно условно разделить на три категории:

1.)Информация об устройстве (версия, имя устройства и т. д.)
Отправить код 04 для чтения входных регистров. Данные будут изменены при обновлении прошивки, при подключении.

2.) Свойства объекта (вид, местоположение и т. д.)
Отправить код 03 для чтения регистров временного хранения/16: Запись нескольких регистров для чтения и записи. Эти данные влияют на внешний вид объектов и обычно не меняются вне стадии проектирования. Чтобы изменить содержимое, Smart Display должен быть временно отключен, прежде чем его можно будет обновить.

3.) Значения объекта (значения, которые представляет объект, например, число оборотов в минуту, включение или выключение, процент и т. д., варьируются от объекта к объекту).
Данный пункт является основным пунктом изменения в работе и каждый элемент использует 16-битное значение, поэтому для него установлено значение 06: запись в одиночный регистр.

Ниже приведен список этих регистров:

■ Регистры ввода

Регистры ввода Smart Display

Регистры ввода Smart Display

 

■ Регистры хранения

Регистры хранения Smart Display

Регистры хранения Smart Display

 

Ранняя версия прошивки Smart Display поддерживала только 10 объектов, поэтому диапазон идентификаторов виджета составлял от 0 до 9 (включительно). В новой версии прошивки данный диапазон был расширен до 64, но способ адресации был изменен.

Этих данных достаточно для сжатия и отправки на Smart Display для управления. Способ сжатия данных и добавления CRC кода будет описано ниже.

VII. Пользовательский интерфейс

 

Для практического применения Smart Display по-прежнему необходим подходящий человеко-машинный интерфейс, особенно графический пользовательский интерфейс, графический интерфейс пользователя. В настоящее время существует множество вариантов кроссплатформенных разработкок графического интерфейса, и мы используем Qt для ее реализации.

Многие люди думают, что Qt — это просто библиотека с графическим интерфейсом, но она является полноценной средой разработки (Framework). Предположим, что приложение полностью реализовано через кроссплатформенную библиотеку классов; проект может быть легко перенесен на несколько платформ (ПК/Windows, Mac/MacOS, Raspberry Pi/Raspbian, Android, iOS, Embedded и т. д.) с небольшими изменениями, поскольку программа представляет собой средство разработки программного обеспечения.

Более новая версия Qt уже поддерживает библиотеку классов Modbus, но чтобы облегчить переписывание на другие языки, мы реализуем эту тестовую программу для наиболее удобного чтения и записи последовательного порта.

Помимо предоставления функции выбора последовательного порта и передачи кода для управления, эта программа дополнительно предоставляет горизонтально рычажное приложение, которое может устанавливать значение указанного объекта. Если вы выбираете COM для последовательного порта, не забудьте указать фактический номер.

На изображении ниже показано выполнение программы на Raspberry Pi и Ubuntu, которая не требует модификации.

Задать значение виджета на Raspberry Pi

Рис. 7-1 Задать значение виджета на Raspberry Pi

 

Задать значение виджета на Ubuntu

Рис. 7-2 Задать значение виджета на Ubuntu

 

■ CRC (Циклический избыточный код)

Алгоритм циклического избыточного кода довольно прост в применении и в Qt выглядит в виде алгоритма ниже:

QByteArray SetWidgetValue::calculateCRC(QByteArray data)
{
uint16_t crc = 0xFFFF;
for(int idx = 0; idx < data.length(); idx++)
{
uint8_t i = (uint8_t)crc ^ data[idx];
crc >>= 8;
crc ^= crcTable[i];
}
QByteArray ba;
ba.append(char(crc & 0xFF));
ba.append(char(crc >> 8));
return ba;
}

Контент таблицы циклического избыточного кода:

const uint16_t crcTable[] =
{
0X0000, 0XC0C1, 0XC181, 0X0140, 0XC301, 0X03C0, 0X0280, 0XC241,
0XC601, 0X06C0, 0X0780, 0XC741, 0X0500, 0XC5C1, 0XC481, 0X0440,
0XCC01, 0X0CC0, 0X0D80, 0XCD41, 0X0F00, 0XCFC1, 0XCE81, 0X0E40,
0X0A00, 0XCAC1, 0XCB81, 0X0B40, 0XC901, 0X09C0, 0X0880, 0XC841,
. . .
0X8801, 0X48C0, 0X4980, 0X8941, 0X4B00, 0X8BC1, 0X8A81, 0X4A40,
0X4E00, 0X8EC1, 0X8F81, 0X4F40, 0X8D01, 0X4DC0, 0X4C80, 0X8C41,
0X4400, 0X84C1, 0X8581, 0X4540, 0X8701, 0X47C0, 0X4680, 0X8641,
0X8201, 0X42C0, 0X4380, 0X8341, 0X4100, 0X81C1, 0X8081, 0X4040
};

Информация выше не является полной, и если требуется, то с ней можно ознакомиться на github.

■ Упаковка данных

Ниже приведена ключевая функция, которая вычисляет управляющий код в соответствии с пользовательским интерфейсом и отправляет его на Smart Display:

void SetWidgetValue::on_sbValue_valueChanged(int value)
{
int id = ui->edWidgetID->text().toInt();
sendWidgetValue(id, value);
ui->lbValue->setText(QString::number(value));
}

void SetWidgetValue::sendWidgetValue(int id, int value)
{
QByteArray msg;
uint16_t addr = (uint16_t)(id * 100 + 6);
msg.append(deviceID);
msg.append(writeSingleRegister);
msg.append((uint8_t)addr >> 8);
msg.append((uint8_t)addr & 0xFF);
msg.append((uint8_t)value >> 8);
msg.append((uint8_t)value & 0xFF);
QByteArray msgToSend = msg.append(calculateCRC(msg));
writeSerialPortData(msgToSend);
}

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

VIII. Расширенный пример

 

Предыдущий пример предназначен только для установки значения объекта, и для изучения наиболее полного примера, можно обаратиться к SmartDisplayConsole. На рис. ниже показан экран выполнения на Raspberry Pi:

SmartDisplayConsole в Raspbian среде

Рис. 8-1 SmartDisplayConsole в Raspbian среде

 

В конце статьи есть URL-ссылка на github, и каждый может обратиться к нему для изучения.

IX. Заключение

 

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

X. Ссылки

 

Serial Terminal Basics
https://learn.sparkfun.com/tutorials/terminal-basics/command-line-windows-mac-linux

Modbus
https://www.modbustools.com/modbus.html
https://www.modbusdriver.com/doc/mbusmaster.net/modbus.htm

XI. Пример исходного кода

 

GettingStartedWithSmartDisplay
https://github.com/Smart-Display-Series/GettingStartedWithSmartDisplay.git

SmartDisplayConsole
https://github.com/Smart-Display-Series/SmartDisplayConsole.git

Если у Вас есть какие-либо вопросы или предложения, пожалуйста свяжитесь с нами!

Подписка

Подписаться на рассылку новостей Winstar

Свяжитесь с нами

Цена/Даташит/Общий запрос

Техподдержка

Служба поддержки Winstar

go top
Контакты
close