You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@plc4x.apache.org by sr...@apache.org on 2018/06/28 15:32:42 UTC

[incubator-plc4x] branch master updated (a643829 -> a7cc186)

This is an automated email from the ASF dual-hosted git repository.

sruehl pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-plc4x.git.


    from a643829  modbus consume error messages
     new ff9aa2d  implemented getSize() on WriteRequestItem method analog to ReadRequestItem
     new 3e2585d  disolved quantity in favor of size attribute of PlcRead and PlcWrite Request.
     new a7cc186  modbus: added some logging and pdu todo

The 3 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../java/api/messages/items/WriteRequestItem.java  |  4 ++
 .../modbus/connection/BaseModbusPlcConnection.java | 16 ++----
 ...ngleCoilModbusAddress.java => CoilAddress.java} | 10 ++--
 .../java/modbus/model/MultiModbusAddress.java      | 66 ----------------------
 .../java/modbus/model/ReadCoilsModbusAddress.java  | 44 ---------------
 .../model/ReadDiscreteInputsModbusAddress.java     | 11 ++--
 .../model/ReadHoldingRegistersModbusAddress.java   | 11 ++--
 .../model/ReadInputRegistersModbusAddress.java     | 11 ++--
 ...sterModbusAddress.java => RegisterAddress.java} | 11 ++--
 .../model/WriteMultipleCoilsModbusAddress.java     | 44 ---------------
 .../model/WriteMultipleRegistersModbusAddress.java | 43 --------------
 .../java/modbus/netty/Plc4XModbusProtocol.java     | 66 +++++++++++++---------
 .../plc4x/java/modbus/ManualPlc4XModbusTest.java   |  9 ++-
 13 files changed, 81 insertions(+), 265 deletions(-)
 rename plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/model/{WriteSingleCoilModbusAddress.java => CoilAddress.java} (80%)
 delete mode 100644 plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/model/MultiModbusAddress.java
 delete mode 100644 plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/model/ReadCoilsModbusAddress.java
 rename plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/model/{WriteSingleRegisterModbusAddress.java => RegisterAddress.java} (80%)
 delete mode 100644 plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/model/WriteMultipleCoilsModbusAddress.java
 delete mode 100644 plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/model/WriteMultipleRegistersModbusAddress.java


[incubator-plc4x] 03/03: modbus: added some logging and pdu todo

Posted by sr...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

sruehl pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-plc4x.git

commit a7cc186b1ce2d14869399bf3ad39cc3a89e8ff7c
Author: Sebastian Rühl <sr...@apache.org>
AuthorDate: Thu Jun 28 17:32:35 2018 +0200

    modbus: added some logging and pdu todo
---
 .../org/apache/plc4x/java/modbus/netty/Plc4XModbusProtocol.java  | 9 +++++++++
 1 file changed, 9 insertions(+)

diff --git a/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/netty/Plc4XModbusProtocol.java b/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/netty/Plc4XModbusProtocol.java
index 9dd4e14..6a4a2aa 100644
--- a/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/netty/Plc4XModbusProtocol.java
+++ b/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/netty/Plc4XModbusProtocol.java
@@ -105,6 +105,7 @@ public class Plc4XModbusProtocol extends MessageToMessageCodec<ModbusTcpPayload,
         // TODO: support multiple requests
         ReadRequestItem<?> readRequestItem = request.getRequestItem().get();
         int quantity = readRequestItem.getSize();
+        // TODO: the unit the should be used for multiple Requests
         short unitId = 0;
 
         ModbusAddress address = (ModbusAddress) readRequestItem.getAddress();
