Modbus/TCP通信をJavaでプログラムを作る方法とは?

プログラミング

ひょんなことから、仕事にてModbus/TCPというプロトコルを使った通信を、Javaでプログラムを組むことになり、色々と調査をしておりました。

零細弱小企業なので、「ただ」で・・・ということで。

まぁ、最近では、書籍を購入して覚えるより、ネットで色々と調べたほうがわかりやすい場合もあります。

それに、長年仕事をしていると、「ただ」で情報を集める術も身につくもので、なんとか、基本的な動作はできるようになりました。

・・・ですが、

それでも、日本語のサンプルが少なすぎ!

探した書籍も「英語」の書籍しか無いみたいだし・・・お金をかけても、結局、英語に苦しむ羽目になっちゃうのね。

Modbus/TCPなんて聞き慣れないプロトコルも、多分、マイナーなんだと思いますが(僕が知らないだけ??)、

サンプルが少なくて、日本語で解説しているサイトも少なくて、だいぶ苦労しました。

で、もしかすると、僕と同じように英語が苦手な日本人の中で、Modbus/TCPをJavaを使ってプログラムを作ろうとしている人が、他にもいるかも知れない・・・と思い、

僕が作ったプログラムをサンプルとして公開することにしました。

もし、Modbus/TCPプロトコル通信をJavaで作ろうと考えている方がいたら、参考にしてくださいね。

それと、公開したサンプルが間違っているようでも、それは、温かい目で見てくださいね。

 

スポンサーリンク

使用したライブラリ(j2mod)

Modbus/TCPをJavaで組むに当たり、使ったJavaライブラリはj2modと言われるライブラリです。

以下にリンクを張っておきます。

jarファイルの他に、javadocもありますので、開発時の参考にしてくださいね。

https://ja.osdn.net/projects/sfnet_j2mod/

 

便利ツール

開発時に便利なツールを紹介します。

 

ModbusTool

Releases · ClassicDIY/ModbusTool
A modbus master and slave test tool with import and export functionality, supports TCP, UDP and RTU. - ClassicDIY/ModbusTool

Modbusのmaster、slaveのシュミレータです。

通信ログも見れるので便利です。

 

Modbus通信確認用アプリケーション

[Modbus Tool for Debug] Modbus通信確認用アプリケーション

Modbusの通信確認用のアプリケーションです。

シュミレータがちゃんと動作ができているか、確認ができるソフトです。

 

ドキュメント

Modbusの通信仕様がわかるドキュメントです。

開発する時に参考にしてください。

 

Modbusプロトコル解説書

 

 

Modbus/TCP通信 Javaプログラムサンプル

Modbus/TCP通信を使ったJavaプログラムのサンプルです。

