用Jamod写modbus

时间:2009-12-03 16:04:26

标签: java modbus

当使用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上。或者这可能是特定于供应商的情况?

5 个答案:

答案 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上遇到过这个问题。

因为这个任务在等待来自外部设备的响应时可能需要一些时间,所以我找到的解决方案是在另一个线程中执行写入和读取。