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.
- {python_snap7-3.2.1 → python_snap7-3.3.0}/CHANGES.md +51 -0
- {python_snap7-3.2.1/python_snap7.egg-info → python_snap7-3.3.0}/PKG-INFO +24 -2
- {python_snap7-3.2.1 → python_snap7-3.3.0}/README.rst +22 -0
- {python_snap7-3.2.1 → python_snap7-3.3.0}/doc/plc-support.rst +66 -0
- {python_snap7-3.2.1 → python_snap7-3.3.0}/doc/real-plc-testing.rst +3 -0
- {python_snap7-3.2.1 → python_snap7-3.3.0}/pyproject.toml +2 -2
- {python_snap7-3.2.1 → python_snap7-3.3.0/python_snap7.egg-info}/PKG-INFO +24 -2
- {python_snap7-3.2.1 → python_snap7-3.3.0}/python_snap7.egg-info/SOURCES.txt +1 -0
- {python_snap7-3.2.1 → python_snap7-3.3.0}/python_snap7.egg-info/requires.txt +1 -1
- {python_snap7-3.2.1 → python_snap7-3.3.0}/snap7/async_client.py +327 -5
- {python_snap7-3.2.1 → python_snap7-3.3.0}/snap7/client.py +17 -6
- {python_snap7-3.2.1 → python_snap7-3.3.0}/snap7/s7protocol.py +87 -103
- {python_snap7-3.2.1 → python_snap7-3.3.0}/snap7/server/__init__.py +38 -29
- {python_snap7-3.2.1 → python_snap7-3.3.0}/snap7/szl.py +1 -1
- {python_snap7-3.2.1 → python_snap7-3.3.0}/snap7/util/getters.py +14 -5
- python_snap7-3.3.0/tests/test_async_typed_access.py +168 -0
- {python_snap7-3.2.1 → python_snap7-3.3.0}/tests/test_multipacket.py +14 -3
- {python_snap7-3.2.1 → python_snap7-3.3.0}/tests/test_s7protocol.py +135 -21
- {python_snap7-3.2.1 → python_snap7-3.3.0}/tests/test_server.py +21 -0
- {python_snap7-3.2.1 → python_snap7-3.3.0}/tests/test_util.py +31 -1
- {python_snap7-3.2.1 → python_snap7-3.3.0}/LICENSE +0 -0
- {python_snap7-3.2.1 → python_snap7-3.3.0}/MANIFEST.in +0 -0
- {python_snap7-3.2.1 → python_snap7-3.3.0}/doc/API/client-base.rst +0 -0
- {python_snap7-3.2.1 → python_snap7-3.3.0}/doc/API/client.rst +0 -0
- {python_snap7-3.2.1 → python_snap7-3.3.0}/doc/API/connection.rst +0 -0
- {python_snap7-3.2.1 → python_snap7-3.3.0}/doc/API/datatypes.rst +0 -0
- {python_snap7-3.2.1 → python_snap7-3.3.0}/doc/API/demo.rst +0 -0
- {python_snap7-3.2.1 → python_snap7-3.3.0}/doc/API/discovery.rst +0 -0
- {python_snap7-3.2.1 → python_snap7-3.3.0}/doc/API/error.rst +0 -0
- {python_snap7-3.2.1 → python_snap7-3.3.0}/doc/API/log.rst +0 -0
- {python_snap7-3.2.1 → python_snap7-3.3.0}/doc/API/logo.rst +0 -0
- {python_snap7-3.2.1 → python_snap7-3.3.0}/doc/API/optimizer.rst +0 -0
- {python_snap7-3.2.1 → python_snap7-3.3.0}/doc/API/partner.rst +0 -0
- {python_snap7-3.2.1 → python_snap7-3.3.0}/doc/API/ppi.rst +0 -0
- {python_snap7-3.2.1 → python_snap7-3.3.0}/doc/API/rate-limiter.rst +0 -0
- {python_snap7-3.2.1 → python_snap7-3.3.0}/doc/API/s7protocol.rst +0 -0
- {python_snap7-3.2.1 → python_snap7-3.3.0}/doc/API/server.rst +0 -0
- {python_snap7-3.2.1 → python_snap7-3.3.0}/doc/API/szl.rst +0 -0
- {python_snap7-3.2.1 → python_snap7-3.3.0}/doc/API/tags.rst +0 -0
- {python_snap7-3.2.1 → python_snap7-3.3.0}/doc/API/type.rst +0 -0
- {python_snap7-3.2.1 → python_snap7-3.3.0}/doc/API/util.rst +0 -0
- {python_snap7-3.2.1 → python_snap7-3.3.0}/doc/Makefile +0 -0
- {python_snap7-3.2.1 → python_snap7-3.3.0}/doc/_static/.phony +0 -0
- {python_snap7-3.2.1 → python_snap7-3.3.0}/doc/advanced.rst +0 -0
- {python_snap7-3.2.1 → python_snap7-3.3.0}/doc/cli.rst +0 -0
- {python_snap7-3.2.1 → python_snap7-3.3.0}/doc/conf.py +0 -0
- {python_snap7-3.2.1 → python_snap7-3.3.0}/doc/connecting.rst +0 -0
- {python_snap7-3.2.1 → python_snap7-3.3.0}/doc/connection-issues.rst +0 -0
- {python_snap7-3.2.1 → python_snap7-3.3.0}/doc/development.rst +0 -0
- {python_snap7-3.2.1 → python_snap7-3.3.0}/doc/error-reference.rst +0 -0
- {python_snap7-3.2.1 → python_snap7-3.3.0}/doc/index.rst +0 -0
- {python_snap7-3.2.1 → python_snap7-3.3.0}/doc/installation.rst +0 -0
- {python_snap7-3.2.1 → python_snap7-3.3.0}/doc/introduction.rst +0 -0
- {python_snap7-3.2.1 → python_snap7-3.3.0}/doc/limitations.rst +0 -0
- {python_snap7-3.2.1 → python_snap7-3.3.0}/doc/multi-variable.rst +0 -0
- {python_snap7-3.2.1 → python_snap7-3.3.0}/doc/ppi.rst +0 -0
- {python_snap7-3.2.1 → python_snap7-3.3.0}/doc/reading-writing.rst +0 -0
- {python_snap7-3.2.1 → python_snap7-3.3.0}/doc/server.rst +0 -0
- {python_snap7-3.2.1 → python_snap7-3.3.0}/doc/thread-safety.rst +0 -0
- {python_snap7-3.2.1 → python_snap7-3.3.0}/doc/tia-portal-config.rst +0 -0
- {python_snap7-3.2.1 → python_snap7-3.3.0}/example/boolean.py +0 -0
- {python_snap7-3.2.1 → python_snap7-3.3.0}/example/db1_layout.txt +0 -0
- {python_snap7-3.2.1 → python_snap7-3.3.0}/example/db_layouts.py +0 -0
- {python_snap7-3.2.1 → python_snap7-3.3.0}/example/example.py +0 -0
- {python_snap7-3.2.1 → python_snap7-3.3.0}/example/logo_7_8.py +0 -0
- {python_snap7-3.2.1 → python_snap7-3.3.0}/example/ppi.py +0 -0
- {python_snap7-3.2.1 → python_snap7-3.3.0}/example/prometheus_metrics.py +0 -0
- {python_snap7-3.2.1 → python_snap7-3.3.0}/example/read_multi.py +0 -0
- {python_snap7-3.2.1 → python_snap7-3.3.0}/example/s7_symbols.py +0 -0
- {python_snap7-3.2.1 → python_snap7-3.3.0}/example/write_multi.py +0 -0
- {python_snap7-3.2.1 → python_snap7-3.3.0}/python_snap7.egg-info/dependency_links.txt +0 -0
- {python_snap7-3.2.1 → python_snap7-3.3.0}/python_snap7.egg-info/entry_points.txt +0 -0
- {python_snap7-3.2.1 → python_snap7-3.3.0}/python_snap7.egg-info/top_level.txt +0 -0
- {python_snap7-3.2.1 → python_snap7-3.3.0}/s7/__init__.py +0 -0
- {python_snap7-3.2.1 → python_snap7-3.3.0}/setup.cfg +0 -0
- {python_snap7-3.2.1 → python_snap7-3.3.0}/snap7/__init__.py +0 -0
- {python_snap7-3.2.1 → python_snap7-3.3.0}/snap7/cli.py +0 -0
- {python_snap7-3.2.1 → python_snap7-3.3.0}/snap7/client_base.py +0 -0
- {python_snap7-3.2.1 → python_snap7-3.3.0}/snap7/connection.py +0 -0
- {python_snap7-3.2.1 → python_snap7-3.3.0}/snap7/datatypes.py +0 -0
- {python_snap7-3.2.1 → python_snap7-3.3.0}/snap7/demo.py +0 -0
- {python_snap7-3.2.1 → python_snap7-3.3.0}/snap7/discovery.py +0 -0
- {python_snap7-3.2.1 → python_snap7-3.3.0}/snap7/error.py +0 -0
- {python_snap7-3.2.1 → python_snap7-3.3.0}/snap7/log.py +0 -0
- {python_snap7-3.2.1 → python_snap7-3.3.0}/snap7/logo.py +0 -0
- {python_snap7-3.2.1 → python_snap7-3.3.0}/snap7/optimizer.py +0 -0
- {python_snap7-3.2.1 → python_snap7-3.3.0}/snap7/partner.py +0 -0
- {python_snap7-3.2.1 → python_snap7-3.3.0}/snap7/ppi.py +0 -0
- {python_snap7-3.2.1 → python_snap7-3.3.0}/snap7/py.typed +0 -0
- {python_snap7-3.2.1 → python_snap7-3.3.0}/snap7/rate_limiter.py +0 -0
- {python_snap7-3.2.1 → python_snap7-3.3.0}/snap7/server/__main__.py +0 -0
- {python_snap7-3.2.1 → python_snap7-3.3.0}/snap7/tags.py +0 -0
- {python_snap7-3.2.1 → python_snap7-3.3.0}/snap7/type.py +0 -0
- {python_snap7-3.2.1 → python_snap7-3.3.0}/snap7/util/__init__.py +0 -0
- {python_snap7-3.2.1 → python_snap7-3.3.0}/snap7/util/db.py +0 -0
- {python_snap7-3.2.1 → python_snap7-3.3.0}/snap7/util/setters.py +0 -0
- {python_snap7-3.2.1 → python_snap7-3.3.0}/tests/__init__.py +0 -0
- {python_snap7-3.2.1 → python_snap7-3.3.0}/tests/conftest.py +0 -0
- {python_snap7-3.2.1 → python_snap7-3.3.0}/tests/features/real_plc/connection.feature +0 -0
- {python_snap7-3.2.1 → python_snap7-3.3.0}/tests/features/real_plc/lifecycle.feature +0 -0
- {python_snap7-3.2.1 → python_snap7-3.3.0}/tests/features/real_plc/read.feature +0 -0
- {python_snap7-3.2.1 → python_snap7-3.3.0}/tests/features/real_plc/report.schema.json +0 -0
- {python_snap7-3.2.1 → python_snap7-3.3.0}/tests/features/real_plc/write.feature +0 -0
- {python_snap7-3.2.1 → python_snap7-3.3.0}/tests/plc_setup/e2e_test_dbs.scl +0 -0
- {python_snap7-3.2.1 → python_snap7-3.3.0}/tests/real_plc/__init__.py +0 -0
- {python_snap7-3.2.1 → python_snap7-3.3.0}/tests/real_plc/reporting.py +0 -0
- {python_snap7-3.2.1 → python_snap7-3.3.0}/tests/real_plc/support.py +0 -0
- {python_snap7-3.2.1 → python_snap7-3.3.0}/tests/real_plc/test_acceptance.py +0 -0
- {python_snap7-3.2.1 → python_snap7-3.3.0}/tests/test_api_surface.py +0 -0
- {python_snap7-3.2.1 → python_snap7-3.3.0}/tests/test_async_client.py +0 -0
- {python_snap7-3.2.1 → python_snap7-3.3.0}/tests/test_behavioral_compatibility.py +0 -0
- {python_snap7-3.2.1 → python_snap7-3.3.0}/tests/test_cli.py +0 -0
- {python_snap7-3.2.1 → python_snap7-3.3.0}/tests/test_client.py +0 -0
- {python_snap7-3.2.1 → python_snap7-3.3.0}/tests/test_client_e2e.py +0 -0
- {python_snap7-3.2.1 → python_snap7-3.3.0}/tests/test_conformance.py +0 -0
- {python_snap7-3.2.1 → python_snap7-3.3.0}/tests/test_connection.py +0 -0
- {python_snap7-3.2.1 → python_snap7-3.3.0}/tests/test_coverage_gaps.py +0 -0
- {python_snap7-3.2.1 → python_snap7-3.3.0}/tests/test_datatypes.py +0 -0
- {python_snap7-3.2.1 → python_snap7-3.3.0}/tests/test_demo.py +0 -0
- {python_snap7-3.2.1 → python_snap7-3.3.0}/tests/test_discovery.py +0 -0
- {python_snap7-3.2.1 → python_snap7-3.3.0}/tests/test_error.py +0 -0
- {python_snap7-3.2.1 → python_snap7-3.3.0}/tests/test_finalize.py +0 -0
- {python_snap7-3.2.1 → python_snap7-3.3.0}/tests/test_hypothesis.py +0 -0
- {python_snap7-3.2.1 → python_snap7-3.3.0}/tests/test_lean_regressions.py +0 -0
- {python_snap7-3.2.1 → python_snap7-3.3.0}/tests/test_logging.py +0 -0
- {python_snap7-3.2.1 → python_snap7-3.3.0}/tests/test_logo_client.py +0 -0
- {python_snap7-3.2.1 → python_snap7-3.3.0}/tests/test_logo_reconnect_options.py +0 -0
- {python_snap7-3.2.1 → python_snap7-3.3.0}/tests/test_mainloop.py +0 -0
- {python_snap7-3.2.1 → python_snap7-3.3.0}/tests/test_operation_hook.py +0 -0
- {python_snap7-3.2.1 → python_snap7-3.3.0}/tests/test_optimizer.py +0 -0
- {python_snap7-3.2.1 → python_snap7-3.3.0}/tests/test_partner.py +0 -0
- {python_snap7-3.2.1 → python_snap7-3.3.0}/tests/test_ppi.py +0 -0
- {python_snap7-3.2.1 → python_snap7-3.3.0}/tests/test_property.py +0 -0
- {python_snap7-3.2.1 → python_snap7-3.3.0}/tests/test_rate_limiter.py +0 -0
- {python_snap7-3.2.1 → python_snap7-3.3.0}/tests/test_real_plc_support.py +0 -0
- {python_snap7-3.2.1 → python_snap7-3.3.0}/tests/test_reconnect.py +0 -0
- {python_snap7-3.2.1 → python_snap7-3.3.0}/tests/test_routing.py +0 -0
- {python_snap7-3.2.1 → python_snap7-3.3.0}/tests/test_server_cli.py +0 -0
- {python_snap7-3.2.1 → python_snap7-3.3.0}/tests/test_stress.py +0 -0
- {python_snap7-3.2.1 → python_snap7-3.3.0}/tests/test_tags.py +0 -0
- {python_snap7-3.2.1 → python_snap7-3.3.0}/tests/test_typed_access.py +0 -0
- {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.
|
|
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<
|
|
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.
|
|
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,<
|
|
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.
|
|
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<
|
|
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>`_.
|