在使用 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 请求的单元 id = 0。因此,必须将任何其他 id 设置为请求,例如:
WriteCoilRequest writeCoilRequest = new WriteCoilRequest(ref, bool);
writeCoilRequest.setUnitID(unitid);
浪费了几个小时试图解决您在问题中描述的相同问题。
关于java - 使用 Jamod 写入 modbus,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1840913/