Smart Display Winstar с популярным интерфейсом RS-485

20 февраля

телекоммуникацииавтомобильная электроникаавтоматизацияинтернет вещейWinstar DisplayстатьяоптоэлектроникаLCD-TFTДисплеи

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

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

Интеллектуальный дисплей поддерживает множество коммуникационных интерфейсов. В настоящее время наиболее часто используются CAN/CANopen, RS-485/Modbus, а в будущем будет предоставлено еще больше вариантов. Популярным интерфейсом связи в промышленности является RS-485/Modbus, и сегодня на рынке представлены различные устройства с ними по разумным ценам. Структура линии проста: для взаимодействия используются два провода (RS-485_A/RS485_B), а интерфейс связи в операционной системе обычно представлен в виде последовательного порта (Serial Port), и каждая платформа имеет для разработки соответствующую библиотеку. Кроме того, протокол Modbus довольно прост, поэтому часто приводится в качестве примера для исследований и экспериментов.

Инженеры Winstar подготовили руководство, в котором описан принцип управления умным дисплеем. Оно поможет, переходя от простых задач к сложным, научиться управлять Smart Display и создавать кроссплатформенные приложения. Это руководство будет полезно и эксперту по промышленному оборудованию, и независимому разработчику.

Для работы потребуются:

  • Smart Display, поддерживающий интерфейс RS-485.
  • Переходник для RS-485 (RS-485 Dongle или конвертер для RS-485). Поскольку такие устройства, как ПК/Raspberry Pi обычно не имеют порта RS-485, при необходимости можно использовать различные USB-переходники (рисунок 1).
  • Основное устройство, хост (HOST Device).

Рис. 1. Типы переходников USB-RS485

Рис. 1. Типы переходников USB-RS-485

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

Для удобства мы возьмем одноплатный компьютер Demo.set WUACLB120V0000N0NX01 со встроенным RS-485, который можно использовать в качестве хост-устройства, как показано на рисунке 2.

Рис. 2. Внешний вид WUACLB120V0000N0NX01

Рис. 2. Внешний вид WUACLB120V0000N0NX01

Тестирование интерфейса управления

Получение кодов управления

Чтобы организовать взаимодействие Smart Display с хостом, сначала надо создать коды управления. Самый простой способ – получить их из приложения Smart Display GUI Builder. GUI Builder – это отличное вспомогательное программное обеспечение для Smart Display. С его помощью можно изучать пользовательский интерфейс, управлять, проектировать и визуализировать его, не имея физического устройства, то есть разрабатывать пользовательский интерфейс без написания какой-либо программы. Благодаря функции WYSIWYG («что видишь, то и получаешь») разработка пользовательского интерфейса может быть выполнена посредством нажатия кнопок или перетаскивания объектов. Кроме того, в приложении есть встроенный симулятор, который работает так же, как аппаратный Smart Display и демонстрирует такой же внешний вид и поведение, что и физическое устройство (рисунок 3). А еще оно бесплатное.

Рис. 3. Конструктор графического интерфейса для Smart Display

Рис. 3. Конструктор графического интерфейса для Smart Display

Smart Display GUI Builder

Чтобы запустить приложение на ОС Windows, дважды щелкните по иконке GUI Builder и откройте проект. Теперь выберите 5″ RS-485 Smart Display WL0F00050000FGDAASA00, а внизу – сценарий по умолчанию: Vehicle (система управления автомобилем). Затем введите название проекта и нажмите кнопку Create, чтобы создать проект (рисунок 4). Если он уже был создан ранее, то его также можно выбрать непосредственно в меню справа.

Рис. 4. Создание проекта

Рис. 4. Создание проекта

После создания проекта необходимо выбрать интерфейс (рисунки 5 и 6).

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

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

Рис. 6. Настройка параметров интерфейса

Рис. 6. Настройка параметров интерфейса

Установите интерфейс RS-485, а RS-485 port хоста должен быть установлен как фактический порт, к которому подключен переходник RS-485. Если есть сомнения, можно проверить имя порта в администраторе устройств. Для этого отключите и затем подключите его. Если все верно, он сначала исчезнет, а потом снова появится (рисунок 7). Скорость передачи данных может быть оставлена как значение по умолчанию, равное 115200.

Рис. 7. Отображение COM-порта в администраторе устройств

Рис. 7. Отображение COM-порта в администраторе устройств

Даже если устройство Smart Display RS-485 отсутствует, это не имеет значения. Пока интерфейс установлен как RS-485, порт RS-485 можно пока игнорировать, поскольку сейчас будет использоваться только симулятор, и практического подключения к устройству Smart Display не будет.

