You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python3读取西门子PLC返回的字节数组如何提取其中的有效字符串

西门子PLC S7字符串字节数组提取解决方案

核心原理

西门子S7系列PLC的String类型固定采用如下存储结构:

  • 第1个字节:字符串最大可容纳长度
  • 第2个字节:当前实际存储的字符长度
  • 第3个字节开始:对应实际长度的有效字符,剩余位用空字节填充

你给出的示例字节串b'\xfe\x07Testing\x00\x00...'完全符合该结构:第2位\x07对应十进制7,刚好是目标字符串Testing的长度。


实现方案

你已经导入了snap7.util工具库,优先用内置方法最稳妥,两种实现可选:

方法1:调用snap7内置解析函数(推荐)

直接使用snap7.util.get_string方法,传入读取到的db块和字符串在块内的起始偏移即可:

# 原有代码不变,在db = plc.db_read(...)后添加如下代码
plc_str = get_string(db, 0)  # 第二个参数为字符串在DB块内的起始偏移,你当前START_ADDRESS为0所以填0
print(plc_str)  # 直接输出目标字符串 Testing

方法2:手动字节解析(适合需要自定义逻辑的场景)

# 原有代码不变,在db = plc.db_read(...)后添加如下代码
if len(db) >= 2:
    # 读取第二个字节的实际字符串长度
    actual_str_len = db[1]
    # 从第3位(索引2)开始截取对应长度的字节,解码为字符串
    plc_str = db[2: 2 + actual_str_len].decode('ascii')
    print(plc_str)

完整可运行参考代码

import snap7
from snap7.util import *
import struct
import snap7.client
import logging

DB_NUMBER = *** # 替换为实际的DB块号
START_ADDRESS = 0
SIZE = 255                           

logging.basicConfig()
logger = logging.getLogger()
logger.setLevel(logging.DEBUG)
plc = snap7.client.Client()
plc.connect('My IP address',0,0) # 替换为实际的PLC IP地址

plc_info = plc.get_cpu_info()
print(plc_info)

state = plc.get_cpu_state()
print(state)
db = plc.db_read(DB_NUMBER, START_ADDRESS, SIZE)

# 字符串解析逻辑
plc_str = get_string(db, 0)
print("提取到的目标字符串:", plc_str)

如果PLC侧存储的是中文字符,把解码规则改为decode('gbk')即可。

内容的提问来源于stack exchange,提问作者Abisheik Kumar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 21:54:05