Hello,

as a complete newbie in Java, S7 and PLC4X it does not help - if I have to get 
some data from a Siemens-PLC. We decided to use PLC4X and as always there can 
occur some little problems. Now I am involved in using PLC4X for about one week.

Ok let me first say what I use at the moment:

  *   Java 11 64-Bit-Version on Intel (Windows 10) and Arm-System (Debian)
  *   PLC4X version 0.9.0 (but I tested in this case 0.10.0-SNAPSHOT, too)
  *   Siemens S7-300, S7-1500 (Software-PLC) and hopefully some more types in 
the next weeks

As preparation for more functionality I created an ugly short test program, 
which does some reading out of a data block. This is really running fine an I 
was surprised to get to this point in really a short time. So I think that the 
PLC4X is a well kind of stuff.

To improve at second the reading of data out of the PLC I tried to use the 
possibility of 'subscription' - unfortunately this has been without success the 
last 2 days. So I decided to ask what I am doing wrong.

As an attachment there are some more information to be found as pictures and 
some text parts.

Explanation:

I try to establish a subscription request by doing the builder and execute the 
request afterwards (attachment Source_SubscriptionRequest.txt):

// Create a new subscription request cyclic mode only !
PlcSubscriptionRequest.Builder builder = 
plcConnection.subscriptionRequestBuilder();

for (String searchName : deviceData.dataMap.keySet()) {
    switch (deviceData.getSubscriptionType(searchName)) {
        case "CYCLIC": {
                    builder.addCyclicField(searchName, 
deviceData.getDataPlaceAndType(searchName), 
Duration.ofMillis(Integer.valueOf(deviceData.getSubscriptionTime(searchName))));
        };break;
        case "ONCHANGE": {
            // TODO add onchange subscription builder
        };break;
        case "ONEVENT": {
            // TODO add onevent subscription builder
        };break;
        default: {

        };break;
    }
}
// finalize the subscription builder
PlcSubscriptionRequest subscriptionRequest = builder.build();

// activate the subscriptions now (here it doesn't matter if you use the 
synchronize or asynchronize approach)
PlcSubscriptionResponse plcSubscriptionResponse = 
subscriptionRequest.execute().get(20, TimeUnit.SECONDS);
// PlcSubscriptionResponse plcSubscriptionResponse = 
subscriptionRequest.execute().get();
// PlcSubscriptionResponse plcSubscriptionResponse = 
subscriptionRequest.execute().get(5000, TimeUnit.MILLISECONDS);

The 'deviceData'-class contains all configuration values which are read out of 
a very simple properties-file. The picture 'Debug_BuilderInfo.PNG' shows the 
content of the two entries and I think they are OK so far.
The property-file contains these information about the entries:



# data address is the physical address inside the plc and the type
data_set_001=TEST_BIT0|%DB100:0.0:BOOL|BOOL|CYCLIC|333
data_set_002=TEST_BIT1|%DB100:0.1:BOOL|BOOL|CYCLIC|444

The fieldname in the first line will be later 'TEST_BIT0' the address and type 
will be '%DB100:0.0:BOOL'  it should be a cyclic mode 'CYCLIC' and the cycle 
time should be '333' [ms]. The other values in the line are not used inside the 
program (maybe later but not now).


Unfortunately this will lead me to an error I can't resolve now. (the out is 
the attachment Console_OutputOnError.txt)

"C:\Program Files\Java\openjdk-11.0.8.10-2.windows.redhat.x86_64\bin\java.exe" 
-agentlib:jdwp=transport=dt_socket,address=127.0.0.1:50521,suspend=y,server=n 
-Dplc_name=KoehlInhouseTestSPS 
-javaagent:D:\Programme\IntelliJ_IDEA_2019.3.4\plugins\java\lib\rt\debugger-agent.jar
 -Dfile.encoding=UTF-8 -classpath 
