1

我试图了解 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();

非常感谢任何帮助。您能否告诉我在哪里可以找到有关此框架的更多信息?

4

1 回答 1

1

我正在使用 PLC4x 中的 modbus 驱动程序成功读写。我在您的其他问题中附加了一些编写代码:Plc4x 寻址系统

关于阅读,这里有一些代码:

  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,我需要深入研究源代码。它可以工作,但您需要阅读源代码以了解其当前状态的详细信息。

于 2019-12-16T07:05:27.863 回答