工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Manufacturing Technology >> 製造プロセス

ArduinoでModbusを使用する方法

コンポーネントと消耗品

>
Arduino UNO
× 1
プロフェッショナルRS422 / RS485シールドforArduino
× 1
USBからRS485へのコンバーター
× 1
ブレッドボード(汎用)
× 1
LED(汎用)
× 1
抵抗10kオーム
× 1
抵抗221オーム
× 1
ジャンパー線(汎用)
× 1
SparkFunプッシュボタンスイッチ12mm
× 1

アプリとオンラインサービス

>
Arduino IDE
Modbustester

このプロジェクトについて

シリアル通信規格であるModbusは、事実上の標準通信プロトコルになり、現在、産業用電子機器を接続するための一般的に利用可能な手段です。 ModbusRTUおよびModbusASCIIでは、RS485が物理層として使用されます。 ModbusアプリケーションでArduinoをスレーブとして(そしてマスターとしてもいくつかの制限付きで)使用することは可能ですが、RS485インターフェースが必要です。当社のRS422 / RS485シールドは、ArduinoUNOおよびArduino101、STM Nucleoなどの他の互換性のあるボードで使用するために設計された完全にガルバニック絶縁されたシリアル通信シールドです...このシールドは、このような種類のアプリケーションに最適です。

このドキュメントの目的は、ArduinoUNOと一緒にシンプルなModbusスレーブデバイスを作成する方法を示すことです。 PCをModbusマスターとして使用します。

ツールと資料

  • Arduino UNO
  • Arduino用RS485シールド
  • すべてのRS485-USB-PC接続用アダプター(またはより安価なもの)

オプション:

  • ブレッドボード
  • プッシュボタン
  • 赤色LED
  • 220オーム抵抗器
  • 10k抵抗
  • ジャンパー線

ソフトウェア

  • Arduino IDE
  • モッドバスター

RS485の配線:

<図>

配線はとても簡単です。シールドのA端子とB端子のみをModbusシステムのAラインとBラインに接続する必要があります。 Y端子とZ端子はこの種のアプリケーションには使用されません。長距離の場合は、AとBにツイストペアを使用することをお勧めします。

Arduinoの配線(オプション):

Modbus通信の効果を確認するには、ArduinoにLEDとボタンを追加することをお勧めします。これはオプションであり、必須ではありません。

<図>

DIPスイッチ設定:

RS422 / RS485シールドには3つのDIPスイッチバンクが付属しています。次の図に示すように、これらのDIPスイッチをModbus用に設定する必要があります。

スイッチ1:1-OFF 2-ON 3-ON 4-OFF

スイッチ2:1-OFF 2-OFF 3-ON 4-ON

スイッチ3:1-OFFまたはON * 2-OFF 3-OFF 4-OFF

* ModbusラインのRS422 / RS485シールドの位置に応じて、終端抵抗をオンまたはオフに切り替える必要があります。シールドがバスラインの一方の端にある場合にのみ、抵抗をオンの位置に切り替えてください。それ以外の場合は、終端抵抗をオフに切り替えます。

<図>

ジャンパー設定:

シールドには3つの異なるジャンパーエリアがあります。非常に重要なのは、電源電圧用のジャンパーJP1です。 ArduinoUNOは内部で5Vで動作します。このジャンパーを5Vの位置に設定する必要があります(たとえば、Arduino 101の3.3Vボードの場合は3.3Vの位置に設定します)。

さらに、上の写真のように、通信ポートのジャンパーを左上隅に設定します。この場合、ポート0と1の内部UARTはシールドのRS485インターフェースに接続されます。

最後になりましたが、RX / TX制御ポートにジャンパーを設定する必要があります。RX/ TXの自動切り替えが構成されているため、このジャンパーは使用しません。

<図> <図>

PCにModbusテスターソフトウェアをインストールします:

この例では、PCをModbusマスターとして使用します。 Modbustesterをダウンロードする必要があります。 zipアーカイブをハードディスクの新しいディレクトリに解凍してください。ソフトウェアを開き、下の図のようにマークされたフィールドを変更します。 USB-RS485アダプターを接続する必要があります。Modbustesterのこのアダプターに適したCOMポートを選択してください。

<図>

Arduinoソフトウェア:

コンパイルとプログラミングのためにファームウェアをArduinoIDEにロードしてください。

作業をテストする:

さあ、あなたの仕事をテストしましょう!

Modbustesterの読み取りボタンを押すことができます。このコマンドは、新しいスレーブデバイスのメモリの8バイトを読み取ります。アドレス400008で、ボタンのステータスを確認できます。アドレス400001〜400006には、ADCポートの値が含まれています。

書き込みボタンを使用すると、スレーブのレジスタを操作できます。アドレス400007に0または1を入力して、LEDのオンとオフを切り替えることができます。

<図>

コード

  • ArduinoUNOのサンプルコード
