Strona główna Rozwiązania Wprowadzenie do SmartDisplay RS485

Wprowadzenie do SmartDisplay RS485

September 10,2022

Opis

I. Wstęp:

 

Po wprowadzeniu produktów, wyświetlacz typu Smart był szeroko stosowany w różnych dziedzinach, takich jak medycyna, kontrola systemów przemysłowych i motoryzacja. Mówiąc najprościej, jest to wyświetlacz połączony z mikrokontrolerem, który może obsługiwać skomplikowane ładowanie, ustawianie, wyświetlanie, a nawet wprowadzanie grafiki, a urządzenie zewnętrzne (tj. Host) może wykonywać interaktywne operacje za pomocą prostych poleceń, więc jest to rozwiązanie bardzo przydatne dla różnych wymagań. Różne rodzaje wyświetlanych lub sterowanych zastosowań.

Wyświetlacz typu Smart obsługuje różne interfejsy komunikacyjne. Obecnie najczęściej stosowane są CAN/CANopen, RS485/Modbus, a w przyszłości dostępne będzie więcej możliwości wyboru. Wśród nich RS485/Modbus jest popularnym w branży interfejsem komunikacyjnym, a na rynku są łatwo dostępne w rozsądnych cenach różne urządzenia RS485. Struktura linii jest prosta, jeśli dwa przewody (RS485_A/RS485_B) mogą się komunikować, interfejs komunikacyjny jest zwykle przedstawiany w systemie operacyjnym w postaci „portu szeregowego”, a każda platforma ma odpowiednią bibliotekę funkcji programistycznych. Ponadto, protokół Modbus jest dość łatwy do zrozumienia, dlatego podajemy go jako przykład dla potrzeb eksperymentów i wyjaśnień.

Ten artykuł objaśnia proste i zaawansowane metody sterowania wyświetlaczem typu Smart, umożliwia zrozumienie zasad sterowania, a na koniec objaśnia, jak tworzyć aplikacje wieloplatformowe. Niezależnie od tego, czy jesteś ekspertem w dziedzinie urządzeń przemysłowych, czy też majsterkowiczem, witamy w świecie wyświetlaczy typu Smart!

II. Wymagania:

 

■Smart Display_RS485

Do testu połączenia wymagany jest inteligentny wyświetlacz z obsługą interfejsu RS485.

■Klucz RS485

Ponieważ taki host jak PC/Raspberry Pi zwykle nie ma portu RS485, w razie potrzeby można wykorzystać różne klucze USB do RS485.

Types of USB to RS485 Dongle

Rysunek 2-1 Types of USB to RS485 Dongle

 

■Urządzenie HOST

Po spełnieniu powyższych wymagań można wybrać środowisko wykonawcze stanowiska testowego jako hosta. Jedynym warunkiem dla urządzenia hosta, jest możliwość odczytu i zapisu portu szeregowego hosta bez względu na to, czy systemem operacyjnym jest Windows, MacOS, różne systemy Linux (w tym Raspbian for Raspberry Pi) lub platforma, którą może być komputer jednopłytowy, Arduino, itp.

Dla wygody tworzymy komputery jednopłytowe z wbudowanym RS485 Demo.set, które mogą być bezpośrednio używane jako urządzenie hosta, jak pokazano na ilustracji poniżej.

WUACLB120V0000N0NX01

Model No. WUACLB120V0000N0NX01

 

III. Prosty test dla interfejsu sterowania:

 

■Uzyskanie kodu sterowania

Aby zrozumieć, jak współpracować z hostem w trybie Smart Najpierw należy uzyskać kod sterowania. Najprostszym sposobem jest pobranie go z Smart Display GUI Builder. GUI Builder to doskonałe oprogramowanie wspierające wyświetlacze typu Smart. Może pomóc w nauce, obsłudze, projektowaniu i wyświetlaniu interfejsu użytkownika, bez fizycznego urządzenia sprzętowego, projektowaniu interfejsu użytkownika, bez pisania jakiegokolwiek programu. Z funkcją WYSIWYG, projekt interfejsu użytkownika można wykonać, przeciągając lub klikając przyciski albo obiekty. Dodatkowo, dostępny jest wbudowany symulator, który współdzieli kod źródłowy z wyświetlaczem typu Smart, zapewniając w ten sposób ten sam wygląd i zachowanie, jak urządzenie fizyczne. Co więcej, to nic nie kosztuje!

