Agreed, just wanted to make sure we not create the abstraction and then lay back and implement drivers the easy way __
Chris Am 18.09.18, 09:02 schrieb "Julian Feinauer" <[email protected]>: Hey, if the protocol supports that we should definetly do it "native". But if not (I can imagine such protocols), we should emulate it. Julian Am 18.09.18, 08:54 schrieb "Christofer Dutz" <[email protected]>: Öhm ... well I think that reading multiple items is ESSENTIAL and all drivers should be able to do this. Especially if the protocol generally allows it. So instead of hiding these shortcomings behind an abstraction layer that adds performance penalties, I think we should fix the drivers. Especially as I already did the hard architectural work in the S7 driver already. Chris Am 18.09.18, 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 > > >
