こんにちは。とぉらぁといいます。
最近 Modbus TCP 通信のクライアント側を業務で実装する機会があり、勉強中だったため本記事にまとめがてら C# でサンプルを作成して実際に通信をしてみようと思います。
Modbus について軽く説明すると、Modbus とは通信プロトコルでマスタ・スレーブ方式によって通信します。また Modbus TCP とは Modbus プロトコルを TCP/IP 上で通信するためのプロトコルになります。
このサンプルでは Input Registers の読み出しを実装します。
サンプルの実行には Modbus TCP サーバのシミュレータが必要になるので後述するフリーソフトを使用します。
環境
- Visual Studio 2019
- .NET Framework 4.8
- 言語:C#
- Modbus TCP サーバシミュレータ:EasyModbusTCPServerSimulator
シミュレータをインストールし起動する
サーバ側になるシミュレータを用意します。上記 URL のホームページから「Download」の項目を選択し、「EasyModbusTCP.NET」をクリックするとダウンロードページに飛ぶので、そこでシミュレータをダウンロードします。
下がシミュレータの画面です。
シミュレータでは各データ領域のアドレスに対して値を直接入力することができます。
今回のサンプルでは、Input Registers の読み出しを行うので上のように Input Registers のアドレスの先頭にテスト用の値を入力しました。
シミュレータの起動については開いた時点で起動するのでサーバ側の準備はこれでOKです。
サンプルアプリの作成
次にクライアント側になるサンプルアプリを作成します。新しくプロジェクトを作成し、C# の「コンソールアプリケーション」を選択します。
プロジェクト名と保存場所を決めます。
ターゲットフレームワークは業務で使用している「.NET 5.0」を選択しています。
下がソースコードになります。
サーバとの接続は、ソケットによる TCP/IP 通信と手順は変わりません。
接続した後は、Modbus TCP プロトコルに準拠したリクエストをサーバに送信すれば、リクエストに沿ったデータを受信できます。今回のサンプルでは Input Registers の先頭アドレスから 3アドレス分のデータをリクエストし、受信したデータをコンソールに出力します。
実行結果
下が実行後の結果です。
サーバ側で設定した値をサンプルのコンソールで出力することができました。
おわりに
今回は Modbus TCP 通信の一例として Input Registers の読み出しを行いましたが、ファンクションコード次第でその他のデータ領域に対して読み書きなどの操作が可能です。
私もより Modbus TCP を理解するためにほかの操作にも挑戦しようと思います。
もしこの記事がだれかの参考になったのであれば幸いです。