python-snap7 3.2.1__tar.gz → 3.3.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (142) hide show
  1. {python_snap7-3.2.1 → python_snap7-3.3.0}/CHANGES.md +51 -0
  2. {python_snap7-3.2.1/python_snap7.egg-info → python_snap7-3.3.0}/PKG-INFO +24 -2
  3. {python_snap7-3.2.1 → python_snap7-3.3.0}/README.rst +22 -0
  4. {python_snap7-3.2.1 → python_snap7-3.3.0}/doc/plc-support.rst +66 -0
  5. {python_snap7-3.2.1 → python_snap7-3.3.0}/doc/real-plc-testing.rst +3 -0
  6. {python_snap7-3.2.1 → python_snap7-3.3.0}/pyproject.toml +2 -2
  7. {python_snap7-3.2.1 → python_snap7-3.3.0/python_snap7.egg-info}/PKG-INFO +24 -2
  8. {python_snap7-3.2.1 → python_snap7-3.3.0}/python_snap7.egg-info/SOURCES.txt +1 -0
  9. {python_snap7-3.2.1 → python_snap7-3.3.0}/python_snap7.egg-info/requires.txt +1 -1
  10. {python_snap7-3.2.1 → python_snap7-3.3.0}/snap7/async_client.py +327 -5
  11. {python_snap7-3.2.1 → python_snap7-3.3.0}/snap7/client.py +17 -6
  12. {python_snap7-3.2.1 → python_snap7-3.3.0}/snap7/s7protocol.py +87 -103
  13. {python_snap7-3.2.1 → python_snap7-3.3.0}/snap7/server/__init__.py +38 -29
  14. {python_snap7-3.2.1 → python_snap7-3.3.0}/snap7/szl.py +1 -1
  15. {python_snap7-3.2.1 → python_snap7-3.3.0}/snap7/util/getters.py +14 -5
  16. python_snap7-3.3.0/tests/test_async_typed_access.py +168 -0
  17. {python_snap7-3.2.1 → python_snap7-3.3.0}/tests/test_multipacket.py +14 -3
  18. {python_snap7-3.2.1 → python_snap7-3.3.0}/tests/test_s7protocol.py +135 -21
  19. {python_snap7-3.2.1 → python_snap7-3.3.0}/tests/test_server.py +21 -0
  20. {python_snap7-3.2.1 → python_snap7-3.3.0}/tests/test_util.py +31 -1
  21. {python_snap7-3.2.1 → python_snap7-3.3.0}/LICENSE +0 -0
  22. {python_snap7-3.2.1 → python_snap7-3.3.0}/MANIFEST.in +0 -0
  23. {python_snap7-3.2.1 → python_snap7-3.3.0}/doc/API/client-base.rst +0 -0
  24. {python_snap7-3.2.1 → python_snap7-3.3.0}/doc/API/client.rst +0 -0
  25. {python_snap7-3.2.1 → python_snap7-3.3.0}/doc/API/connection.rst +0 -0
  26. {python_snap7-3.2.1 → python_snap7-3.3.0}/doc/API/datatypes.rst +0 -0
  27. {python_snap7-3.2.1 → python_snap7-3.3.0}/doc/API/demo.rst +0 -0
  28. {python_snap7-3.2.1 → python_snap7-3.3.0}/doc/API/discovery.rst +0 -0
  29. {python_snap7-3.2.1 → python_snap7-3.3.0}/doc/API/error.rst +0 -0
  30. {python_snap7-3.2.1 → python_snap7-3.3.0}/doc/API/log.rst +0 -0
  31. {python_snap7-3.2.1 → python_snap7-3.3.0}/doc/API/logo.rst +0 -0
  32. {python_snap7-3.2.1 → python_snap7-3.3.0}/doc/API/optimizer.rst +0 -0
  33. {python_snap7-3.2.1 → python_snap7-3.3.0}/doc/API/partner.rst +0 -0
  34. {python_snap7-3.2.1 → python_snap7-3.3.0}/doc/API/ppi.rst +0 -0
  35. {python_snap7-3.2.1 → python_snap7-3.3.0}/doc/API/rate-limiter.rst +0 -0
  36. {python_snap7-3.2.1 → python_snap7-3.3.0}/doc/API/s7protocol.rst +0 -0
  37. {python_snap7-3.2.1 → python_snap7-3.3.0}/doc/API/server.rst +0 -0
  38. {python_snap7-3.2.1 → python_snap7-3.3.0}/doc/API/szl.rst +0 -0
  39. {python_snap7-3.2.1 → python_snap7-3.3.0}/doc/API/tags.rst +0 -0
  40. {python_snap7-3.2.1 → python_snap7-3.3.0}/doc/API/type.rst +0 -0
  41. {python_snap7-3.2.1 → python_snap7-3.3.0}/doc/API/util.rst +0 -0
  42. {python_snap7-3.2.1 → python_snap7-3.3.0}/doc/Makefile +0 -0
  43. {python_snap7-3.2.1 → python_snap7-3.3.0}/doc/_static/.phony +0 -0
  44. {python_snap7-3.2.1 → python_snap7-3.3.0}/doc/advanced.rst +0 -0
  45. {python_snap7-3.2.1 → python_snap7-3.3.0}/doc/cli.rst +0 -0
  46. {python_snap7-3.2.1 → python_snap7-3.3.0}/doc/conf.py +0 -0
  47. {python_snap7-3.2.1 → python_snap7-3.3.0}/doc/connecting.rst +0 -0
  48. {python_snap7-3.2.1 → python_snap7-3.3.0}/doc/connection-issues.rst +0 -0
  49. {python_snap7-3.2.1 → python_snap7-3.3.0}/doc/development.rst +0 -0
  50. {python_snap7-3.2.1 → python_snap7-3.3.0}/doc/error-reference.rst +0 -0
  51. {python_snap7-3.2.1 → python_snap7-3.3.0}/doc/index.rst +0 -0
  52. {python_snap7-3.2.1 → python_snap7-3.3.0}/doc/installation.rst +0 -0
  53. {python_snap7-3.2.1 → python_snap7-3.3.0}/doc/introduction.rst +0 -0
  54. {python_snap7-3.2.1 → python_snap7-3.3.0}/doc/limitations.rst +0 -0
  55. {python_snap7-3.2.1 → python_snap7-3.3.0}/doc/multi-variable.rst +0 -0
  56. {python_snap7-3.2.1 → python_snap7-3.3.0}/doc/ppi.rst +0 -0
  57. {python_snap7-3.2.1 → python_snap7-3.3.0}/doc/reading-writing.rst +0 -0
  58. {python_snap7-3.2.1 → python_snap7-3.3.0}/doc/server.rst +0 -0
  59. {python_snap7-3.2.1 → python_snap7-3.3.0}/doc/thread-safety.rst +0 -0
  60. {python_snap7-3.2.1 → python_snap7-3.3.0}/doc/tia-portal-config.rst +0 -0
  61. {python_snap7-3.2.1 → python_snap7-3.3.0}/example/boolean.py +0 -0
  62. {python_snap7-3.2.1 → python_snap7-3.3.0}/example/db1_layout.txt +0 -0
  63. {python_snap7-3.2.1 → python_snap7-3.3.0}/example/db_layouts.py +0 -0
  64. {python_snap7-3.2.1 → python_snap7-3.3.0}/example/example.py +0 -0
  65. {python_snap7-3.2.1 → python_snap7-3.3.0}/example/logo_7_8.py +0 -0
  66. {python_snap7-3.2.1 → python_snap7-3.3.0}/example/ppi.py +0 -0
  67. {python_snap7-3.2.1 → python_snap7-3.3.0}/example/prometheus_metrics.py +0 -0
  68. {python_snap7-3.2.1 → python_snap7-3.3.0}/example/read_multi.py +0 -0
  69. {python_snap7-3.2.1 → python_snap7-3.3.0}/example/s7_symbols.py +0 -0
  70. {python_snap7-3.2.1 → python_snap7-3.3.0}/example/write_multi.py +0 -0
  71. {python_snap7-3.2.1 → python_snap7-3.3.0}/python_snap7.egg-info/dependency_links.txt +0 -0
  72. {python_snap7-3.2.1 → python_snap7-3.3.0}/python_snap7.egg-info/entry_points.txt +0 -0
  73. {python_snap7-3.2.1 → python_snap7-3.3.0}/python_snap7.egg-info/top_level.txt +0 -0
  74. {python_snap7-3.2.1 → python_snap7-3.3.0}/s7/__init__.py +0 -0
  75. {python_snap7-3.2.1 → python_snap7-3.3.0}/setup.cfg +0 -0
  76. {python_snap7-3.2.1 → python_snap7-3.3.0}/snap7/__init__.py +0 -0
  77. {python_snap7-3.2.1 → python_snap7-3.3.0}/snap7/cli.py +0 -0
  78. {python_snap7-3.2.1 → python_snap7-3.3.0}/snap7/client_base.py +0 -0
  79. {python_snap7-3.2.1 → python_snap7-3.3.0}/snap7/connection.py +0 -0
  80. {python_snap7-3.2.1 → python_snap7-3.3.0}/snap7/datatypes.py +0 -0
  81. {python_snap7-3.2.1 → python_snap7-3.3.0}/snap7/demo.py +0 -0
  82. {python_snap7-3.2.1 → python_snap7-3.3.0}/snap7/discovery.py +0 -0
  83. {python_snap7-3.2.1 → python_snap7-3.3.0}/snap7/error.py +0 -0
  84. {python_snap7-3.2.1 → python_snap7-3.3.0}/snap7/log.py +0 -0
  85. {python_snap7-3.2.1 → python_snap7-3.3.0}/snap7/logo.py +0 -0
  86. {python_snap7-3.2.1 → python_snap7-3.3.0}/snap7/optimizer.py +0 -0
  87. {python_snap7-3.2.1 → python_snap7-3.3.0}/snap7/partner.py +0 -0
  88. {python_snap7-3.2.1 → python_snap7-3.3.0}/snap7/ppi.py +0 -0
  89. {python_snap7-3.2.1 → python_snap7-3.3.0}/snap7/py.typed +0 -0
  90. {python_snap7-3.2.1 → python_snap7-3.3.0}/snap7/rate_limiter.py +0 -0
  91. {python_snap7-3.2.1 → python_snap7-3.3.0}/snap7/server/__main__.py +0 -0
  92. {python_snap7-3.2.1 → python_snap7-3.3.0}/snap7/tags.py +0 -0
  93. {python_snap7-3.2.1 → python_snap7-3.3.0}/snap7/type.py +0 -0
  94. {python_snap7-3.2.1 → python_snap7-3.3.0}/snap7/util/__init__.py +0 -0
  95. {python_snap7-3.2.1 → python_snap7-3.3.0}/snap7/util/db.py +0 -0
  96. {python_snap7-3.2.1 → python_snap7-3.3.0}/snap7/util/setters.py +0 -0
  97. {python_snap7-3.2.1 → python_snap7-3.3.0}/tests/__init__.py +0 -0
  98. {python_snap7-3.2.1 → python_snap7-3.3.0}/tests/conftest.py +0 -0
  99. {python_snap7-3.2.1 → python_snap7-3.3.0}/tests/features/real_plc/connection.feature +0 -0
  100. {python_snap7-3.2.1 → python_snap7-3.3.0}/tests/features/real_plc/lifecycle.feature +0 -0
  101. {python_snap7-3.2.1 → python_snap7-3.3.0}/tests/features/real_plc/read.feature +0 -0
  102. {python_snap7-3.2.1 → python_snap7-3.3.0}/tests/features/real_plc/report.schema.json +0 -0
  103. {python_snap7-3.2.1 → python_snap7-3.3.0}/tests/features/real_plc/write.feature +0 -0
  104. {python_snap7-3.2.1 → python_snap7-3.3.0}/tests/plc_setup/e2e_test_dbs.scl +0 -0
  105. {python_snap7-3.2.1 → python_snap7-3.3.0}/tests/real_plc/__init__.py +0 -0
  106. {python_snap7-3.2.1 → python_snap7-3.3.0}/tests/real_plc/reporting.py +0 -0
  107. {python_snap7-3.2.1 → python_snap7-3.3.0}/tests/real_plc/support.py +0 -0
  108. {python_snap7-3.2.1 → python_snap7-3.3.0}/tests/real_plc/test_acceptance.py +0 -0
  109. {python_snap7-3.2.1 → python_snap7-3.3.0}/tests/test_api_surface.py +0 -0
  110. {python_snap7-3.2.1 → python_snap7-3.3.0}/tests/test_async_client.py +0 -0
  111. {python_snap7-3.2.1 → python_snap7-3.3.0}/tests/test_behavioral_compatibility.py +0 -0
  112. {python_snap7-3.2.1 → python_snap7-3.3.0}/tests/test_cli.py +0 -0
  113. {python_snap7-3.2.1 → python_snap7-3.3.0}/tests/test_client.py +0 -0
  114. {python_snap7-3.2.1 → python_snap7-3.3.0}/tests/test_client_e2e.py +0 -0
  115. {python_snap7-3.2.1 → python_snap7-3.3.0}/tests/test_conformance.py +0 -0
  116. {python_snap7-3.2.1 → python_snap7-3.3.0}/tests/test_connection.py +0 -0
  117. {python_snap7-3.2.1 → python_snap7-3.3.0}/tests/test_coverage_gaps.py +0 -0
  118. {python_snap7-3.2.1 → python_snap7-3.3.0}/tests/test_datatypes.py +0 -0
  119. {python_snap7-3.2.1 → python_snap7-3.3.0}/tests/test_demo.py +0 -0
  120. {python_snap7-3.2.1 → python_snap7-3.3.0}/tests/test_discovery.py +0 -0
  121. {python_snap7-3.2.1 → python_snap7-3.3.0}/tests/test_error.py +0 -0
  122. {python_snap7-3.2.1 → python_snap7-3.3.0}/tests/test_finalize.py +0 -0
  123. {python_snap7-3.2.1 → python_snap7-3.3.0}/tests/test_hypothesis.py +0 -0
  124. {python_snap7-3.2.1 → python_snap7-3.3.0}/tests/test_lean_regressions.py +0 -0
  125. {python_snap7-3.2.1 → python_snap7-3.3.0}/tests/test_logging.py +0 -0
  126. {python_snap7-3.2.1 → python_snap7-3.3.0}/tests/test_logo_client.py +0 -0
  127. {python_snap7-3.2.1 → python_snap7-3.3.0}/tests/test_logo_reconnect_options.py +0 -0
  128. {python_snap7-3.2.1 → python_snap7-3.3.0}/tests/test_mainloop.py +0 -0
  129. {python_snap7-3.2.1 → python_snap7-3.3.0}/tests/test_operation_hook.py +0 -0
  130. {python_snap7-3.2.1 → python_snap7-3.3.0}/tests/test_optimizer.py +0 -0
  131. {python_snap7-3.2.1 → python_snap7-3.3.0}/tests/test_partner.py +0 -0
  132. {python_snap7-3.2.1 → python_snap7-3.3.0}/tests/test_ppi.py +0 -0
  133. {python_snap7-3.2.1 → python_snap7-3.3.0}/tests/test_property.py +0 -0
  134. {python_snap7-3.2.1 → python_snap7-3.3.0}/tests/test_rate_limiter.py +0 -0
  135. {python_snap7-3.2.1 → python_snap7-3.3.0}/tests/test_real_plc_support.py +0 -0
  136. {python_snap7-3.2.1 → python_snap7-3.3.0}/tests/test_reconnect.py +0 -0
  137. {python_snap7-3.2.1 → python_snap7-3.3.0}/tests/test_routing.py +0 -0
  138. {python_snap7-3.2.1 → python_snap7-3.3.0}/tests/test_server_cli.py +0 -0
  139. {python_snap7-3.2.1 → python_snap7-3.3.0}/tests/test_stress.py +0 -0
  140. {python_snap7-3.2.1 → python_snap7-3.3.0}/tests/test_tags.py +0 -0
  141. {python_snap7-3.2.1 → python_snap7-3.3.0}/tests/test_typed_access.py +0 -0
  142. {python_snap7-3.2.1 → python_snap7-3.3.0}/tox.ini +0 -0
