質問
私は好奇心旺盛な状況に出くわしました。以下の読み取りコードは完璧に動作します:
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上でこの問題が発生しています。
それは、外部機器からの応答を待つように、このタスクは、いくつかのかなりの時間がかかることがありますので、私が見つけた解決策は、別のスレッドに書き込み、読み出しを実行するために、だった。