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
相关产品推荐
相关产品推荐