Contact for Smart Display GUI Builder

Smart Display GUI Builder

Rysunek 3-1 Smart Display GUI Builder

 

Kliknij dwukrotnie GUI Builder, aby uruchomić aplikację w systemie operacyjnym Windows, otwórz projekt. W naszym przykładzie, wybieramy 5-calowy inteligentny wyświetlacz RS485 WL0F00050000FGDAASA00, a wybranym poniżej, domyślnym scenariuszem jest Pojazd. Aby utworzyć projekt, wprowadź nazwę projektu i naciśnij przycisk Utwórz. Jeśli został utworzony wcześniej, projekt można również wybrać bezpośrednio z menu po prawej stronie.

Create project

Rysunek3-2 Create project

 

Po otwarciu projektu najpierw wybierz interfejs

Select interface

Rysunek 3-3 Select interface

 

Set interface parameters

Rysunek 3-4 Set interface parameters

 

Wybierz RS485 dla interfejsu, a port RS485 hosta powinien być ustawiony jako rzeczywisty port podłączonego portu dla klucza sprzętowego RS485. W razie wątpliwości nazwę portu można sprawdzić w administratorze urządzenia (przez wielokrotnie odłączenie i sprawdzenie, który znika lub się pokazuje). Szybkość transmisji może przyjąć domyślną wartość 115200.

Com Port display of device administrator

Rysunek 3-5 Com Port display of device administrator

 

Jeśli jednak nie ma jeszcze urządzenia typu Smart RS485, nie ma to znaczenia, czy wybrany zostanie interfejs RS485, port RS485 można na razie zignorować, ponieważ teraz będziemy korzystać tylko z symulatora i praktycznie nie będziemy łączyć się ze urządzeniem wyświetlania typu Smart.

W celu uruchomienia, kliknij Symulator/Symulator z GUI:

To run Simulator

Rysunek 3-6 To run Simulator

 

Po wykonaniu wyświetlony zostanie ekran symulacji, elementy sterowania każdego obiektu; po prawej stronie ekranu rekord danych komunikacji. Zmień wartość dowolnego obiektu, aby wyświetlić odpowiednią treść polecenia:

Change the content of the object and the control code

Rysunek 3-7 Change the content of the object and the control code

 

Każda akcja wyświetli dwa polecenia TX/RX, ponieważ urządzenie wyświetlania (nawet jeśli jest teraz emulatorem) odeśle to samo polecenie jako potwierdzenie po otrzymaniu polecenia, aby wskazać, że zostało odebrane.

Zarejestrujemy kilka różnych wartości dla różnych obiektów, a w kolejnym kroku można będzie sterować fizycznym urządzeniem.

Control code

Tabela 3-1 Control code

■Połączenie przewodowe:

RS485 wykorzystuje parę różnicową do przesyłania i odbierania sygnałów, a więc dopóki można połączyć te dwa przewody, nie jest potrzebny nawet przewód uziemiający. Nazwa linii sygnałowej RS485 to A/B, wystarczy ją śledzić (A łączy z A, B łączy z B).

RS485 wire connection

Rysunek 3-8 RS485 wire connection

 

W jaki sposób host może przesyłać od siebie kody sterowania? Może to robić, jak długo będzie możliwe wykonywanie zapisu do portu szeregowego. Jednak przed przystąpieniem do testu należy pamiętać o dwóch rzeczach.

1. Ponieważ nazwy portów Com w różnych systemach operacyjnych są różne, przed przystąpieniem do testu należy je sprawdzić i potwierdzić. Przykłady są podane w tabeli poniżej:

Serial port names for various operating systems

Tabela 3-2 Serial port names for various operating systems

 

2. W niektórych systemach operacyjnych port Com nie jest domyślnie otwarty. Przed użyciem należy go ustawić. Na przykładzie systemów Linux/Ubuntu, jeśli nazwa portu Com to ttyUSB0, należy go uruchomić w terminalu:

