第四讲:数据采集实战——用NI DAQ采集主轴振动信号

各位同学,今天咱们来点真家伙。

前面三讲我们聊了轴承故障的机理、特征频率的计算,还有传感器的选型。但说实话,那些都是纸上谈兵。真正要诊断故障,你得先把信号拿到手。数据都采不上来,后面分析得再漂亮也是白搭。

这一讲,我就带大家走一遍完整的流程:从硬件接线,到NI DAQ的配置,再到Python实时读取和存储。嗯,都是我在车间里踩过坑之后总结出来的经验。

核心目标:用NI DAQ采集卡(比如USB-6009或9234)采集主轴轴承的振动加速度信号,通过Python实时读取并保存为CSV文件,为后续的时域/频域分析做准备。

4.1 硬件连接与配置

先说说硬件。我个人习惯用NI的USB-6009,性价比高,16位分辨率,采样率最高48kS/s,对付主轴振动绰绰有余。如果你用的是ICP加速度传感器,记得要配一个信号调理器,或者直接用NI 9234这种带IEPE激励的模块。

接线要点:

  • 传感器输出 → DAQ模拟输入通道(AI0+ / AI0-)
  • 信号调理器供电(如果是ICP传感器)
  • DAQ的USB线连到电脑

注意:我曾经有一次没注意传感器线缆的屏蔽层接地,结果采集到的信号里全是50Hz工频干扰。后来花了整整一个下午排查,才发现是接地问题。所以,屏蔽层一定要单端接地,别偷懒。

硬件接好后,打开NI MAX(Measurement & Automation Explorer),确认设备能被识别。如果设备列表里没有,检查驱动或者换根USB线——别问我怎么知道的。

4.2 Python环境准备

Python这边,我们需要装几个库:

  • nidaqmx:NI官方提供的Python驱动,用来控制DAQ卡
  • numpy:处理数据数组
  • pandas:保存CSV文件
  • matplotlib:实时绘图(可选,调试用)

安装命令很简单:

pip install nidaqmx numpy pandas matplotlib

这里有个坑:nidaqmx要求你的NI-DAQmx驱动版本在19.0以上。我建议直接装最新的,省得后面报错。

4.3 实时采集代码实战

好了,现在开始写代码。我会先给一个基础版本,然后逐步优化。

4.3.1 单次采集(测试用)

先跑通最简单的:采集1秒钟的数据,看看传感器和线缆有没有问题。

import nidaqmx
import numpy as np

# 创建设备对象
with nidaqmx.Task() as task:
    # 添加模拟输入通道,物理通道名称为"Dev1/ai0"
    task.ai_channels.add_ai_voltage_chan("Dev1/ai0")
    
    # 配置采样率:10kHz,采样点数:10000(即1秒数据)
    task.timing.cfg_samp_clk_timing(rate=10000, samps_per_chan=10000)
    
    # 读取数据
    data = task.read(number_of_samples_per_channel=10000)
    
    # 转换为numpy数组
    data_array = np.array(data)
    print(f"采集完成,数据长度:{len(data_array)}")
    print(f"最大值:{np.max(data_array):.4f} V,最小值:{np.min(data_array):.4f} V")

跑一下,如果输出正常,说明硬件链路没问题。如果全是0或者数值异常,检查传感器供电和接线。

4.3.2 连续采集与实时存储

实际诊断中,我们通常需要连续采集几分钟甚至几小时的数据。下面这个代码实现了:

  • 连续采集,每1秒读取一次缓冲区
  • 实时显示当前数据的均方根值(RMS)
  • 将数据追加保存到CSV文件
import nidaqmx
import numpy as np
import pandas as pd
import time
from datetime import datetime

# 采集参数
SAMPLE_RATE = 10000      # 采样率 10kHz
DURATION = 60            # 采集时长 60秒
CHUNK_SIZE = 10000       # 每次读取10000个点(1秒)
CHANNEL = "Dev1/ai0"     # 物理通道

# 存储数据的列表
all_data = []

print("开始采集...")
start_time = time.time()

with nidaqmx.Task() as task:
    # 配置通道和采样时钟
    task.ai_channels.add_ai_voltage_chan(CHANNEL)
    task.timing.cfg_samp_clk_timing(
        rate=SAMPLE_RATE,
        samps_per_chan=CHUNK_SIZE
    )
    
    # 启动采集
    task.start()
    
    while time.time() - start_time < DURATION:
        # 读取一个数据块
        chunk = task.read(number_of_samples_per_channel=CHUNK_SIZE)
        chunk_array = np.array(chunk)
        
        # 计算RMS值
        rms = np.sqrt(np.mean(chunk_array**2))
        timestamp = datetime.now().strftime("%H:%M:%S.%f")[:-3]
        
        print(f"[{timestamp}] RMS: {rms:.4f} V")
        
        # 存储数据
        all_data.append(chunk_array)
    
    task.stop()

# 合并所有数据
final_data = np.concatenate(all_data)
print(f"采集完成,总数据点数:{len(final_data)}")

# 保存为CSV
df = pd.DataFrame({
    'time': np.arange(len(final_data)) / SAMPLE_RATE,
    'vibration': final_data
})
df.to_csv('spindle_vibration_data.csv', index=False)
print("数据已保存到 spindle_vibration_data.csv")

小技巧:我习惯在文件名中加入时间戳,比如 spindle_20250101_143000.csv,这样不会覆盖之前的采集数据。你可以在保存时用 datetime.now().strftime("%Y%m%d_%H%M%S") 生成文件名。

4.4 避坑指南与经验分享

做数据采集这么多年,我踩过的坑能写一本书。这里挑几个最常见的说说:

  • 缓冲区溢出:如果采集时间很长,读取速度跟不上采样速度,DAQ卡会报缓冲区溢出错误。解决办法是增大 samps_per_chan 或者用多线程读取。
  • 采样率设置:主轴振动信号的频率范围一般在0-5kHz,根据奈奎斯特定理,采样率至少10kHz。我通常设到20kHz,留点余量。
  • 文件太大:连续采集一小时,10kHz采样率,就是3600万行数据。CSV文件会很大。建议分段保存,比如每10分钟一个文件。

警告:千万不要在采集过程中拔USB线!我曾经手贱拔了一次,结果DAQ卡驱动崩了,重装才恢复。正确做法是先停止任务,再断开连接。

4.5 知识体系总览

下面这张图总结了本章的核心逻辑,从硬件到软件,从采集到存储,一目了然:

主轴振动信号采集流程 加速度传感器 信号调理器 NI DAQ采集卡 NI MAX 设备配置 Python nidaqmx 驱动 实时读取数据 计算RMS/特征值 保存CSV

4.6 课后练习

光看不练假把式。给你留个小任务:

  1. 用你的DAQ卡采集一段主轴空转时的振动信号,保存为CSV
  2. 用Python读取这个CSV,画出时域波形图
  3. 尝试改变采样率(比如5kHz、20kHz),看看波形有什么变化

做完这些,你就掌握了数据采集的基本功。下一讲我们会用这些数据做频谱分析,看看能不能找到轴承故障的特征频率。


专注资料整理