ひょんなことから、仕事にてModbus/TCPというプロトコルを使った通信を、Javaでプログラムを組むことになり、色々と調査をしておりました。
零細弱小企業なので、「ただ」で・・・ということで。
まぁ、最近では、書籍を購入して覚えるより、ネットで色々と調べたほうがわかりやすい場合もあります。
それに、長年仕事をしていると、「ただ」で情報を集める術も身につくもので、なんとか、基本的な動作はできるようになりました。
・・・ですが、
それでも、日本語のサンプルが少なすぎ!
探した書籍も「英語」の書籍しか無いみたいだし・・・お金をかけても、結局、英語に苦しむ羽目になっちゃうのね。
Modbus/TCPなんて聞き慣れないプロトコルも、多分、マイナーなんだと思いますが(僕が知らないだけ??)、
サンプルが少なくて、日本語で解説しているサイトも少なくて、だいぶ苦労しました。
で、もしかすると、僕と同じように英語が苦手な日本人の中で、Modbus/TCPをJavaを使ってプログラムを作ろうとしている人が、他にもいるかも知れない・・・と思い、
僕が作ったプログラムをサンプルとして公開することにしました。
もし、Modbus/TCPプロトコル通信をJavaで作ろうと考えている方がいたら、参考にしてくださいね。
それと、公開したサンプルが間違っているようでも、それは、温かい目で見てくださいね。
使用したライブラリ(j2mod)
Modbus/TCPをJavaで組むに当たり、使ったJavaライブラリはj2modと言われるライブラリです。
以下にリンクを張っておきます。
jarファイルの他に、javadocもありますので、開発時の参考にしてくださいね。
便利ツール
開発時に便利なツールを紹介します。
ModbusTool
Modbusのmaster、slaveのシュミレータです。
通信ログも見れるので便利です。
Modbus通信確認用アプリケーション
Modbusの通信確認用のアプリケーションです。
シュミレータがちゃんと動作ができているか、確認ができるソフトです。
ドキュメント
Modbusの通信仕様がわかるドキュメントです。
開発する時に参考にしてください。
Modbus/TCP通信 Javaプログラムサンプル
Modbus/TCP通信を使ったJavaプログラムのサンプルです。
Discrete Outputの書き込み、読み込み、Holding Registerの書き込み、読み込みを行っています。
- import java.net.InetAddress;
- import com.ghgande.j2mod.modbus.io.ModbusTCPTransaction;
- import com.ghgande.j2mod.modbus.msg.ReadCoilsRequest;
- import com.ghgande.j2mod.modbus.msg.ReadCoilsResponse;
- import com.ghgande.j2mod.modbus.msg.ReadMultipleRegistersRequest;
- import com.ghgande.j2mod.modbus.msg.ReadMultipleRegistersResponse;
- import com.ghgande.j2mod.modbus.msg.WriteMultipleCoilsRequest;
- import com.ghgande.j2mod.modbus.msg.WriteMultipleCoilsResponse;
- import com.ghgande.j2mod.modbus.msg.WriteMultipleRegistersRequest;
- import com.ghgande.j2mod.modbus.msg.WriteMultipleRegistersResponse;
- import com.ghgande.j2mod.modbus.net.TCPMasterConnection;
- import com.ghgande.j2mod.modbus.procimg.SimpleRegister;
- public class ModbusSample {
- public static void main(String[] args) {
- InetAddress address=null;
- TCPMasterConnection connection=null;
- try {
- //接続処理
- address = InetAddress.getByName(“127.0.0.1”);
- connection = new TCPMasterConnection(address);
- connection.setPort(502);
- connection.connect();
- System.out.println(“connect”);
- ModbusTCPTransaction transaction =
- new ModbusTCPTransaction(connection);
- //アドレス等
- int ref = Integer.parseInt(“0000”,16);
- int count = 3;
- int unitId = 1;
- //Discrete Output 書き込み ==============================
- WriteMultipleCoilsRequest writeMultipleCoilsRequest =
- new WriteMultipleCoilsRequest(ref,count);
- //書き込みデータの準備
- writeMultipleCoilsRequest.setUnitID(unitId);
- writeMultipleCoilsRequest.setCoilStatus(0, true);
- writeMultipleCoilsRequest.setCoilStatus(1, false);
- writeMultipleCoilsRequest.setCoilStatus(2, true);
- writeMultipleCoilsRequest.setCoilStatus(3, false);
- //リクエスト送信
- transaction.setRequest(writeMultipleCoilsRequest);
- transaction.execute();
- //書き込み結果受信
- WriteMultipleCoilsResponse writeMultipleCoilsResponse =
- (WriteMultipleCoilsResponse) transaction.getResponse();
- if (writeMultipleCoilsResponse!=null) {
- System.out.println(“DiscreteOutput Write:” +
- writeMultipleCoilsResponse.getHexMessage());
- }
- //Discrete Output 読み込み ==============================
- ReadCoilsRequest readCoilsRequest =
- new ReadCoilsRequest(ref,count);
- //リクエスト送信
- readCoilsRequest.setUnitID(unitId);
- transaction.setRequest(readCoilsRequest);
- transaction.execute();
- //読込み結果受信
- ReadCoilsResponse readCoilsResponse =
- (ReadCoilsResponse)transaction.getResponse();
- if (readCoilsResponse!=null) {
- for (int i=0; i < readCoilsResponse.getBitCount(); i++) {
- System.out.println(“DiscreteOutput Read “ + i + “:” +
- readCoilsResponse.getCoilStatus(i));
- }
- }
- //Holding Register 書き込み ==============================
- //書き込みデータの準備
- SimpleRegister[] simpleRegisters = new SimpleRegister[3];
- for (int i=0; i < simpleRegisters.length; i++) {
- simpleRegisters[i]=new SimpleRegister((i+1)*100);
- }
- WriteMultipleRegistersRequest writeMultipleRegistersRequest =
- new WriteMultipleRegistersRequest(ref,simpleRegisters);
- //リクエスト送信
- writeMultipleRegistersRequest.setUnitID(unitId);
- transaction.setRequest(writeMultipleRegistersRequest);
- transaction.execute();
- //書き込み結果受信
- WriteMultipleRegistersResponse writeMultipleRegistersResponse =
- (WriteMultipleRegistersResponse) transaction.getResponse();
- if (writeMultipleRegistersResponse!=null) {
- System.out.println(“HoldingRegister Write:” + writeMultipleCoilsResponse.getHexMessage());
- }
- //Holding Register 読み込み ==============================
- ReadMultipleRegistersRequest readMultipleRegistersRequest =
- new ReadMultipleRegistersRequest(ref,count);
- //リクエスト送信
- readMultipleRegistersRequest.setUnitID(unitId);
- transaction.setRequest(readMultipleRegistersRequest);
- transaction.execute();
- //読込み結果受信
- ReadMultipleRegistersResponse readMultipleRegistersResponse =
- (ReadMultipleRegistersResponse)transaction.getResponse();
- if (readMultipleRegistersResponse!=null) {
- for (int i=0; i < readMultipleRegistersResponse.getWordCount(); i++) {
- System.out.println(“HoldingRegister Read “ + i + “:” +
- readMultipleRegistersResponse.getRegisterValue(i));
- }
- }
- } catch (Exception e) {
- e.printStackTrace();
- } finally {
- //切断処理
- if (connection!=null) connection.close();
- System.out.println(“close”);
- }
- }
- }
このプログラムの出力結果は、以下のようになります。
- connect
- DiscreteOutput Write:00 00 00 00 00 06 01 0f 00 00 00 03
- DiscreteOutput Read 0:true
- DiscreteOutput Read 1:false
- DiscreteOutput Read 2:true
- DiscreteOutput Read 3:false
- DiscreteOutput Read 4:false
- DiscreteOutput Read 5:false
- DiscreteOutput Read 6:false
- DiscreteOutput Read 7:false
- HoldingRegister Write:00 00 00 00 00 06 01 0f 00 00 00 03
- HoldingRegister Read 0:100
- HoldingRegister Read 1:200
- HoldingRegister Read 2:300
- close
まとめ
この記事では、Modbus/TCPプロトコル通信 Javaプログラムのサンプルをご紹介しました。
見知らぬ分野に手を出してみるのも、意外と楽しいもんですね。
見知らぬ分野のプログラムを組めるのはまぁ楽しいんですけど、これが仕事となると、こりゃまた不安でいっぱいだったりします。
僕と同じように、「Modbus/TCP通信をJavaで作んないといけないんだけど、日本語のサンプルが少なくて、困るー!!」って方がいたら、
参考にしてくださいね。
僕は、英語が苦手で、サンプル作るだけでも、めっちゃ苦労しました^^;
コメント