Source code for snap7.logo

"""
Snap7 client used for connection to a Siemens LOGO 7/8 server.

Pure Python implementation without C library dependency.
"""

import re
import struct
import logging
from typing import Optional

from .type import WordLen, Area
from .client import Client

logger = logging.getLogger(__name__)


def parse_address(vm_address: str) -> tuple[int, WordLen]:
    """
    Parse VM address string to start address and word length.

    Args:
        vm_address: Logo VM address (e.g. "V10", "VW20", "V10.3")

    Returns:
        Tuple of (start_address, word_length)
    """
    logger.debug(f"read, vm_address:{vm_address}")
    if re.match(r"V[0-9]{1,4}\.[0-7]", vm_address):
        logger.info(f"read, Bit address: {vm_address}")
        address = vm_address[1:].split(".")
        # transform string to int
        address_byte = int(address[0])
        address_bit = int(address[1])
        start = (address_byte * 8) + address_bit
        return start, WordLen.Bit
    elif re.match("V[0-9]+", vm_address):
        # byte value
        logger.info(f"Byte address: {vm_address}")
        start = int(vm_address[1:])
        return start, WordLen.Byte
    elif re.match("VW[0-9]+", vm_address):
        # byte value
        logger.info(f"Word address: {vm_address}")
        start = int(vm_address[2:])
        return start, WordLen.Word
    elif re.match("VD[0-9]+", vm_address):
        # byte value
        logger.info(f"DWord address: {vm_address}")
        start = int(vm_address[2:])
        return start, WordLen.DWord
    else:
        raise ValueError("Unknown address format")