You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@plc4x.apache.org by ac...@apache.org on 2020/02/24 14:47:53 UTC
[plc4x] branch rel/0.6 updated: - Introduced a new optional
"slaveId" parameter to the modbus driver
This is an automated email from the ASF dual-hosted git repository.
acs pushed a commit to branch rel/0.6
in repository https://gitbox.apache.org/repos/asf/plc4x.git
The following commit(s) were added to refs/heads/rel/0.6 by this push:
new 190e20c - Introduced a new optional "slaveId" parameter to the modbus driver
190e20c is described below
commit 190e20c7ed32076dc2cd856655735fa9ca1ed91c
Author: Christofer Dutz <ch...@c-ware.de>
AuthorDate: Thu Dec 5 13:54:34 2019 +0100
- Introduced a new optional "slaveId" parameter to the modbus driver
---
.../java/modbus/connection/BaseModbusPlcConnection.java | 10 ++++++++++
.../java/modbus/connection/ModbusTcpPlcConnection.java | 2 +-
.../apache/plc4x/java/modbus/ModbusPlcDriverTest.java | 9 +++++++++
.../plc4x/java/modbus/netty/Plc4XModbusProtocol.java | 16 +++++++++-------
.../plc4x/java/modbus/netty/Plc4XModbusProtocolTest.java | 2 +-
5 files changed, 30 insertions(+), 9 deletions(-)
diff --git a/plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus/connection/BaseModbusPlcConnection.java b/plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus/connection/BaseModbusPlcConnection.java
index 713acd5..bac1c38 100644
--- a/plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus/connection/BaseModbusPlcConnection.java
+++ b/plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus/connection/BaseModbusPlcConnection.java
@@ -36,6 +36,9 @@ public abstract class BaseModbusPlcConnection extends NettyPlcConnection impleme
private static final Logger logger = LoggerFactory.getLogger(BaseModbusPlcConnection.class);
+ // This slaveId defaults to 0 which is a broadcast.
+ private short slaveId = 0;
+
BaseModbusPlcConnection(ChannelFactory channelFactory, String params) {
super(channelFactory);
@@ -46,6 +49,9 @@ public abstract class BaseModbusPlcConnection extends NettyPlcConnection impleme
if (paramElements.length == 2) {
String paramValue = paramElements[1];
switch (paramName) {
+ case "slaveId": {
+ slaveId = Short.parseShort(paramValue);
+ }
default:
logger.debug("Unknown parameter {} with value {}", paramName, paramValue);
}
@@ -104,4 +110,8 @@ public abstract class BaseModbusPlcConnection extends NettyPlcConnection impleme
.thenApply(PlcWriteResponse.class::cast);
}
+ public short getSlaveId() {
+ return slaveId;
+ }
+
}
diff --git a/plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus/connection/ModbusTcpPlcConnection.java b/plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus/connection/ModbusTcpPlcConnection.java
index da2c99f..3fb196b 100644
--- a/plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus/connection/ModbusTcpPlcConnection.java
+++ b/plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus/connection/ModbusTcpPlcConnection.java
@@ -69,7 +69,7 @@ public class ModbusTcpPlcConnection extends BaseModbusPlcConnection {
@Override
protected void initChannel(Channel channel) {
channel.pipeline().addLast(new ModbusTcpCodec(new ModbusRequestEncoder(), new ModbusResponseDecoder()));
- channel.pipeline().addLast(new Plc4XModbusProtocol());
+ channel.pipeline().addLast(new Plc4XModbusProtocol(getSlaveId()));
channel.pipeline().addLast(new SingleItemToSingleRequestProtocol(ModbusTcpPlcConnection.this, ModbusTcpPlcConnection.this, null, timer, null, false));
}
};
diff --git a/plc4j/drivers/modbus/src/test/java/org/apache/plc4x/java/modbus/ModbusPlcDriverTest.java b/plc4j/drivers/modbus/src/test/java/org/apache/plc4x/java/modbus/ModbusPlcDriverTest.java
index 1e2bb72..cfeface 100644
--- a/plc4j/drivers/modbus/src/test/java/org/apache/plc4x/java/modbus/ModbusPlcDriverTest.java
+++ b/plc4j/drivers/modbus/src/test/java/org/apache/plc4x/java/modbus/ModbusPlcDriverTest.java
@@ -85,6 +85,15 @@ public class ModbusPlcDriverTest {
public void getConnection() throws Exception {
ModbusTcpPlcConnection modbusConnection = (ModbusTcpPlcConnection)
new PlcDriverManager().getConnection("modbus:tcp://localhost:" + tcpHexDumper.getPort());
+ assertThat(modbusConnection.getSlaveId(), is((short) 0));
+ modbusConnection.close();
+ }
+
+ @Test
+ public void getConnectionWithSlaveId() throws Exception {
+ ModbusTcpPlcConnection modbusConnection = (ModbusTcpPlcConnection)
+ new PlcDriverManager().getConnection("modbus:tcp://localhost:" + tcpHexDumper.getPort() + "?slaveId=42");
+ assertThat(modbusConnection.getSlaveId(), is((short) 42));
modbusConnection.close();
}
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 12be747..fe2e832 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
@@ -60,6 +60,12 @@ public class Plc4XModbusProtocol extends MessageToMessageCodec<ModbusTcpPayload,
private final ConcurrentMap<Short, PlcRequestContainer<InternalPlcRequest, InternalPlcResponse>> requestsMap = new ConcurrentHashMap<>();
+ private final short slaveId;
+
+ public Plc4XModbusProtocol(short slaveId) {
+ this.slaveId = slaveId;
+ }
+
@Override
protected void encode(ChannelHandlerContext ctx, PlcRequestContainer<InternalPlcRequest, InternalPlcResponse> msg, List<Object> out) throws Exception {
LOGGER.trace("(<--OUT): {}, {}, {}", ctx, msg, out);
@@ -89,8 +95,6 @@ public class Plc4XModbusProtocol extends MessageToMessageCodec<ModbusTcpPayload,
LOGGER.warn("Supplied number of values [{}] don't match t the addressed quantity of [{}]", field.getQuantity(), quantity);
}
- short unitId = 0;
-
/*
* It seems that in Modbus, there are only two types of resources, that can be accessed:
* - Register: 2 byte value
@@ -163,7 +167,7 @@ public class Plc4XModbusProtocol extends MessageToMessageCodec<ModbusTcpPayload,
}
short transactionId = (short) this.transactionId.getAndIncrement();
requestsMap.put(transactionId, msg);
- out.add(new ModbusTcpPayload(transactionId, unitId, modbusRequest));
+ out.add(new ModbusTcpPayload(transactionId, slaveId, modbusRequest));
}
private void encodeReadRequest(PlcRequestContainer<InternalPlcRequest, InternalPlcResponse> msg, List<Object> out) throws PlcException {
@@ -178,8 +182,6 @@ public class Plc4XModbusProtocol extends MessageToMessageCodec<ModbusTcpPayload,
ModbusField field = (ModbusField) request.getField(fieldName);
int quantity = field.getQuantity();
- // TODO: the unit the should be used for multiple Requests
- short unitId = 0;
ModbusPdu modbusRequest;
if (field instanceof CoilModbusField) {
@@ -202,7 +204,7 @@ public class Plc4XModbusProtocol extends MessageToMessageCodec<ModbusTcpPayload,
}
short transactionId = (short) this.transactionId.getAndIncrement();
requestsMap.put(transactionId, msg);
- out.add(new ModbusTcpPayload(transactionId, unitId, modbusRequest));
+ out.add(new ModbusTcpPayload(transactionId, slaveId, modbusRequest));
}
@SuppressWarnings("unchecked")
@@ -523,4 +525,4 @@ public class Plc4XModbusProtocol extends MessageToMessageCodec<ModbusTcpPayload,
}
return new DefaultModbusByteArrayFieldItem(data.toArray(new Byte[0][0]));
}
-}
+}
\ No newline at end of file
diff --git a/plc4j/protocols/modbus/src/test/java/org/apache/plc4x/java/modbus/netty/Plc4XModbusProtocolTest.java b/plc4j/protocols/modbus/src/test/java/org/apache/plc4x/java/modbus/netty/Plc4XModbusProtocolTest.java
index a746a23..30b37a2 100644
--- a/plc4j/protocols/modbus/src/test/java/org/apache/plc4x/java/modbus/netty/Plc4XModbusProtocolTest.java
+++ b/plc4j/protocols/modbus/src/test/java/org/apache/plc4x/java/modbus/netty/Plc4XModbusProtocolTest.java
@@ -158,7 +158,7 @@ public class Plc4XModbusProtocolTest {
@Before
public void setUp() {
- SUT = new Plc4XModbusProtocol();
+ SUT = new Plc4XModbusProtocol((short) 1);
}
@Test