Files
gateway_plc/gateway/data_parser.py

55 lines
2.1 KiB
Python
Raw Permalink Normal View History

2025-08-13 18:13:09 +08:00
from struct import unpack
import time
def parse_data(data, structure):
"""解析结构化数据"""
result = {"raw_data": list(data)}
if not structure:
return result
result["parsed"] = {}
for field in structure:
offset = field["offset"]
name = field["name"]
data_type = field["type"]
try:
if data_type == "int":
if offset + 2 > len(data):
raise ValueError("Offset out of bounds")
val = unpack(">h", data[offset:offset+2])[0]
elif data_type == "dint":
if offset + 4 > len(data):
raise ValueError("Offset out of bounds")
val = unpack(">l", data[offset:offset+4])[0]
elif data_type == "real":
if offset + 4 > len(data):
raise ValueError("Offset out of bounds")
val = unpack(">f", data[offset:offset+4])[0]
elif data_type == "bool":
bit = field.get("bit", 0)
if offset >= len(data):
raise ValueError("Offset out of bounds")
byte = data[offset]
val = bool((byte >> bit) & 1)
elif data_type == "byte":
if offset >= len(data):
raise ValueError("Offset out of bounds")
val = data[offset]
elif data_type == "word":
if offset + 2 > len(data):
raise ValueError("Offset out of bounds")
val = (data[offset] << 8) | data[offset + 1]
elif data_type == "dword":
if offset + 4 > len(data):
raise ValueError("Offset out of bounds")
val = (data[offset] << 24) | (data[offset+1] << 16) | (data[offset+2] << 8) | data[offset+3]
else:
val = f"Unknown type: {data_type}"
result["parsed"][name] = val
except Exception as e:
result["parsed"][name] = f"Error: {str(e)}"
return result