ホーム ソリューション SmartDisplay RS485のご紹介

SmartDisplay RS485のご紹介

September 10,2022

ご説明

一、 序文

 

SmartDisplayは、近年、医療、産業用制御装置、自動車などのさまざまな分野で広く使用されています。簡単に言えば、マイクロコントローラー(MCU)と組み合わされたディスプレイであり、複雑なグラフィックスの読み込み、設定、表示、さらには入力までを処理できます。簡単なコマンドでインタラクティブな操作を実行できるため、さまざまな表示または制御などのアプリケーションに非常に適しています。

SmartDisplayは、さまざまな通信インターフェイスをサポートしています。現在、最も一般的に使用されているのはCANbus/CANopen、RS485/Modbus で、将来さらに多くの選択肢が提供される予定です。その中で、RS485/Modbus は業界で一般的に使用されている通信インターフェイスであり、手頃な価格の RS485 デバイスが市場で簡単に入手できます。ライン構造は単純であり、2つのライン(A+/B-)だけが通信できます。通常、オペレーティングシステムでは「Serial Port」という形で提示されて、各プラットフォームに対応するライブラリがあります。さらに、Modbus プロトコルは非常に理解しやすいため、それを選択して実験と説明を行います。

この文章では、SmartDisplayの制御する方法を紹介して、その制御原理を理解して、最後にクロスプラット フォームのアプリケーションの作成方法を紹介します。産業機械の専門家でもDIY 愛好家でも、SmartDisplayの世界へようこそ!

二、 ソフトウェアおよびハードウェアの要件

 

■SmartDisplay

需要支援RS485介面的SmartDisplay進行連線測試。接続テストには、RS485 インターフェイスをサポートするSmartDisplayが必要です。

■インターフェイスRS485

通常、PC/Raspberry Pi には RS485 が搭載されていないため、さまざまなUSBからRS485 に変換できるケーブルを購入できます。一部のシングルボードコンピュータ(SBC)には、RS485が組み込まれるため、直接に使用できます。

各種のRS485変換ケーブル(左下がアダプターです)

図2-1 各種のRS485変換ケーブル(左下がアダプターです)

 

■テスト環境

最初の 2 つの条件を満たした後、適切な実行環境を選択できます。唯一の条件はSerial Portの読み書きができることなので、Windows、MacOS、各種のLinux(Raspberry PiのRaspbianを含む)、Arduino、シングルボードコンピュータ(SBC)などは可能で、Winstarのモデル:WUACLB120V0000N0NX01はシングルボードコンピュータ (SBC) として非常に良い選択です。

WUACLB120V0000N0NX01

Model No. WUACLB120V0000N0NX01

 

三、 簡易な制御テスト

 

■制御コードを取得する 

まず、制御コードを取得する必要があります。最も簡単な方法は、Winstar が開発したSmartDisplay GUI Builder から入手することです。GUI Builder は、SmartDisplayの補助ソフトウェアとして非常に優れたものです。実際のデバイスがない場合にプログラムを作成しなくても、ユーザーインターフェイスを学習、操作、設計、および表示するなどできます。WYSIWYGという特徴を備えるため、ボタンやコンポーネントをドラッグまたはクリックするだけで、ユーザーインターフェイスの設計を行うことができます。それに、SmartDisplayと同じソースコードのエミュレーターが内蔵するため、実際のデバイスと同じ外観と動作が保証されます。さらに良いことに、それは無料です!

Contact Us for SmartDisplay GUI Builder

SmartDisplay GUI Builder

図3-1SmartDisplay GUI Builder

 

Winstar GUI Builder を実行後、プロジェクトを開きます。ここでは 5 インチのモデルを選択して、またデフォルト値は自動車(Vehicle)を選択します。プロジェクト名を設定したら、Create を押して作成します。以前に作成したことがある場合は、右側のメニューから直接に選択することもできます。

プロジェクトを開く

図3-2 プロジェクトを開く

 

プロジェクトを開いた後、最初にインターフェースを選択します。

インターフェースを選択する

