You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@plc4x.apache.org by Martin Illecker <ma...@gmail.com> on 2019/06/19 13:06:16 UTC

ADS Provider - IllegalArgumentException in DirectAdsField

Hello,

I was trying to read a value from ADS, but I got stuck with the following
error message:

Exception in thread "main" java.lang.IllegalArgumentException: Value must
between 0 and 4.294967296E9. Was -830472190
at
org.apache.plc4x.java.ads.api.util.ByteValue.checkUnsignedBounds(ByteValue.java:52)
at
org.apache.plc4x.java.ads.model.DirectAdsField.<init>(DirectAdsField.java:47)
at org.apache.plc4x.java.ads.model.DirectAdsField.of(DirectAdsField.java:57)
at
org.apache.plc4x.java.ads.connection.AdsAbstractPlcConnection.lambda$mapFields$3(AdsAbstractPlcConnection.java:188)
at
java.base/java.util.concurrent.ConcurrentHashMap.computeIfAbsent(ConcurrentHashMap.java:1705)
at
org.apache.plc4x.java.ads.connection.AdsAbstractPlcConnection.mapFields(AdsAbstractPlcConnection.java:163)
at
java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183)
at
java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:195)
at
java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:177)
at
java.base/java.util.LinkedList$LLSpliterator.forEachRemaining(LinkedList.java:1239)
at
java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:484)
at
java.base/java.util.stream.ForEachOps$ForEachTask.compute(ForEachOps.java:290)
at
java.base/java.util.concurrent.CountedCompleter.exec(CountedCompleter.java:746)
at java.base/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:290)
at
java.base/java.util.concurrent.ForkJoinTask.doInvoke(ForkJoinTask.java:408)
at java.base/java.util.concurrent.ForkJoinTask.invoke(ForkJoinTask.java:736)
at
java.base/java.util.stream.ForEachOps$ForEachOp.evaluateParallel(ForEachOps.java:159)
at
java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateParallel(ForEachOps.java:173)
at
java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:233)
at
java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:497)
at
org.apache.plc4x.java.ads.connection.AdsAbstractPlcConnection.mapFields(AdsAbstractPlcConnection.java:157)
at
org.apache.plc4x.java.ads.connection.AdsAbstractPlcConnection.read(AdsAbstractPlcConnection.java:103)
at
org.apache.plc4x.java.base.messages.DefaultPlcReadRequest.execute(DefaultPlcReadRequest.java:44)
at plc4x.HelloADS.main(HelloADS.java:43)

Please find attached my Java source code and debug screenshots.

Best regards
Martin

Re: ADS Provider - IllegalArgumentException in DirectAdsField

Posted by Julian Feinauer <j....@pragmaticminds.de>.
Hi Martin,

first, thanks for your work and in-depth analysis.
Unfortunetly, the original Author of the ADS driver (Sebastian) is currently pretty busy and thus mostly unavailable.

Generally speaking, if you're able to write a fixed version of the code you can issue a pull request (but we should nonetheless file a bug for that in jira).

Perhaps we should contact the Beckhoff guys... Christofer Dutz has a good contact there, or chris?
Otherwise perhaps we should add a switch to enable that (possibly intentionally wrong) behavior?

What do others think?

Julian