Discrete Outputの書き込み、読み込み、Holding Registerの書き込み、読み込みを行っています。

  1. import java.net.InetAddress;
  2. import com.ghgande.j2mod.modbus.io.ModbusTCPTransaction;
  3. import com.ghgande.j2mod.modbus.msg.ReadCoilsRequest;
  4. import com.ghgande.j2mod.modbus.msg.ReadCoilsResponse;
  5. import com.ghgande.j2mod.modbus.msg.ReadMultipleRegistersRequest;
  6. import com.ghgande.j2mod.modbus.msg.ReadMultipleRegistersResponse;
  7. import com.ghgande.j2mod.modbus.msg.WriteMultipleCoilsRequest;
  8. import com.ghgande.j2mod.modbus.msg.WriteMultipleCoilsResponse;
  9. import com.ghgande.j2mod.modbus.msg.WriteMultipleRegistersRequest;
  10. import com.ghgande.j2mod.modbus.msg.WriteMultipleRegistersResponse;
  11. import com.ghgande.j2mod.modbus.net.TCPMasterConnection;
  12. import com.ghgande.j2mod.modbus.procimg.SimpleRegister;
  13. public class ModbusSample {
  14.     public static void main(String[] args) {
  15.         InetAddress address=null;
  16.         TCPMasterConnection connection=null;
  17.         try {
  18.             //接続処理
  19.             address = InetAddress.getByName(“127.0.0.1”);
  20.             connection = new TCPMasterConnection(address);
  21.             connection.setPort(502);
  22.             connection.connect();
  23.             System.out.println(“connect”);
  24.             ModbusTCPTransaction transaction =
  25.                     new ModbusTCPTransaction(connection);
  26.             //アドレス等
  27.             int ref = Integer.parseInt(“0000”,16);
  28.             int count = 3;
  29.             int unitId = 1;
  30.             //Discrete Output 書き込み ==============================
  31.             WriteMultipleCoilsRequest writeMultipleCoilsRequest =
  32.                     new WriteMultipleCoilsRequest(ref,count);
  33.             //書き込みデータの準備
  34.             writeMultipleCoilsRequest.setUnitID(unitId);
  35.             writeMultipleCoilsRequest.setCoilStatus(0, true);
  36.             writeMultipleCoilsRequest.setCoilStatus(1, false);
  37.             writeMultipleCoilsRequest.setCoilStatus(2, true);
  38.             writeMultipleCoilsRequest.setCoilStatus(3, false);
  39.             //リクエスト送信
  40.             transaction.setRequest(writeMultipleCoilsRequest);
  41.             transaction.execute();
  42.             //書き込み結果受信
  43.             WriteMultipleCoilsResponse writeMultipleCoilsResponse =
  44.                     (WriteMultipleCoilsResponse) transaction.getResponse();
  45.             if (writeMultipleCoilsResponse!=null) {
  46.                 System.out.println(“DiscreteOutput Write:” +
  47.                         writeMultipleCoilsResponse.getHexMessage());
  48.             }
  49.             //Discrete Output 読み込み ==============================
  50.             ReadCoilsRequest readCoilsRequest =
  51.                     new ReadCoilsRequest(ref,count);
  52.             //リクエスト送信
  53.             readCoilsRequest.setUnitID(unitId);
  54.             transaction.setRequest(readCoilsRequest);
  55.             transaction.execute();
  56.             //読込み結果受信
  57.             ReadCoilsResponse readCoilsResponse =
  58.                     (ReadCoilsResponse)transaction.getResponse();
  59.             if (readCoilsResponse!=null) {
  60.                 for (int i=0; i < readCoilsResponse.getBitCount(); i++) {
  61.                     System.out.println(“DiscreteOutput Read “ + i + “:” +
  62.                             readCoilsResponse.getCoilStatus(i));
  63.                 }
  64.             }
  65.             //Holding Register 書き込み ==============================
  66.             //書き込みデータの準備
  67.             SimpleRegister[] simpleRegisters = new SimpleRegister[3];
  68.             for (int i=0; i < simpleRegisters.length; i++) {
  69.                 simpleRegisters[i]=new SimpleRegister((i+1)*100);
  70.             }
  71.             WriteMultipleRegistersRequest writeMultipleRegistersRequest =
  72.                     new WriteMultipleRegistersRequest(ref,simpleRegisters);
  73.             //リクエスト送信
  74.             writeMultipleRegistersRequest.setUnitID(unitId);
  75.             transaction.setRequest(writeMultipleRegistersRequest);
  76.             transaction.execute();
  77.             //書き込み結果受信
  78.             WriteMultipleRegistersResponse writeMultipleRegistersResponse =
  79.                     (WriteMultipleRegistersResponse) transaction.getResponse();
  80.             if (writeMultipleRegistersResponse!=null) {
  81.                 System.out.println(“HoldingRegister Write:” + writeMultipleCoilsResponse.getHexMessage());
  82.             }
  83.             //Holding Register 読み込み ==============================
  84.             ReadMultipleRegistersRequest readMultipleRegistersRequest =
  85.                     new ReadMultipleRegistersRequest(ref,count);
  86.             //リクエスト送信
  87.             readMultipleRegistersRequest.setUnitID(unitId);
  88.             transaction.setRequest(readMultipleRegistersRequest);
  89.             transaction.execute();
  90.             //読込み結果受信
  91.             ReadMultipleRegistersResponse readMultipleRegistersResponse =
  92.                     (ReadMultipleRegistersResponse)transaction.getResponse();
  93.             if (readMultipleRegistersResponse!=null) {
  94.                 for (int i=0; i < readMultipleRegistersResponse.getWordCount(); i++) {
  95.                     System.out.println(“HoldingRegister Read “ + i + “:” +
  96.                             readMultipleRegistersResponse.getRegisterValue(i));
  97.                 }
  98.             }
  99.         } catch (Exception e) {
  100.             e.printStackTrace();
  101.         } finally {
  102.             //切断処理
  103.             if (connection!=null) connection.close();
  104.             System.out.println(“close”);
  105.         }
  106.     }
  107. }

 

このプログラムの出力結果は、以下のようになります。

  1. connect
  2. DiscreteOutput Write:00 00 00 00 00 06 01 0f 00 00 00 03
  3. DiscreteOutput Read 0:true
  4. DiscreteOutput Read 1:false
  5. DiscreteOutput Read 2:true
  6. DiscreteOutput Read 3:false
  7. DiscreteOutput Read 4:false
  8. DiscreteOutput Read 5:false
  9. DiscreteOutput Read 6:false
  10. DiscreteOutput Read 7:false
  11. HoldingRegister Write:00 00 00 00 00 06 01 0f 00 00 00 03
  12. HoldingRegister Read 0:100
  13. HoldingRegister Read 1:200
  14. HoldingRegister Read 2:300
  15. close

 

まとめ

この記事では、Modbus/TCPプロトコル通信 Javaプログラムのサンプルをご紹介しました。

見知らぬ分野に手を出してみるのも、意外と楽しいもんですね。

見知らぬ分野のプログラムを組めるのはまぁ楽しいんですけど、これが仕事となると、こりゃまた不安でいっぱいだったりします。

僕と同じように、「Modbus/TCP通信をJavaで作んないといけないんだけど、日本語のサンプルが少なくて、困るー!!」って方がいたら、

参考にしてくださいね。

僕は、英語が苦手で、サンプル作るだけでも、めっちゃ苦労しました^^;

 

コメント

タイトルとURLをコピーしました