D:\projekte\entwicklung\test-plc-subscription\target\classes;D:\projekte\entwicklung\.m2\spring_repository\org\apache\plc4x\plc4j-api\0.9.0\plc4j-api-0.9.0.jar;D:\projekte\entwicklung\.m2\spring_repository\com\fasterxml\jackson\core\jackson-annotations\2.12.5\jackson-annotations-2.12.5.jar;D:\projekte\entwicklung\.m2\spring_repository\org\apache\plc4x\plc4j-driver-s7\0.9.0\plc4j-driver-s7-0.9.0.jar;D:\projekte\entwicklung\.m2\spring_repository\org\apache\plc4x\plc4j-spi\0.9.0\plc4j-spi-0.9.0.jar;D:\projekte\entwicklung\.m2\spring_repository\io\netty\netty-codec\4.1.67.Final\netty-codec-4.1.67.Final.jar;D:\projekte\entwicklung\.m2\spring_repository\io\netty\netty-common\4.1.67.Final\netty-common-4.1.67.Final.jar;D:\projekte\entwicklung\.m2\spring_repository\commons-beanutils\commons-beanutils\1.9.4\commons-beanutils-1.9.4.jar;D:\projekte\entwicklung\.m2\spring_repository\commons-logging\commons-logging\1.2\commons-logging-1.2.jar;D:\projekte\entwicklung\.m2\spring_repository\commons-collections\commons-collections\3.2.2\commons-collections-3.2.2.jar;D:\projekte\entwicklung\.m2\spring_repository\com\fasterxml\jackson\core\jackson-core\2.12.5\jackson-core-2.12.5.jar;D:\projekte\entwicklung\.m2\spring_repository\com\fasterxml\jackson\core\jackson-databind\2.12.5\jackson-databind-2.12.5.jar;D:\projekte\entwicklung\.m2\spring_repository\com\github\jinahya\bit-io\1.4.3\bit-io-1.4.3.jar;D:\projekte\entwicklung\.m2\spring_repository\org\apache\plc4x\plc4j-transport-tcp\0.9.0\plc4j-transport-tcp-0.9.0.jar;D:\projekte\entwicklung\.m2\spring_repository\commons-codec\commons-codec\1.15\commons-codec-1.15.jar;D:\projekte\entwicklung\.m2\spring_repository\io\netty\netty-buffer\4.1.67.Final\netty-buffer-4.1.67.Final.jar;D:\projekte\entwicklung\.m2\spring_repository\io\netty\netty-transport\4.1.67.Final\netty-transport-4.1.67.Final.jar;D:\projekte\entwicklung\.m2\spring_repository\io\netty\netty-resolver\4.1.67.Final\netty-resolver-4.1.67.Final.jar;D:\projekte\entwicklung\.m2\spring_repository\io\vavr\vavr\0.10.4\vavr-0.10.4.jar;D:\projekte\entwicklung\.m2\spring_repository\io\vavr\vavr-match\0.10.4\vavr-match-0.10.4.jar;D:\projekte\entwicklung\.m2\spring_repository\org\slf4j\slf4j-api\2.0.0-alpha1\slf4j-api-2.0.0-alpha1.jar;D:\projekte\entwicklung\.m2\spring_repository\org\apache\commons\commons-lang3\3.12.0\commons-lang3-3.12.0.jar;D:\Programme\IntelliJ_IDEA_2019.3.4\lib\idea_rt.jar
 de.koehl.plc_adapter.TestPlcAdapter 
d:\projekte\entwicklung\test-plc-subscription\plc_data_s300.txt
Connected to the target VM, address: '127.0.0.1:50521', transport: 'socket'

Using parameter value for path to ini files: 
d:\projekte\entwicklung\test-plc-subscription\plc_data_s300.txt
PLC : KoehlInhouseTestSPS
SLF4J: No SLF4J providers were found.
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#noProviders for further details.