Am 21.06.19, 11:42 schrieb "Martin Illecker" <ma...@gmail.com>:

    Hello,
    
    I was able to find the real issue. For some reason the response of the PLC
    seems not to be in *LITTLE_ENDIAN* format.
    Therefore, the Byte to Integer conversion in [1] results in a negative
    number. It occurs during the *symbolHandle *creation in [2].
    
    I had also a look at the ADS specification and the response should be in
    *LITTLE_ENDIAN* format.
    
    So how can I fix this behavior or is it possible to support also the
    Big-Endian-Format?
    
    Thanks!
    
    Best regards
    Martin
    
    [1]
    https://github.com/apache/plc4x/blob/develop/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/util/UnsignedIntLEByteValue.java#L39
    [2]
    https://github.com/apache/plc4x/blob/develop/plc4j/drivers/ads/src/main/java/org/apache/plc4x/java/ads/connection/AdsAbstractPlcConnection.java#L187
    [3]
    https://infosys.beckhoff.com/index.php?content=../content/1031/tcplclibutilities/html/TcPlcLibUtilities_AddOn_ByteOrder.htm&id=
    
    
    Am Mi., 19. Juni 2019 um 15:06 Uhr schrieb Martin Illecker <
    martin.illecker@gmail.com>:
    
    > Hello,
    >
    > I was trying to read a value from ADS, but I got stuck with the following
    > error message:
    >
    > Exception in thread "main" java.lang.IllegalArgumentException: Value must
    > between 0 and 4.294967296E9. Was -830472190
    > at
    > org.apache.plc4x.java.ads.api.util.ByteValue.checkUnsignedBounds(ByteValue.java:52)
    > at
    > org.apache.plc4x.java.ads.model.DirectAdsField.<init>(DirectAdsField.java:47)
    > at
    > org.apache.plc4x.java.ads.model.DirectAdsField.of(DirectAdsField.java:57)
    > at
    > org.apache.plc4x.java.ads.connection.AdsAbstractPlcConnection.lambda$mapFields$3(AdsAbstractPlcConnection.java:188)
    > at
    > java.base/java.util.concurrent.ConcurrentHashMap.computeIfAbsent(ConcurrentHashMap.java:1705)
    > at
    > org.apache.plc4x.java.ads.connection.AdsAbstractPlcConnection.mapFields(AdsAbstractPlcConnection.java:163)
    > at
    > java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183)
    > at
    > java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:195)
    > at
    > java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:177)
    > at
    > java.base/java.util.LinkedList$LLSpliterator.forEachRemaining(LinkedList.java:1239)
    > at
    > java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:484)
    > at
    > java.base/java.util.stream.ForEachOps$ForEachTask.compute(ForEachOps.java:290)
    > at
    > java.base/java.util.concurrent.CountedCompleter.exec(CountedCompleter.java:746)
    > at
    > java.base/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:290)
    > at
    > java.base/java.util.concurrent.ForkJoinTask.doInvoke(ForkJoinTask.java:408)
    > at
    > java.base/java.util.concurrent.ForkJoinTask.invoke(ForkJoinTask.java:736)
    > at
    > java.base/java.util.stream.ForEachOps$ForEachOp.evaluateParallel(ForEachOps.java:159)
    > at
    > java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateParallel(ForEachOps.java:173)
    > at
    > java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:233)
    > at
    > java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:497)
    > at
    > org.apache.plc4x.java.ads.connection.AdsAbstractPlcConnection.mapFields(AdsAbstractPlcConnection.java:157)
    > at
    > org.apache.plc4x.java.ads.connection.AdsAbstractPlcConnection.read(AdsAbstractPlcConnection.java:103)
    > at
    > org.apache.plc4x.java.base.messages.DefaultPlcReadRequest.execute(DefaultPlcReadRequest.java:44)
    > at plc4x.HelloADS.main(HelloADS.java:43)
    >
    > Please find attached my Java source code and debug screenshots.
    >
    > Best regards
    > Martin
    >
    >
    


Re: ADS Provider - IllegalArgumentException in DirectAdsField

Posted by Christofer Dutz <ch...@c-ware.de>.
Hi Martin,

as I think for modbus there seems to be differences in how the registers "short" values are transmitted, we decided to go for the default and provide an option to override the endianness in the connection-string.
Do you think that would be an option? Could you please create an issue in jira and provide some more information on the device? So we can come-up with a good name for the parameter.

Chris


