我正在研究 Java 中的 modbus TCP 实现。到目前为止,我已经尝试了 3 个不同的库 modbus4j、jamod 和 j2mod。我可以使用 linux modpoll 工具成功访问我的从设备:http ://www.modbusdriver.com/modpoll.html
michael@michael-G75VW:~/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”时不断收到无效的 slaveId 错误,这是我在上述命令中使用的单元 ID。如果我使用其他任何东西,我会收到一个 CRC failed 错误。在 mod4j 中,我收到各种错误,包括错误代码 = 4。这是我最新的 J2mod 代码,它返回 CRC 错误(如果不是 255)或无效的 slaveId。我知道 slaveId 主要用于串行通信,但我的设备在使用其他应用程序时只响应 255 的单元 ID。
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();
}