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);
}