Plc4x一次不能读取9个以上的寄存器

时间:2019-12-03 09:30:57

标签: apache-plc4x

我试图了解plac4x java实现中的地址系统。下面是plcs读取代码的示例:

    @Test
    void testReadingFromPlc() {
        // Establish a connection to the plc using the url provided as first argument
        try( PlcConnection plcConnection = new PlcDriverManager().getConnection( "modbus:tcp://1.1.2.1" ) ){
            // Create a new read request:
            // - Give the single item requested the alias name "value"
            var builder = plcConnection.readRequestBuilder();
            builder.addItem( "value-" + 1, "register:1[9]" );
            builder.addItem( "value-" + 2, "coil:1000[8]" );
            var readRequest = builder.build();

            LOGGER.info( "Synchronous request ..." );
            var syncResponse = readRequest.execute().get();
            // Simply iterating over the field names returned in the response.
            var bytes = syncResponse.getAllByteArrays( "value-1" );
            bytes.forEach( item -> System.out.println( TopicsMapping.byteArray2IntegerArray( item )[0] ) );
            var booleans = syncResponse.getAllBooleans( "value-2" );
            booleans.forEach( System.out::println );
        }catch(Exception e){
            e.printStackTrace();
        }
    }

我们的PLC管理16个寄存器,但是地址的正则表达式不允许数量大于9。是否可以更改此值?

此外,如果我尝试添加具有相同目的的其他字段,则不会发生任何读取:

    var builder = plcConnection.readRequestBuilder();
    builder.addItem( "value-" + 0, "register:26[8]" );
    builder.addItem( "value-" + 1, "register:34[8]" );
    builder.addItem( "value-" + 2, "coil:1000[8]" );
    var readRequest = builder.build();

任何帮助,不胜感激。您还可以告诉我在哪里可以找到有关此框架的更多信息吗?

1 个答案:

答案 0 :(得分:0)

我正在使用PLC4x中的modbus驱动程序成功读写。我已在Plc4x addressing system

上向您的其他问题附加了一些编写代码。

关于阅读,下面是一些代码:

  public static PlcReadResponse readModbusTestData(ProtocolClient client,
                                                   String registerName,
                                                   int offset,
                                                   int size,
                                                   String registerType)
    throws ExecutionException, InterruptedException, TimeoutException {

    PlcReadRequest readRequest = client.getConnection().readRequestBuilder()
      .addItem(registerName, registerType + ":" + offset + "[" + size + "]").build();
    return readRequest.execute().get(2, TimeUnit.SECONDS);
  }

我尚未测试将更多项目添加到PlcReadRequest的多次读取,但它应该可以工作。写几个项目是可行的。

无论如何,为了了解PLC4x如何用于modbus或opc-ua,我需要深入研究源代码。它可以工作,但是您需要阅读源代码以了解其当前状态的详细信息。