1

現在、Schneider Power Logic の電気デバイスを使用しています。デバイスからデータを読み取り、システムに値を表示したいと考えています。これまでのところ、J2mod、Jamod、および Modbus4Java ライブラリを発見しました。すべての modbus4java を使用して接続し、デバイスのデータを取得しました。

実際、Master 側と Slave 側のどちらを作成するか、いまだに迷っています。私の理解に基づいて、デバイスはスレーブになり、私のシステムはマスターになります(最初の質問)。

以下はAT MY DEVICEの設定です。スレーブ モードのデバイスとそのプロトコルが Modbus RTU であることを示します。それで、ModbusRTUプロトコルを使用しているマスターアプリと通信するためのマスターアプリを作成する必要がありますか? (2問目)

  • モード: スレーブ
  • プロトコル: Modbus RTU
  • 住所(1
  • ボーレート: 38400
  • パリティ: なし

以下は、マスターとして機能し、ModbusRTU プロトコルを使用する私のアプリのコードです。

public static void main(String[] args) throws ModbusTransportException, ErrorResponseException {
    ModbusFactory factory = new ModbusFactory();  

    SerialParameters params = new SerialParameters();  
    params.setCommPortId("COM6");  
    params.setBaudRate(9600);  
    params.setDataBits(8);  
    params.setStopBits(1);  
    params.setParity(0); 

    ModbusMaster master = factory.createRtuMaster(params);  

    master.setTimeout(1000);  
    master.setRetries(0);  
    long start = System.currentTimeMillis(); 

    try {
        master.init();
    } catch (Exception e) {
        System.out.println( "Modbus Master Init Error: " + e.getMessage());  
          return; 
    }

    try {  
        System.out.println("Reg. 1001 Value:" + master.getValue(1, RegisterRange.HOLDING_REGISTER, 3110, DataType.FOUR_BYTE_FLOAT_SWAPPED));  
    }  
    finally {  
        master.destroy();  
    }  

    System.out.println("Time elapsed: " + (System.currentTimeMillis() - start) + "ms"); 
}

これは、Modbus4Java ページで提供されているサンプル コードから取得したコードです。私が気になるもう1つのparams.setCommPortId("COM6");ことは、そこに置くことができる「COM6」以外の値です。基本的に文字列値を受け取るためです。それで、任意の文字列値をそれに入れることができますか? そして、この特定の setCommPortID の機能は何ですか。(3問目)

Modbus4Javaのページで提供されているサンプルコードを見ると、デバイスのIPアドレスが記載されていません。しかし、私の場合、私のデバイスは IP アドレスを取得しました。また、IP アドレスはスレーブ アプリでのみ使用されます。システムはどのようにデバイスの IP アドレスを認識する必要がありますか? (4番目の質問)。

このコード スニペットを実行した後、エラーが発生しました。

安定したライブラリ

ネイティブ ライブラリ バージョン = RXTX-2.1-7

Java lib バージョン = RXTX-2.1-7

Modbus マスター初期化エラー: com.serotonin.io.serial.SerialPortException: gnu.io.NoSuchPortException

どうか、どうか、どうか私を助けてください。私はこれでほぼ1か月立ち往生しています。誰かが私を助けてくれることを本当に願っています。あらゆる種類のヘルプと提案を事前にありがとうございます。

4

1 に答える 1

4

私は j2mod のメンテナーなので、j2mod に含まれているテスト プログラムを確認することをお勧めします。j2mod は、SourceForge の次の URL で見つけることができます --

https://sourceforge.net/projects/j2mod/

私はそこで質問に答えるのが得意ですが、stackoverflow もフォローしているので、ここでも詳しく説明できます。ここにはたくさんの質問がありますので、見落としがありましたらお詫び申し上げます。

Schneider デバイスはスレーブまたは「サーバー」であり、アプリケーションはマスターまたは「クライアント」です。Modbus はマスター/スレーブ プロトコルであり、マスターがすべての要求を開始します。アプリケーションがマスターとなり、デバイスのすべてのリクエストを作成します。

正確な通信は、デバイスのドキュメントによって提供されます。この例では、デバイスが 38400 ボーなどを使用することを示します。これらは、RXTX ライブラリで SerialParameters を更新するために使用するパラメータです (たまたま j2mod でも使用されています)。

setCommPortId() に渡される値は、Windows COM ポート識別子です。実際の COM ポートに関連付けられている任意の値 (「COM1」、「COM2」など) を渡すことができます。一部の USB コンバーターは COM を変更することに注意してください。ポートを使用するたびに、ポート名を追跡している可能性があります。

お使いのデバイスにも IP アドレスがあるとおっしゃいました。RTU クラスとメソッドを使用して Modbus/TCP デバイスにアクセスすることはできません。同じことが jamod と j2mod にも当てはまります。ほとんどの Modbus ライブラリには、RTU と TCP トランスポート用の異なるクラスがあります (これらの他のトランスポートをサポートするライブラリ用の ASCII と UDP だけでなく)。

于 2015-09-13T12:48:18.530 に答える