-
Notifications
You must be signed in to change notification settings - Fork 498
Expand file tree
/
Copy pathRELEASE_NOTES
More file actions
1141 lines (987 loc) · 49.3 KB
/
Copy pathRELEASE_NOTES
File metadata and controls
1141 lines (987 loc) · 49.3 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
==============================================================
(Unreleased) Apache PLC4X 1.0.0-SNAPSHOT
==============================================================
New Features
------------
- Java Configurations of drivers now support a "FILE" type
of configuration parameter.
- Subscription of change-of-state values now supports
providing a min time interval to prevent excessive
notifications.
- Added a new PlcCertificateAuthentication to the API module.
- Initial version of a new Java UMAS driver.
- Initial version of a new Java SLMP (Mitsubishi MELSEC) driver:
read and write access to word devices (D/W/R) using binary 3E
frames over TCP (including Batch Write).
- The 'plc4x' proxy driver now supports TLS as a transport and
requires mandatory username/password authentication
(configured via the new "username" and "password" connection
parameters).
- The Go serial transport now supports the full set of serial
options in the connection string: data-bits, stop-bits, parity,
flow-control, dtr, rts, read-timeout and write-timeout.
- The Go serial transport supports sharing one physical serial port
between multiple connections ("reuse-port", e.g. multi-slave Modbus
RTU) with broadcast reads and serialized writes, plus inter-frame
write pacing ("interframe-delay") on both shared and dedicated ports.
- The Java serial transport's shared-port mode ("reuse-port") now uses a
single broadcast reader per physical port, fixing responses being split
between connections, and "interframe-delay" write pacing works on both
shared and dedicated ports (gap measured from the last write or
received data).
- The Java Modbus RTU codec now frames responses by function code with
CRC validation and byte-wise resynchronization: batched deliveries
(e.g. on shared serial ports) yield every frame instead of only the
first, and partial or corrupted frames no longer discard buffered data.
- Java Modbus serial connections (RTU/ASCII) now serialize their requests
per connection (single outstanding transaction, matching the protocol),
fixing concurrent same-unit requests receiving each other's responses;
unknown Modbus exception codes map to REMOTE_ERROR instead of failing;
shared serial ports dispatch each connection's callbacks on their own
thread, so one blocked callback no longer stalls the whole port.
Responses are additionally validated against the pending request's
function code (late responses from timed-out requests are discarded
instead of completing the wrong caller), and the request timeout now
covers the full time from submission, including queueing.
- Drivers that don't natively support subscriptions (Modbus,
EtherNet/IP, AB-ETH, SLMP, UMAS) now provide subscriptions
through a polling-based emulation layer, supporting CYCLIC and
CHANGE_OF_STATE subscriptions.
- Added a new remote-data-fetching component (event-pump)
replacing the old scraper.
- Re-implemented the connection-cache with more reliable resource
handling and transparent re-subscription after a connection was
lost and re-established.
- New TCP transport implementation using per-connection
virtual-thread blocking I/O (replacing the NIO selector),
scaling better on Java 21.
- OPC-UA: Added reading and writing of structured values
(PlcStruct) and corrected array handling.
- OPC-UA: Tag data types are now derived from the server's type
model instead of being guessed from the input data.
- OPC-UA: Added browse support, resolving server-side types and
access rights.
- Simulated driver: Added STRING support.
- CANopen: Added NMT command support.
- Go: Added a production-grade BACnet/IP driver (segmentation,
write priority, directed/multi-target WhoIs, routed addressing,
array/bit-string property decoding).
- Go: The connection-cache now supports a configurable max idle
time, and connections carrying subscriptions are exempt from the
idle TTL.
- The Object-PLC-Mapping (OPM) module was ported to SPI3.
- PlcBrowseItem now reports which subscription types each item
supports via a new getSupportedSubscriptionTypes() method, so
browse results carry subscription capability information.
- OPC-UA: Improved Siemens S7-1500 support, including reading and
writing of (almost) all variant types.
- Updated the bundled KNX manufacturer data and the BACnet/KNX
vendor IDs for broader device recognition.
- Go: Connections can now be invalidated (Invalidate()) to mark
themselves irrecoverably failed for lease management, and
transport errors are now classified and propagated through
codecs/transports (TransportErrorKind).
- Performance: Sped up byte-aligned integer read/write in the Java
byte-based SPI buffers.
- EtherNet/IP: The CIP bit-string types (BYTE, WORD, DWORD, LWORD)
and unsigned integer types (USINT, UINT, UDINT, ULINT) can now be
read and written, in both the Java and the Go drivers. They were
accepted by the address parser but not decoded, so reading such a
tag returned INTERNAL_ERROR. All eight are unsigned over their
full range: a DWORD reads as 0 to 4294967295 and an LWORD as 0 to
18446744073709551615. Their signed counterparts are unchanged - a
DINT of 0xFFFFFFFF still reads as -1.
Incompatible changes
--------------------
- The connection-creating methods of the API moved from
"PlcConnectionManager" to a new "PlcConnectionFactory"
interface, which the "PlcDriverManager" hands out via
"getConnectionFactory()" (formerly "getConnectionManager()").
"PlcConnectionManager" now extends "PlcConnectionFactory" and
adds the "close()" method, and is only implemented by managers
that keep the connections they hand out, such as the connection
cache.
- The connection cache was renamed from
"CachedPlcConnectionManager" to "PlcConnectionCache", matching
the name the concept already has in PLC4Go. Its builder method
"withConnectionManager()" became "withConnectionFactory()", and
"PlcConnectionManagerClosedException" became
"PlcConnectionCacheClosedException". The Maven artifactId
("plc4j-tools-connection-cache") and the package are
unchanged.
- All drivers were migrated to a new shared SPI ("SPI3"):
dependency-free Read/Write buffers, an updated code-generation
framework, a pluggable-transport system and a layered
protocol-driver model.
- Drivers now reject connection strings using an unsupported
transport with an exception. The check can be force-disabled
via a configuration parameter.
- Several Maven artifactIds changed (tools, transports, scraper);
see the "Changed Maven Coordinates" section below for the full
mapping. Consumers must update their coordinates.
- The PlcBrowseItem interface gained a
getSupportedSubscriptionTypes() method that custom
implementations must now provide.
- Dropped support for Java 11, new baseline Java version is
Java 21.
- Migrated the build to Apache Maven 4.
- The Go serial transport's default baud-rate changed from 115200
to 9600 (aligning with common serial defaults and the Java
transport). Specify baud-rate explicitly if you relied on the
previous default.
- Go serial reads/writes without an explicit context deadline are
now bounded by the new read-timeout/write-timeout options
(default 1000 ms; set to 0 for the previous blocking behavior),
and invalid serial option values now fail connection creation
instead of being silently ignored.
- The Java serial transport removed the unused options
"break-enabled", "receive-buffer-size" and "send-buffer-size",
removed the combined "RTS_CTS_XON_XOFF" flow-control mode, and now
rejects invalid parity/flow-control values instead of silently
falling back to defaults. Option values are case-insensitive and
accept "-" or "_" as separator (canonical forms: none, odd, even,
mark, space; none, rts-cts, xon-xoff).
- Acquiring a shared Java serial port ("reuse-port") with a configuration
differing from the first connection's now fails with an error instead
of silently reusing the first configuration.
- The 'plc4x' proxy driver now defaults to the TLS transport
instead of plaintext TCP. Existing plaintext connections must
switch to an explicit transport prefix (e.g. "plc4x:tcp://...").
When using TLS against a server with a self-signed certificate,
set "tls.verify-ssl=false" (or pin the certificate).
- The 'plc4x' proxy driver now requires username/password
authentication on connect; connecting without credentials, or
with invalid ones, is rejected with an ACCESS_DENIED handshake.
- The PLC4J-API module however is intentionally held at
Java 17 to allow alternate driver implementations to support
Java 17.
- Updated the signature of the PlcBrowseRequestInterceptor to
also accept a queryName, query and item instead of just an
item.
- The ConnectionStateListener interface was updated to no longer
have a connected() and disconnected() method, but use a
onConnectionStateChanged method instead that accepts
PlcConnectionStateChangedEvent events which have many more
state change options beyond a simple connected and disconnected
event.
- The OPC UA driver's "security-policy" now defaults to
Basic256Sha256 instead of NONE. NONE means the channel is
neither signed nor encrypted, so anything on the network path
can read and alter what is exchanged, and the server is not
authenticated at all.
A protected channel needs the server's certificate to be known
before the channel is opened. The discovery phase that would
otherwise fetch it runs unprotected by necessity, and a
certificate learned from the peer it is meant to authenticate
establishes nothing - so the driver no longer proceeds from
discovery onto a channel weaker than the one configured. It used
to do exactly that, silently: a connection asking for
Basic256Sha256 got a session with neither signing nor encryption
and no indication of it.
Together this means a connection that names no certificate now
fails where it previously came up unprotected. Name one with
"server-certificate-file", or a trust store with
"trust-store-file"; or set "discovery=false" if the endpoint needs
no discovery; or ask for "security-policy=NONE" to accept an
unprotected channel as before.
Note that a protected channel also needs a client key pair:
supply one with "key-store-file", or the driver generates a
throwaway self-signed certificate, which a server that
authenticates its clients will not accept.
- The OPC UA driver refuses to send a username and password over a
channel that neither signs nor encrypts, because the password is
then readable by anything on the path and stays useful long after
it is read. The new "allow-insecure-credentials" parameter sends
them anyway, with a warning.
- The OPC UA driver now requires an endpoint to match both the
requested security policy and the requested message security
mode, and selects the strongest endpoint that matches rather than
the weakest. It previously accepted an endpoint matching either
one and then chose the lowest security level on offer, so a
server publishing a wide-open endpoint beside a protected one was
usually reached over the wide-open one. Where two endpoints are
equally strong, one whose user token policy protects the token is
preferred.
- The ctrlX driver no longer trusts the Bosch factory default
certificate that ships inside the driver jar, and no longer
accepts a certificate for any host regardless of the name it was
issued for. It also asks for a TLS context rather than the
legacy "SSL" one. That certificate identifies nobody - anything
presenting it and its key was trusted - and because it was the
only trust anchor, a device carrying a properly issued
certificate could not be reached at all. The credentials for the
connection travel over that channel.
Connections to a device still on its factory certificate will
now fail. The new "allow-factory-default-certificate" parameter
restores the old behaviour, with a warning; alternatively
"server-certificate-file" names a single PEM certificate to
trust, or "trust-store-file" (with "trust-store-password" and
"trust-store-type") a key store of them, matching the names used
by the OPC UA driver and the TLS transport.
"ignore-common-name" is also available if the certificate is
trusted but names a different host.
- The TLS transport now checks that the server's certificate was
issued for the host it connected to. The "ignore-common-name"
parameter was declared but never consulted, so this check did
not happen at all: with "verify-ssl" on, any certificate from a
trusted issuer was accepted for any host, which is what a
machine in the middle needs. Setting "ignore-common-name=true"
restores the old behaviour and logs a warning saying so.
A connection to a device whose certificate names something other
than the address it is reached at will now fail where it
previously succeeded.
Two new parameters make the check usable where a device carries
its own certificate: "trust-store-file" (with
"trust-store-password" and "trust-store-type") names the
certificates to trust instead of the public authorities the JVM
ships with. Previously the only way past a private CA was
"verify-ssl=false", which turns off both the chain check and
this one.
- The IEC 60870-5-104 driver now derives its S-format
acknowledgements from the send sequence number of the frames it
received, counted modulo 2^15 and encoded in the upper fifteen
bits of the control field, as the standard requires. It
previously sent the received frame's receive sequence number
plus one, which is the station reporting how much of our traffic
it had taken in - a different number, and one that said nothing
about how far we had read. This changes what the driver puts on
the wire in response to received telemetry, so a station that
checks acknowledgements will see different (correct) values, and
one that had adapted to the old behaviour may need attention.
The frame format itself is unchanged.
- Tag addresses naming an implausible number of elements are now
rejected as invalid addresses rather than acted on. An element
count is a request to allocate, and it was taken at face value:
in the s7 driver a count is now measured against the 2097151
bytes an S7 address can reach (for the string forms, against
what one string of the declared length costs, which is the same
arithmetic the optimizer does in an int and where an unbounded
count overflowed); in the ads driver an index group, index
offset and element count must each fit the four bytes ADS
carries them in; in the firmata driver a digital tag must stay
within the 256 pins the protocol can name, having previously
turned its count into that many set bits at parse time. In all
three, a count too wide to be a number used to escape as a
NumberFormatException instead of the PlcInvalidTagException the
tag parsers promise.
- The OPC UA driver bounds a browse, which previously walked
whatever tree the server described for as long as it described
one. "browse-max-references-per-node" (default 65536) limits the
references collected for one node and is now also asked of the
server, "browse-max-total-nodes" (default 1000000) limits how
many nodes one browse expands, and "browse-max-depth" (default
64) limits how deep it recurses. Set any of them to 0 for no
limit. Reaching one warns and returns what was found rather
than failing, so an address space within these sizes is
unaffected.
- The ctrlX driver bounds a browse the same way, with
"browse-max-total-nodes" (default 1000000) and
"browse-max-depth" (default 64). Its browse also now always
completes its future: a node answering with no child list used
to throw inside the executor's task, where nothing caught it and
the caller was left waiting on a future that was never
completed. Such a node is now read as the leaf it says it is.
- The simulated driver bounds how much data one tag may ask it to
make up. The count in the address was multiplied by the size of
one element in an int to size the array it fills, so a large
enough count asked for a negative array rather than a large one,
and anything below that got what it asked for - three hundred
million doubles being 2.4 GB. The product is now measured
against a budget of 16 MiB per tag.
The Go driver carries that count as a uint16, where a count
above it used to be truncated to its low two bytes rather than
refused - a request for 70000 elements handing back a tag of
4464, and one for 65536 handing back a tag of none. Both are
now invalid addresses, as is a count of zero, which the Java
driver already refused.
- The modbus, profinet and profinet-ng tag parsers now report a
count, address or slot too wide to be a number as an invalid
tag. All three already bounded these values, but the checks ran
after the number was read, so anything too wide to read left as
a NumberFormatException instead. The digit widths are capped in
the address patterns, at what each field can hold.
- Every generated parser now refuses a message that nests its
types deeper than 1024 levels, in both the Java and the Go
bindings. Several types contain themselves - BACnet constructed
data holds further constructed data, an OPC UA variant of type
24 holds further variants - so the depth of the value tree is
the sender's to choose and one level costs a single byte on the
wire. Deep enough, that ran the parser out of stack: in Java a
StackOverflowError, which is neither a parse failure the driver
can report nor an error the receive path contains, so a frame
that should have cost one frame ended the connection; in Go a
goroutine out of stack takes the process with it rather than
the request. Set PLC4X_MAX_NESTING_DEPTH for a device whose
messages genuinely nest deeper - it means the same thing in
both bindings, and a value that is not a positive number leaves
the default in place with a warning. The deepest message in the
project's own testsuites nests 36 levels, so this bounds only
what no real device sends. Note for Go consumers that the
default rose from 255 to 1024 in the process, so one setting of
the variable now means one depth whichever binding reads it.
- plc4go now requires Go 1.27. The uuid package it used to take
from github.com/google/uuid now comes from the standard library,
which drops that dependency outright - it is gone from go.mod and
go.sum - at the cost of the version floor.
- EtherNet/IP: Two CIP data type codes were wrong and are
corrected. LWORD moves from 0x00D3 to 0x00D4 and STRINGI from
0x00DD to 0x00DE. Each had been sharing its value with another
type (DWORD and ENGUNIT respectively), and a duplicate key is
silently dropped from the generated lookup tables, so LWORD and
STRINGI could not be resolved by name or by value at all. Anyone
who hardcoded the old LWORD value was addressing a DWORD.
- EtherNet/IP: A string write now emits the structure the read path
parses - a 2-byte structure handle, a 4-byte length and then the
characters - so what the driver writes reads back as the same
value. Previously it wrote a bare length followed by the
characters, which no read could decode. The length is now the
number of UTF-8 bytes rather than of characters; the two differ
for any non-ASCII text, which used to read back truncated. Text
that does not fit the type's fixed payload is reported instead of
overflowing. Because CIPDataTypeCode.STRING declares a size of 0,
the serializer emits no payload for it at all, so a write
addressed as ":STRING" is now rejected rather than silently sent
empty - write strings as ":STRUCTURED".
- Go: Several values now serialize under their own names and in
their canonical forms, which changes the output anything parsing
it will see. PlcDWORD, PlcSINT, PlcULINT and PlcWSTRING were
serialized as PlcDINT, PlcINT, PlcUINT and PlcSTRING; PlcTIME and
PlcLTIME render ISO-8601 with hours/minutes/seconds and a
sub-second fraction instead of truncating to whole seconds;
PlcDATE_AND_TIME renders the UTC wall time in ISO-8601 rather
than Go's local-zone default; and PlcStruct keeps a deterministic
member order. String-ish values now carry encoding="UTF-8".
- Java: The unsigned bit-string values WORD, DWORD and LWORD now
serialize as dataType="uint" rather than through the signed
writers, PlcBYTE serializes as a bit string, and PlcTIME renders
as an ISO-8601 string like PlcLTIME. This aligns the Java and Go
renderings of the same value.
- EtherNet/IP: EipTag is now immutable, matching every other
driver's tag in both bindings - it was the only tag class in
plc4j that exposed setters. setType(...) and setElementNb(...)
are gone; give the type and the element count to the
constructor instead. An element count below one is normalised
to one rather than kept, so a tag built as ":INT:0", or through
the (tag, type) constructor which used to leave the count at
zero, now reads one element instead of none.
Changed Maven Coordinates
-------------------------
The Maven groupId of all modules is unchanged ("org.apache.plc4x").
The following artifactIds changed; consumers must update their
dependency coordinates accordingly:
- The "tools" modules were renamed to the "plc4j-tools-*" pattern:
plc4j-capture-replay -> plc4j-tools-capture-replay
plc4j-connection-cache -> plc4j-tools-connection-cache
plc4j-opm -> plc4j-tools-opm
- The transport modules were renamed from the singular
"plc4j-transport-*" to the plural "plc4j-transports-*":
plc4j-transport-can -> plc4j-transports-can
plc4j-transport-pcap-replay -> plc4j-transports-pcap-replay
plc4j-transport-raw-socket -> plc4j-transports-raw-socket
plc4j-transport-serial -> plc4j-transports-serial
plc4j-transport-tcp -> plc4j-transports-tcp
plc4j-transport-test -> plc4j-transports-test
plc4j-transport-udp -> plc4j-transports-udp
plc4j-transport-socketcan -> plc4j-transports-can-socketcan
plc4j-transport-virtualcan -> plc4j-transports-can-virtualcan
- The scraper was replaced by the new event-pump component:
plc4j-scraper -> plc4j-tools-event-pump
- Removed modules (no direct replacement):
plc4j-scraper-ng (experimental, dropped)
plc4j-transport-pcap-shared (obsolete)
Note: this release also adds a number of new SPI3 modules (e.g.
the "plc4j-spi-*" buffers/config/drivers/values split, the new
"plc4j-transports-api"/"-cotp"/"-tls" transports, the
"plc4j-utils-audit-log*" and "plc4j-utils-subscription-emulation"
utilities). These are new artifacts, not renames.
Bug Fixes
---------
- Fixed serialization in the 'plc4x' proxy driver's message
codec, which did not configure the buffer integer/string
encodings under SPI3 and failed to serialize any message.
- OPC-UA: Fixed several issues: a hang during discovery /
encrypted-policy negotiation, a divide-by-zero when the server
provided no certificate, and hardened parsing of corrupt or
malicious responses that could previously cause an
OutOfMemoryError.
- ADS: The connect handshake now honors the configured AMS ports
instead of hardcoding RUNTIME_SYSTEM_01/851.
- ADS: Fixed an invalid size calculation in AdsDataTypeArrayInfo.
- ADS: Fixed serialization of STRING/WSTRING values.
- S7: Fixed duplicate TSAP information at the COTP and S7 level.
- Connection-cache: Fixed a deadlock when obtaining a connection,
plus a race condition and idle-timer/cleanup issues.
- The base driver now redacts password information from console
logs.
- TCP transport: Close the SocketChannel on a failed bind /
socket-option setup.
- Request objects were made more null-safe (#2280).
- OPC-UA: All consumers registered on a shared subscription now
receive notifications (previously only one consumer was
registered).
- AB-ETH: Fixed reading a tag after the SPI3 refactoring.
- The socket is now disconnected when the handshake fails instead
of being left hanging (#2290).
- Go Modbus: Hardened frame parsing against truncated/extended
frames, trailing CRCs from misbehaving gateways and TCP
keep-alive padding, with stream resynchronization on desync.
- Go: Numerous stability and resource-leak fixes (connection cache
no longer hands out dead connections, goroutine and codec-worker
leaks on Modbus reconnect, robust Modbus receive with
desync/resync, TCP/UDP transport deadline and reset races, codec
disconnect deadlock).
- Go: Generated code ignored the string encoding declared in the
mspec and read and wrote every string as UTF-8. A WSTRING, which
ADS declares as UTF-16LE, stopped at the first NUL byte, so
"wolf" decoded as "w". The generated code now carries the real
encodings (UTF-16LE, UTF-16BE, ASCII, ISO-8859-1, Windows-1252),
and the byte-based write buffer passes the single-byte encodings
through instead of zero-filling anything it did not recognise.
Reading a string likewise honors the requested encoding, decoding
UTF-16 per code unit rather than per byte.
- Java: The XML buffer could not read back everything its own
writer produced. A field discriminating on a typed enum was
written under the enum's name but read under the field's, and a
text node larger than the parser's chunk size - the ADS symbol
and data-type tables run to 70-80k characters - failed with
"Expected end element" because the reader was not coalescing.
- ADS (Go): Several fixes. The connection accepts the same
kebab-case parameters as the Java driver (source-ams-net-id and
friends), and a missing targetAmsNetId is now reported as such
rather than as sourceAmsNetId. The device-info request uses the
configured AMS ports instead of a hardcoded 851/800. Multi-tag
subscriptions run in request order rather than in map order,
honor the requested interval as the notification cycle time, and
no longer panic when a data type is missing from the table. The
data type table is keyed by the name symbols actually reference.
- ADS (Go): Direct-address reads and writes all failed with
"invalid tag item type" - the request paths expected a pointer
where the tag handler produced a value - and never filled in the
tag's data type. Hex address parts with an odd number of digits
(0x8) were rejected, though the Java driver accepts them.
- EtherNet/IP: A reply carrying fewer bytes than a single-element
tag declares no longer throws out of the response handler; it is
reported as INTERNAL_ERROR for that tag, which is what a
truncated multi-element reply already did.
==============================================================
Apache PLC4X 0.13.1
==============================================================
New Features
------------
- Extended the PlcRawByteArray to provide access to a List of
USINT objects.
Incompatible changes
--------------------
Bug Fixes
---------
- When reading an array of bits, the old s7 driver seems to hang.
- The s7 driver causes issues when writing arrays of bits.
- The block optimizer used in s7-light causes errors, if a tag
references the same byte multiple times.
- When using the new block-optimizer in the s7-light driver,
when reading multiple BOOL values located in the same byte
produces errors
==============================================================
Apache PLC4X 0.13.0
==============================================================
New Features
------------
- The CachedPlcConnectionManager now has a maxIdleTimeout time
which defaults to 5 minutes. If a connection is not being
used for that amount of time, the connection is closed and
removed from the cache.
- The CachedPlcConnectionManager now has a close method, which
shuts down all connections.
- The CachedPlcConnection now implements the EventPlcConnection
interface which forwards listener registrations to the
connection.
- The S7 driver is now able to automatically split up large
array requests into multiple ones and transparently merge
them back together. It is now possible to read arrays of
almost unlimited size.
- Added an Optimizer to the Modbus driver, that improves read
performance of multi-item read requests by more than 10 times.
- Added an optimizer to the Modbus protocol, that allows reading
multiple fields in one request.
- Added support for Modbus encodings of BIG_ENDIAN_WORD_SWAP
and LITTLE_ENDIAN_WORD_SWAP.
- Modbus tags allow specifying the unit-id in order to address
multiple devices using one serial modbus connection.
- Added a new optimizer to the S7 protocol, that ready chunks
of data instead of individual fields, which allows reading
a lot more fields in one request.
- Added a new variant of the S7 driver, called s7-light, which
doesn't have support for subscriptions, but is less likely
to cause connection problems.
- Added auto-discovery to the KNX Driver in PLC4J.
- Added auto-discovery to EIP in PLC4J.
- Added auto-discovery to S7 in PLC4J.
- Improved some things in the SPI, that caused issues with
drivers under heavy load.
- The Modbus driver uses the "Single Register Request" if a
tag fits into one register. This can help communicating with
devices that don't support "Multi Register Requests".
Incompatible changes
--------------------
- When reading byte arrays with the s7 driver, now the more
efficient PlcRawByteArray type is used, that gives users
direct access to the bytes returned from the PLC instead of
a list of PlcValues.
- The builders for read-, write- ans subscription.requests now
process tags and values on a per-field level. If one field
has an invalid address it will now only fail the one item
related to that. Same applies to values. Only the tag who's
value was invalid will be considered failed and no longer an
exception should be thrown.
- Subscription-requests now allow registering a handler for
all fields in the subscription.
- The addPreRegisteredConsumer method was removed and versions
of the "addXYZ" methods were added, that allow providing
individual consumers for each tag.
Bug Fixes
---------
==============================================================
Apache PLC4X 0.12.0
==============================================================
New Features
------------
- API: Made several bits of information available via the API
allowing tools to provide more content assist when dealing
with PLC4X connections.
- S7: The S7 driver now supports reading of STRING and
WSTRING data-types without providing a maximum length.
- Build: Worked on making PLC4X provide reproducible builds.
- Added "Ping" functionality to: ADS, EIP, KNX, Mock, Modbus
and Simulated drivers.
- The OPC-UA Java driver now support certificate-based
authentication and encryption.
Incompatible changes
--------------------
- Java 8 is no longer officially supported and Java 11 is the
new base-line.
- Renamed the PlcDriverManager method `listDrivers` to
`getProtocolCodes`
- Renamed the PlcDriverMetadata method `canDiscover` to
`isDiscoverySupported`
- Renamed the PlcConnectionMetadata methods `canRead`, `canWrite`
`canSubscribe` and `canBrowse` to `isReadSupported`,
`isWriteSupported`, `isSubscribeSupported` and `isBrowseSupported`
- The configuration syntax for configuring transport-related
config options in the connection-string was updated to be
now prefixed with the transport name the option belongs to.
Bug Fixes
---------
- S7: Several bugs and issues regarding supporting various
duration, date and time data-types.
- S7: Implemented the missing 64bit (L-) types.
- KNX: Fixed an issue with decoding 16 bit floating point
numbers.
- NiFi-Integration: The NiFi integration module was greatly
improved.
- Core: Fixed several leaks of open threads.
==============================================================
Apache PLC4X 0.11.0
==============================================================
New Features
------------
- IEC-60870-5-104 driver
- Completely rewritten EIP driver that should now support
Allen-Bradley controllers
- Completely rewritten the ADS driver that now supports
Auto-Discovery, Browse, UDOs and auto-configuration of
remote AMS routes
- Support for S7 200 subscriptions
- Added a docker-compose setup in a preparation for reproducible
builds
- Added SBOM generation
- Improved Apache NiFi support
- Added support for the latest ETS version in KNX
- Started implementing the ping() method for some drivers
- Greatly updated Apache NiFi integration
Incompatible changes
--------------------
- Java 1.8 is no longer supported and Java 11 is now the new
baseline version we support.
- We've updated the APIs of both PLC4J and PLC4Go to be more in
sync. We also refined some of the terminology.
- We've also re-written the `connection-cache`, which now replaces
both the old `connection-pool` and the old `connection-cache`.
- The UI module has been removed as it relied on JavaFX, which is
no longer bundled with the JDK and therefore the LGPL license
renders is dad for Apache projects.
- The Apache Camel integration was moved over to the Apache Camel
project.
- The prototype-driver for PROFINET was completely updated
- Due to the extreme refactoring of S7, ADS and EIP, the Go versions
of these drivers are currently not going to work as well as before
(We're going to address these issues in the next phase after the
release)
- Changed the return type of the PLC4J Ping method to return more
information on if the ping was successful
Bug Fixes
---------
Fixed issues with memory leaks in the ConnectionManager
Fixed multiple issues reported for the handling of data-types in
S7, Modbus and ADS protocols when reading and writing.
==============================================================
Apache PLC4X 0.10.0
==============================================================
A lot of the work in this version went into refactoring and
cleaning up our code generation. The code generation itself is
now a lot cleaner and simpler as well as the code generated
for Java. We also added a number of new field-types to allow
implementing more sophisticated protocols. PLC4C now should
also support all of the constructs mspec has to offer.
New Features
------------
- Implemented a `PLC4X-Server` and `PLC4X-Driver` that allows
using the server as a proxy for communicating with PLCs.
- The Modbus driver is now also available in the variants:
"modbus-rtu" and "modbus-ascii" (Both using Serial
communication, which however can be tunneled through a
"tcp" and "udp" transport)
- The KNX driver in Java now supports reading "knxproj" files
exported from the new ETS version 6.
Incompatible changes
--------------------
- The name of the Modbus TCP driver was changed from "modbus"
to "modbus-tcp".
- Removed the Apache Edgent (incubating) integration and
examples related, as Edgent is abandoned and there were
CVEs reported, which will not be fixed.
- We have replaced the BitString types with BYTE, WORD, DWORD,
and LWORD which generally match their unsigned integer
counterparts. So we are no longer returning lists of boolean
values for any of these types.
Bug Fixes
---------
- Fixed a big bug in the KNX Datapoint decoding, which caused
byte-aligned data types to parse with an offset of 8 bit.
(This bug affected both the Java and the Go driver)
==============================================================
Apache PLC4X 0.9.0
==============================================================
New Features
------------
- The OPC UA driver has been replaced with a native driver. Previously
Eclipse Milo was being used.
- Permit customized package names for code generation
- Added an initial draft of a Discover and Browse API to PLC4J
- PLC4Go now supports many more drivers
- PLC4Go received a huge internal refactoring and cleanup
- Major cleanup of PLC4C
- S7 Driver now supports event and alarm handling on some S7 models
Incompatible changes
--------------------
Bug Fixes
---------
PLC4X-200 OPC-UA Driver not connecting if params string is not provided
PLC4X-201 OPC-UA PlcList underlying type not compatible with Eclipse Milo
PLC4X-202 OPC-UA Driver cannot write Unsigned Types
PLC4X-276 [S7] The most of the supported types don't work correctly
PLC4X-278 Double Reading Error
PLC4X-279 nioEventLoopGroup thread proliferation
PLC4X-280 ADS route request swapped positions of route name and address
PLC4X-291 DefaultPlcSubscriptionField cannot be cast to class OpcuaField
PLC4X-298 [S7] When writing REAL values the Write
operation fails with an internal error
PLC4X-299 Modbus - Kafka Connect Configuration
PLC4X-312 CAN NOT READ STRING FROM S7 PLC
PLC4X-314 CAN NOT WRITING MANY DATA TO S7 ONE TIME
==============================================================
Apache PLC4X 0.8.0
==============================================================
This is an ordinary PLC4X release, containing changes that
accumulated over time. It doesn't have an explicit focus on
a particular topic.
New Features
------------
- The KNXnet/IP Driver now supports writing of values.
- The Modbus driver now supports more common notations of
Modbus addresses using a pure-numeric notation.
- The ADS, KNX, Modbus, S7 and simulated drivers have been
updated to support the IEC 61131-3 data-types.
- We are now including PLC4Go as PLC4X implementation in
the programming language Go(lang)
- Integration with the Milo OPC UA Server is now available.
- Kafka Connect workers have been updated source and sink connectors
are now included.
Incompatible changes
--------------------
- The syntax of the S7 addresses changed slightly allowing to
provide a string length. Without this, a STRING datatype will
read 254 characters, by adding the size in round brackets to
the type name will use the specified number.
Examples:
Read one String which is max 10 chars long:
%DB2:30:STRING(10)
Read an array of 3 Strings where each is max 10 chars long:
%DB2:30:STRING(10)[3]
- The PLCValue types have been refactored to align with the types
defined in IEC 61131-3 (https://en.wikipedia.org/wiki/IEC_61131-3)
directly using the older Java types (PlcBoolean) is no longer
possible.
Bug Fixes
---------
A lot of testing was done regarding the IEC 61131-3 data-types.
This resulted in numerous bugfixes in many protocols.
PLC4X-132 [S7] Communication to S7 PLC dies in some situations
PLC4X-206 When writing short values exceptions are thrown
while preparing the write request.
PLC4X-207 No registered handler found for message TPKTPacket[],
using default decode method - Communication with S7
and Modbus device hangs
PLC4X-209 [S7] When writing INT and DINT values the Write
operation fails with an internal error
PLC4X-210 [KNX] When running a KNX Tunneling Subscription
for a longer time there are packets that kill
the connection
PLC4X-211 PlcValues seem to always return "true" on the
isXYZ" checks.
PLC4X-212 When writing multiple values in one request the
item status is not correctly set
PLC4X-213 [Modbus] The Modbus driver doesn't handle error
responses gracefully
PLC4X-214 [Modbus] Holding register addresses have an offset
of 1 (Not reading the correct address)
PLC4X-215 Drivers using the BaseOptimizer
(SingleFieldOptimizer) don't handle error responses
gracefully
PLC4X-218 [Scraper] After stopping the scraper still the
statistics are logged and the application doesn't
terminate
PLC4X-239 Read DTL (Date and Time)
PLC4X-240 Protocol error in reading string
PLC4X-246 S7 driver hangs on read
PLC4X-245 [Modbus] Apache NiFi processor throws
java.io.IOException after a while
PLC4X-255 Kafka Connector Source Task doesn't block within poll()
resulting in high CPU usage.
PLC4X-261 Pooled connection manager returns a connection that isn't
connected in some situations.
PLC4X-272 When splitting up large requests, too big sub-requests
are generated (S7)
PLC4X-256 ReadBuffer truncate last byte of even small payloads
PLC4X-262 Error in reading Array
PLC4X-270 Ads driver does not accept double-digit array indexes
==============================================================
Apache PLC4X 0.7.0
==============================================================
This version is the first after a major refactoring of the driver
core. All previous driver versions are now considered deprecated
and have been replaced by versions using the new driver structure
and generated driver codebase.
New Features
------------
- Drivers now support structured types using PlcValues
- The EIP (EtherNet/IP) driver no longer requires an external
library and is implemented fully in the PLC4X project
- The Modbus driver no longer requires an external library
and is implemented fully in the PLC4X project
- The new S7 Driver supports writing multiple entries in one
request (The API allowed this from the beginning now not
every item is wrapped in a single request. It should bring
significant performance gains when writing multiple values)
- S7 Driver now supports String datatypes.
- OSGi : Implementation of Drivers/Transports as OSGi services
to be able to use them in an OSGi container.
- New Firmata protocol driver
Incompatible changes
--------------------
- Due to the refactoring of the driver core there might be issues
running drivers built against older core versions.
- This version doesn't provide a Beckhoff AMS/ADS driver as this
driver is still being ported to the new mspec format.
- All drivers connection strings now follow the same pattern:
{protocol-code:(transport-code:)?//{transport-config}(?{params})?
Please check the drivers documentation on our website:
https://plc4x.apache.org/users/protocols/s7.html
- The karaf-feature modules are removed as the drivers now all
provide both a feature.xml as well as a `kar` bundled archive
Bug Fixes
---------
PLC4X-174 UDP Transport does not accept ports containing 0
PLC4X-134 S7 is terminating the connection during handshake
PLC4X-192 Support for conversion of complex connection string
parameters
==============================================================
Apache PLC4X 0.6.0
==============================================================
This is the last release of PLC4X with the "handwritten" drivers.
This Minor release will thus receive updates and fixes until
most users have switched to 0.7 and above (with generated drivers).
If you are using the S7 Driver you should update to this Version
as the critical (memory leak) bug PLC4X-163 is fixed.
New Features
------------
- PLC4X-168 A shorter S7 Field Syntax is Introduced.
This release contains no further features and mostly stabilization.
Incompatible changes
--------------------
- Moved the C++, C# and Python drivers into the `sandbox`
Bug Fixes
---------
- Fixed Promise Chain for InternalPlcWriteRequest
- PLC4X-45 Add float support to Modbus Protocol
- PLC4X-164 Fix wrong NOT FOUND exception in OPC UA Driver
- PLC4X-166 Fixed Download Page
- PLC4X-163 Fixed Netty ByteBuf Leaks for S7 Driver
- PLC4X-158 Added Warning if no Pooled Driver is used for Scraper
==============================================================
Apache PLC4X 0.5.0
==============================================================
This is the first release containing our new generated drivers (AB-ETH)
New Features
------------
- Implemented a new Apache Kafka Connect integration module
- Implemented a new Apache NiFi integration module
- Implemented a new Logstash integration module
- Implemented a driver for the AB-ETH protocol
- Implemented Apache Karaf features for S7 OSGI drivers
- PLC4X-121 Develop Code Generation to allow Generated Drivers in multiple Languages
Sandbox (Beta-Features)
- Implemented a new BACnet/IP passive mode driver
- Implemented a new Serial DF1 driver
Incompatible changes
--------------------
Bug Fixes
---------
- PLC4X-104 S7 Driver Datatype TIME_OF_DAY causes ArrayOutOfBoundException
- PLC4X-134 S7 is terminating the connection during handshake
- PLC4X-139 PLC4X leaks sockets in case of connection problems
- PLC4X-141 String with real length of greater 127 throw an exception
- PLC4X-144 When requesting invalid addresses, the DefaultS7MessageProcessor produces errors
==============================================================
Apache PLC4X 0.4.0
==============================================================
This is the first release of Apache PLC4X as top-level project.
New Features
------------
- The PlcConnection now supports a `ping` method to allow checking if an existing connection is still alive.
- Support of the OPC-UA protocol with the `opc-ua-driver`.
- Other Languages Support:
-- Added first versions of a C# .Net PLC4X API (`plc4net`)
-- Added first versions of a Python PLC4X API (`plc4py`)
- Added an Interop server which allows to relay requests from other languages to a Java Server
Incompatible changes
--------------------
- ElasticSearch example was updated to use ElasticSearch 7.0.1, this might cause problems with older Kibana versions.
Bug Fixes
---------
==============================================================
Apache PLC4X (incubating) 0.3.1
==============================================================
This is a bugfix-release, that fixes some problems with S7 driver.
Bug Fixes
---------
- The S7 driver didn't correctly handle "fill-bytes" in multi-item read-responses and multi-item write-requests
- PLC4X-83: fixed NPE when reading odd-length array of one-byte base types
- PLC4X-82: renamed flags "F" to Siemens Standard "M" (Marker)
- PLC4X-84: Fixed a bug in the DefaultS7MessageProcessor which didn't correctly merge together split up items
==============================================================
Apache PLC4X (incubating) 0.3.0
==============================================================