本文へスキップ
技術資料に戻る

産業用ArduinoにHMIを接続する方法

Modbus RTUまたはI²Cでリアルタイムのフィールド入出力やプロセス値をタッチスクリーンHMIに公開する方法と、レジスタマッピング例を紹介します。

読了 7 分

目標:オペレータ画面でのリアルタイムI/O表示

HMIをMPINO産業用Arduinoに接続するとは、コントローラの物理世界、すなわち入力、リレー、トランジスタ、アナログチャネルをオペレータパネルから可視化し制御可能にすることを意味します。HMIはリアルタイムの入力状態を表示し、オペレータが出力を指令できるようにし、アナログ値をトレンド表示します。これらすべてをオペレータがコントローラに直接触れることなく行います。

MPINOはほぼすべてのHMIが標準対応するプロトコルであるRS-485ベースのModbus RTUを通じてI/OをHMIに公開するのが一般的です。さらに列挙したすべてのモデルにオンボードI²Cバスが備わり、パネルアーキテクチャにより適合する場合はローカル周辺機器や補助プロセッサへの近距離接続に使用できます。

パターンはモデルの大きさに関わらず同一です。小型のMPINO-8A8R-Sを配置するのであれ、完全実装のMPINO-16A8R8Tを配置するのであれ、レジスタおよびコイルマップを公開し、内蔵命令のModbusスレーブを実行し、HMIオブジェクトをそれらのアドレスにバインドします。本ガイドの残りはそのマッピングとそれを支えるファームウェアを案内します。

伝送方式の選択:Modbus RTUかI²Cか

オペレータHMIにはRS-485ベースのModbus RTUがほぼ常に正しい伝送方式です。長くノイズ耐性のあるケーブル上で動作し、すべての主要HMIブランドがModbus RTUドライバを含み、要求応答モデルが入力読み取りとコイル書き込みに直接対応します。MPINOのオートディレクショントランシーバと内蔵命令のスレーブスタックは、管理すべきドライバイネーブルタイミングなしにMPINOを清浄なModbusノードにします。

I²Cは別の役割に適します。これは同一パネルやボード上の通信、例えばMPINOとローカルディスプレイコントローラ、エキスパンダ、または監視用マイクロコントローラ間の通信のための近距離マルチデバイスバスです。列挙したすべてのMPINOがシリアルインタフェースとともにI²Cを公開するため、設計者はHMIへの長距離Modbusリンクと近傍機器へのローカルI²Cリンクを組み合わせられます。

HMIがコントローラからある程度離れた独立型オペレータパネルである場合はModbus RTUを選択してください。これが典型的な産業事例です。I²Cは、短い到達距離と単純な2線バスが制約ではなく利点となる、キャビネット内に密結合された周辺機器に限定してください。

レジスタおよびコイルマップの設計

レジスタマップは各アドレスが正確に何を意味するかを定義するため、HMI統合における最も重要な成果物です。ファームウェアを書く前に配置し、公開されたインタフェースとして扱ってください。HMIが読み取るのみの入力はディスクリート入力と入力レジスタに、HMIが指令する出力はコイルと保持レジスタに置きます。

MPINO-8A8Rの明確なマップは次のとおりです。コイル0-7が8つのリレーを駆動し、ディスクリート入力0-7が8つのデジタル入力を報告し、入力レジスタ0-3がEXTERNAL基準ADCの生の0-1023カウントとして4つのアナログチャネルを運びます。HMI作成者が表示スケーリングを正しく構成できるよう、各レジスタの隣に単位とスケーリングを文書化してください。

MPINO-16A8R8Tのようなより豊富なコントローラは同じ方式を拡張します。16のデジタル入力はディスクリート入力0-15、リレーはコイル0-7、8つのトランジスタ出力はコイル8-15、4つのアナログ入力と2つのNTCチャネルは入力レジスタ、2つのアナログ出力は保持レジスタに置きます。安定し適切にラベリングされたマップは、HMI統合担当者がファームウェア開発と並行して作業できるようにします。

ファームウェア:入力の読み取りとリレーコイルの書き込み

マップが固定されると、ファームウェアは簡潔なループに帰着します。リアルタイムのデジタルおよびアナログ入力をスレーブのディスクリート入力および入力レジスタテーブルにコピーし、毎スキャンでマスタ要求を処理し、マスタが書き込んだコイル値を物理的なリレーとトランジスタ出力に適用します。

このModbus RTUスタックはSDKの内蔵命令がそのまま提供するため、インストールするライブラリはありません。ImodbusRTUMem()とImodbusRTUAdr()でデータ領域のサイズと開始アドレスを決め、ImodbusRTUInit()でRS-485ポートにスレーブアドレスと通信速度を結び付け、毎スキャンImodbusRTU()を呼び出してマスタ要求を処理します。MPINOアナログフロントエンドが正しいADC読み取りのために要求するanalogReference(EXTERNAL)に留意してください。

この構造は毎スキャンで入力データを新鮮に保ち、マスタ要求の処理直後にオペレータ指令を決定論的に適用するため、HMIが表示するものと指令するものが物理I/Oと緊密に同期します。

/*
  MPINO-16A8R8T example: Modbus RTU slave

  使用する命令:
  - ImodbusRTUMem(), ImodbusRTUAdr(), ImodbusRTUInit()
  - ImodbusRTU(), ImodbusRTU(serialPort)
  - ImodbusRTUmasterInit(), ImodbusRTUmasterAdd(), ImodbusRTUmasterRun()

  MPINO-16A8R8T のポート:
  - Serial1 = RS-232
  - Serial2 = RS-485
*/