@@ -153,22 +154,27 @@ public class Plc4XModbusProtocol extends MessageToMessageCodec<ModbusTcpPayload,
         if (modbusPdu instanceof WriteMultipleCoilsResponse) {
             // TODO: finish implementation
             WriteMultipleCoilsResponse writeMultipleCoilsResponse = (WriteMultipleCoilsResponse) modbusPdu;
+            LOGGER.debug("{}: address:{}, quantity:{}", writeMultipleCoilsResponse, writeMultipleCoilsResponse.getAddress(), writeMultipleCoilsResponse.getQuantity());
             plcRequestContainer.getResponseFuture().complete(new PlcWriteResponse((PlcWriteRequest) request, new WriteResponseItem<>((WriteRequestItem<? extends Object>) requestItem, ResponseCode.OK)));
         } else if (modbusPdu instanceof WriteMultipleRegistersResponse) {
             // TODO: finish implementation
             WriteMultipleRegistersResponse writeMultipleRegistersResponse = (WriteMultipleRegistersResponse) modbusPdu;
+            LOGGER.debug("{}: address:{}, quantity:{}", writeMultipleRegistersResponse, writeMultipleRegistersResponse.getAddress(), writeMultipleRegistersResponse.getQuantity());
             plcRequestContainer.getResponseFuture().complete(new PlcWriteResponse((PlcWriteRequest) request, new WriteResponseItem<>((WriteRequestItem<? extends Object>) requestItem, ResponseCode.OK)));
         } else if (modbusPdu instanceof WriteSingleCoilResponse) {
             // TODO: finish implementation
             WriteSingleCoilResponse writeSingleCoilResponse = (WriteSingleCoilResponse) modbusPdu;
+            LOGGER.debug("{}: address:{}, value:{}", writeSingleCoilResponse, writeSingleCoilResponse.getAddress(), writeSingleCoilResponse.getValue());
             plcRequestContainer.getResponseFuture().complete(new PlcWriteResponse((PlcWriteRequest) request, new WriteResponseItem<>((WriteRequestItem<? extends Object>) requestItem, ResponseCode.OK)));
         } else if (modbusPdu instanceof WriteSingleRegisterResponse) {
             // TODO: finish implementation
             WriteSingleRegisterResponse writeSingleRegisterResponse = (WriteSingleRegisterResponse) modbusPdu;
+            LOGGER.debug("{}: address:{}, value:{}", writeSingleRegisterResponse, writeSingleRegisterResponse.getAddress(), writeSingleRegisterResponse.getValue());
             plcRequestContainer.getResponseFuture().complete(new PlcWriteResponse((PlcWriteRequest) request, new WriteResponseItem<>((WriteRequestItem<? extends Object>) requestItem, ResponseCode.OK)));
         } else if (modbusPdu instanceof ReadCoilsResponse) {
             // TODO: finish implementation
             ReadCoilsResponse readCoilsResponse = (ReadCoilsResponse) modbusPdu;
+            LOGGER.debug("{}: Nothing", readCoilsResponse);
             ByteBuf byteBuf = readCoilsResponse.getCoilStatus();
             byte[] bytes = new byte[byteBuf.readableBytes()];
             byteBuf.readBytes(bytes);
@@ -176,6 +182,7 @@ public class Plc4XModbusProtocol extends MessageToMessageCodec<ModbusTcpPayload,
         } else if (modbusPdu instanceof ReadDiscreteInputsResponse) {
             // TODO: finish implementation
             ReadDiscreteInputsResponse readDiscreteInputsResponse = (ReadDiscreteInputsResponse) modbusPdu;
+            LOGGER.debug("{}: Nothing", readDiscreteInputsResponse);
             ByteBuf byteBuf = readDiscreteInputsResponse.getInputStatus();
             byte[] bytes = new byte[byteBuf.readableBytes()];
             byteBuf.readBytes(bytes);
@@ -183,6 +190,7 @@ public class Plc4XModbusProtocol extends MessageToMessageCodec<ModbusTcpPayload,
         } else if (modbusPdu instanceof ReadHoldingRegistersResponse) {
             // TODO: finish implementation
             ReadHoldingRegistersResponse readHoldingRegistersResponse = (ReadHoldingRegistersResponse) modbusPdu;
+            LOGGER.debug("{}: Nothing", readHoldingRegistersResponse);
             ByteBuf byteBuf = readHoldingRegistersResponse.getRegisters();
             byte[] bytes = new byte[byteBuf.readableBytes()];
             byteBuf.readBytes(bytes);
@@ -190,6 +198,7 @@ public class Plc4XModbusProtocol extends MessageToMessageCodec<ModbusTcpPayload,
         } else if (modbusPdu instanceof ReadInputRegistersResponse) {
             // TODO: finish implementation
             ReadInputRegistersResponse readInputRegistersResponse = (ReadInputRegistersResponse) modbusPdu;
+            LOGGER.debug("{}: Nothing", readInputRegistersResponse);
             ByteBuf byteBuf = readInputRegistersResponse.getRegisters();
             byte[] bytes = new byte[byteBuf.readableBytes()];
             byteBuf.readBytes(bytes);


[incubator-plc4x] 01/03: implemented getSize() on WriteRequestItem method analog to ReadRequestItem

Posted by sr...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

sruehl pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-plc4x.git

commit ff9aa2dad842677e79aa943f5be18a4ac35fee75
Author: Sebastian Rühl <sr...@apache.org>
AuthorDate: Thu Jun 28 17:00:17 2018 +0200

    implemented getSize() on WriteRequestItem method analog to ReadRequestItem
---
 .../org/apache/plc4x/java/api/messages/items/WriteRequestItem.java    | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/items/WriteRequestItem.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/items/WriteRequestItem.java
index 32c75bd..3acbef5 100644
--- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/items/WriteRequestItem.java
+++ b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/items/WriteRequestItem.java
@@ -39,6 +39,10 @@ public class WriteRequestItem<T> extends RequestItem<T> {
         return values;
     }
 
+    public int getSize() {
+        return values.size();
+    }
+
     @Override
     public boolean equals(Object o) {
         if (this == o) {


[incubator-plc4x] 02/03: disolved quantity in favor of size attribute of PlcRead and PlcWrite Request.

Posted by sr...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

sruehl pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-plc4x.git

commit 3e2585d315993a03742fc56b4f6228719ce90072
Author: Sebastian Rühl <sr...@apache.org>
AuthorDate: Thu Jun 28 17:25:26 2018 +0200

    disolved quantity in favor of size attribute of PlcRead and PlcWrite
    Request.
---
 .../modbus/connection/BaseModbusPlcConnection.java | 16 ++----
 ...ngleCoilModbusAddress.java => CoilAddress.java} | 10 ++--
 .../java/modbus/model/MultiModbusAddress.java      | 66 ----------------------
 .../java/modbus/model/ReadCoilsModbusAddress.java  | 44 ---------------
 .../model/ReadDiscreteInputsModbusAddress.java     | 11 ++--
 .../model/ReadHoldingRegistersModbusAddress.java   | 11 ++--
 .../model/ReadInputRegistersModbusAddress.java     | 11 ++--
 ...sterModbusAddress.java => RegisterAddress.java} | 11 ++--
 .../model/WriteMultipleCoilsModbusAddress.java     | 44 ---------------
 .../model/WriteMultipleRegistersModbusAddress.java | 43 --------------
 .../java/modbus/netty/Plc4XModbusProtocol.java     | 57 ++++++++++---------
 .../plc4x/java/modbus/ManualPlc4XModbusTest.java   |  9 ++-
 12 files changed, 68 insertions(+), 265 deletions(-)

diff --git a/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/connection/BaseModbusPlcConnection.java b/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/connection/BaseModbusPlcConnection.java
index 5c3fcdf..3c65ee6 100644
--- a/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/connection/BaseModbusPlcConnection.java
+++ b/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/connection/BaseModbusPlcConnection.java
@@ -36,7 +36,7 @@ public abstract class BaseModbusPlcConnection extends AbstractPlcConnection impl
     private static final Logger logger = LoggerFactory.getLogger(BaseModbusPlcConnection.class);
 
     protected BaseModbusPlcConnection(ChannelFactory channelFactory, String params) {
-        super(channelFactory );
+        super(channelFactory);
 
         if (!StringUtils.isEmpty(params)) {
             for (String param : params.split("&")) {
@@ -59,22 +59,16 @@ public abstract class BaseModbusPlcConnection extends AbstractPlcConnection impl
     public Address parseAddress(String addressString) {
         if (MaskWriteRegisterModbusAddress.ADDRESS_PATTERN.matcher(addressString).matches()) {
             return MaskWriteRegisterModbusAddress.of(addressString);
-        } else if (ReadCoilsModbusAddress.ADDRESS_PATTERN.matcher(addressString).matches()) {
-            return ReadCoilsModbusAddress.of(addressString);
         } else if (ReadDiscreteInputsModbusAddress.ADDRESS_PATTERN.matcher(addressString).matches()) {
             return ReadDiscreteInputsModbusAddress.of(addressString);
         } else if (ReadHoldingRegistersModbusAddress.ADDRESS_PATTERN.matcher(addressString).matches()) {
             return ReadHoldingRegistersModbusAddress.of(addressString);
         } else if (ReadInputRegistersModbusAddress.ADDRESS_PATTERN.matcher(addressString).matches()) {
             return ReadInputRegistersModbusAddress.of(addressString);
-        } else if (WriteMultipleCoilsModbusAddress.ADDRESS_PATTERN.matcher(addressString).matches()) {
-            return WriteMultipleCoilsModbusAddress.of(addressString);
-        } else if (WriteMultipleRegistersModbusAddress.ADDRESS_PATTERN.matcher(addressString).matches()) {
-            return WriteMultipleRegistersModbusAddress.of(addressString);
-        } else if (WriteSingleCoilModbusAddress.ADDRESS_PATTERN.matcher(addressString).matches()) {
-            return WriteSingleCoilModbusAddress.of(addressString);
-        } else if (WriteSingleRegisterModbusAddress.ADDRESS_PATTERN.matcher(addressString).matches()) {
-            return WriteSingleRegisterModbusAddress.of(addressString);
+        } else if (CoilAddress.ADDRESS_PATTERN.matcher(addressString).matches()) {
+            return CoilAddress.of(addressString);
+        } else if (RegisterAddress.ADDRESS_PATTERN.matcher(addressString).matches()) {
+            return RegisterAddress.of(addressString);
         }
         return null;
     }
diff --git a/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/model/WriteSingleCoilModbusAddress.java b/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/model/CoilAddress.java
similarity index 80%
rename from plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/model/WriteSingleCoilModbusAddress.java
rename to plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/model/CoilAddress.java
index 25cc5cb..fb83da9 100644
--- a/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/model/WriteSingleCoilModbusAddress.java
+++ b/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/model/CoilAddress.java
@@ -23,20 +23,20 @@ import org.apache.plc4x.java.api.exceptions.PlcRuntimeException;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
-public class WriteSingleCoilModbusAddress extends ModbusAddress {
+public class CoilAddress extends ModbusAddress {
 
-    public static final Pattern ADDRESS_PATTERN = Pattern.compile("writesinglecoil:" + MultiModbusAddress.ADDRESS_PATTERN);
+    public static final Pattern ADDRESS_PATTERN = Pattern.compile("coil:" + ModbusAddress.ADDRESS_PATTERN);
 
-    protected WriteSingleCoilModbusAddress(int address) {
+    protected CoilAddress(int address) {
         super(address);
     }
 
-    public static WriteSingleCoilModbusAddress of(String addressString) {
+    public static CoilAddress of(String addressString) {
         Matcher matcher = ADDRESS_PATTERN.matcher(addressString);
         if (!matcher.matches()) {
             throw new PlcRuntimeException(addressString + " doesn't match" + ADDRESS_PATTERN);
         }
         int address = Integer.valueOf(matcher.group("address"));
-        return new WriteSingleCoilModbusAddress(address);
+        return new CoilAddress(address);
     }
 }
diff --git a/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/model/MultiModbusAddress.java b/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/model/MultiModbusAddress.java
deleted file mode 100644
index 83b4063..0000000
--- a/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/model/MultiModbusAddress.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements.  See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership.  The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License.  You may obtain a copy of the License at
-
-   http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing,
- software distributed under the License is distributed on an
- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- KIND, either express or implied.  See the License for the
- specific language governing permissions and limitations
- under the License.
- */
-package org.apache.plc4x.java.modbus.model;
-
-import java.util.Objects;
-import java.util.regex.Pattern;
-
-public abstract class MultiModbusAddress extends ModbusAddress {
-
-    public static final Pattern ADDRESS_PATTERN = Pattern.compile(ModbusAddress.ADDRESS_PATTERN + "/" + "(?<quantity>\\d+)");
-
-    private final int quantity;
-
-    protected MultiModbusAddress(int address, int quantity) {
-        super(address);
-        this.quantity = quantity;
-    }
-
-    public int getQuantity() {
-        return quantity;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (!(o instanceof MultiModbusAddress)) {
-            return false;
-        }
-        if (!super.equals(o)) {
-            return false;
-        }
-        MultiModbusAddress that = (MultiModbusAddress) o;
-        return quantity == that.quantity;
-    }
-
-    @Override
-    public int hashCode() {
-
-        return Objects.hash(super.hashCode(), quantity);
-    }
-
-    @Override
-    public String toString() {
-        return "MultiModbusAddress{" +
-            "quantity=" + quantity +
-            "} " + super.toString();
-    }
-}
diff --git a/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/model/ReadCoilsModbusAddress.java b/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/model/ReadCoilsModbusAddress.java
deleted file mode 100644
index 88c97d6..0000000
--- a/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/model/ReadCoilsModbusAddress.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements.  See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership.  The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License.  You may obtain a copy of the License at
-
-   http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing,
- software distributed under the License is distributed on an
- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- KIND, either express or implied.  See the License for the
- specific language governing permissions and limitations
- under the License.
- */
-package org.apache.plc4x.java.modbus.model;
-
-import org.apache.plc4x.java.api.exceptions.PlcRuntimeException;
-import org.apache.plc4x.java.api.model.Address;
-
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-public class ReadCoilsModbusAddress extends MultiModbusAddress {
-
-    public static final Pattern ADDRESS_PATTERN = Pattern.compile("readcoils:" + MultiModbusAddress.ADDRESS_PATTERN);
-
-    protected ReadCoilsModbusAddress(int address, int quantity) {
-        super(address, quantity);
-    }
-
-    public static Address of(String addressString) {
-        Matcher matcher = ADDRESS_PATTERN.matcher(addressString);
-        if (!matcher.matches()) {
-            throw new PlcRuntimeException(addressString + " doesn't match" + ADDRESS_PATTERN);
-        }
-        int address = Integer.valueOf(matcher.group("address"));
-        int quantity = Integer.valueOf(matcher.group("quantity"));
-        return new ReadCoilsModbusAddress(address, quantity);
-    }
-}
diff --git a/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/model/ReadDiscreteInputsModbusAddress.java b/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/model/ReadDiscreteInputsModbusAddress.java
index ba85079..2433e26 100644
--- a/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/model/ReadDiscreteInputsModbusAddress.java
+++ b/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/model/ReadDiscreteInputsModbusAddress.java
@@ -23,12 +23,12 @@ import org.apache.plc4x.java.api.exceptions.PlcRuntimeException;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
-public class ReadDiscreteInputsModbusAddress extends MultiModbusAddress {
+public class ReadDiscreteInputsModbusAddress extends ModbusAddress {
 
-    public static final Pattern ADDRESS_PATTERN = Pattern.compile("readdiscreteinputs:" + MultiModbusAddress.ADDRESS_PATTERN);
+    public static final Pattern ADDRESS_PATTERN = Pattern.compile("readdiscreteinputs:" + ModbusAddress.ADDRESS_PATTERN);
 
-    protected ReadDiscreteInputsModbusAddress(int address, int quantity) {
-        super(address, quantity);
+    protected ReadDiscreteInputsModbusAddress(int address) {
+        super(address);
     }
 
     public static ReadDiscreteInputsModbusAddress of(String addressString) {
@@ -37,7 +37,6 @@ public class ReadDiscreteInputsModbusAddress extends MultiModbusAddress {
             throw new PlcRuntimeException(addressString + " doesn't match" + ADDRESS_PATTERN);
         }
         int address = Integer.valueOf(matcher.group("address"));
-        int quantity = Integer.valueOf(matcher.group("quantity"));
-        return new ReadDiscreteInputsModbusAddress(address, quantity);
+        return new ReadDiscreteInputsModbusAddress(address);
     }
 }
diff --git a/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/model/ReadHoldingRegistersModbusAddress.java b/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/model/ReadHoldingRegistersModbusAddress.java
index de7a94b..4d222f8 100644
--- a/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/model/ReadHoldingRegistersModbusAddress.java
+++ b/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/model/ReadHoldingRegistersModbusAddress.java
@@ -23,12 +23,12 @@ import org.apache.plc4x.java.api.exceptions.PlcRuntimeException;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
-public class ReadHoldingRegistersModbusAddress extends MultiModbusAddress {
+public class ReadHoldingRegistersModbusAddress extends ModbusAddress {
 
-    public static final Pattern ADDRESS_PATTERN = Pattern.compile("readholdingregisters:" + MultiModbusAddress.ADDRESS_PATTERN);
+    public static final Pattern ADDRESS_PATTERN = Pattern.compile("readholdingregisters:" + ModbusAddress.ADDRESS_PATTERN);
 
-    protected ReadHoldingRegistersModbusAddress(int address, int quantity) {
-        super(address, quantity);
+    protected ReadHoldingRegistersModbusAddress(int address) {
+        super(address);
     }
 
     public static ReadHoldingRegistersModbusAddress of(String addressString) {
@@ -37,7 +37,6 @@ public class ReadHoldingRegistersModbusAddress extends MultiModbusAddress {
             throw new PlcRuntimeException(addressString + " doesn't match" + ADDRESS_PATTERN);
         }
         int address = Integer.valueOf(matcher.group("address"));
-        int quantity = Integer.valueOf(matcher.group("quantity"));
-        return new ReadHoldingRegistersModbusAddress(address, quantity);
+        return new ReadHoldingRegistersModbusAddress(address);
     }
 }
diff --git a/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/model/ReadInputRegistersModbusAddress.java b/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/model/ReadInputRegistersModbusAddress.java
index e9bd52e..36172ab 100644
--- a/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/model/ReadInputRegistersModbusAddress.java
+++ b/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/model/ReadInputRegistersModbusAddress.java
@@ -23,12 +23,12 @@ import org.apache.plc4x.java.api.exceptions.PlcRuntimeException;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
-public class ReadInputRegistersModbusAddress extends MultiModbusAddress {
+public class ReadInputRegistersModbusAddress extends ModbusAddress {
 
-    public static final Pattern ADDRESS_PATTERN = Pattern.compile("readinputregisters:" + MultiModbusAddress.ADDRESS_PATTERN);
+    public static final Pattern ADDRESS_PATTERN = Pattern.compile("readinputregisters:" + ModbusAddress.ADDRESS_PATTERN);
 
-    protected ReadInputRegistersModbusAddress(int address, int quantity) {
-        super(address, quantity);
+    protected ReadInputRegistersModbusAddress(int address) {
+        super(address);
     }
 
     public static ReadInputRegistersModbusAddress of(String addressString) {
@@ -37,7 +37,6 @@ public class ReadInputRegistersModbusAddress extends MultiModbusAddress {
             throw new PlcRuntimeException(addressString + " doesn't match" + ADDRESS_PATTERN);
         }
         int address = Integer.valueOf(matcher.group("address"));
-        int quantity = Integer.valueOf(matcher.group("quantity"));
-        return new ReadInputRegistersModbusAddress(address, quantity);
+        return new ReadInputRegistersModbusAddress(address);
     }
 }
diff --git a/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/model/WriteSingleRegisterModbusAddress.java b/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/model/RegisterAddress.java
similarity index 80%
rename from plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/model/WriteSingleRegisterModbusAddress.java
rename to plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/model/RegisterAddress.java
index 1612095..69fe451 100644
--- a/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/model/WriteSingleRegisterModbusAddress.java
+++ b/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/model/RegisterAddress.java
@@ -23,20 +23,21 @@ import org.apache.plc4x.java.api.exceptions.PlcRuntimeException;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
-public class WriteSingleRegisterModbusAddress extends ModbusAddress {
+// TODO: Default to {@link ReadHoldingRegistersModbusAddress}
+public class RegisterAddress extends ModbusAddress {
 
-    public static final Pattern ADDRESS_PATTERN = Pattern.compile("writesingleregister:" + MultiModbusAddress.ADDRESS_PATTERN);
+    public static final Pattern ADDRESS_PATTERN = Pattern.compile("register:" + ModbusAddress.ADDRESS_PATTERN);
 
-    protected WriteSingleRegisterModbusAddress(int address) {
+    protected RegisterAddress(int address) {
         super(address);
     }
 
-    public static WriteSingleCoilModbusAddress of(String addressString) {
+    public static RegisterAddress of(String addressString) {
         Matcher matcher = ADDRESS_PATTERN.matcher(addressString);
         if (!matcher.matches()) {
             throw new PlcRuntimeException(addressString + " doesn't match" + ADDRESS_PATTERN);
         }
         int address = Integer.valueOf(matcher.group("address"));
-        return new WriteSingleCoilModbusAddress(address);
+        return new RegisterAddress(address);
     }
 }
diff --git a/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/model/WriteMultipleCoilsModbusAddress.java b/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/model/WriteMultipleCoilsModbusAddress.java
deleted file mode 100644
index 142ec83..0000000
--- a/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/model/WriteMultipleCoilsModbusAddress.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements.  See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership.  The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License.  You may obtain a copy of the License at
-
-   http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing,
- software distributed under the License is distributed on an
- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- KIND, either express or implied.  See the License for the
- specific language governing permissions and limitations
- under the License.
- */
-package org.apache.plc4x.java.modbus.model;
-
-import org.apache.plc4x.java.api.exceptions.PlcRuntimeException;
-import org.apache.plc4x.java.api.model.Address;
-
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-public class WriteMultipleCoilsModbusAddress extends MultiModbusAddress {
-
-    public static final Pattern ADDRESS_PATTERN = Pattern.compile("writemultiplecoils:" + MultiModbusAddress.ADDRESS_PATTERN);
-
-    protected WriteMultipleCoilsModbusAddress(int address, int quantity) {
-        super(address, quantity);
-    }
-
-    public static Address of(String addressString) {
-        Matcher matcher = ADDRESS_PATTERN.matcher(addressString);
-        if (!matcher.matches()) {
-            throw new PlcRuntimeException(addressString + " doesn't match" + ADDRESS_PATTERN);
-        }
-        int address = Integer.valueOf(matcher.group("address"));
-        int quantity = Integer.valueOf(matcher.group("quantity"));
-        return new WriteMultipleCoilsModbusAddress(address, quantity);
-    }
-}
diff --git a/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/model/WriteMultipleRegistersModbusAddress.java b/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/model/WriteMultipleRegistersModbusAddress.java
deleted file mode 100644
index 92c120c..0000000
--- a/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/model/WriteMultipleRegistersModbusAddress.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements.  See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership.  The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License.  You may obtain a copy of the License at
-
-   http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing,
- software distributed under the License is distributed on an
- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- KIND, either express or implied.  See the License for the
- specific language governing permissions and limitations
- under the License.
- */
-package org.apache.plc4x.java.modbus.model;
-
-import org.apache.plc4x.java.api.exceptions.PlcRuntimeException;
-
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-public class WriteMultipleRegistersModbusAddress extends MultiModbusAddress {
-
-    public static final Pattern ADDRESS_PATTERN = Pattern.compile("writemultipleregisters:" + MultiModbusAddress.ADDRESS_PATTERN);
-
-    protected WriteMultipleRegistersModbusAddress(int address, int quantity) {
-        super(address, quantity);
-    }
-
-    public static WriteMultipleRegistersModbusAddress of(String addressString) {
-        Matcher matcher = ADDRESS_PATTERN.matcher(addressString);
-        if (!matcher.matches()) {
-            throw new PlcRuntimeException(addressString + " doesn't match" + ADDRESS_PATTERN);
-        }
-        int address = Integer.valueOf(matcher.group("address"));
-        int quantity = Integer.valueOf(matcher.group("quantity"));
-        return new WriteMultipleRegistersModbusAddress(address, quantity);
-    }
-}
diff --git a/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/netty/Plc4XModbusProtocol.java b/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/netty/Plc4XModbusProtocol.java
index b7f89c1..9dd4e14 100644
--- a/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/netty/Plc4XModbusProtocol.java
+++ b/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/netty/Plc4XModbusProtocol.java
@@ -67,30 +67,31 @@ public class Plc4XModbusProtocol extends MessageToMessageCodec<ModbusTcpPayload,
         PlcWriteRequest request = (PlcWriteRequest) msg.getRequest();
         // TODO: support multiple requests
         WriteRequestItem<?> writeRequestItem = request.getRequestItem().get();
+        int quantity = writeRequestItem.getSize();
         short unitId = 0;
 
         ModbusAddress address = (ModbusAddress) writeRequestItem.getAddress();
         ModbusPdu modbusRequest;
-        if (address instanceof WriteMultipleCoilsModbusAddress) {
-            WriteMultipleCoilsModbusAddress writeMultipleCoilsModbusAddress = (WriteMultipleCoilsModbusAddress) address;
-            // TODO: support multivalue
-            byte[] bytesToWrite = (byte[]) writeRequestItem.getValues().get(0);
-            modbusRequest = new WriteMultipleCoilsRequest(writeMultipleCoilsModbusAddress.getAddress(), writeMultipleCoilsModbusAddress.getQuantity(), bytesToWrite);
-        } else if (address instanceof WriteMultipleRegistersModbusAddress) {
-            WriteMultipleRegistersModbusAddress writeMultipleRegistersModbusAddress = (WriteMultipleRegistersModbusAddress) address;
-            // TODO: support multivalue
-            byte[] bytesToWrite = (byte[]) writeRequestItem.getValues().get(0);
-            modbusRequest = new WriteMultipleRegistersRequest(writeMultipleRegistersModbusAddress.getAddress(), writeMultipleRegistersModbusAddress.getQuantity(), bytesToWrite);
-        } else if (address instanceof WriteSingleCoilModbusAddress) {
-            WriteSingleCoilModbusAddress writeSingleCoilModbusAddress = (WriteSingleCoilModbusAddress) address;
-            // TODO: support multivalue
-            boolean booleanToWrite = (Boolean) writeRequestItem.getValues().get(0);
-            modbusRequest = new WriteSingleCoilRequest(writeSingleCoilModbusAddress.getAddress(), booleanToWrite);
-        } else if (address instanceof WriteSingleRegisterModbusAddress) {
-            WriteSingleRegisterModbusAddress writeSingleRegisterModbusAddress = (WriteSingleRegisterModbusAddress) address;
-            // TODO: support multivalue
-            int intToWrite = (Integer) writeRequestItem.getValues().get(0);
-            modbusRequest = new WriteSingleRegisterRequest(writeSingleRegisterModbusAddress.getAddress(), intToWrite);
+        if (address instanceof RegisterAddress) {
+            RegisterAddress registerAddress = (RegisterAddress) address;
+            if (quantity > 1) {
+                // TODO: ensure we have a least quantity * 2 = N bytes
+                byte[] bytesToWrite = (byte[]) writeRequestItem.getValues().get(0);
+                modbusRequest = new WriteMultipleRegistersRequest(registerAddress.getAddress(), quantity, bytesToWrite);
+            } else {
+                int intToWrite = (Integer) writeRequestItem.getValues().get(0);
+                modbusRequest = new WriteSingleRegisterRequest(registerAddress.getAddress(), intToWrite);
+            }
+        } else if (address instanceof CoilAddress) {
+            CoilAddress coilAddress = (CoilAddress) address;
+            if (quantity > 1) {
+                // TODO: ensure we have a least (quantity + 7) / 8 = N bytes
+                byte[] bytesToWrite = (byte[]) writeRequestItem.getValues().get(0);
+                modbusRequest = new WriteMultipleCoilsRequest(coilAddress.getAddress(), quantity, bytesToWrite);
+            } else {
+                boolean booleanToWrite = (Boolean) writeRequestItem.getValues().get(0);
+                modbusRequest = new WriteSingleCoilRequest(coilAddress.getAddress(), booleanToWrite);
+            }
         } else {
             throw new PlcProtocolException("Unsupported address type" + address.getClass());
         }
@@ -103,22 +104,26 @@ public class Plc4XModbusProtocol extends MessageToMessageCodec<ModbusTcpPayload,
         PlcReadRequest request = (PlcReadRequest) msg.getRequest();
         // TODO: support multiple requests
         ReadRequestItem<?> readRequestItem = request.getRequestItem().get();
+        int quantity = readRequestItem.getSize();
         short unitId = 0;
 
         ModbusAddress address = (ModbusAddress) readRequestItem.getAddress();
         ModbusPdu modbusRequest;
-        if (address instanceof ReadCoilsModbusAddress) {
-            ReadCoilsModbusAddress readCoilsModbusAddress = (ReadCoilsModbusAddress) address;
-            modbusRequest = new ReadCoilsRequest(readCoilsModbusAddress.getAddress(), readCoilsModbusAddress.getQuantity());
+        if (address instanceof CoilAddress) {
+            CoilAddress coilAddress = (CoilAddress) address;
+            modbusRequest = new ReadCoilsRequest(coilAddress.getAddress(), quantity);
+        } else if (address instanceof RegisterAddress) {
+            RegisterAddress registerAddress = (RegisterAddress) address;
+            modbusRequest = new ReadHoldingRegistersRequest(registerAddress.getAddress(), quantity);
         } else if (address instanceof ReadDiscreteInputsModbusAddress) {
             ReadDiscreteInputsModbusAddress readDiscreteInputsModbusAddress = (ReadDiscreteInputsModbusAddress) address;
-            modbusRequest = new ReadDiscreteInputsRequest(readDiscreteInputsModbusAddress.getAddress(), readDiscreteInputsModbusAddress.getQuantity());
+            modbusRequest = new ReadDiscreteInputsRequest(readDiscreteInputsModbusAddress.getAddress(), quantity);
         } else if (address instanceof ReadHoldingRegistersModbusAddress) {
             ReadHoldingRegistersModbusAddress readHoldingRegistersModbusAddress = (ReadHoldingRegistersModbusAddress) address;
-            modbusRequest = new ReadHoldingRegistersRequest(readHoldingRegistersModbusAddress.getAddress(), readHoldingRegistersModbusAddress.getQuantity());
+            modbusRequest = new ReadHoldingRegistersRequest(readHoldingRegistersModbusAddress.getAddress(), quantity);
         } else if (address instanceof ReadInputRegistersModbusAddress) {
             ReadInputRegistersModbusAddress readInputRegistersModbusAddress = (ReadInputRegistersModbusAddress) address;
-            modbusRequest = new ReadInputRegistersRequest(readInputRegistersModbusAddress.getAddress(), readInputRegistersModbusAddress.getQuantity());
+            modbusRequest = new ReadInputRegistersRequest(readInputRegistersModbusAddress.getAddress(), quantity);
         } else {
             throw new PlcProtocolException("Unsupported address type" + address.getClass());
         }
diff --git a/plc4j/protocols/modbus/src/test/java/org/apache/plc4x/java/modbus/ManualPlc4XModbusTest.java b/plc4j/protocols/modbus/src/test/java/org/apache/plc4x/java/modbus/ManualPlc4XModbusTest.java
index 11b0586..bff08d6 100644
--- a/plc4j/protocols/modbus/src/test/java/org/apache/plc4x/java/modbus/ManualPlc4XModbusTest.java
+++ b/plc4j/protocols/modbus/src/test/java/org/apache/plc4x/java/modbus/ManualPlc4XModbusTest.java
@@ -32,21 +32,21 @@ import java.util.concurrent.CompletableFuture;
 
 public class ManualPlc4XModbusTest {
 
-    public static void main(String... args) throws Exception {
+    public static void main(String... args) {
         String connectionUrl;
         if (args.length > 0 && "serial".equalsIgnoreCase(args[0])) {
             System.out.println("Using serial");
             connectionUrl = "modbus:serial:///dev/ttys003";
         } else {
             System.out.println("Using tcp");
-            connectionUrl = "modbus:tcp://10.10.64.10";
+            connectionUrl = "modbus:tcp://localhost:5440";
         }
         try (PlcConnection plcConnection = new PlcDriverManager().getConnection(connectionUrl)) {
             System.out.println("PlcConnection " + plcConnection);
 
             PlcReader reader = plcConnection.getReader().orElseThrow(() -> new RuntimeException("No Reader found"));
 
-            Address address = plcConnection.parseAddress("readcoils:1/0");
+            Address address = plcConnection.parseAddress("register:2");
             CompletableFuture<TypeSafePlcReadResponse<byte[]>> response = reader
                 .read(new TypeSafePlcReadRequest<>(byte[].class, address));
             TypeSafePlcReadResponse<byte[]> readResponse = response.get();
@@ -56,6 +56,9 @@ public class ManualPlc4XModbusTest {
             ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
             HexDump.dump(responseItem.getValues().get(0), 0, byteArrayOutputStream, 0);
             responseItem.getValues().stream().map(integer -> "Value: " + byteArrayOutputStream).forEach(System.out::println);
+        } catch (Exception e) {
+            e.printStackTrace();
+            System.exit(1);
         }
         System.exit(0);
     }