Запустите симулятор, нажав Simulator/Simulator with GUI (Симулятор/Симулятор с графическим интерфейсом), как показано на рисунке 8.

Рис. 8. Запуск симулятора

Рис. 8. Запуск симулятора

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

Рис. 9. Изменение настроек объекта и код управления

Рис. 9. Изменение настроек объекта и код управления

Каждое действие будет сопровождаться двумя командами TX/RX, потому что устройство отображения (даже если сейчас это эмулятор) после получения команды отправит обратно такую же команду-подтверждение, чтобы показать, что она получена. Запишите несколько различных значений для разных объектов (рисунок 10).

Рис. 10. Код управления

Рис. 10. Код управления

Управления физическим устройством

Подключение проводов

Для передачи и приема сигналов RS-485 использует дифференциальную пару, работающую, пока два провода соединены (даже нет необходимости в проводе заземления). Сигнальные линии RS-485 называются A/B. Просто соедините между собой A с A, и B с B (рисунок 11).

Рис. 11. Подключение проводов RS485

Рис. 11. Подключение проводов RS-485

Хост передает управляющие коды, записывая их в последовательный порт.

Прежде чем приступить к тестированию, следует запомнить два момента:

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

Рис. 12. Пример названий последовательных портов в разных ОС

Рис. 12. Пример названий последовательных портов в разных ОС

  • В некоторых операционных системах доступ к COM-порту по умолчанию закрыт, поэтому перед использованием его необходимо разрешить. Например, если в Linux/Ubuntu COM-порт называется ttyUSB0, в терминале необходимо выполнить команду:

sudo chmod 666 /dev/ttyUSB0

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

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

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

Рис. 13. Отправка управляющих кодов с помощью программы-терминала

Рис. 13. Отправка управляющих кодов с помощью программы-терминала

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

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

В качестве языка программирование сначала попробуем популярный кроссплатформенный ЯП Python.

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

Следующие программы запускаются с помощью Python3. Структура программы довольно проста: в ней 4 команды, но 3 разных управляющих кода. Достаточно напрямую записывать три набора управляющих кодов в последовательный порт каждую секунду, чтобы прибор на устройстве продолжал отображаться.



import serial
from time import sleep

