You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@plc4x.apache.org by jf...@apache.org on 2020/05/22 11:56:43 UTC

[plc4x] 04/05: - Continued implemting the functionality to read DBs in the simulator

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

jfeinauer pushed a commit to branch feature/plc-simulator
in repository https://gitbox.apache.org/repos/asf/plc4x.git

commit 5638602ac3b43bde3113eb6037c5f22a98fc6900
Author: Christofer Dutz <ch...@c-ware.de>
AuthorDate: Fri Oct 18 13:17:59 2019 +0200

    - Continued implemting the functionality to read DBs in the simulator
---
 .../server/s7/protocol/S7Step7ServerAdapter.java   | 34 ++++++++++++++++++++--
 1 file changed, 31 insertions(+), 3 deletions(-)

diff --git a/sandbox/plc-simulator/src/main/java/org/apache/plc4x/simulator/server/s7/protocol/S7Step7ServerAdapter.java b/sandbox/plc-simulator/src/main/java/org/apache/plc4x/simulator/server/s7/protocol/S7Step7ServerAdapter.java
index 9f7a34d..f4f6ddb 100644
--- a/sandbox/plc-simulator/src/main/java/org/apache/plc4x/simulator/server/s7/protocol/S7Step7ServerAdapter.java
+++ b/sandbox/plc-simulator/src/main/java/org/apache/plc4x/simulator/server/s7/protocol/S7Step7ServerAdapter.java
@@ -25,6 +25,7 @@ import org.apache.plc4x.simulator.model.Context;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.nio.ByteOrder;
 import java.util.Arrays;
 import java.util.BitSet;
 import java.util.List;
@@ -241,13 +242,40 @@ public class S7Step7ServerAdapter extends ChannelInboundHandlerAdapter {
                                             S7AddressAny addressAny = (S7AddressAny) address1;
                                             switch (addressAny.getArea()) {
                                                 case DATA_BLOCKS: {
-
+                                                    final int dataBlockNumber = addressAny.getDbNumber();
+                                                    if(dataBlockNumber != 1) {
+                                                        // TODO: Return unknown object.
+                                                    }
+                                                    final int numberOfElements = addressAny.getNumberOfElements();
+                                                    if(numberOfElements != 1) {
+                                                        // TODO: Return invalid address.
+                                                    }
+                                                    final int byteAddress = addressAny.getByteAddress();
+                                                    if(byteAddress != 0) {
+                                                        // TODO: Return invalid address.
+                                                    }
+                                                    final byte bitAddress = addressAny.getBitAddress();
+                                                    switch (addressAny.getTransportSize()) {
+                                                        case INT: {
+                                                            String firstKey = context.getMemory().keySet().iterator().next();
+                                                            Object value = context.getMemory().get(firstKey);
+                                                            short shortValue = ((Number) value).shortValue();
+                                                            byte[] data = new byte[2];
+                                                            data[0] = (byte) (shortValue & 0xff);
+                                                            data[1] = (byte) ((shortValue >> 8) & 0xff);
+                                                            payloadItems[i] = new S7VarPayloadDataItem((short) 0xFF, PayloadSize.BYTE_WORD_DWORD, data.length, data);
+                                                            break;
+                                                        }
+                                                        default: {
+                                                            // TODO: Return invalid address.
+                                                        }
+                                                    }
                                                     break;
                                                 }
                                                 case INPUTS:
                                                 case OUTPUTS: {
-                                                    int ioNumber = (addressAny.getByteAddress() * 8) + addressAny.getBitAddress();
-                                                    int numElements = (addressAny.getTransportSize() == ParameterSize.BOOL) ?
+                                                    final int ioNumber = (addressAny.getByteAddress() * 8) + addressAny.getBitAddress();
+                                                    final int numElements = (addressAny.getTransportSize() == ParameterSize.BOOL) ?
                                                         addressAny.getNumberOfElements() : addressAny.getTransportSize().getSizeInBytes() * 8;
                                                     final BitSet bitSet = toBitSet(context.getDigitalInputs(), ioNumber, numElements);
                                                     final byte[] data = Arrays.copyOf(bitSet.toByteArray(), (numElements + 7) / 8);