我正在使用Java中的modbus TCP實現。到目前爲止,我已經嘗試了3個不同的庫,modbus4j,jamod和j2mod。我可以成功地訪問我的從設備與Linux modpoll工具:http://www.modbusdriver.com/modpoll.htmlJava/Android中的Modbus TCP
[email protected]:~/Documents/modbus-test-tool/linux$ ./modpoll -a255 -r1 -1 192.168.1.101
modpoll 3.4 - FieldTalk(tm) Modbus(R) Master Simulator
Copyright (c) 2002-2013 proconX Pty Ltd
Visit http://www.modbusdriver.com for Modbus libraries and tools.
Protocol configuration: MODBUS/TCP
Slave configuration...: address = 255, start reference = 1, count = 1
Communication.........: 192.168.1.101, port 502, t/o 1.00 s, poll rate 1000 ms
Data type.............: 16-bit register, output (holding) register table
-- Polling slave...
[1]: 256
這使我的設備上的障礙上去這是偉大的。但是,在Java實現中工作我無法重現這一點。我嘗試了很多不同的步驟,但都失敗了。在J2mod/jamod中,當使用'255'(這是我在上面的命令中使用的單元ID)時,我不斷得到無效的slaveId錯誤。如果我使用其他任何東西,我會得到一個CRC失敗的錯誤。在mod4j中,我得到各種錯誤,包括錯誤代碼= 4.這是我最新的J2mod代碼,它返回CRC錯誤(如果不是255)或無效的slaveId。我知道slaveId主要用於串行通信,但是當使用其他應用程序時,我的設備僅響應單元ID 255。
Integer value = Integer.decode(val).intValue();
Integer unitID = Integer.decode(uid).intValue();
Integer length = Integer.decode(len).intValue();
Integer ref = Integer.decode(reference).intValue();
SimpleRegister MyReg = new SimpleRegister(value);
try {
InetAddress address;
address = InetAddress.getByName(addr);
//2. Open the connection
TCPMasterConnection con = new TCPMasterConnection(address);
con.setPort(port);
con.connect();
//3. Prepare the requestWrite
WriteSingleRegisterRequest WriteReq = new WriteSingleRegisterRequest(ref,MyReg);
WriteReq.setDataLength(length);
WriteReq.setUnitID(unitID);
//4. Prepare the transaction
ModbusTCPTransaction trans = new ModbusTCPTransaction(con);
trans.setRequest(WriteReq);
trans.setRetries(0);
trans.execute();
Log.d(TAG, "Complete: " +trans.toString());
return trans.getResponse().getHexMessage();
} catch (UnknownHostException e) {
Log.d(TAG, "UnknownHostException: " + e.getMessage());
return e.getMessage();
} catch (Exception e) {
Log.d(TAG,"Exception: " + e.toString());
return e.getMessage();
}
是不是ID 255通常是一個廣播ID?你可以嘗試把奴隸換成別的東西,比如1嗎?實際上,我從來沒有看到任何人使用255作爲Modbus從站地址。不知道這是否會有所幫助,但是您的圖書館中可能有些東西不會喜歡'255'。 – Nanomurf
否,除Modbus/TCP PLCs外,單元0是廣播地址,通常所有通信都使用單元0。唯一的(通常...)例外是當PLC通過網橋連接並且網橋將TCP/IP連接端和其他傳輸端之間的PDU編組時。 –