当使用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。
我还编写了raw-socket tester来编写寄存器,据我所知,它可以正常工作。但在两种情况下使用jamod都会很好。
有没有人有任何使用过jamod的经历,那个人会不会说出我做错了什么?这种情况发生在1.1和1.2rc1版本的jamod上。或者这可能是特定于供应商的情况?
答案 0 :(得分:2)
最后我写了自己的modbus实现。我只需要支持2个不同的功能代码,因此实现很简单。
虽然后来我发现了另一个用于java的开源modbus库。我有其他人使用modbus4j遇到同样的问题可能会有所帮助。
答案 1 :(得分:1)
默认情况下,Modbus请求的单位ID = 0。因此,任何其他id必须设置为request,例如:
fragmentpageradapter
浪费了几个小时试图解决你在问题中描述的同样问题。
答案 2 :(得分:0)
我根据你的问题编写的方法有效!
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();
}
答案 3 :(得分:0)
我遇到了类似的问题,我试图在“设备作业”中定义的寄存器中写入一个值作为线圈寄存器。所以我用过:
WriteCoilRequest coil_req = new WriteCoilRequest(registerReference,value2write)
这解决了这个问题。也许这有帮助。
再见!
答案 4 :(得分:0)
我在Android上遇到过这个问题。
因为这个任务在等待来自外部设备的响应时可能需要一些时间,所以我找到的解决方案是在另一个线程中执行写入和读取。