@@ -1,6 +1,57 @@
1
1
  CHANGES
2
2
  ========
3
3
 
4
+ 3.3.0
5
+ -----
6
+
7
+ ### New features
8
+
9
+ * Add the typed DB accessors (`db_read_int`, `db_write_real`, `db_read_string`, ...,
10
+ `db_read_array`/`db_write_array`) and the tag helpers (`read_tag`, `write_tag`,
11
+ `read_tags`) to `AsyncClient`, matching the synchronous `Client`, as well as
12
+ `is_alive`, `connect_routed`, and `read_diagnostic_buffer`. (#922)
13
+
14
+ ### Bug fixes
15
+
16
+ * `get_string` and `get_wstring` now raise `ValueError` when the buffer is shorter than the declared current length,
17
+ instead of silently returning a truncated value (#945).
18
+ * USERDATA responses whose last-data-unit byte is neither `0x00` nor `0x01` are rejected with `S7ProtocolError`
19
+ instead of being treated as "more data" (#946).
20
+ * `get_wstring` compared the declared maximum in bytes with the 16382-character limit, so any WSTRING with a
21
+ capacity of 8192 characters or more was rejected, including ones written by `set_wstring` (#923).
22
+ * The get-block-info request now places the trailing `A` after the block number, as native Snap7 does
23
+ (`'0' type '00001' 'A'`), instead of before it. The bundled server parses the new layout (#929).
24
+ * `set_plc_datetime` encoded the weekday as Monday=1, but S7 DATE_AND_TIME counts Sunday=1 .. Saturday=7, so every
25
+ day was off by one position. The bundled server's clock reply uses the same convention now (#932).
26
+ * `set_plc_datetime` now raises `ValueError` for years outside 1990-2089 instead of silently sending a different
27
+ year, since the two-digit S7 year cannot represent them (#933).
28
+ * `parse_get_clock_response` now accepts the ten-byte S7 clock reply (reserved, century, then the time with milliseconds)
29
+ that native Snap7 and PLCs send, and still accepts the legacy eight-byte form. The bundled server emits the
30
+ ten-byte form (#934).
31
+ * `parse_response` now fails on any nonzero S7 header error word, as native Snap7 does, instead of only when the error
32
+ class is nonzero. Read and upload responses with error class 0 and a nonzero error code were previously treated as
33
+ successes while the write path rejected them (#930).
34
+ * `parse_list_blocks_response` now requires exactly the seven four-byte block-type entries (28 bytes) that native Snap7
35
+ expects, with distinct, known type codes. Empty or partial tables and duplicate entries are rejected instead of being
36
+ reported as zero block counts (#939).
37
+ * `set_plc_datetime` and the session-password calls now accept the null acknowledgement (return code 0x0A, no data) that
38
+ real PLCs send for services that return no data, instead of failing with "Object does not exist". The bundled
39
+ server acknowledges these services the same way (#940).
40
+ * Compress now uses the PI service `_GARB` and copy RAM to ROM uses file system `EP` with `_MODU`, matching real
41
+ engineering tools and native Snap7, instead of the invented `_MSZL`. The bundled server recognises the new
42
+ requests (#941).
43
+ * Read-SZL requests now carry the `0xFF`/octet-string data header and continuation requests the 12-byte parameter
44
+ block (method `0x12`) that real engineering tools send; both previously used the header of a request without data
45
+ and an 8-byte parameter block (#942).
46
+ * `get_order_code` no longer keeps the trailing space padding of the order code on S7-1200/1500 CPUs, for example
47
+ `6ES7 212-1BE40-0XB0 ` is now `6ES7 212-1BE40-0XB0` (#949).
48
+
49
+ ### Documentation
50
+
51
+ * Add a "Tested and Verified Hardware" section to the PLC support matrix, listing the CPUs, firmware versions and
52
+ python-snap7 versions the real-PLC acceptance suite has passed on (S7-1200 CPU 1212C V4.7.3, S7-1500 CPU 1511F-1 PN
53
+ V2.9.7). (#947)
54
+
4
55
  3.2.1
5
56
  -----
6
57
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: python-snap7
3
- Version: 3.2.1
3
+ Version: 3.3.0
4
4
  Summary: Pure Python S7 communication library for Siemens PLCs
5
5
  Author-email: Gijs Molenaar <gijsmolenaar@gmail.com>
6
6
  License-Expression: MIT
@@ -24,7 +24,7 @@ License-File: LICENSE
24
24
  Provides-Extra: test
25
25
  Requires-Dist: pytest; extra == "test"
26
26
  Requires-Dist: pytest-asyncio; extra == "test"
27
- Requires-Dist: pytest-bdd<9,>=8.1; extra == "test"
27
+ Requires-Dist: pytest-bdd<10,>=8.1; extra == "test"
28
28
  Requires-Dist: pytest-cov; extra == "test"
29
29
  Requires-Dist: pytest-html; extra == "test"
30
30
  Requires-Dist: hypothesis; extra == "test"
@@ -75,6 +75,26 @@ using the classic S7 protocol. It supports S7-300 and S7-400 controllers, as
75
75
  well as S7-1200 and S7-1500 controllers with PUT/GET access enabled. It
76
76
  supports Python 3.10+ on Windows, Linux, and macOS without native dependencies.
77
77
 
78
+ S7-1200 and S7-1500
79
+ ===================
80
+
81
+ On S7-1200 and S7-1500 controllers, python-snap7 only works when PUT/GET access
82
+ is enabled in TIA Portal, and it cannot access optimized data blocks. PUT/GET
83
+ is unauthenticated and disabled by default, so leaving it disabled is the more
84
+ secure configuration.
85
+
86
+ If PUT/GET is disabled, or you need optimized data blocks or symbolic access,
87
+ use `s7commplus <https://github.com/gijzelaerr/s7commplus>`_ instead::
88
+
89
+ pip install s7commplus
90
+
91
+ s7commplus is a separate, younger project that implements S7CommPlus, the
92
+ protocol these controllers speak natively. Check the
93
+ `firmware versions validated so far <https://s7commplus.readthedocs.io/en/latest/connections.html>`_
94
+ before relying on it, and see the
95
+ `PLC support matrix <https://python-snap7.readthedocs.io/en/latest/plc-support.html>`_
96
+ for what python-snap7 supports on each controller family.
97
+
78
98
  Installation
79
99
  ============
80
100
 
@@ -105,3 +125,5 @@ Read the full documentation at
105
125
 
106
126
  The safe volunteer hardware-test procedure is in
107
127
  `Real-PLC acceptance testing <doc/real-plc-testing.rst>`_.
128
+ The CPUs and firmware versions it has passed on are listed under
129
+ `Tested and Verified Hardware <doc/plc-support.rst>`_.
@@ -22,6 +22,26 @@ using the classic S7 protocol. It supports S7-300 and S7-400 controllers, as
22
22
  well as S7-1200 and S7-1500 controllers with PUT/GET access enabled. It
23
23
  supports Python 3.10+ on Windows, Linux, and macOS without native dependencies.
24
24
 
25
+ S7-1200 and S7-1500
26
+ ===================
27
+
28
+ On S7-1200 and S7-1500 controllers, python-snap7 only works when PUT/GET access
29
+ is enabled in TIA Portal, and it cannot access optimized data blocks. PUT/GET
30
+ is unauthenticated and disabled by default, so leaving it disabled is the more
31
+ secure configuration.
32
+
33
+ If PUT/GET is disabled, or you need optimized data blocks or symbolic access,
34
+ use `s7commplus <https://github.com/gijzelaerr/s7commplus>`_ instead::
35
+
36
+ pip install s7commplus
37
+
38
+ s7commplus is a separate, younger project that implements S7CommPlus, the
39
+ protocol these controllers speak natively. Check the
40
+ `firmware versions validated so far <https://s7commplus.readthedocs.io/en/latest/connections.html>`_
41
+ before relying on it, and see the
42
+ `PLC support matrix <https://python-snap7.readthedocs.io/en/latest/plc-support.html>`_
43
+ for what python-snap7 supports on each controller family.
44
+
25
45
  Installation
26
46
  ============
27
47
 
@@ -52,3 +72,5 @@ Read the full documentation at
52
72
 
53
73
  The safe volunteer hardware-test procedure is in
54
74
  `Real-PLC acceptance testing <doc/real-plc-testing.rst>`_.
75
+ The CPUs and firmware versions it has passed on are listed under
76
+ `Tested and Verified Hardware <doc/plc-support.rst>`_.
@@ -52,6 +52,53 @@ Supported PLCs
52
52
  - Full
53
53
  - Use the :class:`~snap7.logo.Logo` class.
54
54
 
55
+ .. _tested-hardware:
56
+
57
+ Tested and Verified Hardware
58
+ ----------------------------
59
+
60
+ The table lists real CPUs the :doc:`real-plc-testing` acceptance suite has been
61
+ run against, with the firmware and python-snap7 version used. Every run reached
62
+ the CPU over the classic S7 protocol with PUT/GET enabled and non-optimized
63
+ fixture data blocks. A pass means the 13 acceptance scenarios succeeded: five
64
+ read-only smoke scenarios (session, canonical fixture read, multi-read,
65
+ reconnect, repeated operations) and eight scratch-write round trips (INT, REAL,
66
+ BYTE, WORD, DWORD, DINT, CHAR, BOOL), each restored and read back.
67
+
68
+ .. list-table::
69
+ :header-rows: 1
70
+ :widths: 20 12 12 14 12 30
71
+
72
+ * - CPU
73
+ - Firmware
74
+ - Result
75
+ - python-snap7
76
+ - Date
77
+ - Report
78
+ * - S7-1200 CPU 1212C (``6ES7 212-1BE40-0XB0``)
79
+ - V4.7.3
80
+ - 13/13 pass
81
+ - 3.2.1
82
+ - 2026-10-04
83
+ - `#919 <https://github.com/gijzelaerr/python-snap7/issues/919>`_
84
+ (rerun of `#907 <https://github.com/gijzelaerr/python-snap7/issues/907>`_)
85
+ * - S7-1500 CPU 1511F-1 PN (fail-safe) (``6ES7 511-1FK02-0AB0``)
86
+ - V2.9.7
87
+ - 13/13 pass
88
+ - 3.2.1
89
+ - 2026-10-13
90
+ - `#952 <https://github.com/gijzelaerr/python-snap7/issues/952>`_
91
+ (rerun of `#909 <https://github.com/gijzelaerr/python-snap7/issues/909>`_,
92
+ python-snap7 3.2.0, 2026-10-01)
93
+
94
+ Notes:
95
+
96
+ - On the S7-1200 CPU 1212C, ``upload()`` of a non-optimized DB is refused with
97
+ class 0x81, code 0x04 (see Feature Availability below). Block upload and
98
+ download were not run on the S7-1500 CPU 1511F-1 PN.
99
+ - Administrative scenarios (``--allow-admin``) were not run.
100
+ - To add your CPU, follow the result policy in :doc:`real-plc-testing`.
101
+
55
102
  Enabling PUT/GET Access
56
103
  -----------------------
57
104
 
@@ -59,6 +106,25 @@ For S7-1200 and S7-1500 PLCs, classic S7 protocol access requires the
59
106
  **PUT/GET** option to be enabled. See :doc:`tia-portal-config` for
60
107
  step-by-step instructions.
61
108
 
109
+ .. note::
110
+
111
+ S7-1200 and S7-1500 CPUs natively speak **S7CommPlus**, the protocol TIA
112
+ Portal itself uses. python-snap7 does not implement it. What it uses on
113
+ these CPUs is the classic S7 protocol, which the CPU only serves as a
114
+ compatibility feature (PUT/GET). That compatibility path is deliberately
115
+ limited:
116
+
117
+ - it only reaches non-optimized data blocks and the I/O, marker, timer and
118
+ counter areas, so symbolic access to optimized DBs is not possible;
119
+ - program blocks (OB/FC/FB) and block upload/download are generally
120
+ refused, and the project source is never available;
121
+ - it has no authentication, which is why Siemens disables it by default.
122
+
123
+ If you need optimized DBs, symbolic access or any of the above, use an
124
+ S7CommPlus client such as the standalone
125
+ `s7commplus project <https://github.com/gijzelaerr/s7commplus>`_, OPC UA,
126
+ or TIA Portal Openness, rather than trying to make python-snap7 do it.
127
+
62
128
  .. warning::
63
129
 
64
130
  PUT/GET access provides unauthenticated read/write access to PLC memory.
@@ -87,3 +87,6 @@ before expanding the host matrix; hosted CI already covers supported Python
87
87
  versions and operating systems without hardware. Test evidence stays in issues.
88
88
  Volunteer coordination may use Discussions, but is not a substitute for an
89
89
  attached structured result.
90
+
91
+ Passing results are summarized, with CPU, firmware and python-snap7 version, in
92
+ :ref:`tested-hardware`.
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "python-snap7"
7
- version = "3.2.1"
7
+ version = "3.3.0"
8
8
  description = "Pure Python S7 communication library for Siemens PLCs"
9
9
  readme = "README.rst"
10
10
  authors = [
@@ -32,7 +32,7 @@ Homepage = "https://github.com/gijzelaerr/python-snap7"
32
32
  Documentation = "https://python-snap7.readthedocs.io/en/latest/"
33
33
 
34
34
  [project.optional-dependencies]
35
- test = ["pytest", "pytest-asyncio", "pytest-bdd>=8.1,<9", "pytest-cov", "pytest-html", "hypothesis", "mypy", "types-setuptools", "ruff", "tox", "tox-uv", "types-click", "uv"]
35
+ test = ["pytest", "pytest-asyncio", "pytest-bdd>=8.1,<10", "pytest-cov", "pytest-html", "hypothesis", "mypy", "types-setuptools", "ruff", "tox", "tox-uv", "types-click", "uv"]
36
36
  cli = ["rich", "click" ]
37
37
  demo = ["psutil", "rich", "click"]
38
38
  doc = ["sphinx", "sphinx_rtd_theme"]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: python-snap7
3
- Version: 3.2.1
3
+ Version: 3.3.0
4
4
  Summary: Pure Python S7 communication library for Siemens PLCs
5
5
  Author-email: Gijs Molenaar <gijsmolenaar@gmail.com>
6
6
  License-Expression: MIT
@@ -24,7 +24,7 @@ License-File: LICENSE
24
24
  Provides-Extra: test
25
25
  Requires-Dist: pytest; extra == "test"
26
26
  Requires-Dist: pytest-asyncio; extra == "test"
27
- Requires-Dist: pytest-bdd<9,>=8.1; extra == "test"
27
+ Requires-Dist: pytest-bdd<10,>=8.1; extra == "test"
28
28
  Requires-Dist: pytest-cov; extra == "test"
29
29
  Requires-Dist: pytest-html; extra == "test"
30
30
  Requires-Dist: hypothesis; extra == "test"
@@ -75,6 +75,26 @@ using the classic S7 protocol. It supports S7-300 and S7-400 controllers, as
75
75
  well as S7-1200 and S7-1500 controllers with PUT/GET access enabled. It
76
76
  supports Python 3.10+ on Windows, Linux, and macOS without native dependencies.
77
77
 
78
+ S7-1200 and S7-1500
79
+ ===================
80
+
81
+ On S7-1200 and S7-1500 controllers, python-snap7 only works when PUT/GET access
82
+ is enabled in TIA Portal, and it cannot access optimized data blocks. PUT/GET
83
+ is unauthenticated and disabled by default, so leaving it disabled is the more
84
+ secure configuration.
85
+
86
+ If PUT/GET is disabled, or you need optimized data blocks or symbolic access,
87
+ use `s7commplus <https://github.com/gijzelaerr/s7commplus>`_ instead::
88
+
89
+ pip install s7commplus
90
+
91
+ s7commplus is a separate, younger project that implements S7CommPlus, the
92
+ protocol these controllers speak natively. Check the
93
+ `firmware versions validated so far <https://s7commplus.readthedocs.io/en/latest/connections.html>`_
94
+ before relying on it, and see the
95
+ `PLC support matrix <https://python-snap7.readthedocs.io/en/latest/plc-support.html>`_
96
+ for what python-snap7 supports on each controller family.
97
+
78
98
  Installation
79
99
  ============
80
100
 
@@ -105,3 +125,5 @@ Read the full documentation at
105
125
 
106
126
  The safe volunteer hardware-test procedure is in
107
127
  `Real-PLC acceptance testing <doc/real-plc-testing.rst>`_.
128
+ The CPUs and firmware versions it has passed on are listed under
129
+ `Tested and Verified Hardware <doc/plc-support.rst>`_.
@@ -92,6 +92,7 @@ tests/__init__.py
92
92
  tests/conftest.py
93
93
  tests/test_api_surface.py
94
94
  tests/test_async_client.py
95
+ tests/test_async_typed_access.py
95
96
  tests/test_behavioral_compatibility.py
96
97
  tests/test_cli.py
97
98
  tests/test_client.py
@@ -21,7 +21,7 @@ pyserial>=3.5
21
21
  [test]
22
22
  pytest
23
23
  pytest-asyncio
24
- pytest-bdd<9,>=8.1
24
+ pytest-bdd<10,>=8.1
25
25
  pytest-cov
26
26
  pytest-html
27
27
  hypothesis