"""
Название COM Port зависит от операционной системы, к примеру:

Raspberry Pi: /dev/ttyUSBn (например, /dev/ttyUSB0)

Windows: COMn (например, 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 может быть выполнен на различных платформах, поэтому если последовательный порт выбран правильно, он должен отлично работать при верном подключении тестового стенда.

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

Анализ управляющих кодов

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

Сравним команды с разными значениями для одного и того же объекта (рисунок 14).

Рис. 14. Сравнение команд с разными значениями

Рис. 14. Сравнение команд с разными значениями

Как видим из рисунка, синим обведены установленные значения для объекта. Сравним разные объекты и команды с одинаковым значением (рисунок 15).

Рис. 15. Сравнение команд

Рис. 15. Сравнение команд

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

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

Фактически содержимое этих 8 байт и есть так называемое сообщение Modbus. На рисунке 16 проиллюстрированы значения каждого поля.

Рис. 16. Пример описания кода управления

Рис. 16. Пример описания кода управления

Значения кодов:

  • ID. Каждое устройство Modbus должно иметь код идентификации. Для Smart Display это 0x7B = 123.
  • Fun (код функции) указывает на назначение данного сообщения. Например, код 06 – это Write Single Register (записать в один регистр), который также записывает значение в указанное место.
  • Register Address – адрес регистра, в который производится запись, то есть адрес объекта.
  • Data – данные о том, что записать, то есть значение объекта.
  • CRC (контрольная сумма) – результат проверки первых 6 байт, который используется для контроля наличия ошибок в данных во время передачи.

Теперь, когда суть стала понятной, познакомимся поближе с Modbus. 

Введение в Modbus

Протокол Modbus – это фактически формат данных. В основном он определяет содержание обмена в архитектуре «ведущий-ведомый». Поскольку это только определение структуры данных, он может передавать информацию через разные физические интерфейсы, такие как RS-232, RS-422, RS-485 и даже сеть.

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

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

Modbus рассматривает передачу данных как доступ к регистру. Для доступа извне каждое устройство должно определить свой собственный тип и адрес регистра. Так называемая передача данных на устройство заключается в записи в указанный регистр, а чтение данных – в чтении указанного регистра, что просто и понятно. Кроме того, значение, хранящееся в каждом адресуемом регистре, составляет 16 бит.

Код функции

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

Рис. 17. Коды функций Modbus

Рис. 17. Коды функций Modbus

Программы управления Smart Display чаще всего используют функцию 06:

  • «Запись регистра» – запись 16-разрядного значения;
  • «Считать регистры хранения» – чтение значений нескольких регистров.

CRC

Последние 2 байта могут вызвать вопросы, но на самом деле ничего сложного в них нет. Это всего лишь CRC (Cyclic Redundancy Check, контрольная сумма) для защиты данных при передаче. Не обязательно глубоко изучать принцип ее работы, поскольку на самом деле это просто поиск в таблице и операция с битами, и результате чего получается 16-разрядный проверочный код. Главное, чтобы вам было понятно, как ее использовать. 

Управление объектами Smart Display

Как уже говорилось ранее, для каждого Modbus необходимо определить тип и адрес регистра. Давайте разберем эту тему подробнее.

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

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

  • Информация об устройстве. К ней относятся, например, версия, имя устройства и так далее. Для считывания используйте 04: «Считать регистры ввода». Эти данные будут изменены только при обновлении прошивки, обычно при первом подключении, чтобы получить параметры устройства.
  • Свойства объекта, например, вид, местоположение и прочее. Для чтения и записи используйте 03(«Считать регистры хранения») либо 16 («Записать несколько регистров»). Эти данные влияют на внешний вид объектов и обычно не меняются после этапа проектирования. Чтобы изменить содержимое, Smart Display необходимо временно выключить, прежде чем внести обновления.
  • Параметры объекта – значения, которые описывают объект, такие как число оборотов, включение или выключение, процент и тому подобное. Они варьируются от объекта к объекту. Это основной элемент для изменения в операции. Каждый элемент использует 16-разрядное значение, поэтому он устанавливается с помощью 06 («Записать регистр»).

Рассмотрим упорядоченный список этих регистров:

  • регистры ввода (рисунок 18);
  • регистры хранения (рисунок 19).

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

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

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

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

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

Имея эти хоть и неполные, но уже достаточные данные, можно упаковать управляющие инструкции и отправить их на Smart Display. Далее рассмотрим, как это сделать и добавить CRC-код.

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

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

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

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

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

На рисунках 20 и 21 показаны экраны выполнения этой программы на Raspberry Pi и Ubuntu. Программа не нуждается в каких-либо изменениях.

Рис. 20. Экран программы SetWidgetValue на Raspberry Pi

Рис. 20. Экран программы SetWidgetValue на Raspberry Pi

Рис. 21. Экран программы SetWidgetValue на Ubuntu

Рис. 21. Экран программы SetWidgetValue на 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;
}

Содержимое crcTable[]:



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 станет хорошим выбором для разработки кроссплатформенных приложений и быстрого создания прототипа системы.

Пример посложнее

Выше приведена только установка значения параметра объекта. Для заинтересовавшихся есть более полный пример прикладной программы SmartDisplayConsole. На рисунке 22 показан экран выполнения программы на Raspberry Pi.

Рис. 22. Экран программы SmartDisplayConsole на Raspberry Pi

Рис. 22. Экран программы SmartDisplayConsole на Raspberry Pi

Примеры исходного кода для самостоятельного изучения

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

Дополнительные материалы

  1. Основы работы с терминалом последовательного интерфейса
  2. Описание протокола Modbus
  3. Что нужно знать о Modbus 

Оригинал статьи

Перевел Д. В. Васильев по заказу АО КОМПЭЛ

•••

Наши информационные каналы

О компании Winstar Display

Winstar Display Co.,Ltd. (Winstar) – крупнейший в Юго-Восточной Азии и один из ведущих в мире производителей промышленных решений для отображения информации (дисплеев и дисплейных модулей). Компания была основана близ города Тайчжун на западе Тайваня в 1998 году. Winstar – ведущий на мировом рынке производитель малых и средних дисплеев. Бизнес-модель компании LVHM (Low-Volume/High-Mix) позволяет клиентам размещать заказы на стандартную продукцию без ограничения на ее минимальное количество. Wi ...читать далее

Товары
Наименование
WF24LTYAJDNN0# (WINSTAR)
 
WF150ATYAMLNN0# (WINSTAR)
 
WF70A6TIFGDBT0# (WINSTAR)
 
WF70C4TIFGDBT0# (WINSTAR)
 
WF70QTIFGDBT0# (WINSTAR)
 
WO12864C2-TFH# (WINSTAR)
 
WO12864D3-TFH# (WINSTAR)
 
WO1602I-YYH-AT# (WINSTAR)
 
WEA012864AWAP3N00000 (WINSTAR)
 
WEA012864DWPP3N00003 (WINSTAR)