LabVIEWからアクセス可能なModBusデバイスを構築したい

最終更新日 2021年4月22日

Modbusはシーケンサプロトコルとして一般的なものです。実装が比較的容易でライセンスフィーがかからないため、ArduinoPLCでも実装されています。
RS485での接続が一般のようですが、TCP接続の実装も定義されています。

ここでは、CPUにSTM32F1(BluePillモジュール)、NICにWIZ5500、開発環境をSTM32duinoでMODBUSSlaveデバイスを構築し、マスタとしてLabVIEWからアクセス出来るものを実現したいと考えています。
実例が出来る事で仕事に繋げたいという意図があります。

MODBUS/TCP SlaveデバイスでI/Oポートを幾つか確保出来ることから汎用的なSlaveデバイスとして構築出来ると意味があるかと思います。


ArduinoにはModbusライブラリの投稿が結構あるようで、フォーラムには相当の投稿があります。これらを駆使してModBusTCPSlaveデバイスを構築し、LabVIEWから制御出来るものを構築することを検討しています。

現時点で判っている事は、


単一機能のModBusデバイスはRS485インターフェースにてたくさん市場にあります。M-DuinoとかControllino がそれです。
これらは必要なシールド機能をまとめハウジングに纏めた使いやすさがあります。そしてソフトウエアを自由に書き込む事でカスタマイズが可能です。
ModbusTCPインターフェースに関してもNICが用意されており、ソフトウエアを更新するだけで対応するとあります。

とはいうものの別のアプローチを検討しました。CPUをAVRから変更したいという課題もあります。


標準的なタ−ゲットデバイスを検討しました。Ajaxで検討したデバイスがそのまま利用出来るのではないかと考えています。

Inputが4ch、Coil_8ch、inputレジスタ4ch、ホールディングレジスタ4ch、I2C


メモリマップを決めてから更に全体像を纏めます。

MODBUSデータモデルは次のように定義されています。

プライマリテーブル オブジェクトタイプ 種類 コメント
離散入力 シングルビット 読み取り専用 このタイプのデータは、I / Oシステムから提供できます。
DIポートの読み取り結果を割り当てます
Baseアドレス:10001
コイル シングルビット 読み書き このタイプのデータは、アプリケーションプログラムによって変更可能です。
DOポートの入出力を割り当てます。
Baseアドレス:1
入力レジスタ 16ビットワード 読み取り専用 このタイプのデータは、I / Oシステムによって提供できます
アナログ入力を割り当てます。一部I2Cの読み取り結果もここで扱います。
Baseアドレス:30001
登録レジスタ 16ビットワード 読み書き このタイプのデータは、アプリケーションプログラムによって変更可能です。
アナログ出力等で使用します。
Baseアドレス:40001

使用を検討しているModbusライブラリはMgsModbusです。STM32で使うために使えるライブラリを調査したところ、このライブラリがシンプルで使えそうでした。サンプルスケッチをbuild出来るかどうかで判断しています。

このMgsModbusライブラリは単一のWORD型メモリを確保しています。このことから以下のような仕組みを検討したのですが、実際に実装してみるととっても使いづらいことが判りました。

メモリブロックを4つ個別に確保した方がわかりやすく安全です。そして融通が利きます。

そして保持すべきメモリブロックの問題も露呈しました。このMgsModbusライブラリではEEPROMをアクセスするような事はしていませんが実際には保持メモリはEEPROMにて読み書きしないといけないのかもしれません。BluePillではEEPROMは搭載されていないため、STM32duinoのEEPROM.hの機能で対処するか、I2CのEEPROMデバイス(24LC64やAT24C1024Bのような)を追加するかです。

今回はまず、全体像として動く様にすることを優先することにしました。

パフォーマンスですが、AJAXによるブラウザからのI/O反応に比べ、明らかに反応がキビキビしています。対応アプリケーションからのアクセスとなりますので、iPhoneからの制御については難しいかもしれませんが。


マスタはとりあえずLabVIEWで構築します。ただ、検証出来るツールも必要ですので、『Modbus Poll』と云うツールも用意しておきます。有償ソフトなのですが、10分間は無償で使えるためデバッグには調子いいです。※デンマークのWitte Softwareと云う会社製です

