You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@plc4x.apache.org by hu...@apache.org on 2021/08/17 20:47:47 UTC

[plc4x] 02/02: Checked modbus-rtu package, updated mspec

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

hutcheb pushed a commit to branch feature/modbusrtu
in repository https://gitbox.apache.org/repos/asf/plc4x.git

commit 27f6a9aa2e996ed263abf822e41dc2e7dfb01e46
Author: hutcheb <hu...@apache.org>
AuthorDate: Wed Aug 18 06:46:39 2021 +1000

    Checked modbus-rtu package, updated mspec
---
 plc4j/drivers/modbus/pom.xml                       | 16 ++++
 .../plc4x/java/modbus_rtu/ModbusRTUDriver.java     |  6 +-
 .../protocol/ModbusRTUProtocolLogic.java           |  6 +-
 .../plc4x/java/modbus_rtu/utils/StaticHelper.java  | 86 ++++++++++++++++++++++
 .../services/org.apache.plc4x.java.api.PlcDriver   |  1 +
 .../main/resources/protocols/modbus/modbus.mspec   |  3 +-
 6 files changed, 112 insertions(+), 6 deletions(-)

diff --git a/plc4j/drivers/modbus/pom.xml b/plc4j/drivers/modbus/pom.xml
index 57e007f..bab886e 100644
--- a/plc4j/drivers/modbus/pom.xml
+++ b/plc4j/drivers/modbus/pom.xml
@@ -98,6 +98,22 @@
         </configuration>
       </plugin>
       <plugin>
+        <groupId>org.apache.felix</groupId>
+        <artifactId>maven-bundle-plugin</artifactId>
+        <extensions>true</extensions>
+        <configuration>
+          <instructions>
+            <Bundle-SymbolicName>${project.groupId}.${project.artifactId}</Bundle-SymbolicName>
+            <Bundle-Activator>org.apache.plc4x.java.osgi.DriverActivator</Bundle-Activator>
+            <Export-Service>org.apache.plc4x.java.api.PlcDriver,org.apache.plc4x.java.modbus_rtu.ModbusRTUDriver</Export-Service>
+            <Import-Package>
+              com.fasterxml.jackson.annotation;resolution:=optional,
+              *
+            </Import-Package>
+          </instructions>
+        </configuration>
+      </plugin>
+      <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-dependency-plugin</artifactId>
         <configuration>