Connection established to: 
s7://172.16.10.10?controller-type=S7_300&remote-rack=0&remote-slot=2
PLC with connection: 
s7://172.16.10.10?controller-type=S7_300&remote-rack=0&remote-slot=2 is able to 
be read !
PLC with connection: 
s7://172.16.10.10?controller-type=S7_300&remote-rack=0&remote-slot=2 is able to 
be written !
PLC with connection: 
s7://172.16.10.10?controller-type=S7_300&remote-rack=0&remote-slot=2 is able to 
do subscriptions !
PLC with connection: 
s7://172.16.10.10?controller-type=S7_300&remote-rack=0&remote-slot=2 is not 
able to do browsing !
Value could not be read!
java.lang.ClassCastException: class 
org.apache.plc4x.java.s7.readwrite.field.S7Field cannot be cast to class 
org.apache.plc4x.java.s7.readwrite.field.S7SubscriptionField 
(org.apache.plc4x.java.s7.readwrite.field.S7Field and 
org.apache.plc4x.java.s7.readwrite.field.S7SubscriptionField are in unnamed 
module of loader 'app')
Number of threads starting was: 1
Number of threads on ending was: 4
java.lang.ClassCastException: class 
org.apache.plc4x.java.s7.readwrite.field.S7Field cannot be cast to class 
org.apache.plc4x.java.s7.readwrite.field.S7SubscriptionField 
(org.apache.plc4x.java.s7.readwrite.field.S7Field and 
org.apache.plc4x.java.s7.readwrite.field.S7SubscriptionField are in unnamed 
module of loader 'app')
      at 
org.apache.plc4x.java.s7.readwrite.protocol.S7ProtocolLogic.subscribe(S7ProtocolLogic.java:335)
      at 
org.apache.plc4x.java.spi.optimizer.BaseOptimizer.lambda$optimizedSubscribe$4(BaseOptimizer.java:121)
      at 
org.apache.plc4x.java.spi.optimizer.BaseOptimizer.send(BaseOptimizer.java:139)
      at 
org.apache.plc4x.java.spi.optimizer.BaseOptimizer.optimizedSubscribe(BaseOptimizer.java:121)
      at 
org.apache.plc4x.java.spi.connection.AbstractPlcConnection.subscribe(AbstractPlcConnection.java:167)
      at 
org.apache.plc4x.java.spi.messages.DefaultPlcSubscriptionRequest.execute(DefaultPlcSubscriptionRequest.java:61)
      at 
de.koehl.plc_adapter.TestPlcAdapter.readTestPlc(TestPlcAdapter.java:129)
      at de.koehl.plc_adapter.TestPlcAdapter.main(TestPlcAdapter.java:57)
Disconnected from the target VM, address: '127.0.0.1:50521', transport: 'socket'

Process finished with exit code 0

As a further step to get more information I did some debugging at the line 
where the exception crashes my code.
Just look at the attached pictures, where you can see the content of the 
subscription request.

I switched to the PLC4X version 0.10.0-SNAPSHOT but this creates exactly the 
same situation - no difference to version 0.9.0

Does anybody proposals how to solve this ? Or maybe - I do something wrong but 
I don't recognize what.

Mit freundlichen Grüßen / Best regards


Dipl.-Ing. (FH)
Guido Rennert
Software Engineering
Logistic & Information Systems
Phone:

+352 27 68 27 - 3650


E-Mail:

guido.renn...@koehl-mb.eu<mailto:guido.renn...@koehl-mb.eu>


GEHEIMHALTUNGSPFLICHT: Diese E-Mail und alle damit verbundenen Anlagen sind 
vertraulich und dürfen nur bestimmten Personen zugänglich gemacht werden. 
Sofern Sie nicht zu den angegebenen Empfängern gehören, benachrichtigen Sie 
bitte unverzüglich den Absender. Der Inhalt darf weder an Dritte weitergegeben 
noch zu anderen Zwecken verwendet werden. Die Informationen dürfen auch nicht 
auf einem Datenträger gespeichert oder auf einen Datenträger kopiert werden. 
Unsere Datenschutzerklärung hier<https://www.koehl-mb.eu/datenschutz/>.
CONFIDENTIALITY: This e-mail and any attachments are confidential and may be 
privileged. If you are not a named recipient, please notify the sender 
immediately and delete the e-mail from your system. You are not authorized to 
disclose the contents to another person, to use it for any purpose or store or 
copy the information in any medium. Our privacy policy 
here<https://www.koehl-mb.eu/en/data-protection/>.

            // Create a new subscription request cyclic mode only !
            PlcSubscriptionRequest.Builder builder = 