Modbus Pollは、特にFA業界で利用されている通信プロトコル Modbus のスレーブ機器のテストやデバッグを
行うための、Modbusマスタ シミュレータです。
マルチウィンドウのユーザーインターフェースを採用しているため、同時に複数のスレーブやデータ領域を
モニタリングすることが可能です。
(スレーブID・ファンクション・アドレス・サイズ・ポーリングレート等)
またそれぞれのウィンドウからレジスタやコイルの読み書きも可能です

LabVIEWでModbusマスタのソフトを構築するに当たり、不確定なslaveでのデバッグでは問題があると考えました。上記Witte Software社はModbus Slaveというツールも用意しています。このツールでLabVIEWでのModbusマスタのソフトを作成し、その後にBluePillで構築したデバイスにアクセスしてデバイス側のデバッグに使うことを検討しました。
IPアドレスを127.0.0.1にすることで1台のPC上でデバッグ出来ます。大変調子いいです。

LabVIEWのModbusライブラリはアドレス指定を基本Base0で扱うようです。注意が必要です。Base1に変更する術が見当たりません。


もう少し検討も必要ですが、汎用エッジ端末としてのMODBUSデバイスが安価に構築できることが示せたのかと思います。
NICがそこそこ電流を喰います。それでも、500mAを供給出来るUSBでの電力供給で動作可能です。外部にLEDを駆動させるとちょっと電流不足から電圧ドロップします。USB3.0の端子であれば電流供給の余油が出ることも判りました。

このモックアップデバイスはAJAXのコードを書き込むと同じように動かせることも判りました。

フラッシュサイズも余裕がありますし、実行メモリも十分余裕があります。BluePill様々です。そこで、MACアドレスや、IPアドレスをEEPROM(STM32ではフラッシュの一部を使用)で管理する機能も追加できました。この実装で、ソースコードを書き直す必要性も限られます。

ここではMAC/IP/MASK/GWの書き換えが可能です。DHCPはなじまないので対応していませんが、ライブラリはDHCPもサポートしています。
この書き換え機能により、基本同じバイナリファイルを書き込んで置いて、実際の設置環境下で書き換えて対応出来ることになります。


ModbusSlaveデバイスのインプリメントとしてどうすべきなのか悩んでいます。

例えばModbusSlaveデバイスの実装コイル点数が16点の場合、ReadCoilで100点の読込を実行されたとき、

どちらのインプリメントが正しいのか、仕様書を見ているのですが判りません。

クライアントソフトも挙動がまちまちなんです。同様の操作を実行した場合、そのまま16点だけデータ更新し、他の部分は無意味な数字を表示する物も有りますし、エラーダイアログを出し、点数を許容内に変更する事で表示するという物も有ります。

この点は調査が必要です。結果によってはModbusSlaveデバイス側のファームコードを修正する必要があります。


戯言(nonsense)に戻る


免責事項

本ソフトウエアは、あなたに対して何も保証しません。本ソフトウエアの関係者(他の利用者も含む)は、あなたに対して一切責任を負いません。
あなたが、本ソフトウエアを利用(コンパイル後の再利用など全てを含む)する場合は、自己責任で行う必要があります。

本ソフトウエアの著作権はToolsBoxに帰属します。
本ソフトウエアをご利用の結果生じた損害について、ToolsBoxは一切責任を負いません。
ToolsBoxはコンテンツとして提供する全ての文章、画像等について、内容の合法性・正確性・安全性等、において最善の注意をし、作成していますが、保証するものではありません。
ToolsBoxはリンクをしている外部サイトについては、何ら保証しません。
ToolsBoxは事前の予告無く、本ソフトウエアの開発・提供を中止する可能性があります。

商標・登録商標

Microsoft、Windows、WindowsNTは米国Microsoft Corporationの米国およびその他の国における登録商標です。
Windows Vista、Windows XPは、米国Microsoft Corporation.の商品名称です。
LabVIEW、National Instruments、NI、ni.comはNational Instrumentsの登録商標です。
I2Cは、NXP Semiconductors社の登録商標です。
その他の企業名ならびに製品名は、それぞれの会社の商標もしくは登録商標です。
すべての商標および登録商標は、それぞれの所有者に帰属します。