在使用 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/

10-10 19:42