sudo chmod 666 /dev/ttyUSB0

 

Poniżej przedstawiono dwie metody wykonania testu:

■Sterowanie przez terminal portu szeregowego

Po podłączeniu, należy użyć oprogramowanie terminala portu szeregowego, które obsługuje wprowadzanie szesnastkowe i bezpośrednio wprowadzić szesnastkowy kod kontrolny:

Send Control Codes with Terminal Program

Rysunek 3-9 Send Control Codes with Terminal Program

 

Jeśli jest to normalne, powinno być widoczne, że obiekty na urządzeniu działają zgodnie z różnymi kodami sterowania.

Ale ta metoda jest używana tylko do sprawdzenia, czy połączenie się powiodło i nie jest zbyt wygodna w praktycznym zastosowaniu. Aby osiągnąć najlepsze wyniki, należy to zrobić poprzez program. A w jakim języku? W wieloplatformowym języku programowania należy najpierw spróbować użycie popularnego języka python.

■Użycie języka python

Po użyciu języka Pythona3, wykonywane są następujące programy. Struktura programu jest dość prosta, aby instrument na urządzeniu nadal się obracał, wystarczy co sekundę bezpośrednio wpisać do portu szeregowego trzy zestawy kodów sterujących.

 

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)

Kod źródłowy języka Python można uruchamiać na różnych platformach, dlatego dopóki port szeregowy ma poprawną nazwę, powinien działać dobrze z odpowiednim stanowiskiem do testowania połączeń.

Jednak, te przykładowe stałe kody sterowania mogą nie być zgodne z praktycznymi zastosowaniami, dlatego aby w pełni je wykorzystać, należy zrozumieć treść tych instrukcji.

IV. Analiza kodu sterowania

 

■Analiza porównawcza

Porównaj polecenia z różnymi wartościami dla tego samego obiektu:

Table

Nietrudno się domyślić, że niebieska część to wartość ustawianego obiektu.

Porównaj różne obiekty, z tym samym poleceniem wartości:

Table

Niebieska część oczywiście odnosi się do jakiegoś indeksu lub adresu do obiektu.

Jeśli chodzi o dane ostatnich dwóch bajtów, wydaje się, że nie ma żadnych reguł. Co jednak oznaczają te komunikaty? Wyjaśniamy jak poniżej.

■Analiza kodu sterowania

W rzeczywistości zawartość tych 8 bajtów to tak zwana wiadomość Modbus. Aby zilustrować znaczenie każdego pola, użyj ilustracje:

Control code example description

Rysunek 4-1 Control code example description

 

ID
Każde urządzenie Modbus musi posiadać kod identyfikacyjny. Kod identyfikacyjny wyświetlacza typu Smart to 0x7B = 123

Fun(Kod funkcji)
Kod funkcji, wskazujący cel tej wiadomości, na przykład 06, to tutaj Write Single Register, który również zapisuje wartość w określonym miejscu.

Adres rejestracji
Adres rejestracji, który określa miejsce docelowe zapisu (to jest adres obiektu).

Dane
Co wpisać (czyli wartość obiektu)

CRC
Wynik CRC (Cyclic Redundancy Check) na pierwszych 6 bajtach służy do sprawdzenia, czy podczas procesu transmisji nie wystąpił błąd w danych.

Czy znasz jakieś koncepcje? Aby dowiedzieć się więcej, należy przyjrzeć się, czym jest Modbus.

V. Wprowadzenie do Modbus

 

■Protokół Modbus

Protokół Modbus jest właściwie formatem danych. Zasadniczo definiuje treść komunikacyjną architektury master-slave. Ponieważ jest to tylko definicja struktury danych, może komunikować się przez różne interfejsy fizyczne, takie jak RS232, RS422, RS485, a nawet sieć.

Ponieważ w Internecie jest już wiele dokumentów instruktażowych i objaśniających, Modbus nie będzie tutaj szczegółowo opisywany. W rzeczywistości, o ile znane są pewne koncepcje, można swobodnie korzystać z protokołu Modbus.

■Model koncepcyjny

