【问题标题】:Plc4x cannot read more than 9 registers at onceplc4x 一次不能读取超过 9 个寄存器
【发布时间】:2019-12-03 09:30:57
【问题描述】:

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

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

【问题讨论】:

    标签: apache-plc4x


    【解决方案1】:

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

    【讨论】:

    • 最近我们也确实在 Modbus 驱动程序上投入了大量时间。在 PLC4X 的 0.8.0 版本中,它应该可以正常工作。
    猜你喜欢
    • 1970-01-01
    • 2019-08-01
    • 2020-07-15
    • 1970-01-01
    • 2017-07-24
    • 2020-12-14
    • 1970-01-01
    • 2020-07-24
    • 1970-01-01
    相关资源
    最近更新 更多