
こちらの記事について、内容・翻訳・視点・長さなど、皆様のご意見をお送りください。今後の記事製作の参考にしたいと思います。

Thank you! Your feedback has been received.

There was a problem submitting your feedback, please try again later.

こちらの記事の感想をお聞かせください。
単相Modbusエネルギーメーターを、ラズパイ搭載PLCで読み取る
この記事では、エネルギーメーター、温度センサ、I/OモジュールといったModbus デバイスを、Brainboxes BB-400 (181-7467) とインターフェースを介して簡単に接続する方法を見ていきます。
Modbus 101
Modbusプロトコルには古い歴史があり、そのルーツは実に1970年代にまで遡ります。比較的シンプルで効率的、また、ロイヤリティーフリーであるということから、長年にわたって素晴らしい成功を収めており、産業用コントロ―ラやビルディングオートメーションをはじめとする、多くのアプリケーションで使用されており、PLCや、アプリケーション固有のコントローラ、センサ、アクチュエーター、HMIなど、幅広くサポートしています。
シリアルポートとIPネットワークには、様々なプロトコルのバージョンがあります。おそらく最も一般的なものは、シリアル通信接続で使用される、バイナリプロトコルのModbus RTUと、イーサネット接続にて良く使用される、Modbus TCPです。
RS-485は、一組の配線で構成されるバス・アーキテクチャで使用され、多くのデバイスに対応できるため、RTU製品は多くのアプリケーション、特にコスト重視のアプリケーションにおいて人気があります。膨大な数のエネルギーメーターを、せいぜい数分ごとに読み取るような場合、エネルギーメーターに100Mのイーサネットリンクを使うのは明らかに過剰だと感じますよね。
それぞれのModbusステーションは、1回のデータリンクにおいて、247台までのデバイスをアドレス指定できます。それぞれのデバイスには固有のアドレスがあり、多くのレジスタを持つことが可能です。また、Modbusデバイスによって認識されるファンクションコードというものがあり、例えば、ファンクションコード4は、入力レジスタを読み取るために使用するものです。
ハードウェアのセットアップ
BB-400シリアルポートをSDM120M (871-8302) エネルギーメーターに接続するといった、シンプルなセットアップを使うことにしました。初期設定では、ユニットID が 1 、ボーレート2,400での通信に設定されています。適宜、Modbusのレジスタに書きこむことで、変更も可能です。同じバスに複数のデバイスがある場合や、ボーレートを上げたい場合に行う必要があるでしょう。
BB-400と接続
BB-400はRaspbianベースのオペレーティングシステムを実行し、mDNS(「Zeroconf」とも) をすぐに使用できるように設定されています。つまり、ルーターにログオンした後、割り当てられている IP アドレスを確認する必要がなく、代わりに、ホスト名 bb400-xxxx.localを使用するだけで良いのです。ここでのxxxxは、エンクロージャの側面に印刷されているMACアドレスの下 4 桁です。
今回使用したWebインターフェースにアクセスするためのアドレス:
https://bb400-0250.local:9090/
ポート番号9090の追加方法に注意してください。
このページを読み込む前に、自己署名証明書が使用されているため、セキュリティ警告が出ていることを確認しておいてください。サードパーティがランダムにWebインターフェースにアクセスするとは考えていないため、これが問題にはなることはありません。また、自身のブラウザにこの例外を保存することで、証明書が変更されない限り、再度表示されることはありません。再表示された場合は、理由を調べる必要がありそうです。
デフォルトのユーザー名は「bb」、パスワードはMACアドレスの下 4 桁と同じに設定されています。
以下のように、Linuxの端末などからSSH経由でログインすることも可能です。
$ ssh bb@bb400-0250.local
ポートの設定
Webインターフェースでは、BB-400のステータスを表示したり、デジタル I/O、ネットワーク、ワイヤレスを設定したり、ソフトウェアのアップデートを実行したりすることが可能です。上の写真のように、シリアルポートを設定するメニューもあります。ここでは、ポートを全二重のRS-232とRS422/RS-485、または、半二重の RS-485のいずれかに設定できます。
Modbusデバイスは半二重で、2 本のデータラインを使用しているため、これがシリアルポートの設定となります。また、ここでは、ボーレートやデータビット数などの、デフォルトのポート設定をすることもできます。Web インターフェースには、接続するピンと、設定したポートタイプのジャンパー設定がわかりやすく表示されています。
PCBジャンパーは上の写真のように設定しました。詳細については、Brainboxes ウェブサイトをご覧ください。
Node-RED
BB-400でプロトタイプアプリケーションを起動して実行するための最短ルートは、Node-REDを使用することです。Node-REDは事前に設定されているため、同じURLを使用し、ポートを1880に変更するだけでWeb インターフェースにアクセスできます。ログインには、先ほどと同じユーザー名とパスワードを使用します。
Node-REDの機能は、サードパーティの「ノード」を経由して拡張されます。
便利なことに、Modbusのサポートを追加するノードと、使用中かどうかを示す設定済みのフロー (エディターのタブ/ページ) が用意されています。
簡単なフローから始めてみます。上のような場合、Modbus Readタイプのノードが設定されていることがわかります。このため、デバイスユニットID、機能コードタイプ、レジスタアドレス、読み取れる入力レジスタの数を指定する必要があります。また、ここでは、電圧を読み取る設定や、読み取り頻度を決めるポールレートの設定も行います。
フォームの下部にはサーバーフィールドがあり、フロー内やフロー間にある、複数のサーバーを設定することができます。それぞれのサーバーは、読み取りや書き込みの操作を実行する複数のノードで使用可能です。この場合、サーバーがシリアル接続を使用するように設定されていることがわかりますが、TCPの使用も可能です。ここでは、BB-400 が /dev/ttySC0なので、シリアルポートを指定しました。また、Modbusノードで指定されていない場合に使用するボーレートと、デフォルトのユニットIDも設定します。
上のような場合、Modbus Readノードはデバッグノードに接続され、右側にデバッグ出力が表示されていることがわかります。読み取り値は32ビットIEEE 754浮動小数点形式で、2つの隣接するレジスタに保持されます。したがって、さらに扱いやすいものに変換する必要があります。
Node-REDの良さを一つ挙げると、非常に人気があるため、多くの場合、他者が共有しているリソースを使用して、車輪の再発明を避けられるということです。実際のところ、フロー全体を共有するのは簡単で、さらっと検索してみるとこういったページが見つかりました。上図のように、新しいフローにインポートされていることがわかるはずです。
フロー全体を使用するのではなく、上のようなフォーマット機能と、これにより使えるようになる、はるかに扱いやすい出力を再利用することにしました。
これはほんの一例で、提供されているModbusノードのパレットには、レジスタへの書き込みを行うノードや、さらに柔軟な機能を備えた様々なノードが用意されています。
その他のオプション
Node-REDはどちらかというとラピッドプロトタイピングツールと見なされるかもしれませんが、本番環境でも使用されています。私のオフィスではRaspberry Pi 2で暖房を制御していますが、何年も問題が起きたことはありません。しかし、最小限のコードで1つのことを的確にこなすような、シンプルかつ専用のプログラムにも大きな価値があります。
Node-RED同様、Pythonプログラミング言語も非常に人気があり、緩やかな立ち上がりで初心者や愛好家だけでなく、上級者にも幅広く支持されています。検索してみると、この特定のエネルギーメーターで使用できるsdm-modbus Python モジュールが見つかりました。これは、実際に pymodbus モジュール上に構築されているものです。
一方、C言語を好む人はlibmodbusを使用することができ、Modbusの成熟度と人気を考えると、他の選択肢にも事欠きません。