Modbus traktuje transmisję danych jako dostęp „Register”. Każde urządzenie musi zdefiniować własny typ rejestru i adres do zewnętrznego odniesienia. Tak zwana transmisja danych do urządzenia w celu zapisania do określonego rejestru i odczytanie danych do odczytania, co jest proste i czytelne. Ponadto, wartość przechowywana w każdym rejestrze adresowym ma 16 bitów.

■Kod funkcji

Zgodnie z charakterystyką danych, Modbus definiuje kilka metod odczytu i zapisu, które są określone przez kod funkcji w wiadomości.

Modbus Function Codes

Tabela 5-1 Modbus Function Codes

 

Dla programów sterujących wyświetlacza typu Smart, najczęściej używanymi jest to 06: Pojedynczy rejestr zapisu (zapis wartości 16-bitowej) i odczytanie rejestrów utrzymujących (odczytanie wartości wielu rejestrów).

■CRC

Ostatnie 2 bajty wydają się najbardziej tajemniczą częścią, która w rzeczywistości nie jest trudna. Jest to tylko sprawdzenie CRC (Cyclic Redundancy Check), aby sprawdzić dane komunikacyjne. Nie jest konieczna dogłębna nauka zasad (w rzeczywistości jest to tylko wyszukiwanie w tablicy i operacja na bitach, a w końcu uzyskuje się 16-bitowy kod sterowania), o ile rozumiemy, jak go używać.

VI. Sterowanie obiektami wyświetlacza typu Smart

 

Jak wspomniano wcześniej, każdy protokół Modbus musi mieć zdefiniowany typ i adres rejestru, a teraz omówimy ten temat.

■Klasyfikacja rejestru

Rejestry wyświetlacza typu Smart można z grubsza podzielić na trzy kategorie:

1.)Informacje o urządzeniu (np. wersja, nazwa urządzenia, itp.)
Użyj 04: Odczyt rejestrów wejściowych do odczytu. Dane te zostaną zmienione dopiero podczas aktualizacji oprogramowania, zwykle po podłączeniu, w celu uzyskania parametrów charakterystycznych dla urządzenia.

2.)Właściwości obiektu (np. rodzaj, lokalizacja, itp.)
Użyj 03: Odczyt rejestrów utrzymywania/16: Zapis wiele rejestrów do odczytu i zapisu. Dane te wpływają na wygląd obiektów i zwykle nie zmieniają się poza etapem projektowania. Aby zmienić zawartość, wyświetlacz typu Smart musi zostać tymczasowo wyłączony, zanim będzie można go zaktualizować.

3.)Wartości obiektu (wartości, które reprezentują obiekt, takie jak obroty, włączenie lub wyłączenie, procent, itp., różnią się w zależności od obiektu)
Jest to główny element zmiany w operacji. Każdy element używa wartości 16-bitowej, więc jest ustawiony na 06: Rejestr pojedynczego zapisu.

Poniżej znajduje się zorganizowana lista tych rejestrów:

■Input Registers

Smart Display Input Registers

Tabela 6-1 Smart Display Input Registers

 

■Holding Registers

Smart Display Holding Registers

Tabela 6-2 Smart Display Holding Registers

 

Wczesne wyświetlacze typu Smart obsługują tylko 10 obiektów, a więc zakres widgetID wynosi 0 do 9 (włącznie). Nowa wersja firmware została rozszerzona do 64, ale zmieniono sposób adresowania, co nie będzie tutaj omawiane.

Mając te dane (choć niepełne, ale na razie wystarczające), możemy spakować instrukcje sterowania i wysłać je do wyświetlacza typu Smart w celu kontroli. To, jak spakować i jak dodać kod CRC, zostanie to wyjaśnione w kolejnych rozdziałach.

VII. Interfejs użytkownika

 

Aby zastosować wyświetlacz typu Smart w praktyce, , aby zmaksymalizować jego skuteczność, nadal potrzebny jest odpowiedni interfejs człowiek-maszyna (zwłaszcza graficzny interfejs użytkownika, GUI). Obecnie istnieje wiele opcji dla wieloplatformowej platformy programistycznej GUI, a my do jej implementacji tutaj używamy Qt.

