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

cgarcia pushed a commit to branch feature/merlot
in repository https://gitbox.apache.org/repos/asf/plc4x-extras.git


The following commit(s) were added to refs/heads/feature/merlot by this push:
     new 756541e  Implement s7 counter.
756541e is described below

commit 756541e92c6f443e17b266ef95139315e3b034ee
Author: César García <[email protected]>
AuthorDate: Mon Oct 28 16:09:46 2024 -0400

    Implement s7 counter.
---
 .../merlot/drv/s7/core/DBS7CounterFactory.java     | 18 +++++++++++++-
 .../merlot/drv/s7/impl/S7PlcTagFunctionImpl.java   | 29 +++++++++++++++++++---
 2 files changed, 42 insertions(+), 5 deletions(-)

diff --git 
a/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/main/java/org/apache/plc4x/merlot/drv/s7/core/DBS7CounterFactory.java
 
b/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/main/java/org/apache/plc4x/merlot/drv/s7/core/DBS7CounterFactory.java
index ddaa03f..9a04c58 100644
--- 
a/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/main/java/org/apache/plc4x/merlot/drv/s7/core/DBS7CounterFactory.java
+++ 
b/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/main/java/org/apache/plc4x/merlot/drv/s7/core/DBS7CounterFactory.java
@@ -116,7 +116,7 @@ public class DBS7CounterFactory extends DBBaseFactory {
                 if (write_enable.get()) {                          
                     write_value.put(value.get());                           
                     innerWriteBuffer.clear();                     
-                    innerWriteBuffer.writeShort(write_value.get());            
             
+                    innerWriteBuffer.writeShort(intToBcd(write_value.get()));
                     super.process();                      
                 }
             }               
@@ -151,7 +151,23 @@ public class DBS7CounterFactory extends DBBaseFactory {
         @Override
         public String getFieldsToMonitor() {
             return MONITOR_FIELDS;
+        }
+
+        private short intToBcd(int decimal) {
+            if (decimal < 0 ) decimal = 0;
+            if (decimal > 999 ) decimal = 999;
+            short bcd = 0;
+            int shift = 0;
+            while (decimal > 0) {
+                int digit = decimal % 10;
+                bcd |= (digit << (shift * 4));
+                decimal /= 10;
+                shift++;
+            }
+            return bcd;
         }        
+
+        
     }
            
 }
diff --git 
a/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/main/java/org/apache/plc4x/merlot/drv/s7/impl/S7PlcTagFunctionImpl.java
 
b/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/main/java/org/apache/plc4x/merlot/drv/s7/impl/S7PlcTagFunctionImpl.java
index 2bb0440..a8d319d 100644
--- 
a/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/main/java/org/apache/plc4x/merlot/drv/s7/impl/S7PlcTagFunctionImpl.java
+++ 
b/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/main/java/org/apache/plc4x/merlot/drv/s7/impl/S7PlcTagFunctionImpl.java
@@ -20,6 +20,7 @@ import io.netty.buffer.ByteBuf;
 import org.apache.commons.lang3.tuple.ImmutablePair;
 import org.apache.plc4x.java.api.model.PlcTag;
 import static org.apache.plc4x.java.api.types.PlcValueType.BOOL;
+import static org.apache.plc4x.java.api.types.PlcValueType.USINT;
 import org.apache.plc4x.java.s7.readwrite.MemoryArea;
 import static org.apache.plc4x.java.s7.readwrite.MemoryArea.DATA_BLOCKS;
 import static 
org.apache.plc4x.java.s7.readwrite.MemoryArea.DIRECT_PERIPHERAL_ACCESS;
@@ -146,12 +147,14 @@ public class S7PlcTagFunctionImpl implements 
PlcTagFunction {
         short tempValue = 0;
         int intBlockNumber = 0;
         int intByteOffset = 0;
+        byte byBitOffset = 0;        
         S7Tag s7PlcTag = null;
         if (plcTag instanceof S7Tag){
             final S7Tag s7Tag = (S7Tag) plcTag;
             LOGGER.info("Processing S7Tag: {}", s7Tag.toString()); 
+            LOGGER.info("Buffer: \r\n" + byteBuf.toString());
             Object[] objValues = new Object[byteBuf.capacity()];
-            switch (s7Tag.getPlcValueType()) { 
+            switch (s7Tag.getDataType()) { 
                 case BYTE:  
                         intBlockNumber = (s7Tag.getMemoryArea() == 
MemoryArea.DATA_BLOCKS)?
                                             s7Tag.getBlockNumber() : 0;
@@ -162,7 +165,7 @@ public class S7PlcTagFunctionImpl implements PlcTagFunction 
{
                                             intByteOffset,
                                             bitOffset,
                                             byteBuf.capacity());
-                        LOGGER.info("Write BOOL S7Tag: {}", s7Tag.toString()); 
                        
+                        LOGGER.info("Write BOOL S7Tag: {}", 
s7PlcTag.toString());                         
                         byteBuf.resetReaderIndex();
                         for (int i=0; i < byteBuf.capacity(); i++){
                             objValues[i] = byteBuf.readBoolean();
@@ -176,18 +179,36 @@ public class S7PlcTagFunctionImpl implements 
PlcTagFunction {
                                             intByteOffset,
                                             (byte) 0,
                                             byteBuf.capacity());
-                        LOGGER.info("Write ANY S7Tag: {}", s7Tag.toString()); 
+                        LOGGER.info("Write ANY S7Tag: {}", 
s7PlcTag.toString()); 
                         byteBuf.resetReaderIndex();
                         for (int i=0; i < byteBuf.capacity(); i++){
                             tempValue = (short) (byteBuf.readByte() & 0xFF);   
                         
                             objValues[i] = tempValue;
                         }                                  
                     break;
+                case COUNTER:                         
+                        intByteOffset = ((s7Tag.getByteOffset() << 3) + 
+                                         s7Tag.getBitOffset()) + (byteOffset / 
2);                                                                   
+                        s7PlcTag = new S7Tag(s7Tag.getDataType(),
+                                            s7Tag.getMemoryArea(),
+                                            s7Tag.getBlockNumber(),
+                                            intByteOffset,
+                                            byBitOffset,
+                                            byteBuf.capacity() / 2);
+                        LOGGER.info("> Write COUNTER S7Tag: {}", 
s7PlcTag.toString()); 
+                        byteBuf.resetReaderIndex();
+                        objValues = new Object[byteBuf.capacity() / 2];
+                        for (int i=0; i < byteBuf.capacity() / 2; i++){
+                            tempValue = (short) (byteBuf.readShort() & 
0xFFFF);                            
+                            objValues[i] = tempValue;
+                        }                                  
+                    break;                    
+                    
                 default:;
                 
             }
             if (null != s7PlcTag)
-            LOGGER.info("Writing tag : {}", s7PlcTag.toString());
+                LOGGER.info("Writing tag : {}", s7PlcTag.toString());         
             return new ImmutablePair<>(s7PlcTag, objValues);            
         }        
         return null;

Reply via email to