今日、私たちは最終的に、
第1部と
第2部で得られた知識とベストプラクティスを組み合わせることでこのサイクルを完了します。
前のエピソードの要約AtmelのAtmelのWi-FiモジュールWINC1500を使用して、サードパーティのアクセスポイントに接続し、クライアントとしてTCPサーバーに接続してデータを転送することを学びました。 タッチボタンとスライダーを使用した作業もマスターされ、対応するビデオが撮影されました。
一般的な概念を思い出してください。
Atmel SAMD21マイクロコントローラーを使用したデバッグのために、Q-touch拡張カードが接続されています。このカードには、スライダーとローターの3つのボタンがあります。 1つのボタンを使用して照明をオンにし、もう1つのボタンを使用してオフにし、スライダーを使用して明るさをスムーズに調整します。 WINC1500モジュールを搭載したボードは、2番目のポートに接続されます。 私たちのデバイス(または、プロトタイプ)は、TCPクライアントとして機能します。
サーバーは、
DALIGW1 -ModBusコマンドを
DALIプロトコル(Digital Addressable Lighting Interface)のコマンドに変換するModBus TCPデバイス-デジタル照明制御用の特別なプロトコルになります。 したがって、センサーの位置の値を受け取り、Modbusプロトコルに従ってリクエストを作成し、Wi-Fi経由でゲートウェイに送信します。
TCPクライアント
簡単にするために、アクセスポイントを作成し、使用可能なネットワークをスキャンして、ユーザーにそれらの1つに接続するように依頼しませんが、オフィスのローカルネットワークに必要な設定をコードで直接設定します。
作業の開始時に、以前に作成したプロジェクトの1つ(記事の前の部分)またはQtouchまたはWINC1500のサンプルプロジェクトを開き、以前の記事の1つで説明したように、ウィザードを使用して必要なモジュールを追加できます。
main.hファイルでネットワークパラメータを設定します。
#define MAIN_WLAN_SSID "Habrahabr"
main.cで、 tcpクライアントモードでwinc1500で動作するようにライブラリを構成します。
お気に入りのコールバックを忘れないでください。 ネットワークを介したイベント処理機能を規定しています。
コールバックコード static void socket_cb(SOCKET sock, uint8_t u8Msg, void *pvMsg) { switch (u8Msg) {
実際、これはwincをtcpクライアントとして使用するために必要なすべてのコードです。
Qtouch
ボタンとスライダーを処理するための記事の2番目の部分で説明されているすべてのコードは完全に移植性があり、tcpを介してパッケージの形成と送信を追加するだけです。
すべてをまとめる
ModBusプロトコルはシンプルでオープンであり、自動化システムで非常に愛されています。インターネット上で多くの情報を見つけることができるからです。
wikiの内容は次のとおりです。 すでに述べたように、ローカルネットワークで動作するように設計されたTCPの変更を使用します。
トレーニングタスクがあるため、美しいModBusライブラリを実装しません(個別の関数、レジスタ、データなどを示します)が、対応するバイトセットを単純に作成し、オープンソケットに送信します。 この場合のModbusパケットは、レジスタに書き込まれたデータの部分でのみ変更されます(ゲートウェイとの作業プロトコルに従って)。 1つのレジスタで書き込みコマンドを使用します-コマンドコードは0x06です。
パッケージフィールド:
- トランザクションID、プロトコルID Modbus仕様
- 長さ= 6
- Modbus仕様に従ったユニットID
- コマンドコード0x06
- レジスタ番号25(0x0019)
- レジスタ値:DALIコマンドコード、照明器具/照明器具のグループのアドレス、およびコマンドのデータ(コマンドのタイプに応じて)。
読者をDALIプロトコルの詳細に没頭させるために、この記事の目的は意図されていなかったため、使用するコマンドを簡単な説明とともに単純にリストします。
- オフ-指定されたランプをすぐにオフにし、左のタッチボタンにハングアップします
- RECALL MAX LEVEL-ランプの最大輝度をスムーズに設定、右ボタン
- オンおよびステップアップ-ランプがオフの場合、最小輝度を設定します。 RECALL MAX LEVELの前に呼び出します
- DIRECT ARC POWER X-ランプに指定された輝度Xをスムーズに設定し、スライダーに掛けます
注:(科学者は、デバッグの役割である)ModBusマスターがスレーブと通信する方が正しいことについて議論しています-現在の通信セッションの終了後にソケットを閉じるか、開いたままにします。 この例では、ゲートウェイに接続したい他のマスターもバス上にいる可能性があるという事実に基づいて、最初の方法を使用しました。 しかし、ここでは正しいアプローチは、ほとんどの場合そうではなく、すべては開発者の世界観に依存しています。それだけです 最後の部分は特にボリュームがありませんでしたが、主な詰め物全体は最初の2つの部分にありました。 面白かったと思います。
最終コードメイン int main(void) { uint8_t button1_state; uint8_t button2_state; uint8_t slider_state; uint8_t slider_position; tstrWifiInitParam param; int8_t ret; struct sockaddr_in addr;