From bece24a69fd2c4a9ae529bd8c3fb1b98d56bf90a Mon Sep 17 00:00:00 2001 From: docbender Date: Tue, 26 Nov 2019 20:54:52 +0100 Subject: [PATCH] When creating the data queue the PDU size is taken into account --- .../META-INF/MANIFEST.MF | 2 +- org.openhab.binding.simatic/pom.xml | 2 +- .../simatic/internal/SimaticBinding.java | 3 +-- .../simatic/internal/SimaticGenericDevice.java | 9 ++++++--- .../internal/SimaticIReadWriteDataArea.java | 3 ++- .../simatic/internal/SimaticReadDataArea.java | 11 ++++++++--- .../binding/simatic/internal/SimaticTCP.java | 7 +++++-- .../simatic/internal/SimaticWriteDataArea.java | 17 +++++++++++------ 8 files changed, 35 insertions(+), 19 deletions(-) diff --git a/org.openhab.binding.simatic/META-INF/MANIFEST.MF b/org.openhab.binding.simatic/META-INF/MANIFEST.MF index aca0e61..144c022 100644 --- a/org.openhab.binding.simatic/META-INF/MANIFEST.MF +++ b/org.openhab.binding.simatic/META-INF/MANIFEST.MF @@ -5,7 +5,7 @@ Bundle-License: http://www.eclipse.org/legal/epl-v10.html Bundle-Name: openHAB Simatic Binding Bundle-SymbolicName: org.openhab.binding.simatic Bundle-Vendor: openHAB.org -Bundle-Version: 1.9.0.qualifier +Bundle-Version: 1.14.0.qualifier Bundle-ManifestVersion: 2 Bundle-Description: This is the Simatic binding of the open Home Aut omation Bus (openHAB) diff --git a/org.openhab.binding.simatic/pom.xml b/org.openhab.binding.simatic/pom.xml index 011d2db..bf738e3 100644 --- a/org.openhab.binding.simatic/pom.xml +++ b/org.openhab.binding.simatic/pom.xml @@ -5,7 +5,7 @@ org.openhab.bundles binding - 1.9.0-SNAPSHOT + 1.14.0-SNAPSHOT diff --git a/org.openhab.binding.simatic/src/main/java/org/openhab/binding/simatic/internal/SimaticBinding.java b/org.openhab.binding.simatic/src/main/java/org/openhab/binding/simatic/internal/SimaticBinding.java index 6cff5bf..cbb356f 100644 --- a/org.openhab.binding.simatic/src/main/java/org/openhab/binding/simatic/internal/SimaticBinding.java +++ b/org.openhab.binding.simatic/src/main/java/org/openhab/binding/simatic/internal/SimaticBinding.java @@ -32,7 +32,7 @@ * like querying a Website/Device. * * @author VitaTucek - * @since 1.9.0 + * @since 1.14.0 */ public class SimaticBinding extends AbstractActiveBinding { @@ -145,7 +145,6 @@ public void activate(final BundleContext bundleContext, final Map item : devices.entrySet()) { item.getValue().setBindingData(eventPublisher, items, infoItems); - item.getValue().prepareData(); item.getValue().open(); } diff --git a/org.openhab.binding.simatic/src/main/java/org/openhab/binding/simatic/internal/SimaticGenericDevice.java b/org.openhab.binding.simatic/src/main/java/org/openhab/binding/simatic/internal/SimaticGenericDevice.java index fff3f92..ef9e61a 100644 --- a/org.openhab.binding.simatic/src/main/java/org/openhab/binding/simatic/internal/SimaticGenericDevice.java +++ b/org.openhab.binding.simatic/src/main/java/org/openhab/binding/simatic/internal/SimaticGenericDevice.java @@ -48,7 +48,7 @@ * Generic device class * * @author Vita Tucek - * @since 1.9.0 + * @since 1.14.0 */ public class SimaticGenericDevice implements SimaticIDevice { private static final Logger logger = LoggerFactory.getLogger(SimaticGenericDevice.class); @@ -81,6 +81,9 @@ public class SimaticGenericDevice implements SimaticIDevice { protected SimaticReadQueue readAreasList = new SimaticReadQueue(); /** try reconnect flag when read/write function failure **/ protected AtomicBoolean tryReconnect = new AtomicBoolean(false); + /** PDU size **/ + protected int pduSize = 0; + public enum ProcessDataResult { OK, @@ -229,7 +232,7 @@ public void reconnectWithDelaying() { @Override public void sendData(String itemName, Command command, SimaticBindingConfig config) { - sendData(SimaticWriteDataArea.create(command, config)); + sendData(SimaticWriteDataArea.create(command, config, pduSize)); } /** @@ -405,7 +408,7 @@ public void prepareData() { } if (readDataArea == null || readDataArea.isItemOutOfRange(item.getValue().getAddress())) { - readDataArea = new SimaticReadDataArea(item.getValue()); + readDataArea = new SimaticReadDataArea(item.getValue(),pduSize); readAreasList.put(readDataArea); } else { try { diff --git a/org.openhab.binding.simatic/src/main/java/org/openhab/binding/simatic/internal/SimaticIReadWriteDataArea.java b/org.openhab.binding.simatic/src/main/java/org/openhab/binding/simatic/internal/SimaticIReadWriteDataArea.java index f4f4a14..90442df 100644 --- a/org.openhab.binding.simatic/src/main/java/org/openhab/binding/simatic/internal/SimaticIReadWriteDataArea.java +++ b/org.openhab.binding.simatic/src/main/java/org/openhab/binding/simatic/internal/SimaticIReadWriteDataArea.java @@ -12,11 +12,12 @@ * Read / write area interface * * @author Vita Tucek - * @since 1.9.0 + * @since 1.14.0 */ public interface SimaticIReadWriteDataArea { /** Maximum bytes transfered in one data frame **/ public static final int MAX_DATA_LENGTH = 192; + public static final int MAX_PDU480_DATA_LENGTH = 462; /** * Return PLC area type diff --git a/org.openhab.binding.simatic/src/main/java/org/openhab/binding/simatic/internal/SimaticReadDataArea.java b/org.openhab.binding.simatic/src/main/java/org/openhab/binding/simatic/internal/SimaticReadDataArea.java index 27f285c..361cfce 100644 --- a/org.openhab.binding.simatic/src/main/java/org/openhab/binding/simatic/internal/SimaticReadDataArea.java +++ b/org.openhab.binding.simatic/src/main/java/org/openhab/binding/simatic/internal/SimaticReadDataArea.java @@ -17,7 +17,7 @@ * Read / write area class * * @author Vita Tucek - * @since 1.9.0 + * @since 1.14.0 */ public class SimaticReadDataArea implements SimaticIReadWriteDataArea { /** Maximum space between two useful data block **/ @@ -26,12 +26,17 @@ public class SimaticReadDataArea implements SimaticIReadWriteDataArea { LinkedList items = new LinkedList(); final SimaticPLCAddress startAddress; int areaLength = 0; + /** data limit PDU size depending **/ + int dataLimit = MAX_DATA_LENGTH; - public SimaticReadDataArea(SimaticBindingConfig firstItem) { + public SimaticReadDataArea(SimaticBindingConfig firstItem, int pduSize) { startAddress = firstItem.getAddress(); items.add(firstItem); areaLength = startAddress.getDataLength(); + if(pduSize >= 480) { + dataLimit = MAX_PDU480_DATA_LENGTH; + } } @Override @@ -117,7 +122,7 @@ public boolean isItemOutOfRange(SimaticPLCAddress itemAddress) { return itemAddress.getArea() != this.getArea() || (this.getArea() == SimaticPLCAreaTypes.DB && !startAddress.DBNum.equals(itemAddress.DBNum)) || (itemAddress.addressByte + itemAddress.getDataLength() - - this.startAddress.addressByte > MAX_DATA_LENGTH) + - this.startAddress.addressByte > dataLimit) || (itemAddress.addressByte - (this.startAddress.addressByte + this.getAddressSpaceLength()) > GAP_LIMIT); } diff --git a/org.openhab.binding.simatic/src/main/java/org/openhab/binding/simatic/internal/SimaticTCP.java b/org.openhab.binding.simatic/src/main/java/org/openhab/binding/simatic/internal/SimaticTCP.java index b37cf6d..045f90d 100644 --- a/org.openhab.binding.simatic/src/main/java/org/openhab/binding/simatic/internal/SimaticTCP.java +++ b/org.openhab.binding.simatic/src/main/java/org/openhab/binding/simatic/internal/SimaticTCP.java @@ -28,7 +28,7 @@ * IP device class * * @author Vita Tucek - * @since 1.9.0 + * @since 1.14.0 */ public class SimaticTCP extends SimaticGenericDevice { @@ -163,10 +163,13 @@ public Boolean open() { try { if (dc.connectPLC() == 0) { if (logger.isInfoEnabled()) { - logger.info("{} - connected", this.toString()); + logger.info("{} - connected. Max PDU size = {}", this.toString(), dc.maxPDUlength); } + pduSize = dc.maxPDUlength; portState.setState(PortStates.LISTENING); tryReconnect.set(false); + //prepare data after PDU is negotiated + prepareData(); connected = true; } else { logger.error("{} - cannot connect to PLC", this.toString()); diff --git a/org.openhab.binding.simatic/src/main/java/org/openhab/binding/simatic/internal/SimaticWriteDataArea.java b/org.openhab.binding.simatic/src/main/java/org/openhab/binding/simatic/internal/SimaticWriteDataArea.java index 8f2a5d2..95c7024 100644 --- a/org.openhab.binding.simatic/src/main/java/org/openhab/binding/simatic/internal/SimaticWriteDataArea.java +++ b/org.openhab.binding.simatic/src/main/java/org/openhab/binding/simatic/internal/SimaticWriteDataArea.java @@ -36,15 +36,17 @@ * Class holding single write data request * * @author Vita Tucek - * @since 1.9.0 + * @since 1.14.0 */ public class SimaticWriteDataArea implements SimaticIReadWriteDataArea { private static final Logger logger = LoggerFactory.getLogger(SimaticWriteDataArea.class); static int INCREASE_STEP = 5; + /** data limit PDU size depending **/ + int dataLimit = MAX_DATA_LENGTH; - public static SimaticWriteDataArea create(Command command, SimaticBindingConfig config) { + public static SimaticWriteDataArea create(Command command, SimaticBindingConfig config, int pduSize) { if (logger.isDebugEnabled()) { logger.debug("create(): item:" + config.getName() + "|datatype:" + config.getDataType()); } @@ -342,7 +344,7 @@ public static SimaticWriteDataArea create(Command command, SimaticBindingConfig return null; } - return new SimaticWriteDataArea(config.getAddress(), data); + return new SimaticWriteDataArea(config.getAddress(), data, pduSize); } @@ -355,9 +357,12 @@ public static SimaticWriteDataArea create(Command command, SimaticBindingConfig * @param itemData * Raw data */ - public SimaticWriteDataArea(SimaticPLCAddress address, byte[] itemData) { + public SimaticWriteDataArea(SimaticPLCAddress address, byte[] itemData, int pduSize) { this.address = address; this.itemData = itemData; + if(pduSize >= 480) { + dataLimit = MAX_PDU480_DATA_LENGTH; + } } /** @@ -474,9 +479,9 @@ public boolean isItemOutOfRange(SimaticPLCAddress itemAddress) { || this.address.getSimaticDataType() == SimaticPLCDataTypes.BIT || (itemAddress.addressByte > (this.address.addressByte + this.address.getDataLength())) || ((itemAddress.addressByte + itemAddress.getDataLength()) < this.address.addressByte) - || (itemAddress.addressByte + itemAddress.getDataLength() - this.address.addressByte > MAX_DATA_LENGTH) + || (itemAddress.addressByte + itemAddress.getDataLength() - this.address.addressByte > dataLimit) || (this.address.addressByte + this.getAddressSpaceLength() - - itemAddress.addressByte > MAX_DATA_LENGTH); + - itemAddress.addressByte > dataLimit); } public void insert(SimaticWriteDataArea data) {