質問

MODBUSへの書き込みにJAMODを使用した場合、

私は好奇心旺盛な状況に出くわしました。以下の読み取りコードは完璧に動作します:

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をサポートして働いていることを知っています。

私はまた、レジスタを書くために、生のソケットテスターを書き、私の知る限り、それは正常に動作します。しかし、それは両方の状況でJAMODを使用するとよいでしょう。

誰もがJAMODを使って誰でも経験を持っていて、その一つが親切にも私が間違ってやって伝えることでしょうか?これはJAMODの1.1と1.2rc1バージョンの両方で発生します。それともこれは、いくつかのベンダー固有の状況可能性がありますか?

役に立ちましたか?

解決

私は自分のModbusの実装を書いて終わり。実装が簡単だったので、私は、2つの異なる機能コードをサポートするために必要な。

私は後でJava用の別のオープンソースのModbusライブラリを見つけましたが。私は他の誰かを助けるかもしれない modbus4jするを使用して、同じ問題に遭遇ます。

他のヒント

のModbus要求は、デフォルトではユニットID = 0を持っています。だから、他のIDは、例えばを要求するように設定する必要があります。

WriteCoilRequest writeCoilRequest = new WriteCoilRequest(ref, bool);
writeCoilRequest.setUnitID(unitid);

あなたが質問で説明したのと同じ問題を解決しようとすると、数時間を無駄にします。

私はあなたの質問の作品をもとに書いた

私の方法!

try {
            ModbusTCPTransaction trans = null; // the transaction

            String refe = "0";// HEX Address
            int ref = Integer.parseInt(refe, 16);// Hex to int
            // int count = 1; // the number Address to read

            ReadMultipleRegistersRequest ainReq = new ReadMultipleRegistersRequest(
                    ref, count);
            ReadMultipleRegistersResponse ainRes = new ReadMultipleRegistersResponse();

            // 3. Start Transaction
            trans = new ModbusTCPTransaction(con);
            trans.setRetries(5);
            trans.setReconnecting(true);
            trans.setRequest(ainReq);

            int k = 0;
            do {
                trans.execute();
                ainRes = (ReadMultipleRegistersResponse) trans.getResponse();
                Register reg = new SimpleRegister(ertekInt);
                WriteMultipleRegistersRequest request = new WriteMultipleRegistersRequest(0,
                        new Register[]{reg});
                System.out.println("Állított AOUT:  " + request.getRegisterValue(k));
                lista.add(createPlanet("AOUT",
                        "" + k + "    " + request.getRegisterValue(k)));
                k++;
            } while (k < count);
} catch (ModbusIOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (ModbusSlaveException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (ModbusException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

私は、コイルレジスタとして「デバイスジョブ」で定義されたレジスタに値を書き込むしようとしていた、同様の問題がありました。だから私は使用します:

WriteCoilRequest coil_req = new WriteCoilRequest(registerReference,value2write)

、それが問題を解決しました。たぶん、このヘルプます。

さようなら!

私は、Android上でこの問題が発生しています。

それは、外部機器からの応答を待つように、このタスクは、いくつかのかなりの時間がかかることがありますので、私が見つけた解決策は、別のスレッドに書き込み、読み出しを実行するために、

だった。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top