Hi Julian,

Agreed, regarding an abstract support I started a branch way back ago to solve 
this issue in a generic protocol layer:
https://github.com/apache/incubator-plc4x/tree/feature/TopLevelItemSpliting 
<https://github.com/apache/incubator-plc4x/tree/feature/TopLevelItemSpliting>

Going this way drivers could keep simple like modbus and ads but the thing that 
stopped me back then was the issue of correlation.
As far as I remember you can’t use the MessageToMessageEncoder anymore as 
protocol layer.

Sebastian

> Am 18.09.2018 um 08:32 schrieb Julian Feinauer <[email protected]>:
> 
> Hi Sebastian,
> 
> ah, okay, THIS is a valuable information __
> Perhaps we should think (aside from modbus) more and more about wrappers that 
> add the "full" functionality to partialy implemented drivers.
> In this case for me as the user I do not care if theres one or two roundtrips 
> to the plc, I only care about the API.
> 
> Perhaps this is another interesting topic for Thursday.
> 
> Best
> Julian
> 
> Am 18.09.18, 08:29 schrieb "Sebastian Rühl" 
> <[email protected]>:
> 
>    Hi Julian,
> 
>    Currently I have no idea if the modbus part still works after the 
> refactoring (maybe Chris can help here) [might be disabled at all at time]. 
> Before the register got mapped into the requested java type.
>    Regarding multiple items: like in ads the support for multiple items is 
> currently not implemented so you would require to send a new request:
>    
> https://github.com/apache/incubator-plc4x/blob/master/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/netty/Plc4XModbusProtocol.java#L79
>  
> <https://github.com/apache/incubator-plc4x/blob/master/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/netty/Plc4XModbusProtocol.java#L79>
> 
>    Sebastian
> 
>> Am 18.09.2018 um 08:21 schrieb Julian Feinauer 
>> <[email protected]>:
>> 
>> Hi Sebastian,
>> 
>> thanks for the fast reply, so the 16 bit register can be fetched as byte 
>> array?
>> And if I need two registers (should be a 32 bit value altogether) I put two 
>> items in the builder?
>> 
>> I just looked at our test code from marcel and its like
>> 
>> PlcReadRequest plcReadRequest1 = new PlcReadRequest();
>> //            ReadRequestItem<byte[]> readRequestItem1 = new 
>> ReadRequestItem<>(byte[].class, 
>> ReadInputRegistersModbusAddress.of(ADDRESS_PREFIX + 
>> modbusAddressToKafka.getAddress()), 2);
>> //            plcReadRequest1.addItem(readRequestItem1);
>> //
>> //            CompletableFuture<PlcReadResponse> completableFuture1 = 
>> plcConnection.read(plcReadRequest1);
>> //
>> //            PlcReadResponse plcReadResponse = 
>> completableFuture1.get(TIMEOUT, TimeUnit.MILLISECONDS);
>> //            Optional<ReadResponseItem<byte[]>> ret1 = 
>> plcReadResponse.getValue(readRequestItem1);
>> //            if (ret1.isPresent() && ret1.get().getValues().size() == 2) {
>> //                ByteBuffer byteBuffer = ByteBuffer.allocate(4);
>> //                byteBuffer.put(0, ret1.get().getValues().get(0)[0]);
>> //                byteBuffer.put(1, ret1.get().getValues().get(0)[1]);
>> //                byteBuffer.put(2, ret1.get().getValues().get(1)[0]);
>> //                byteBuffer.put(3, ret1.get().getValues().get(1)[1]);
>> //                return byteBuffer.getInt();
>> //            } else {
>> //                throw new ModbusReadException(TIMEOUT_ERROR_MSG + " " + 
>> modbusAddressToKafka.getAddress());
>> //            }
>> 
>> And I don’t like the byteBuffer part as we as client in this case should not 
>> bother with stuff like that.
>> 
>> So after changing to the new API I build to requests for two subsequent 
>> addresses (named with their address) and do:
>> 
>> ByteBuffer byteBuffer = ByteBuffer.allocate(4);
>> byteBuffer.put(0, 
>> response.getByteArray(Integer.toString(modbusAddressToKafka.getAddress()))[0]);
>> byteBuffer.put(1, 
>> response.getByteArray(Integer.toString(modbusAddressToKafka.getAddress()))[1]);
>> byteBuffer.put(2, 
>> response.getByteArray(Integer.toString(modbusAddressToKafka.getAddress() + 
>> 1))[0]);
>> byteBuffer.put(3, 
>> response.getByteArray(Integer.toString(modbusAddressToKafka.getAddress() + 
>> 1))[1]);
>> return byteBuffer.getInt();
>> 
>> Or is there any simpler approach to this?
>> 
>> Best
>> Julian
>> 
>> Am 18.09.18, 08:08 schrieb "Sebastian Rühl" 
>> <[email protected]>:
>> 
>>   Hi Julian,
>> 
>>   Two bytes would be a register so you could read it like that 
>> („register:7"):
>>   
>> https://github.com/apache/incubator-plc4x/blob/master/plc4j/protocols/modbus/src/test/java/org/apache/plc4x/java/modbus/ManualPlc4XModbusTest.java
>>  
>> <https://github.com/apache/incubator-plc4x/blob/master/plc4j/protocols/modbus/src/test/java/org/apache/plc4x/java/modbus/ManualPlc4XModbusTest.java>
>> 
>>   All in all it seems that this driver is only able to read one 
>> register/coil at a time a would need some work after the refactoring.
>>   Types of addresses can be found here: 
>> https://github.com/apache/incubator-plc4x/tree/master/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/model
>>  
>> <https://github.com/apache/incubator-plc4x/tree/master/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/model>
>> 
>>   Sebastian
>> 
>>> Am 18.09.2018 um 08:01 schrieb Julian Feinauer 
>>> <[email protected]>:
>>> 
>>> Hi all,
>>> 
>>> I am currently migrating some code to the new plc4j API and are a bit 
>>> unsure what to do.
>>> The current code is
>>> 
>>> PlcReadRequest plcReadRequest1 = new PlcReadRequest();
>>> ReadRequestItem<byte[]> readRequestItem1 = new 
>>> ReadRequestItem<>(byte[].class, 
>>> plcConnection.parseAddress(someAddressStringHere), 2);
>>> plcReadRequest1.addItem(readRequestItem1);
>>> 
>>> So we fetch 2 bytes from Modbus.
>>> How do I tell him to fetch an array of length 2 in the new API?
>>> 
>>> Thanks!
>>> Julian
>> 
>> 
>> 
> 
> 
> 

Reply via email to