我用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这个问题。

由于它等待来自外部设备的响应此任务可能需要一些时间显著,我发现该溶液在另一个线程来执行写入和读出。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top