当使用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.
我还编写了原始套接字测试器来编写寄存器,据我所知,它可以正常工作.但在两种情况下使用jamod会很好.
有没有人有任何人使用jamod的经验,并且那个人是否善意告诉我做错了什么?这种情况发生在1.1和1.2rc1版本的jamod上.或者这可能是特定于供应商的情况?
解决方法:
最后我写了自己的modbus实现.我只需要支持2个不同的功能代码,因此实现很简单.
虽然后来我发现了另一个用于java的开源modbus库.我有其他人遇到同样的问题,使用modbus4j可能有所帮助.