Hi Guido, first of all, welcome here ... I am sure we'll be able to help you.
Regarding your problem with the subcriptions. This is actually something we already discussed interenally (here on the list). The problem is, that this sort of subscription, that was recently added to the S7 driver, is only supported on a very limited subset oft he S7 devices. I think currently only the big S7 400 devicess support that, but I'm sure Cesar (the one who implemented that feature) will be able to give you more information on this. Right now I would expect it to simply fail on S7 300, S7 1200 and S7 1500 ... and of course the LOGO ... So as a next step, I think we should make the driver aware of this and return a sensible error in case of requesting a subscription builder from a connection to a device, that doesn't support this. On a longer perspective we have plans to simulate subscriptions by internally polling in the background, but that is a feature that hasn't been implemented yet, but we have it on our shedule. Chris Von: Rennert, Guido <guido.renn...@koehl-mb.eu> Gesendet: Donnerstag, 4. November 2021 11:06 An: dev@plc4x.apache.org Betreff: some problems with S7 cyclic subscriptions 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/>.