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/12 08:40:13 UTC

[plc4x] branch develop 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 develop
in repository https://gitbox.apache.org/repos/asf/plc4x.git


The following commit(s) were added to refs/heads/develop by this push:
     new 4958efd  - Introduced a new optional "slaveId" parameter to the modbus driver
4958efd is described below

commit 4958efded6d8dd0274fba5e4d07df253d432a6a4
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 6c3b203..20012d1 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
@@ -44,6 +44,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);
 
@@ -54,6 +57,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);
                     }
@@ -112,4 +118,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 742ecdb..bc1cc2f 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
@@ -68,7 +68,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 18af60c..0d85175 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
@@ -90,6 +90,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);
@@ -119,8 +125,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
@@ -193,7 +197,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 {
@@ -208,8 +212,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) {
@@ -232,7 +234,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")
@@ -557,4 +559,4 @@ public class Plc4XModbusProtocol extends MessageToMessageCodec<ModbusTcpPayload,
         }
         return null;//new DefaultModbusByteArrayPlcValue(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 9582016..97031f9 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
@@ -189,7 +189,7 @@ public class Plc4XModbusProtocolTest {
 
     @Before
     public void setUp() {
-        SUT = new Plc4XModbusProtocol();
+        SUT = new Plc4XModbusProtocol((short) 1);
     }
 
     @Test