diff --git a/plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus_rtu/ModbusRTUDriver.java b/plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus_rtu/ModbusRTUDriver.java
index a8ede08..16ba73f 100644
--- a/plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus_rtu/ModbusRTUDriver.java
+++ b/plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus_rtu/ModbusRTUDriver.java
@@ -48,7 +48,7 @@ public class ModbusRTUDriver extends GeneratedDriverBase<ModbusSerialADU> {
 
     @Override
     public String getProtocolName() {
-        return "ModbusRTU";
+        return "Modbus RTU";
     }
 
     @Override
@@ -118,8 +118,8 @@ public class ModbusRTUDriver extends GeneratedDriverBase<ModbusSerialADU> {
     public static class ByteLengthEstimator implements ToIntFunction<ByteBuf> {
         @Override
         public int applyAsInt(ByteBuf byteBuf) {
-            if (byteBuf.readableBytes() >= 6) {
-                return byteBuf.getUnsignedShort(byteBuf.readerIndex() + 4) + 6;
+            if (byteBuf.readableBytes() >= 3) {
+                return byteBuf.getUnsignedByte(byteBuf.readerIndex() + 2) + 5;
             }
             return -1;
         }
diff --git a/plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus_rtu/protocol/ModbusRTUProtocolLogic.java b/plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus_rtu/protocol/ModbusRTUProtocolLogic.java
index 204441c..457c699 100644
--- a/plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus_rtu/protocol/ModbusRTUProtocolLogic.java
+++ b/plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus_rtu/protocol/ModbusRTUProtocolLogic.java
@@ -54,6 +54,8 @@ import java.util.*;
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.atomic.AtomicInteger;
 
+import static org.apache.plc4x.java.modbus_rtu.utils.StaticHelper.calculateChecksum;
+
 public class ModbusRTUProtocolLogic extends Plc4xProtocolBase<ModbusSerialADU> implements HasConfiguration<ModbusRTUConfiguration> {
 
     private Duration requestTimeout;
@@ -93,7 +95,7 @@ public class ModbusRTUProtocolLogic extends Plc4xProtocolBase<ModbusSerialADU> i
             String fieldName = request.getFieldNames().iterator().next();
             ModbusField field = (ModbusField) request.getField(fieldName);
             final ModbusPDU requestPdu = getReadRequestPdu(field);
-            ModbusSerialADU modbusSerialADU = new ModbusSerialADU(address, requestPdu);
+            ModbusSerialADU modbusSerialADU = new ModbusSerialADU(address, requestPdu, calculateChecksum(address, requestPdu));
 
             RequestTransactionManager.RequestTransaction transaction = tm.startRequest();
             transaction.submit(() -> context.sendRequest(modbusSerialADU)
@@ -187,7 +189,7 @@ public class ModbusRTUProtocolLogic extends Plc4xProtocolBase<ModbusSerialADU> i
             PlcField field = request.getField(fieldName);
             final ModbusPDU requestPdu = getWriteRequestPdu(field, ((DefaultPlcWriteRequest) writeRequest).getPlcValue(fieldName));
 
-            ModbusSerialADU modbusSerialADU = new ModbusSerialADU(address, requestPdu);
+            ModbusSerialADU modbusSerialADU = new ModbusSerialADU(address, requestPdu, calculateChecksum(address, requestPdu));
             RequestTransactionManager.RequestTransaction transaction = tm.startRequest();
             transaction.submit(() -> context.sendRequest(modbusSerialADU)
                 .expectResponse(ModbusSerialADU.class, requestTimeout)
diff --git a/plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus_rtu/utils/StaticHelper.java b/plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus_rtu/utils/StaticHelper.java
new file mode 100644
index 0000000..d4e7758
--- /dev/null
+++ b/plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus_rtu/utils/StaticHelper.java
@@ -0,0 +1,86 @@
+/*
+ * 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_rtu.utils;
+
+import org.apache.commons.lang3.ArrayUtils;
+import org.apache.plc4x.java.api.exceptions.PlcRuntimeException;
+import org.apache.plc4x.java.api.messages.PlcReadRequest;
+import org.apache.plc4x.java.api.messages.PlcReadResponse;
+import org.apache.plc4x.java.api.messages.PlcWriteRequest;
+import org.apache.plc4x.java.api.messages.PlcWriteResponse;
+import org.apache.plc4x.java.api.model.PlcField;
+import org.apache.plc4x.java.api.types.PlcResponseCode;
+import org.apache.plc4x.java.api.value.PlcValue;
+import org.apache.plc4x.java.modbus.field.*;
+import org.apache.plc4x.java.modbus.readwrite.*;
+import org.apache.plc4x.java.modbus.readwrite.io.DataItemIO;
+import org.apache.plc4x.java.modbus.readwrite.io.ModbusPDUIO;
+import org.apache.plc4x.java.modbus.readwrite.types.ModbusDataType;
+import org.apache.plc4x.java.modbus_rtu.config.ModbusRTUConfiguration;
+import org.apache.plc4x.java.spi.ConversationContext;
+import org.apache.plc4x.java.spi.Plc4xProtocolBase;
+import org.apache.plc4x.java.spi.configuration.HasConfiguration;
+import org.apache.plc4x.java.spi.generation.ParseException;
+import org.apache.plc4x.java.spi.generation.ReadBuffer;
+import org.apache.plc4x.java.spi.generation.ReadBufferByteBased;
+import org.apache.plc4x.java.spi.generation.WriteBufferByteBased;
+import org.apache.plc4x.java.spi.messages.DefaultPlcReadRequest;
+import org.apache.plc4x.java.spi.messages.DefaultPlcReadResponse;
+import org.apache.plc4x.java.spi.messages.DefaultPlcWriteRequest;
+import org.apache.plc4x.java.spi.messages.DefaultPlcWriteResponse;
+import org.apache.plc4x.java.spi.messages.utils.ResponseItem;
+import org.apache.plc4x.java.spi.transaction.RequestTransactionManager;
+import org.apache.plc4x.java.spi.values.PlcBOOL;
+import org.apache.plc4x.java.spi.values.PlcList;
+
+import java.time.Duration;
+import java.util.*;
+import java.util.concurrent.CompletableFuture;
+
+public class StaticHelper {
+
+    public static Integer ModbusCRC(byte[] buf, int len)
+    {
+        Integer crc = 0xFFFF;
+        for (int pos = 0; pos < len; pos++) {
+            crc ^= (int)buf[pos];
+            for (int i = 8; i != 0; i--) {
+                if ((crc & 0x0001) != 0) {
+                    crc >>= 1;
+                    crc ^= 0xA001;
+                }
+                else
+                    crc >>= 1;
+            }
+        }
+        return ((crc >> 8) & 0xff) | ((crc & 0xff) << 8);
+    }
+
+    public static Integer calculateChecksum(short address, ModbusPDU pdu) {
+        WriteBufferByteBased buffer = new WriteBufferByteBased(pdu.getLengthInBytes() + 1);
+        try {
+            buffer.writeShort("test", 8, address, null);
+            ModbusPDUIO.staticSerialize(buffer, pdu);
+        } catch (ParseException e) {
+            return -1;
+        }
+        return ModbusCRC(buffer.getData(), buffer.getData().length);
+    }
+
+}
diff --git a/plc4j/drivers/modbus/src/main/resources/META-INF/services/org.apache.plc4x.java.api.PlcDriver b/plc4j/drivers/modbus/src/main/resources/META-INF/services/org.apache.plc4x.java.api.PlcDriver
index abed59a..818f994 100644
--- a/plc4j/drivers/modbus/src/main/resources/META-INF/services/org.apache.plc4x.java.api.PlcDriver
+++ b/plc4j/drivers/modbus/src/main/resources/META-INF/services/org.apache.plc4x.java.api.PlcDriver
@@ -17,3 +17,4 @@
 # under the License.
 #
 org.apache.plc4x.java.modbus.ModbusDriver
+org.apache.plc4x.java.modbus_rtu.ModbusRTUDriver
\ No newline at end of file
diff --git a/protocols/modbus/src/main/resources/protocols/modbus/modbus.mspec b/protocols/modbus/src/main/resources/protocols/modbus/modbus.mspec
index 8995bcb..2d99ee1 100644
--- a/protocols/modbus/src/main/resources/protocols/modbus/modbus.mspec
+++ b/protocols/modbus/src/main/resources/protocols/modbus/modbus.mspec
@@ -52,7 +52,8 @@
     [simple         ModbusPDU   'pdu' ['response']]
 
     //This should be a checksum, not sure the status of the checksum field esp in C and Go
-    [checksum uint 16           'headerChecksum' '100']
+    //[checksum uint 16           'headerChecksum' 'STATIC_CALL("org.apache.plc4x.java.modbus_rtu.utils.StaticHelper.calculateChecksum", readBuffer, _type.encoding)']
+    [simple uint 16 'crc']
 ]
 
 [discriminatedType 'ModbusPDU' [bit 'response']