インターフェースを選択する

 

インターフェイスパラメータの設定

インターフェイスパラメータの設定

 

インターフェイスに RS485 を選択すると、RS485 Portは RS485 変換ケーブルが実際のPortに設定する必要があります。不明な場合は、デバイス管理者で確認できます。(繰り返しプラグを抜いてみて、消えるか、表示されるか、どのポートを確認できます。)Baudrateは、デフォルト値の 115200 を使用します。

デバイス管理者のCom Port表示画面

図3-5デバイス管理者のCom Port表示画面

 

ただし、RS485 デバイスがない場合でも、インターフェイスが RS485 を選択すれば、RS485 ポートは今のところ無視しても大丈夫です。これは、エミュレータのみを使用して、実際にはデバイスに接続しないためです。

Simulator/Simulator with GUIを押して、エミュレータを起動します。

エミュレータを起動する

図3-6エミュレータを起動する

 

実行後、シミュレーション画面と各コンポーネントの制御項目、右側に制御命令の記録が表示されます。コンポーネントの値を変更して、送信されたコマンドの内容を確認できます。

コンポーネントの値を変更するおよび送信された制御コード

図3-7コンポーネントの値を変更するおよび送信された制御コード

 

すべてのアクションで TX/RX の 2 つのコマンドが表示されます。これは、デバイスが (実際にはミュレータであっても) コマンドを受信した後に同じコマンドを送り返して、受信したことを示すためです。

さまざまなコンポーネントのいくつかの異なる値を記録したら、次のステップに使用すると実際のデバイスを制御できます。

制御コード

表3-1 制御コード

■デバイスに接続する

RS485 は2本の信号線の電位差を利用して信号を伝送するため、この2本の線だけ接続できて、アース線さえ必要ありません。 RS485の信号線の名前は A+/B- で、それに従って接続してください。

RS485信号線の接続

図3-8 RS485 信号線の接続

 

制御コードの伝送方法は何ですか?Serial Portに書き込めるだけです。ただし、テストする前に、注意すべき点が 2 つあります。

1. 異なるオペレーティングシステムではCom Portの名前も異なるため、テストする前に確認してください。次の表を参照してください。

各オペレーティングシステムのSerial Portの名前

表3-2各オペレーティングシステムのSerial Portの名前

 

2. 一部のオペレーティングシステムのCom Portの権限は設定されていないため、使用前に設定する必要があります。たとえばLinux/Ubuntuを例として、Com Portの名前が ttyUSB0 の場合、ターミナルで

sudo chmod 666 /dev/ttyUSB0を実行するだけです。
 

下記は2種類のテスト方法を提供します。

 

■Serial Portターミナル制御

16 進数入力をサポートするSerial Portターミナルソフトを使用します。接続後、直接に16 進数の制御コードを入力します。

図3-9 ターミナルソフトで制御コードを伝送する

図3-9 ターミナルソフトで制御コードを伝送する

 

通常の操作では、デバイスのコンポーネントが違う制御コードに従って、動作することが分かります。

この方法は、接続が成功したかどうかをテストするためにのみ使用されて、アプリケーションではあまり便利ではありません。ベスト結果を達成するには、プログラムを通じて行う必要があります。どの言語を使用するのか、実際にどっちも可能です。人気のあるクロスプラットフォーのプログラミング言語の python を使用してテストをしてみます。

■pythonを使用する

次のプログラムは python3 を使用して実行されます。プログラムの構造は非常に簡単で、1 秒ごとに 3 セットの制御コードをSerial Portに直接書き込むだけで、デバイス上の計測器が回転し続けます。
 

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のソースコードはさまざまなプラットフォームで実行できるため、Serial Portの名前が正しくて、適切な変換ケーブルが接続されるなら、基本的には正常に動作できます。

ただし、これらの制御コードは実際のアプリケーションに沿ったものではないので、これらのコマンドを十分に活用するには、コマンドの内容を理解する必要があります。

四、 制御コードを分析する

 

■比較分析

同じコンポーネントで異なる値のコマンドを比較する:

Table