plcConnection.subscriptionRequestBuilder();

            for (String searchName : deviceData.dataMap.keySet()) {
                switch (deviceData.getSubscriptionType(searchName)) {
                    case "CYCLIC": {
                                builder.addCyclicField(searchName, 
deviceData.getDataPlaceAndType(searchName), 
Duration.ofMillis(Integer.valueOf(deviceData.getSubscriptionTime(searchName))));
                    };break;
                    case "ONCHANGE": {
                        // TODO add onchange subscription builder
                    };break;
                    case "ONEVENT": {
                        // TODO add onevent subscription builder
                    };break;
                    default: {

                    };break;
                }
            }
            // finalize the subscription builder
            PlcSubscriptionRequest subscriptionRequest = builder.build();

            // activate the subscriptions now (here it doesn't matter if you 
use the synchronize or asynchronize approach)
            PlcSubscriptionResponse plcSubscriptionResponse = 
subscriptionRequest.execute().get(20, TimeUnit.SECONDS);
            // PlcSubscriptionResponse plcSubscriptionResponse = 
subscriptionRequest.execute().get();
            // PlcSubscriptionResponse plcSubscriptionResponse = 
subscriptionRequest.execute().get(5000, TimeUnit.MILLISECONDS);
"C:\Program Files\Java\openjdk-11.0.8.10-2.windows.redhat.x86_64\bin\java.exe" 
-agentlib:jdwp=transport=dt_socket,address=127.0.0.1:50521,suspend=y,server=n 
-Dplc_name=KoehlInhouseTestSPS 
-javaagent:D:\Programme\IntelliJ_IDEA_2019.3.4\plugins\java\lib\rt\debugger-agent.jar
 -Dfile.encoding=UTF-8 -classpath 
D:\projekte\entwicklung\test-plc-subscription\target\classes;D:\projekte\entwicklung\.m2\spring_repository\org\apache\plc4x\plc4j-api\0.9.0\plc4j-api-0.9.0.jar;D:\projekte\entwicklung\.m2\spring_repository\com\fasterxml\jackson\core\jackson-annotations\2.12.5\jackson-annotations-2.12.5.jar;D:\projekte\entwicklung\.m2\spring_repository\org\apache\plc4x\plc4j-driver-s7\0.9.0\plc4j-driver-s7-0.9.0.jar;D:\projekte\entwicklung\.m2\spring_repository\org\apache\plc4x\plc4j-spi\0.9.0\plc4j-spi-0.9.0.jar;D:\projekte\entwicklung\.m2\spring_repository\io\netty\netty-codec\4.1.67.Final\netty-codec-4.1.67.Final.jar;D:\projekte\entwicklung\.m2\spring_repository\io\netty\netty-common\4.1.67.Final\netty-common-4.1.67.Final.jar;D:\projekte\entwicklung\.m2\spring_repository\commons-beanutils\commons-beanutils\1.9.4\commons-beanutils-1.9.4.jar;D:\projekte\entwicklung\.m2\spring_repository\commons-logging\commons-logging\1.2\commons-logging-1.2.jar;D:\projekte\entwicklung\.m2\spring_repository\commons-collections\commons-collections\3.2.2\commons-collections-3.2.2.jar;D:\projekte\entwicklung\.m2\spring_repository\com\fasterxml\jackson\core\jackson-core\2.12.5\jackson-core-2.12.5.jar;D:\projekte\entwicklung\.m2\spring_repository\com\fasterxml\jackson\core\jackson-databind\2.12.5\jackson-databind-2.12.5.jar;D:\projekte\entwicklung\.m2\spring_repository\com\github\jinahya\bit-io\1.4.3\bit-io-1.4.3.jar;D:\projekte\entwicklung\.m2\spring_repository\org\apache\plc4x\plc4j-transport-tcp\0.9.0\plc4j-transport-tcp-0.9.0.jar;D:\projekte\entwicklung\.m2\spring_repository\commons-codec\commons-codec\1.15\commons-codec-1.15.jar;D:\projekte\entwicklung\.m2\spring_repository\io\netty\netty-buffer\4.1.67.Final\netty-buffer-4.1.67.Final.jar;D:\projekte\entwicklung\.m2\spring_repository\io\netty\netty-transport\4.1.67.Final\netty-transport-4.1.67.Final.jar;D:\projekte\entwicklung\.m2\spring_repository\io\netty\netty-resolver\4.1.67.Final\netty-resolver-4.1.67.Final.jar;D:\projekte\entwicklung\.m2\spring_repository\io\vavr\vavr\0.10.4\vavr-0.10.4.jar;D:\projekte\entwicklung\.m2\spring_repository\io\vavr\vavr-match\0.10.4\vavr-match-0.10.4.jar;D:\projekte\entwicklung\.m2\spring_repository\org\slf4j\slf4j-api\2.0.0-alpha1\slf4j-api-2.0.0-alpha1.jar;D:\projekte\entwicklung\.m2\spring_repository\org\apache\commons\commons-lang3\3.12.0\commons-lang3-3.12.0.jar;D:\Programme\IntelliJ_IDEA_2019.3.4\lib\idea_rt.jar
 de.koehl.plc_adapter.TestPlcAdapter 
