S7 Protocol
The s7protocol module implements the S7 PDU encoding and decoding layer.
S7 protocol implementation.
Handles S7 PDU encoding/decoding and protocol operations.
- class snap7.s7protocol.S7Protocol[source]
S7 protocol implementation.
Handles encoding and decoding of S7 PDUs for communication with Siemens PLCs.
- build_compress_request() bytes[source]
Build PLC control request for memory compression.
Uses PI service “_MSZL” (compress memory).
- Returns:
Complete S7 PDU for compress request
- build_copy_ram_to_rom_request() bytes[source]
Build PLC control request for copying RAM to ROM.
Uses PI service “_MSZL” with file system parameters.
- Returns:
Complete S7 PDU for copy RAM to ROM request
- build_cpu_state_request() bytes[source]
Build CPU state request.
- Returns:
Complete S7 PDU for CPU state query
- build_delete_block_request(block_type: int, block_num: int) bytes[source]
Build delete block request.
Uses PLC_CONTROL with PI service “_DELE” for block deletion.
- Parameters:
block_type – Block type code
block_num – Block number
- Returns:
Complete S7 PDU for delete block request
- build_download_request(block_type: int, block_num: int, block_data: bytes) bytes[source]
Build request download request.
- Parameters:
block_type – Block type code
block_num – Block number
block_data – Block data to download
- Returns:
Complete S7 PDU for request download
- build_end_upload_request(upload_id: int) bytes[source]
Build end upload request.
- Parameters:
upload_id – Upload ID from start upload response
- Returns:
Complete S7 PDU for end upload request
- build_get_block_info_request(block_type: int, block_num: int) bytes[source]
Build USER_DATA request for getting block information.
- Parameters:
block_type – Block type code (0x38=OB, 0x41=DB, 0x42=SDB, 0x43=FC, 0x44=SFC, 0x45=FB, 0x46=SFB)
block_num – Block number
- Returns:
Complete S7 PDU for get block info request
- build_get_clock_request() bytes[source]
Build USER_DATA request for reading PLC clock.
- Returns:
Complete S7 PDU for get clock request
- build_list_blocks_of_type_request(block_type: int) bytes[source]
Build USER_DATA request for listing blocks of a specific type.
- Parameters:
block_type – Block type code (e.g., 0x41 for DB)
- Returns:
Complete S7 PDU for list blocks of type request
- build_list_blocks_request() bytes[source]
Build USER_DATA request for listing all blocks.
- Returns:
Complete S7 PDU for list blocks request
- build_multi_read_request(items: List[Tuple[int, int, int, int]]) bytes[source]
Build S7 multi-variable read request PDU.
Encodes multiple address specifications into a single READ_AREA request so the PLC can return all data in one response.
- Parameters:
items – List of (area, db_number, start_offset, byte_length) tuples.
- Returns:
Complete S7 PDU.
- build_plc_control_request(operation: str) bytes[source]
Build PLC control request.
- Parameters:
operation – Control operation (‘stop’, ‘hot_start’, ‘cold_start’)
- Returns:
Complete S7 PDU for PLC control
- build_read_request(area: S7Area, db_number: int, start: int, word_len: S7WordLen, count: int) bytes[source]
Build S7 read request PDU.
- Parameters:
area – Memory area to read from
db_number – DB number (for DB area)
start – Start address/offset
word_len – Data word length
count – Number of items to read
- Returns:
Complete S7 PDU
- build_read_szl_request(szl_id: int, szl_index: int) bytes[source]
Build USER_DATA request for reading SZL (System Status List).
- Parameters:
szl_id – SZL identifier
szl_index – SZL index
- Returns:
Complete S7 PDU for read SZL request
- build_set_clock_request(dt: datetime) bytes[source]
Build USER_DATA request for setting PLC clock.
- Parameters:
dt – Datetime to set
- Returns:
Complete S7 PDU for set clock request
- build_setup_communication_request(max_amq_caller: int = 1, max_amq_callee: int = 1, pdu_length: int = 480) bytes[source]
Build S7 setup communication request.
This negotiates communication parameters with the PLC.
- build_start_upload_request(block_type: int, block_num: int) bytes[source]
Build start upload request.
- Parameters:
block_type – Block type code (0x38=OB, 0x41=DB, 0x42=SDB, 0x43=FC, 0x44=SFC, 0x45=FB, 0x46=SFB)
block_num – Block number
- Returns:
Complete S7 PDU for start upload request
- build_upload_request(upload_id: int) bytes[source]
Build upload request to get block data.
- Parameters:
upload_id – Upload ID from start upload response
- Returns:
Complete S7 PDU for upload request
- build_userdata_followup_request(group: int, subfunction: int, sequence_number: int) bytes[source]
Build USERDATA follow-up request for multi-packet responses.
- Parameters:
group – USERDATA group (e.g., 4 for SZL, 3 for block info)
subfunction – Subfunction code
sequence_number – Sequence number from the previous response
- Returns:
Complete S7 PDU for follow-up request
- build_write_request(area: S7Area, db_number: int, start: int, word_len: S7WordLen, data: bytes) bytes[source]
Build S7 write request PDU.
- Parameters:
area – Memory area to write to
db_number – DB number (for DB area)
start – Start address/offset
word_len – Data word length
data – Data to write
- Returns:
Complete S7 PDU
- check_control_response(response: Dict[str, Any]) None[source]
Check PLC control response for errors.
- Parameters:
response – Parsed S7 response
- Raises:
S7ProtocolError – If control operation failed
- check_write_response(response: Dict[str, Any]) None[source]
Check write operation response for errors.
- Parameters:
response – Parsed S7 response
- Raises:
S7ProtocolError – If write operation failed
- extract_cpu_state(response: Dict[str, Any]) str[source]
Extract CPU state from response.
- Parameters:
response – Parsed S7 response
- Returns:
CPU state string in S7CpuStatus format (e.g., ‘S7CpuStatusRun’)
- extract_multi_read_data(response: Dict[str, Any], block_count: int) List[bytearray][source]
Extract per-block data from a multi-variable read response.
- Parses the raw data section which contains N items, each with:
return_code (1 byte)
transport_size (1 byte)
bit_length (2 bytes, big-endian)
data (bit_length / 8 bytes)
fill byte (1 byte if byte_length is odd and not the last item)
- Parameters:
response – Parsed S7 response from
parse_response().block_count – Expected number of data items.
- Returns:
List of bytearrays, one per block.
- Raises:
S7ProtocolError – If any item has a non-success return code.
- extract_read_data(response: Dict[str, Any], word_len: S7WordLen, count: int) List[Any][source]
Extract and decode data from read response.
- Parameters:
response – Parsed S7 response
word_len – Expected data word length
count – Expected number of items
- Returns:
List of decoded values
- parse_get_block_info(response: Dict[str, Any]) TS7BlockInfo[source]
Parse block info response directly into a
TS7BlockInfo.Consolidates the dict→struct conversion that used to live in both the sync and async clients.
- parse_get_block_info_response(response: Dict[str, Any]) Dict[str, Any][source]
Parse get block info response.
- Parameters:
response – Parsed S7 response
- Returns:
Dictionary with block info fields
- parse_get_clock_response(response: Dict[str, Any]) datetime[source]
Parse get clock response.
- Parameters:
response – Parsed S7 response
- Returns:
Datetime from PLC
- parse_list_blocks(response: Dict[str, Any]) BlocksList[source]
Parse list blocks response directly into a
BlocksList.Consolidates the dict→struct conversion that used to live in both the sync and async clients so the field mapping is declared once.
- parse_list_blocks_of_type_response(response: Dict[str, Any]) List[int][source]
Parse list blocks of type response and extract block numbers.
- Parameters:
response – Parsed S7 response
- Returns:
List of block numbers
- parse_list_blocks_response(response: Dict[str, Any]) Dict[str, int][source]
Parse list blocks response and extract block counts.
- Parameters:
response – Parsed S7 response
- Returns:
Dictionary mapping block type names to counts
- parse_read_szl_response(response: Dict[str, Any], first_fragment: bool = True) Dict[str, Any][source]
Parse read SZL response.
- Parameters:
response – Parsed S7 response
first_fragment – If True (default), parse SZL header (ID+Index). If False, treat all data as raw payload (follow-up fragments).
- Returns:
Dictionary with SZL ID, Index, and data
- parse_response(pdu: bytes) Dict[str, Any][source]
Parse S7 response PDU.
- Parameters:
pdu – Complete S7 PDU
- Returns:
Parsed response data
- parse_start_upload_response(response: Dict[str, Any]) Dict[str, Any][source]
Parse start upload response.
- Returns:
Dictionary with upload_id and block_length
- parse_upload_response(response: Dict[str, Any]) bytes[source]
Parse upload response and extract block data.
- Returns:
Block data bytes
- validate_pdu_reference(response_sequence: int) None[source]
Validate the PDU reference number from a response.
Compares the response sequence number against the expected (current) sequence.
- Parameters:
response_sequence – Sequence number from the response PDU.
- Raises:
S7StalePacketError – If response is older than expected (stale).
S7PacketLostError – If response is ahead of expected (packet loss).
- class snap7.s7protocol.S7UserDataGroup(*values)[source]
S7 USER_DATA type groups (from s7_types.h).
- snap7.s7protocol.build_block_info_from_dict(info: Dict[str, Any]) TS7BlockInfo[source]
Populate a
TS7BlockInfofrom the dict returned byparse_get_block_info_response.
- snap7.s7protocol.build_blocks_list_from_dict(counts: Dict[str, int]) BlocksList[source]
Populate a
BlocksListfrom the dict returned byparse_list_blocks_response.