青い枠線が設定したコンポーネントの値です。

違うコンポーネントで同じ値のコマンドを比較する:

Table

青い枠線は、明らかにコンポーネントのあるインデックスまたはアドレスと考えています。
後ろの2つのbytesのデータは特にルールはないようですが、下記の制御コードを解明するところを見てください。

■制御コードを解明する

実はこの 8 bytesの内容は、いわゆる Modbus メッセージです。各フィールドの意味は下記の図で説明します。

制御コードの実例を説明する

図4-1 制御コードの実例を説明する

 

ID識別コード:
各 Modbus デバイスには識別コードが必要です。SmartDisplayの識別コードは 0x7B = 123 です。

ファンクション・コード:
ファンクション・コードとはこのメッセージの目的を示すコードです。たとえば、ここでは 06 は Write Single Register で、指定された場所に値を書き込みます。

レジスタ アドレス:
レジスタのアドレス、書き込み先です。 (つまり、エレメントのアドレスです。)

データ:
書き込む内容です。(エレメント値です)

CRC
最初の6 bytesの CRC (Cyclic Redundancy Check) の結果は、送信プロセス中にデータにエラーがあるかどうかを確認するために使用されます。

少し分かるようになりましたか?さらに詳しく知りたい場合、Modbus とは何かを知る必要があります。

五、 Modbusの紹介

 

■Modbusプロトコル

Modbus プロトコルは、実際にはデータ形式で、 マスタ・スレーブ方式の通信内容です。 データ構造ですので、RS232、RS422、RS485、さらにはネットワークなど、さまざまなデバイスを介して通信できます。

インターネット上にはすでに多くの範例および説明文章があるため、この記事では Modbus について詳しく説明しません。 簡単なルールさえ分かれば、Modbus を自由に使用できます。

■概念モデル

Modbus は、データ送信を「レジスタ」(Register)として保存します。各デバイスは、独自のレジスタのタイプとアドレスを定義する必要があります。 デバイスにデータを送信することはいわゆる指定されたレジスタに書き込んむことです。データを読み取ることも、指定されたレジスタを読み取るということです。また、各アドレスレジスタの格納される値は 16 ビットです。

■ファンクション・コード

データの特性に応じて、Modbus はいくつかの読み取りと書き込みの方法があって、メッセージ内のファンクション・コードによって指定されます。

Modbusファンクション・コード

表5-1Modbusファンクション・コード

 

SmartDisplay 制御プログラムの場合、最も一般的に使用されるのは06:Write single register (16 ビット値の書き込み) とRead holding registers (複数のレジスタの値の読み取り) です。

■CRC

ここが一番謎だと思いますが、実は難しくありません。 その原理を深く学ぶ必要はなく、使い方が分かればいいです。(実際にはルックアップテーブルとビット演算だけで、最終的に16ビットのチェックコードを取得すします)。

六、 SmartDisplay コンポーネントの制御

前述のように、各 Modbus は独自のレジスタのタイプとアドレスを定義する必要があります。このトテーマについては以下で説明します。

■レジスタの分類

SmartDisplay レジスタは、次の 3 つのカテゴリに分類できます。

1)デバイス情報(バージョン、デバイス名など)
04: ReadInputRegisters を使用して読み取ります。これらのデータはファームウェアが更新した時のみ変更されて、通常は接続したばかりにデバイスの特性パラメータを取得します。

2)コンポーネントの特徴(種類、位置など)
03: ReadHoldingRegisters/16: Write Multiple Register を使用して読み書きします。 これらのデータはコンポーネントの外観に影響を与えて、設計段階以外では変更されません。 コンテンツを変更するには、更新する前に SmartDisplay を一時的にオフにする必要があります。

3)コンポーネントの数値(コンポーネントで表される値は回転速度、オンまたはオフ、パーセンテージなど、コンポーネントごとに異なります)
運行中に変更する項目です。 各コンポーネントは 16 ビット値を使用するため、06:Write Single Register で設定されます。

以下はレジスタのリスト:

■Input Registers