d:\projekte\entwicklung\test-plc-subscription\plc_data_s300.txt
Connected to the target VM, address: '127.0.0.1:50521', transport: 'socket'

Using parameter value for path to ini files: 
d:\projekte\entwicklung\test-plc-subscription\plc_data_s300.txt
PLC : KoehlInhouseTestSPS
SLF4J: No SLF4J providers were found.
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#noProviders for further details.

Connection established to: 
s7://172.16.10.10?controller-type=S7_300&remote-rack=0&remote-slot=2
PLC with connection: 
s7://172.16.10.10?controller-type=S7_300&remote-rack=0&remote-slot=2 is able to 
be read !
PLC with connection: 
s7://172.16.10.10?controller-type=S7_300&remote-rack=0&remote-slot=2 is able to 
be written !
PLC with connection: 
s7://172.16.10.10?controller-type=S7_300&remote-rack=0&remote-slot=2 is able to 
do subscriptions !
PLC with connection: 
s7://172.16.10.10?controller-type=S7_300&remote-rack=0&remote-slot=2 is not 
able to do browsing !
Value could not be read!
java.lang.ClassCastException: class 
org.apache.plc4x.java.s7.readwrite.field.S7Field cannot be cast to class 
org.apache.plc4x.java.s7.readwrite.field.S7SubscriptionField 
(org.apache.plc4x.java.s7.readwrite.field.S7Field and 
org.apache.plc4x.java.s7.readwrite.field.S7SubscriptionField are in unnamed 
module of loader 'app')
Number of threads starting was: 1
Number of threads on ending was: 4
java.lang.ClassCastException: class 
org.apache.plc4x.java.s7.readwrite.field.S7Field cannot be cast to class 
org.apache.plc4x.java.s7.readwrite.field.S7SubscriptionField 
(org.apache.plc4x.java.s7.readwrite.field.S7Field and 
org.apache.plc4x.java.s7.readwrite.field.S7SubscriptionField are in unnamed 
module of loader 'app')
        at 
org.apache.plc4x.java.s7.readwrite.protocol.S7ProtocolLogic.subscribe(S7ProtocolLogic.java:335)
        at 
org.apache.plc4x.java.spi.optimizer.BaseOptimizer.lambda$optimizedSubscribe$4(BaseOptimizer.java:121)
        at 
org.apache.plc4x.java.spi.optimizer.BaseOptimizer.send(BaseOptimizer.java:139)
        at 
org.apache.plc4x.java.spi.optimizer.BaseOptimizer.optimizedSubscribe(BaseOptimizer.java:121)
        at 
org.apache.plc4x.java.spi.connection.AbstractPlcConnection.subscribe(AbstractPlcConnection.java:167)
        at 
org.apache.plc4x.java.spi.messages.DefaultPlcSubscriptionRequest.execute(DefaultPlcSubscriptionRequest.java:61)
        at 
de.koehl.plc_adapter.TestPlcAdapter.readTestPlc(TestPlcAdapter.java:129)
        at de.koehl.plc_adapter.TestPlcAdapter.main(TestPlcAdapter.java:57)
Disconnected from the target VM, address: '127.0.0.1:50521', transport: 'socket'

Process finished with exit code 0

Reply via email to