Python:处理车辆控制单元MDF(CANApe数据)记录文件思路

目录

  • 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版本自带例子,数据截图:

Python:处理车辆控制单元MDF(CANApe数据)记录文件思路_第1张图片

4 源程序

Python源程序

"""
    名称:  CheckMDF.py
    作者:  Morven_Xie
    版本:  1.0
    时间:  2020/7/21 1:49
    功能:  用于车辆排查车辆VCU记录的MDF文件
    简介:  提取车辆车速、电机进水温度、油温、电机扭矩、电机转速等信号
    Email:  [email protected]
"""


# 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记录文件思路_更新版”。

>> 更多相关内容,点击Morven_Xie博客概览

你可能感兴趣的:(软件,python)