#if !defined(M16A8R8T)
#warning "This example is written for MPINO-16A8R8T."
#endif

void setup() {
  // M ビット128点、D ワード128点を通信メモリとして確保する。
  ImodbusRTUMem(128, 128);

  // 外部アドレスと内部配列のインデックス開始点を0に合わせる。
  ImodbusRTUAdr(0, 0);

  // RS-485ポート Serial2 を Modbus RTU スレーブ ID 1、9600bps で開始する。
  ImodbusRTUInit(Serial2, 1, 9600);

  // 複数ポートを使う場合は Init を追加する。M/D メモリは共有される。
  // ImodbusRTUInit(Serial1, 2, 9600);
}

void loop() {
  // 登録されたすべての Modbus RTU ポートを順に処理する。
  ImodbusRTU();

  // 特定のポートだけ処理する場合は serialPort 引数を渡す。
  // ImodbusRTU(Serial2);

  // HMI/PLC が読む値を内部メモリに反映する。
  M[0] = digitalRead(22);       // コイル領域の例
  D[0] = analogRead(A0);        // 保持レジスタの例

  // HMI/PLC が書いた M[10] で R(62) を制御する。
  digitalWrite(62, M[10]);
}

/*
  Modbus RTU マスタスケジューラの例:

  void setup() {
    ImodbusRTUmasterInit(Serial2, 9600);
    ImodbusRTUmasterAdd(Serial2, 1, 0x03, 0x00, 1, &D[1]);
    ImodbusRTUmasterAdd(Serial2, 1, 0x03, 0x01, 1, &D[2]);
  }

  void loop() {
    ImodbusRTUmasterRun();
  }
*/

HMI側の構成

HMIでbaud rate、データビット、パリティ、ストップビットがMPINOのbegin()呼び出しと正確に一致するModbus RTUシリアルドライバを作成します。MPINOをスレーブアドレスで機器エントリに追加し、公開されたアドレスを指すタグを作成します。入力ランプ用のディスクリート入力タグ、出力ボタン用のコイルタグ、アナログ表示用のレジスタタグです。

画面ウィジェットをこれらのタグにバインドします。モーメンタリまたはメンテインドのプッシュボタンはコイルを書き込み、表示灯はディスクリート入力を読み取り、数値表示やトレンドは入力レジスタを読み取りマップに文書化したスケーリングを適用します。コイルは読み書き可能なため、HMIはリレーを指令すると同時に確認のため指令された状態を読み戻せます。

適切なポーリング間隔(一般に100-500 ms)を設定し、隣接アドレスをグループ化してHMIが単一のModbusトランザクションで読み取るようにします。これはバストラフィックを最小化し、ATmega128またはATmega2560がコントローラの全I/Oを処理する際も画面更新を滑らかに保ちます。

検証、安全、実際の値

パネルをオペレータに引き渡す前に、マッピングされたすべての点をエンドツーエンドで検証してください。各物理入力をトグルして対応するHMIランプが追従することを確認し、各HMIボタンを押して対応するリレーまたはトランジスタ出力が動作することを確認します。アナログ表示が各チャネルに印加した既知の基準を追従し、文書化したスケーリングが正しい工学単位を生成することを検証します。

HMIアラームやインターロックが実際の値のように作用しうるプレースホルダやゼロ値をMPINOが公開しないようにしてください。setup()で出力を定義された安全状態に初期化し、通信喪失時に最後の指令状態を無期限にラッチせず機械を安全な状態に置くようコイルロジックを設計してください。

人員の安全に影響しうる出力については、HMI-Modbus経路のみに依存しないでください。ハードワイヤの非常停止と安全インターロックをコントローラおよびネットワークから独立して維持してください。MPINOとそのHMIは監視制御と可視性を提供し、機能安全は専用のハードワイヤ安全回路の領域に留まります。

対象コントローラ

MPINO-8A8R-S 産業用Arduinoコントローラ — 上面画像

MPINO-8A8R-S

MPINO-8A8R-S 産業用Arduinoコントローラ

8 DI / 8 Relay / 4 AI / 2 NTC / RS-485 / I²C
$82.50
MPINO-16A8R8T 産業用Arduinoコントローラ — 上面画像

MPINO-16A8R8T

MPINO-16A8R8T 産業用Arduinoコントローラ

16 DI / 8 Relay / 8 Transistor / 4 AI / 2 AO / 2 NTC / RS-232 / RS-485 / UART / I²C
$110.00

関連ガイド

FAQ

HMIをMPINOにModbus RTUで接続すべきですか、I²Cで接続すべきですか?

独立型オペレータHMIにはRS-485ベースのModbus RTUを使用してください。長くノイズ耐性のあるケーブル上で動作し、すべての主要HMIが対応します。I²CはMPINOとディスプレイコントローラやエキスパンダなどのローカル周辺機器間の近距離キャビネット内接続に限定してください。

HMIはMPINOのリレーをどのように指令しますか?

HMIはそのリレーにマッピングされたModbusコイルを書き込みます。ファームウェアで内蔵命令のModbusスレーブは8つのリレーに対しコイル0-7を公開し、スケッチが毎スキャンModbusデータ領域からそのコイル値を読み取りdigitalWrite()でリレーを駆動するため、HMIのボタン押下が物理リレーを励磁または消磁します。

HMIでアナログ値を読み取れますか?

はい。各アナログチャネルを入力レジスタにマッピングすると、ファームウェアがEXTERNAL基準の0-1023 ADCカウントを公開し、HMIが文書化したスケーリングを適用して工学単位を表示します。MPINO-16A8R8Tは2つのNTC温度チャネルも同じ方式で公開します。