Wiele osób myśli, że Qt to tylko biblioteka GUI, ale w rzeczywistości jest to dość kompletna platforma programistyczna. Jeśli aplikacja jest zaimplementowana w całości poprzez bibliotekę klas, projekt można łatwo przenieść na inne platformy (PC/Windows, Mac/MacOS, Raspberry Pi/Raspbian, Android, iOS, Embedded, itp.) z niewielką modyfikacją. Program jest narzędziem programistycznym, w którego naukę warto zainwestować.

Nowsza wersja Qt obsługuje już bibliotekę klas Modbus. Ale tutaj, dla zilustrowania i ułatwienia wszystkim przepisywania na inne języki, nadal wdrażamy ten program testowy, od najbardziej podstawowego odczytu i zapisu portu szeregowego.

Oprócz udostępnienia funkcji wyboru portu szeregowego i przesłania kodu sterowania użytego w poprzednim przykładzie, ten przykład dodatkowo udostępnia poziomą dźwignię w interfejsie użytkownika okna aplikacji, za pomocą której można ustawić wartość określonego obiektu. Po wybraniu jako port szeregowy COM, należy pamiętać o podaniu rzeczywistej liczby.

Poniższy rysunek przedstawia ekran wykonywania tego programu na Raspberry Pi i Ubuntu. Program w ogóle nie wymaga modyfikacji.

Set WidgetValue screen on Raspberry Pi

Rysunek 7-1 Set WidgetValue screen on Raspberry Pi

 

Set WidgetValuet screen on Ubuntu

Rysunek 7-2 Set WidgetValuet screen on Ubuntu

 

■Działanie CRC

Działanie CRC w rzeczywistości nie jest skomplikowane. Jest prawdopodobnie takie, jak poniższe kody z 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;
}

The contents of crcTable[] are:

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
};

Nie wszystkie kody są tutaj wymienione. W githubie znajdują się kompletne informacje, które użytkownicy mogą pobrać samodzielnie, jeśli interesują się programowaniem, w tym artykule dowiemy się tylko, jak operować formatem danych.

■Pakowanie danych

Poniżej przedstawiono kluczową funkcję, która oblicza kod sterowania zgodnie z interfejsem użytkownika i wysyła go do wyświetlacza typu Smart:

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);
}

Jeśli znany jest już Qt, powyższy kod nie powinien być trudny do zrozumienia. Jeśli nie jest znany, należy poświęcić trochę czasu na jego przestudiowanie, niektóre z jego koncepcji są w rzeczywistości całkiem dobre i warte dogłębnego przestudiowania. Po poznaniu go, będzie dobrym wyborem do tworzenia aplikacji wieloplatformowych lub szybkiego prototypowania systemu.

VIII. Zaawansowany przykład

 

Poprzedni przykład dotyczy tylko ustawienia wartości obiektu. Zainteresowani czytelnicy mogą dowiedzieć się więcej o pełniejszym, przykładowym programie użytkowym SmartDisplayConsole. Poniższy rysunek przedstawia ekran wykonania na Raspberry Pi:

SmartDisplayConsole screen on Raspberry Pi

Rysunek 8-1 SmartDisplayConsole screen on Raspberry Pi

 

Na końcu artykułu znajduje się adres URL githuba, gdzie każdy może się do niego odnieść i wspólnie studiować.

IX. Konkluzja

 

Wyjaśniliśmy każdy krok sterowania wyświetlaczem typu Smart, udostępniamy także różnorodne metody sterowania. Wykorzystanie tej wiedzy i bogatej wyobraźni, może pomóc w realizacji różnych pomysłów i tworzeniu więcej różnorodnych produktów. Stwórzmy razem lepszą przyszłość dzięki wyświetlaczowi typu Smart!

X. Odniesienia

 

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. Sample source code

 

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

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

Masz pytania dotyczące rozwiązań w zakresie wyświetlania dla twojej firmy? Kontakt z nami!

Subskrybuj

Otrzymuj e-maile z wiadomościami od firmy Winstar

Kontakt z nami

Cena/Arkusz danych/Zapytanie ogólne

Pomoc techniczna

Skontaktuj się z nami, aby uzyskać wszelkie informacje techniczne

go top
Kontakt
close