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']