2. 设备数据采集方案设计
任务定义
针对旋转机械(如电机、风机)与液压系统两类典型设备,设计一套可落地的多传感器数据采集方案。方案需明确传感器选型、安装位置、采样频率设定依据,并给出可执行的配置代码与验证方法。本案例聚焦于采集层设计,不涉及后续信号处理与故障诊断算法。
1. 传感器选型与安装位置
旋转机械主要监测振动与转速,液压系统主要监测压力、流量与油液温度。选型原则:振动传感器选用IEPE型加速度计(量程±50g,灵敏度100mV/g),转速采用磁电式接近开关,压力选用扩散硅压力变送器(4-20mA输出),流量选用涡轮流量计,温度选用PT100铂电阻。安装位置需遵循以下规则:
- 振动传感器:安装于轴承座垂直与水平方向(测点1、2),以及设备基座(测点3),使用磁座或螺纹安装,确保接触面平整;
- 转速传感器:安装于转轴附近,间隙1-2mm,对准键相标记;
- 压力传感器:安装于液压泵出口主管路(测点P1)与执行器入口(测点P2),使用三通接头接入;
- 流量传感器:串联于回油管路(测点F1);
- 温度传感器:插入液压油箱内部(测点T1),浸没深度≥100mm。
2. 采样频率设定
采样频率依据被测信号最高频率分量确定。旋转机械振动信号关注至10倍转频(假设最高转速3000rpm即50Hz),则最高分析频率500Hz,按抗混叠要求采样率≥2.56×500=1280Hz,取整为2048Hz。液压系统压力脉动主要能量集中在100Hz以内,采样率设为512Hz;流量与温度为缓变信号,采样率设为10Hz。所有通道同步采集,避免相位偏差。
3. 数据采集配置实现
以下代码基于Python与NI-DAQmx驱动,实现多通道同步采集配置。硬件假设为NI USB-6343(32路AI,16位,2MS/s),通过接线盒连接上述传感器。
import nidaqmx
from nidaqmx.constants import (
TerminalConfiguration, Edge, AcquisitionType, VoltageUnits, CurrentUnits
)
import numpy as np
import time
# 通道配置参数
VIB_SENSITIVITY = 0.1 # 100mV/g → 0.1 V/g
VIB_SAMPLE_RATE = 2048.0
VIB_SAMPLES = 2048 * 2 # 采集2秒
PRESS_SAMPLE_RATE = 512.0
PRESS_SAMPLES = 512 * 2
SLOW_SAMPLE_RATE = 10.0
SLOW_SAMPLES = 10 * 2
def configure_task():
"""创建并配置多通道采集任务"""
task = nidaqmx.Task()
# 振动通道(3路,IEPE需启用激励电流)
for i, ch in enumerate(["Dev1/ai0", "Dev1/ai1", "Dev1/ai2"]):
task.ai_channels.add_ai_accel_chan(
ch, name_to_assign_to_channel=f"vib_{i+1}",
terminal_config=TerminalConfiguration.DIFFERENTIAL,
sensitivity=VIB_SENSITIVITY, sensitivity_units=VoltageUnits.VOLTS_PER_G,
current_excit_source=nidaqmx.constants.ExcitationSource.INTERNAL,
current_excit_val=0.004 # 4mA IEPE激励
)
# 压力通道(2路,4-20mA需外接250Ω电阻转为1-5V)
for i, ch in enumerate(["Dev1/ai3", "Dev1/ai4"]):
task.ai_channels.add_ai_voltage_chan(
ch, name_to_assign_to_channel=f"press_{i+1}",
terminal_config=TerminalConfiguration.DIFFERENTIAL,
min_val=0.0, max_val=5.0, units=VoltageUnits.VOLTS
)
# 流量通道(1路,4-20mA经250Ω电阻)
task.ai_channels.add_ai_voltage_chan(
"Dev1/ai5", name_to_assign_to_channel="flow",
terminal_config=TerminalConfiguration.DIFFERENTIAL,
min_val=0.0, max_val=5.0, units=VoltageUnits.VOLTS
)
# 温度通道(1路,PT100经变送器输出4-20mA)
task.ai_channels.add_ai_voltage_chan(
"Dev1/ai6", name_to_assign_to_channel="temp",
terminal_config=TerminalConfiguration.DIFFERENTIAL,
min_val=0.0, max_val=5.0, units=VoltageUnits.VOLTS
)
# 转速通道(1路,数字输入)
task.di_channels.add_di_chan("Dev1/port0/line0", name_to_assign_to_channel="tacho")
# 设置采样时钟(所有AI通道统一采样率,此处以振动采样率为基准)
task.timing.cfg_samp_clk_timing(
rate=VIB_SAMPLE_RATE,
sample_mode=AcquisitionType.FINITE,
samps_per_chan=VIB_SAMPLES
)
return task
def read_data(task):
"""读取一次采集数据,返回字典"""
data = task.read(number_of_samples_per_channel=VIB_SAMPLES)
# data为二维列表:行=通道,列=采样点
result = {
"vib_1": np.array(data[0]) / 0.1, # 转换为g
"vib_2": np.array(data[1]) / 0.1,
"vib_3": np.array(data[2]) / 0.1,
"press_1": (np.array(data[3]) / 5.0) * 20.0, # 0-5V → 0-20MPa
"press_2": (np.array(data[4]) / 5.0) * 20.0,
"flow": (np.array(data[5]) / 5.0) * 100.0, # 0-5V → 0-100L/min
"temp": (np.array(data[6]) / 5.0) * 150.0 # 0-5V → 0-150℃
}
return result
if __name__ == "__main__":
task = configure_task()
try:
task.start()
# 等待转速信号触发(简单轮询,实际可用硬件触发)
time.sleep(0.5)
data = read_data(task)
task.stop()
# 输出关键统计值(仅作示例,非实测结果)
print(f"振动1 RMS: {np.sqrt(np.mean(data['vib_1']**2)):.3f} g")
print(f"压力1 均值: {np.mean(data['press_1']):.2f} MPa")
print(f"温度: {np.mean(data['temp']):.1f} ℃")
finally:
task.close()
4. 通道标定与量程映射
代码中已包含传感器灵敏度与量程换算:振动通道通过DAQmx加速度计通道直接设置灵敏度,返回值为g;压力、流量、温度通道通过电压-物理量线性映射(0-5V对应0-20MPa、0-100L/min、0-150℃)。实际使用时需根据传感器具体量程修改映射系数。
5. 验证方法与判定标准
硬件连接验证:启动设备后,在NI MAX中检查所有通道是否识别,手动施加已知激励(如敲击振动传感器),观察对应通道波形是否变化。
采样率验证:运行上述代码,采集已知频率信号(如使用信号发生器输入50Hz正弦波至振动通道),对采集数据做FFT,频谱峰值应出现在50Hz±1Hz处,且无混叠分量。
同步性验证:同时给两个压力通道施加同一阶跃压力,比较两通道数据上升沿时间差,应小于1个采样周期(1/512s≈2ms)。
判定标准:以上三项验证全部通过,且代码能连续稳定运行30分钟无报错,即判定采集方案合格。