SmartDisplay Input Registers

表6-1 SmartDisplay Input Registers

 

■Holding Registers

SmartDisplay Holding Registers

表6-2 SmartDisplay Holding Registers

 

初期の SmartDisplay は 10 個のコンポーネントしかサポートしていないため、widgetID の範囲は 0 ~ 9 (両端を含む) です。ファームウェアの新しいバージョンは 64 に拡張されていますが、アドレス指定方式が少し変更されています。この記事では説明しません。

これらのデータがあったら、制御命令をパッケージ化して、SmartDisplay に送信して制御することができます。 パッキング方法とCRCコードの追加方法については、次の章で説明します。

七、 ユーザーインターフェース

 

SmartDisplay を実用化するには、適切なヒューマンマシンインターフェース が必要で(特にグラフィック・ユーザー・インターフェース、GUI) 、その効果を最大化できます。 現在、クロスプラットフォームの GUI 開発プラットフォームには多くの選択がありますが、この記事では Qt を使用する方法を紹介します。

多くの人は Qt がGUI ライブラリだと思っていますが、実際にはかなり完成度の高い開発フレームワーク (Framework) です。アプリケーションがクラスライブラリを介して実装されている場合、プロジェクトはほとんど変更しなくてを複数のプラットフォーム (PC/Windows、Mac/MacOS、Raspberry Pi/Raspbian、Android、iOS、Embeded など) に簡単に移植できます。学ぶ価値のあるプログラミングツールです。

実際、Qt の新しいバージョンはModbus クラスライブラリを既にサポートしています。 しかし、ここでは説明するために、また他の言語に書き直せるように、最も基本的なシリアルポートの読み取りと書き込みからこのテストプログラムを実装します。

このプログラムは、シリアルポートを選択することと、前の例で使用した制御コードを送信する機能を提供するだけでなくて、また水平レバーを提供して指定されたコンポーネントの値を設定できます。 シリアルポートにCOM を選択した場合は、実際の番号を忘れずに入力してください。

下記の図は、このプログラムを Raspberry Pi と Ubuntu で実行した画面で、プログラムはまったく変更する必要はありません。

Raspberry Pi の SetWidgetValue 画面

図 7-1 Raspberry Pi の SetWidgetValue 画面

 

Ubuntu の SetWidgetValuet 画面

図 7-2 Ubuntu の SetWidgetValuet 画面

 

■CRC 演算

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 に完全な情報があって、使用方法だけ理解すればいいです。

■データのパッケージ化

以下は、UI に従って制御コードを計算して、それをSmartDisplay に送信する関数:

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 に精通している場合は、上記のコードを理解するのは難しくありません。よく知らない場合は、少し勉強してみて、深く学ぶ価値があります。 慣れてきたら、クロスプラットフォームのアプリケーション開発や、迅速にシステムの試作品を作成することにすごく適しています。

八、 詳しい範例

 

前の例でコンポーネント値の設定だけ説明しました。 興味のある読者にもっと深く理解させるために、より詳しい範例SmartDisplayConsoleがあります。 次の図は、Raspberry Pi での実行画面です。

Raspberry Pi の SmartDisplayConsole 画面

圖8-1 Raspberry Pi の SmartDisplayConsole 画面

 

記事の最後にgithubのURLがありますので、参考にして一緒に勉強しましょう。

九、 結論

 

SmartDisplayの制御手順を説明して、さまざまな制御方法も提供しています。その知識と豊かな想像力を活用して、より多様な製品を作成することができると信じています。SmartDisplay でより良い未来を一緒に作りましょう。

十、 参考資料

 

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

十一、 サンプルソースコード

 

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

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

追記:この技術文書の原文は中国語で、和訳の内容に疑問がある場合は、原文をご参考お願いします。

ディスプレイ ソリューションについてのご質問はあるのでしょうか。 お問合わせ!

配信申し込み

Winstar からの最新情報を受け取ります。

お問合わせ

価格/データシート/一般的なお問合せ

技術的なサポート

技術情報についてはお問合せください。

go top
お問合わせ
close