You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@plc4x.apache.org by cd...@apache.org on 2019/10/12 18:52:34 UTC
[plc4x] branch develop updated: - Finished implementing the SZL part
This is an automated email from the ASF dual-hosted git repository.
cdutz pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/plc4x.git
The following commit(s) were added to refs/heads/develop by this push:
new b20e50a - Finished implementing the SZL part
b20e50a is described below
commit b20e50a15b32aba25d5d9342481cb0668bc76440
Author: Christofer Dutz <ch...@c-ware.de>
AuthorDate: Sat Oct 12 20:52:20 2019 +0200
- Finished implementing the SZL part
---
.../s7/src/main/resources/protocols/s7/s7.mspec | 18 ++---
.../server/s7/protocol/S7Step7ServerProtocol.java | 86 ++++++++++++++--------
2 files changed, 64 insertions(+), 40 deletions(-)
diff --git a/protocols/s7/src/main/resources/protocols/s7/s7.mspec b/protocols/s7/src/main/resources/protocols/s7/s7.mspec
index 8c3371e..2eac203 100644
--- a/protocols/s7/src/main/resources/protocols/s7/s7.mspec
+++ b/protocols/s7/src/main/resources/protocols/s7/s7.mspec
@@ -177,15 +177,15 @@
[discriminator uint 8 'itemType']
[typeSwitch 'itemType'
['0x12' S7ParameterUserDataItemCPUFunctions
- [implicit uint 8 'itemLength' 'lengthInBytes']
- [simple uint 8 'method']
- [simple uint 4 'cpuFunctionType']
- [simple uint 4 'cpuFunctionGroup']
- [simple uint 8 'cpuSubfunction']
- [simple uint 8 'sequenceNumber']
- [optional uint 8 'dataUnitReferenceNumber' 'cpuFunctionType == 8']
- [optional uint 8 'lastDataUnit' 'cpuFunctionType == 8']
- [optional uint 8 'errorCode' 'cpuFunctionType == 8']
+ [implicit uint 8 'itemLength' 'lengthInBytes - 2']
+ [simple uint 8 'method']
+ [simple uint 4 'cpuFunctionType']
+ [simple uint 4 'cpuFunctionGroup']
+ [simple uint 8 'cpuSubfunction']
+ [simple uint 8 'sequenceNumber']
+ [optional uint 8 'dataUnitReferenceNumber' 'cpuFunctionType == 8']
+ [optional uint 8 'lastDataUnit' 'cpuFunctionType == 8']
+ [optional uint 16 'errorCode' 'cpuFunctionType == 8']
]
]
]
diff --git a/sandbox/plc-simulator/src/main/java/org/apache/plc4x/simulator/server/s7/protocol/S7Step7ServerProtocol.java b/sandbox/plc-simulator/src/main/java/org/apache/plc4x/simulator/server/s7/protocol/S7Step7ServerProtocol.java
index d5dd6f8..b9b1d1a 100644
--- a/sandbox/plc-simulator/src/main/java/org/apache/plc4x/simulator/server/s7/protocol/S7Step7ServerProtocol.java
+++ b/sandbox/plc-simulator/src/main/java/org/apache/plc4x/simulator/server/s7/protocol/S7Step7ServerProtocol.java
@@ -22,6 +22,8 @@ import io.netty.channel.*;
import org.apache.plc4x.java.s7.readwrite.*;
import org.apache.plc4x.java.s7.readwrite.types.COTPProtocolClass;
import org.apache.plc4x.java.s7.readwrite.types.COTPTpduSize;
+import org.apache.plc4x.java.s7.readwrite.types.SzlModuleTypeClass;
+import org.apache.plc4x.java.s7.readwrite.types.SzlSublist;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -148,39 +150,61 @@ public class S7Step7ServerProtocol extends ChannelInboundHandlerAdapter {
final int s7TpduReference = s7MessageUserData.getTpduReference();
final S7Parameter s7Parameter = s7MessageUserData.getParameter();
if(s7Parameter instanceof S7ParameterUserData) {
- S7ParameterUserData userData = (S7ParameterUserData) s7Parameter;
- for (S7ParameterUserDataItem item : userData.getItems()) {
+ S7ParameterUserData userDataParameter = (S7ParameterUserData) s7Parameter;
+ for (S7ParameterUserDataItem item : userDataParameter.getItems()) {
if(item instanceof S7ParameterUserDataItemCPUFunctions) {
- S7ParameterUserDataItemCPUFunctions function = (S7ParameterUserDataItemCPUFunctions) item;
- /*s7MessageUserData.getParameter()
- final S7ParameterUserDataItemCpuFunctionsItem cpuFunction = function.getCpuFunction();
- if(cpuFunction instanceof S7ParameterUserDataItemCpuFunctionReadSzlRequest) {
- S7ParameterUserDataItemCpuFunctionReadSzlRequest readSzlRequest =
- (S7ParameterUserDataItemCpuFunctionReadSzlRequest) cpuFunction;
- final SzlId szlId = readSzlRequest.getSzlId();
- // This is a request to list the type of device
- if((szlId.getTypeClass() == SzlModuleTypeClass.CPU) &&
- (szlId.getSublistList() == SzlSublist.MODULE_IDENTIFICATION)) {
-
- SzlDataTreeItem[] items = new SzlDataTreeItem[1];
- items[0] = new SzlDataTreeItem((short) 0x0001, new byte[20],
- 0x2020, 0x0001, 0x2020);
- S7ParameterUserDataItemCpuFunctionReadSzlResponse readSzlResponse =
- new S7ParameterUserDataItemCpuFunctionReadSzlResponse(
- readSzlRequest.getCpuFunctionType(), readSzlRequest.getCpuFunctionGroup(),
- readSzlRequest.getCpuSubfunction(), (short) 1, (short) 0, (short) 0,
- (short) 0, (short) 0xFF, (short) 0x09, readSzlRequest.getSzlId(),
- readSzlRequest.getSzlIndex(), items);
- S7ParameterUserDataItem[] responseItems = new S7ParameterUserDataItem[1];
- responseItems[0] = new S7ParameterUserDataItemCPUFunctions((short) 0x12, readSzlResponse);
- S7ParameterUserData responseUserData = new S7ParameterUserData(responseItems);
- S7Message s7ResponseMessage = new S7MessageResponse(s7TpduReference, responseUserData, new S7PayloadUserData());
- ctx.writeAndFlush(new TPKTPacket(new COTPPacketData(null, responseUserData, true, cotpTpduRef)));
- } else {
- LOGGER.error("Not able to respond to the given request Read SZL with SZL type class " +
- szlId.getTypeClass().name() + " and SZL sublise " + szlId.getSublistList().name());
+ S7ParameterUserDataItemCPUFunctions function =
+ (S7ParameterUserDataItemCPUFunctions) item;
+ final S7PayloadUserData userDataPayload =
+ (S7PayloadUserData) s7MessageUserData.getPayload();
+
+ for (S7PayloadUserDataItem userDataPayloadItem : userDataPayload.getItems()) {
+ if(userDataPayloadItem instanceof S7PayloadUserDataItemCpuFunctionReadSzlRequest) {
+ S7PayloadUserDataItemCpuFunctionReadSzlRequest readSzlRequestPayload =
+ (S7PayloadUserDataItemCpuFunctionReadSzlRequest) userDataPayloadItem;
+
+ final SzlId szlId = readSzlRequestPayload.getSzlId();
+ // This is a request to list the type of device
+ if((szlId.getTypeClass() == SzlModuleTypeClass.CPU) &&
+ (szlId.getSublistList() == SzlSublist.MODULE_IDENTIFICATION)) {
+
+ S7ParameterUserDataItemCPUFunctions readSzlResponseParameter =
+ new S7ParameterUserDataItemCPUFunctions((short) 0x12,
+ (byte) 0x08, function.getCpuFunctionGroup(),
+ function.getCpuSubfunction(), (short) 1,
+ (short) 0, (short) 0, 0);
+
+ SzlDataTreeItem[] items = new SzlDataTreeItem[1];
+ items[0] = new SzlDataTreeItem((short) 0x0001,
+ "6ES7 212-1BD30-0XB0 ".getBytes(), 0x2020, 0x0001, 0x2020);
+
+ S7PayloadUserDataItemCpuFunctionReadSzlResponse readSzlResponsePayload =
+ new S7PayloadUserDataItemCpuFunctionReadSzlResponse(
+ (short) 0xFF, (short) 0x09, szlId,
+ readSzlRequestPayload.getSzlIndex(), items);
+
+ S7ParameterUserDataItem[] responseParameterItems =
+ new S7ParameterUserDataItem[1];
+ responseParameterItems[0] = readSzlResponseParameter;
+ S7ParameterUserData responseParameterUserData =
+ new S7ParameterUserData(responseParameterItems);
+
+ S7PayloadUserDataItem[] responsePayloadItems =
+ new S7PayloadUserDataItem[1];
+ responsePayloadItems[0] = readSzlResponsePayload;
+ S7PayloadUserData responsePayloadUserData =
+ new S7PayloadUserData(responsePayloadItems);
+
+ S7Message s7ResponseMessage = new S7MessageUserData(s7TpduReference,
+ responseParameterUserData, responsePayloadUserData);
+ ctx.writeAndFlush(new TPKTPacket(new COTPPacketData(null, s7ResponseMessage, true, cotpTpduRef)));
+ } else {
+ LOGGER.error("Not able to respond to the given request Read SZL with SZL type class " +
+ szlId.getTypeClass().name() + " and SZL sublise " + szlId.getSublistList().name());
+ }
+
}
- }*/
+ }
}
}
} else {