python解析的代码:
import sys
import json
import numpy as np
from nptdms import TdmsFile
def parse_tdms_file(file_path, group_name):
"""
解析TDMS文件并返回指定通道的数据
"""
try:
# 读取TDMS文件
tdms_file = TdmsFile.read(file_path)
# 获取指定组和通道
group = tdms_file[group_name]
# channel = group[channel_name]
channel_ia = group["Ia"]
channel_ib = group["Ib"]
channel_ic = group["Ic"]
channel_uab = group["Uab"]
channel_ubc = group["Ubc"]
channel_uca = group["Uca"]
channel_ua = group["Ua"]
channel_ub = group["Ub"]
channel_uc = group["Uc"]
# 获取数据
data_ia = channel_ia[:]
data_ib = channel_ib[:]
data_ic = channel_ic[:]
data_uab = channel_uab[:]
data_ubc = channel_ubc[:]
data_uca = channel_uca[:]
data_ua = channel_ua[:]
data_ub = channel_ub[:]
data_uc = channel_uc[:]
# 如果数据太大,可以采样
# if len(data) > 10000:
# indices = np.linspace(0, len(data)-1, 10000, dtype=int)
# data = data[indices]
if len(data_ia) > 10000:
indices = np.linspace(0, len(data_ia)-1, 10000, dtype=int)
data_ia = data_ia[indices]
if len(data_ib) > 10000:
indices = np.linspace(0, len(data_ib)-1, 10000, dtype=int)
data_ib = data_ib[indices]
if len(data_ic) > 10000:
indices = np.linspace(0, len(data_ic)-1, 10000, dtype=int)
data_ic = data_ic[indices]
if len(data_uab) > 10000:
indices = np.linspace(0, len(data_uab)-1, 10000, dtype=int)
data_uab = data_uab[indices]
if len(data_ubc) > 10000:
indices = np.linspace(0, len(data_ubc)-1, 10000, dtype=int)
data_ubc = data_ubc[indices]
if len(data_uca) > 10000:
indices = np.linspace(0, len(data_uca)-1, 10000, dtype=int)
data_uca = data_uca[indices]
if len(data_ua) > 10000:
indices = np.linspace(0, len(data_ua)-1, 10000, dtype=int)
data_ua = data_ua[indices]
if len(data_ub) > 10000:
indices = np.linspace(0, len(data_ub)-1, 10000, dtype=int)
data_ub = data_ub[indices]
if len(data_uc) > 10000:
indices = np.linspace(0, len(data_uc)-1, 10000, dtype=int)
data_uc = data_uc[indices]
# 转换为Python列表
data_list_ia = data_ia.tolist() if isinstance(data_ia, np.ndarray) else list(data_ia)
data_list_ib = data_ib.tolist() if isinstance(data_ib, np.ndarray) else list(data_ib)
data_list_ic = data_ic.tolist() if isinstance(data_ic, np.ndarray) else list(data_ic)
data_list_uab = data_uab.tolist() if isinstance(data_uab, np.ndarray) else list(data_uab)
data_list_ubc = data_ubc.tolist() if isinstance(data_ubc, np.ndarray) else list(data_ubc)
data_list_uca = data_uca.tolist() if isinstance(data_uca, np.ndarray) else list(data_uca)
data_list_ua = data_ua.tolist() if isinstance(data_ua, np.ndarray) else list(data_ua)
data_list_ub = data_ub.tolist() if isinstance(data_ub, np.ndarray) else list(data_ub)
data_list_uc = data_uc.tolist() if isinstance(data_uc, np.ndarray) else list(data_uc)
# 转换为Python列表
# data_list = data_ib.tolist() if isinstance(data_ib, np.ndarray) else list(data_ib)
return {
"success": True,
"data_ia": data_list_ia,
"data_ib": data_list_ib,
"data_ic": data_list_ic,
"data_uab": data_list_uab,
"data_ubc": data_list_ubc,
"data_uca": data_list_uca,
"data_ua": data_list_ua,
"data_ub": data_list_ub,
"data_uc": data_list_uc,
"length": len(data_list_ia),
"min": float(np.min(data_ia)),
"max": float(np.max(data_ia)),
"mean": float(np.mean(data_ia))
}
except Exception as e:
return {
"success": False,
"error": str(e)
}
if __name__ == "__main__":
# 从命令行参数获取输入
if len(sys.argv) >= 4:
file_path = sys.argv[1]
group_name = sys.argv[2]
# channel_name = sys.argv[3]
result = parse_tdms_file(file_path, group_name)
print(json.dumps(result, ensure_ascii=False))
else:
print(json.dumps({
"success": False,
"error": "参数不足,需要文件路径、组名和通道名"
}))
node代码:
const path = require("path");
const { spawn } = require("child_process");
// 解析TDMS文件
// 解析TDMS文件的API
router.get("/tdms_data", async (req, res) => {
try {
const { group = "采集数据" } = req.query;
// 调用Python脚本
const pythonProcess = spawn("python", [
"E:\\project\\***\\***\\parse_tdms.py",
"E:\\project\\***\\***\\test_ac.tdms",
group,
]);
let output = "";
let errorOutput = "";
// 收集标准输出
pythonProcess.stdout.on("data", (data) => {
output += data.toString();
});
// 收集错误输出
pythonProcess.stderr.on("data", (data) => {
errorOutput += data.toString();
});
// 处理进程结束
pythonProcess.on("close", (code) => {
if (code === 0) {
try {
const result = JSON.parse(output);
res.json({
success: true,
code: 20000,
data: result,
message: "解析TDMS文件成功",
});
} catch (parseError) {
res.status(500).json({
code:20001,
success: false,
error: `解析Python输出失败: ${parseError.message}`,
rawOutput: output,
});
}
} else {
res.status(500).json({
code:20001,
success: false,
error: `Python脚本执行失败 (退出码: ${code})`,
pythonError: errorOutput,
});
}
});
} catch (error) {
res.status(500).json({
code:20001,
success: false,
error: error.message,
});
}
});
vue代码:
parseTdms() {
this.listLoading = true
parseTdmsDo(this.device_name).then(response => {
if(response.success&&response.data.success){
const llength=response.data.length;
this.timeData = Array.from({ length: llength }, (_, i) => i)
this.iaData =response.data.data_ia;
this.ibData =response.data.data_ib;
this.icData =response.data.data_ic;
this.uabData =response.data.data_uab;
this.ubcData =response.data.data_ubc;
this.ucaData =response.data.data_uca;
this.uaData =response.data.data_ua;
this.ubData =response.data.data_ub;
this.ucData =response.data.data_uc;
console.log("更新了数据!!")
this.updateChartIa()
this.updateChartIb()
this.updateChartIc()
this.updateChartUab()
this.updateChartUbc()
this.updateChartUca()
this.updateChartUa()
this.updateChartUb()
this.updateChartUc()
}
this.listLoading = false
}).catch(error => {
console.error('API调用失败:', error)
this.listLoading = false
this.$message({
message: 'API调用失败,请检查网络连接',
type: 'error',
duration: 5 * 1000
})
})
},
vue的api:
// 获取tdms数据
export function parseTdmsDo(device_name) {
return request({
url: '/vue-element-admin/device/tdms_data',
method: 'get',
params: { device_name }
})
}
展示:
