题
我用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 可能的帮助。
其他提示
Modbus请求默认具有单元ID = 0。因此,任何其他ID必须设置为请求,e.g:
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这个问题。
由于它等待来自外部设备的响应此任务可能需要一些时间显著,我发现该溶液在另一个线程来执行写入和读出。
不隶属于 StackOverflow