4

jamod を使用して modbus に書き込むときに、奇妙な状況に遭遇しました。次の読み取りコードは完全に機能します。

public static void main(String[] args) throws Exception {
   InetAddress address = InetAddress.getByName("host.somewhere");
   TCPMasterConnection connection = new TCPMasterConnection(address);
   connection.setPort(502);
   connection.connect();
   ReadMultipleRegistersRequest request = new ReadMultipleRegistersRequest(0, 1);
   ReadMultipleRegistersResponse response = (ReadMultipleRegistersResponse)
       executeTransaction(connection, request);
}

private static ModbusResponse executeTransaction(TCPMasterConnection connection,
         ModbusRequest request) 
         throws ModbusIOException, ModbusSlaveException, ModbusException {
   ModbusTCPTransaction transaction = new ModbusTCPTransaction(connection);
   transaction.setRequest(request);
   transaction.execute();
   return transaction.getResponse();
}

しかし、同様の方法で書き込もうとすると失敗します (Jamod は 3 回試行し、そのたびに SocketTimeoutException が発生し、最後に ModbusException をスローします)。

public static void main(String[] args) throws Exception {
    final InetAddress address = InetAddress.getByName("host.somewhere");
    final TCPMasterConnection connection = new TCPMasterConnection(address);
    connection.setPort(502);
    connection.connect();
    Register reg = new SimpleRegister(0);
    WriteMultipleRegistersRequest request = new WriteMultipleRegistersRequest(0,
        new Register[]{reg});
    executeTransaction(connection, request);
}

はい、リクエスト オブジェクトのマルチレジスタ バージョンを使用していることは知っていますが、使用しているデバイスは機能コード 3 と 16 しかサポートしていません。

また、レジスタを書き込むための raw ソケット テスターも作成しました。しかし、両方の状況で jamod を使用すると便利です。

誰かjamodを使用した経験がある人はいますか?私が間違っていることを教えてくれるほど親切でしょうか? これは、jamod の 1.1 および 1.2rc1 バージョンの両方で発生します。それとも、これはおそらくベンダー固有の状況ですか?

4

5 に答える 5

1

最後に、独自の modbus 実装を作成しました。2 つの異なる関数コードをサポートするだけでよかったので、実装は簡単でした。

後でJava用の別のオープンソースmodbusライブラリを見つけましたが. modbus4jを使用して同じ問題に遭遇した人が助けになるかもしれません。

于 2010-03-23T10:22:03.807 に答える
0

Android でこの問題が発生しました。

このタスクは外部デバイスからの応答を待つため、かなりの時間がかかる可能性があるため、別のスレッドで書き込みと読み取りを実行するという解決策を見つけました。

于 2017-06-19T10:53:01.260 に答える