Arduino UNO Arduino のサンプルコード
 / * * Arduino RS422 / RS485シールドのテストプログラム*バージョン1.0 * Copyright(C)2018 Hartmut Wendt www.zihatec.de * *(https://github.com/angeloc/simplemodbusngのソースに基づく)* * *このプログラムはフリーソフトウェアです。*フリーソフトウェアファウンデーション、ライセンスのバージョン3、または*(オプションで)によって公開されているGNU General PublicLicenseの条件の下で*再配布および/または変更できます。それ以降のバージョン。 * *このプログラムは、役立つことを期待して配布されていますが、*保証はありません。 *商品性または特定目的への適合性の黙示の保証もありません。詳細については、* GNU General PublicLicenseを参照してください。 **このプログラムと一緒にGNUGeneral Public License *のコピーを受け取っているはずです。そうでない場合は、を参照してください。* /#include  #define ledPin 12 //オンボードled#define buttonPin 7 //プッシュボタン/ *このサンプルコードには9つの保持レジスタ。 6つのアナログ入力、1つのボタン、1つのデジタル出力、および開始以降に発生したエラーを示す1つのレジスタ。機能5(シングルコイルの書き込み)は実装されていないため、レジスタ全体と機能16を使用して、Atmega328PのオンボードLEDを設定しています。 modbus_update()メソッドは、holdingRegsレジスタ配列を更新し、通信をチェックします。注:Arduinoシリアルリングバッファは128バイトまたは64レジスタです。ほとんどの場合、MAX485などを使用してシリアル経由でarduinoをマスターに接続します。関数3の要求では、マスターはスレーブからの読み取りを試みます。5バイトはすでにID、FUNCTION、NO OF BYTES、および2つのBYTES CRCに使用されているため、マスターは122バイトまたは61レジスタしか要求できません。関数16の要求では、マスターはスレーブへの書き込みを試みます。9バイトはID、関数、アドレス、レジスタなし、バイトなし、および2バイトCRCにすでに使用されているため、マスターは118バイトまたは59レジスタしか書き込むことができません。 。 FTDI USBからシリアルへのコンバーターを使用すると、送信できる最大バイト数は、60バイトまたは30個のunsignedintレジスターである内部バッファーに制限されます。したがって、機能3の要求では、マスターはスレーブからの読み取りを試みます。ID、FUNCTION、NO OF BYTES、および2つのBYTES CRCに5バイトがすでに使用されているため、マスターは54バイトまたは27個のレジスタしか要求できません。関数16の要求では、マスターはスレーブへの書き込みを試みます。9バイトはID、関数、アドレス、レジスタなし、バイトなし、および2バイトCRCにすでに使用されているため、マスターは50バイトまたは25レジスタしか書き込むことができません。 。 USBからシリアルへのコンバーターを使用せずにマスターに接続するために主にArduinoを使用することが想定されているため、内部バッファーは128バイトのArduinoシリアルリングバッファーと同じに設定されます。* ///列挙型命令を使用するとレジスタを追加および//削除する簡単な方法。このようにすることで、レジスタを追加するたびに//スレーブレジスタ配列のサイズを定義する必要がなくなります//そして一目でスレーブレジスタのレイアウトがわかります。/////////// /////スレーブのレジスタ/////////////////// enum {//レジスタを追加または削除するだけで準備完了... //最初のレジスタアドレス0から開始ADC0、ADC1、ADC2、ADC3、ADC4、ADC5、LED_STATE、BUTTON_STATE、TOTAL_ERRORS、//これをそのままにしますTOTAL_REGS_SIZE //関数3と16のレジスタの総数は同じレジスタ配列を共有します}; unsignedintholdingRegs [ TOTAL_REGS_SIZE]; //関数3および16レジスタ配列////////////////////////////////////////// ////////////////// void setup(){/ *パラメーター(longbaudrate、unsigned char ID、unsigned char送信イネーブルピン、unsigned int保持レジスタサイズ、unsignedchar低レイテンシ)送信イネーブルピンは、MAX485などをアクティブにするために半二重通信で使用され、このモードを非アクティブにするために、0と1がRxとTxに予約されているため、2未満の任意の値を使用します。レイテンシーの遅延が少ないため、実装は非標準になりますが、実際には、すべての主要なmodbusマスター実装で機能します。 * / modbus_configure(9600、1、6、TOTAL_REGS_SIZE、0); pinMode(ledPin、OUTPUT); pinMode(buttonPin、INPUT); } void loop(){// modbus_update()はloop()で使用される唯一のメソッドです。 //スレーブが起動してからの合計エラー//カウントを返します。使用する必要はありませんが、// modbusマスターによる障害検出に役立ちます。 holdRegs [TOTAL_ERRORS] =modbus_update(holdingRegs); for(byte i =0; i <6; i ++){holdingRegs [i] =analogRead(i); delayMicroseconds(50); }バイトbuttonState =digitalRead(buttonPin); //ボタンの状態を読み取ります// buttonState値を保持レジスタに割り当てますholdingRegs [BUTTON_STATE] =buttonState; // LED_STATEレジスタ値を読み取り、関数16バイトでオンボードLEDをハイまたはローに設定しますledState =holdRegs [LED_STATE]; if(ledState)// set led {digitalWrite(ledPin、HIGH); } else if(ledState ==0)// LEDをリセット{// digitalWrite(ledPin、LOW); holdRegs [LED_STATE] =0; }} 

回路図

Arduinoへのいくつかのテストコンポーネントの配線

製造プロセス

  1. C# キューと例:C# キューとは何ですか? 使用方法は?
  2. プッシュボタンを使用したPWMによる調光ライト
  3. MPU-6050を搭載したArduinoジャイロスコープゲーム
  4. Unopad-Abletonを搭載したArduinoMIDIコントローラー
  5. Arduinoを搭載したシンプルな障害物センサー
  6. Find Me
  7. Arduinoジョイスティック
  8. サーミスタの使い方は簡単ですか?!
  9. Arduinoで音楽を作る方法
  10. ArduinoでNMEA-0183を使用する方法
  11. Arduinoベースの自動ドア開口部の作り方