Am 21.06.19, 11:42 schrieb "Martin Illecker" <ma...@gmail.com>:

    Hello,
    
    I was able to find the real issue. For some reason the response of the PLC
    seems not to be in *LITTLE_ENDIAN* format.
    Therefore, the Byte to Integer conversion in [1] results in a negative
    number. It occurs during the *symbolHandle *creation in [2].
    
    I had also a look at the ADS specification and the response should be in
    *LITTLE_ENDIAN* format.
    
    So how can I fix this behavior or is it possible to support also the
    Big-Endian-Format?
    
    Thanks!
    
    Best regards
    Martin
    
    [1]
    https://github.com/apache/plc4x/blob/develop/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/util/UnsignedIntLEByteValue.java#L39
    [2]
    https://github.com/apache/plc4x/blob/develop/plc4j/drivers/ads/src/main/java/org/apache/plc4x/java/ads/connection/AdsAbstractPlcConnection.java#L187
    [3]
    https://infosys.beckhoff.com/index.php?content=../content/1031/tcplclibutilities/html/TcPlcLibUtilities_AddOn_ByteOrder.htm&id=
    
    
    Am Mi., 19. Juni 2019 um 15:06 Uhr schrieb Martin Illecker <
    martin.illecker@gmail.com>:
    
    > Hello,
    >
    > I was trying to read a value from ADS, but I got stuck with the following
    > error message:
    >
    > Exception in thread "main" java.lang.IllegalArgumentException: Value must
    > between 0 and 4.294967296E9. Was -830472190
    > at
    > org.apache.plc4x.java.ads.api.util.ByteValue.checkUnsignedBounds(ByteValue.java:52)
    > at
    > org.apache.plc4x.java.ads.model.DirectAdsField.<init>(DirectAdsField.java:47)
    > at
    > org.apache.plc4x.java.ads.model.DirectAdsField.of(DirectAdsField.java:57)
    > at
    > org.apache.plc4x.java.ads.connection.AdsAbstractPlcConnection.lambda$mapFields$3(AdsAbstractPlcConnection.java:188)
    > at
    > java.base/java.util.concurrent.ConcurrentHashMap.computeIfAbsent(ConcurrentHashMap.java:1705)
    > at
    > org.apache.plc4x.java.ads.connection.AdsAbstractPlcConnection.mapFields(AdsAbstractPlcConnection.java:163)
    > at
    > java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183)
    > at
    > java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:195)
    > at
    > java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:177)
    > at
    > java.base/java.util.LinkedList$LLSpliterator.forEachRemaining(LinkedList.java:1239)
    > at
    > java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:484)
    > at
    > java.base/java.util.stream.ForEachOps$ForEachTask.compute(ForEachOps.java:290)
    > at
    > java.base/java.util.concurrent.CountedCompleter.exec(CountedCompleter.java:746)
    > at
    > java.base/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:290)
    > at
    > java.base/java.util.concurrent.ForkJoinTask.doInvoke(ForkJoinTask.java:408)
    > at
    > java.base/java.util.concurrent.ForkJoinTask.invoke(ForkJoinTask.java:736)
    > at
    > java.base/java.util.stream.ForEachOps$ForEachOp.evaluateParallel(ForEachOps.java:159)
    > at
    > java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateParallel(ForEachOps.java:173)
    > at
    > java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:233)
    > at
    > java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:497)
    > at
    > org.apache.plc4x.java.ads.connection.AdsAbstractPlcConnection.mapFields(AdsAbstractPlcConnection.java:157)
    > at
    > org.apache.plc4x.java.ads.connection.AdsAbstractPlcConnection.read(AdsAbstractPlcConnection.java:103)
    > at
    > org.apache.plc4x.java.base.messages.DefaultPlcReadRequest.execute(DefaultPlcReadRequest.java:44)
    > at plc4x.HelloADS.main(HelloADS.java:43)
    >
    > Please find attached my Java source code and debug screenshots.
    >
    > Best regards
    > Martin
    >
    >
    


Re: ADS Provider - IllegalArgumentException in DirectAdsField

Posted by Martin Illecker <ma...@gmail.com>.
Hello,

I was able to find the real issue. For some reason the response of the PLC
seems not to be in *LITTLE_ENDIAN* format.
Therefore, the Byte to Integer conversion in [1] results in a negative
number. It occurs during the *symbolHandle *creation in [2].

I had also a look at the ADS specification and the response should be in
*LITTLE_ENDIAN* format.

So how can I fix this behavior or is it possible to support also the
Big-Endian-Format?

Thanks!

Best regards
Martin

[1]
https://github.com/apache/plc4x/blob/develop/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/util/UnsignedIntLEByteValue.java#L39
[2]
https://github.com/apache/plc4x/blob/develop/plc4j/drivers/ads/src/main/java/org/apache/plc4x/java/ads/connection/AdsAbstractPlcConnection.java#L187
[3]
https://infosys.beckhoff.com/index.php?content=../content/1031/tcplclibutilities/html/TcPlcLibUtilities_AddOn_ByteOrder.htm&id=


Am Mi., 19. Juni 2019 um 15:06 Uhr schrieb Martin Illecker <
martin.illecker@gmail.com>:

