目录
- 1 博客内容
- 2 提取信号
- 3 程序原理
- 4 源程序
1 博客内容
之前网上见有人问及Python在汽车行业的应用,这篇博客作为一个Use Case,介绍Python在处理汽车控制单元记录数据方面的应用:排查使用CANape采集的VCU记录数据中的异常点,数据类型的MDF(MF4通用)。
2 提取信号
设定内容,排查MDF文件三项数据:电机进水温>60℃、电机油温和进水差值>10℃、电机功率>50kW的所有数据点。之前有耳闻Python能处理MDF数据。网上搜索两个库可以,Python的Asammdf库似曾相识,因为去除MDF是康师傅的一个产品。
3 程序原理
下载轮子后,网上找不到教程。遂把帮助文件码一遍,分段print找规律。通过Signal.py和csselectronics(EN)网站对MDF4讲解,以及之前了解的基础教程+尝试,判断数据处理主要是对提取的信号(使用列表)处理。需留意不同信号的采样频率不一致,假设记录时间2min,列出信号:
- 车速,VehicleSpeed,简写Vehspd,采样频率100Hz(10ms),信号点12000个;
- 电机进水温度,EM Temperature Water In,简写TWI,采样频率10Hz(周期100ms),信号点1200个;
- 电机进油温度,EM Temperature Oil In,简写TOI,采样频率10Hz(周期100ms),信号点1200个;
- 电机扭矩,EM Torque,简写EMTq,采样频率10Hz(周期100ms),信号点1200个;
- 电机转速,EM Speed,简写EMSpd,采样频率100Hz(周期10ms),信号点12000个;
CANape使用17版本自带例子,数据截图:
4 源程序
Python源程序
"""
名称: CheckMDF.py
作者: Morven_Xie
版本: 1.0
时间: 2020/7/21 1:49
功能: 用于车辆排查车辆VCU记录的MDF文件
简介: 提取车辆车速、电机进水温度、油温、电机扭矩、电机转速等信号
Email: morven_xie@163.com
"""
# coding=utf-8
from asammdf import MDF # 用于处理MDF文件
import os # 用于获取文件路径
file_path = "D:\SoftApp\Python\HardWay2StudyPython\MDFData" # 文件所在文件夹
def CheckMDF(inpath):
mdf =MDF(inpath)
print(mdf.info())
i=-1
vehspd = mdf.get("sensor_S1_discrete_value")
TWI=mdf.get("t")
TOI=mdf.get("sensor_S1_state")
EMTq=mdf.get("sensor_S2_state")
EMSpd=mdf.get("sensor_S2_discrete_value")
print(len(vehspd.timestamps))
for k in vehspd.timestamps:
i+=1
if TWI.samples[i]>60:
with open("CheckDataRecord.txt", 'a') as f:
f.write(inpath) # 将固定信息先写入txt中
f.write(str(TWI.samples[i]))
f.write(str(k))
f.write('\n')
f.close()
if (TOI.samples[int(i/10)]-TWI.samples[int(i/10)])>10:
with open("CheckDataRecord.txt", 'a') as f: # 新建txt,且其名称每次更新
f.write(inpath) # 将固定信息先写入txt中
f.write(int(TOI.samples[int(i/10)]-TWI.samples[int(i/10)]))
f.write(str(k))
f.write('\n')
f.close()
if (EMTq[int(i/10)]*EMSpd[i])/9550>50:
with open("CheckDataRecord.txt", 'a') as f:
f.write(inpath) # 将固定信息先写入txt中
f.write(int((EMTq[int(i/10)]*EMSpd[i])/9550))
f.write(str(k))
f.write('\n')
f.close()
pathss = [] #存储文件夹内所有文件的路径(包括子目录内的文件)
for root, dirs, files in os.walk(file_path): # os.walk返回三个对象: dirpath(目录路径,string类型) dirname(多个子目录名,列表); filename(多个文件名,也是一个列表)
path = [os.path.join(root, name) for name in files] #遍历文件名对应的地址(3个文件地址)
for i in path: #如果地址为真
CheckMDF(i) #调用def CheckMDF(inpath)函数
该思路的实际应用内容,点击“Python:处理车辆控制单元MDF记录文件思路_更新版”。