> Hello,
>
> I was trying to read a value from ADS, but I got stuck with the following
> error message:
>
> Exception in thread "main" java.lang.IllegalArgumentException: Value must
> between 0 and 4.294967296E9. Was -830472190
> at
> org.apache.plc4x.java.ads.api.util.ByteValue.checkUnsignedBounds(ByteValue.java:52)
> at
> org.apache.plc4x.java.ads.model.DirectAdsField.<init>(DirectAdsField.java:47)
> at
> org.apache.plc4x.java.ads.model.DirectAdsField.of(DirectAdsField.java:57)
> at
> org.apache.plc4x.java.ads.connection.AdsAbstractPlcConnection.lambda$mapFields$3(AdsAbstractPlcConnection.java:188)
> at
> java.base/java.util.concurrent.ConcurrentHashMap.computeIfAbsent(ConcurrentHashMap.java:1705)
> at
> org.apache.plc4x.java.ads.connection.AdsAbstractPlcConnection.mapFields(AdsAbstractPlcConnection.java:163)
> at
> java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183)
> at
> java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:195)
> at
> java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:177)
> at
> java.base/java.util.LinkedList$LLSpliterator.forEachRemaining(LinkedList.java:1239)
> at
> java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:484)
> at
> java.base/java.util.stream.ForEachOps$ForEachTask.compute(ForEachOps.java:290)
> at
> java.base/java.util.concurrent.CountedCompleter.exec(CountedCompleter.java:746)
> at
> java.base/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:290)
> at
> java.base/java.util.concurrent.ForkJoinTask.doInvoke(ForkJoinTask.java:408)
> at
> java.base/java.util.concurrent.ForkJoinTask.invoke(ForkJoinTask.java:736)
> at
> java.base/java.util.stream.ForEachOps$ForEachOp.evaluateParallel(ForEachOps.java:159)
> at
> java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateParallel(ForEachOps.java:173)
> at
> java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:233)
> at
> java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:497)
> at
> org.apache.plc4x.java.ads.connection.AdsAbstractPlcConnection.mapFields(AdsAbstractPlcConnection.java:157)
> at
> org.apache.plc4x.java.ads.connection.AdsAbstractPlcConnection.read(AdsAbstractPlcConnection.java:103)
> at
> org.apache.plc4x.java.base.messages.DefaultPlcReadRequest.execute(DefaultPlcReadRequest.java:44)
> at plc4x.HelloADS.main(HelloADS.java:43)
>
> Please find attached my Java source code and debug screenshots.
>
> Best regards
> Martin
>
>

Re: ADS Provider - IllegalArgumentException in DirectAdsField

Posted by Julian Feinauer <j....@pragmaticminds.de>.
Hi Martin,

sadly, the mailing list skips attachements from the email, so we cannot see it.
Would you mind to create a Bug in our Jira [1] and attach your files there?

This would be great and help us to trace down the bug.

Thank you!
Julian

[1] https://issues.apache.org/jira/projects/PLC4X/issues/

Von: Martin Illecker <ma...@gmail.com>
Antworten an: "dev@plc4x.apache.org" <de...@plc4x.apache.org>
Datum: Mittwoch, 19. Juni 2019 um 15:06
An: "dev@plc4x.apache.org" <de...@plc4x.apache.org>
Betreff: ADS Provider - IllegalArgumentException in DirectAdsField

Hello,

I was trying to read a value from ADS, but I got stuck with the following error message:

Exception in thread "main" java.lang.IllegalArgumentException: Value must between 0 and 4.294967296E9. Was -830472190
at org.apache.plc4x.java.ads.api.util.ByteValue.checkUnsignedBounds(ByteValue.java:52)
at org.apache.plc4x.java.ads.model.DirectAdsField.<init>(DirectAdsField.java:47)
at org.apache.plc4x.java.ads.model.DirectAdsField.of(DirectAdsField.java:57)
at org.apache.plc4x.java.ads.connection.AdsAbstractPlcConnection.lambda$mapFields$3(AdsAbstractPlcConnection.java:188)
at java.base/java.util.concurrent.ConcurrentHashMap.computeIfAbsent(ConcurrentHashMap.java:1705)
at org.apache.plc4x.java.ads.connection.AdsAbstractPlcConnection.mapFields(AdsAbstractPlcConnection.java:163)
at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183)
at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:195)
at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:177)
at java.base/java.util.LinkedList$LLSpliterator.forEachRemaining(LinkedList.java:1239)
at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:484)
at java.base/java.util.stream.ForEachOps$ForEachTask.compute(ForEachOps.java:290)
at java.base/java.util.concurrent.CountedCompleter.exec(CountedCompleter.java:746)
at java.base/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:290)
at java.base/java.util.concurrent.ForkJoinTask.doInvoke(ForkJoinTask.java:408)
at java.base/java.util.concurrent.ForkJoinTask.invoke(ForkJoinTask.java:736)
at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateParallel(ForEachOps.java:159)
at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateParallel(ForEachOps.java:173)
at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:233)
at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:497)
at org.apache.plc4x.java.ads.connection.AdsAbstractPlcConnection.mapFields(AdsAbstractPlcConnection.java:157)
at org.apache.plc4x.java.ads.connection.AdsAbstractPlcConnection.read(AdsAbstractPlcConnection.java:103)
at org.apache.plc4x.java.base.messages.DefaultPlcReadRequest.execute(DefaultPlcReadRequest.java:44)
at plc4x.HelloADS.main(HelloADS.java:43)

Please find attached my Java source code and debug screenshots.

Best regards
Martin