基于Modbus与PID的驱动电机故障诊断试验台设计
2026/9/19 15:31:02 网站建设 项目流程

简介:这份PDF文献聚焦电动汽车驱动电机故障诊断试验台的完整设计方案,适合新能源汽车、汽车电子及故障诊断方向的工程师、研究生与科研人员参考。内容涵盖基于NI cRIO控制器与PLC组合的硬件架构、PID控制算法应用、NI 9220/9234多路信号高速同步采集,以及基于LabVIEW的上位机监控软件设计,能够帮助读者快速理解从试验台搭建到负载实验验证的全流程。资源为单份PDF文件,压缩包大小约1.29MB,属于2019年《济南大学学报(自然科学版)》的学术论文,附带中英文摘要、图表与参考文献。目前已有124人学习使用,对于正在开展电动汽车驱动电机试验台研究或课程设计的用户,具有直接的专业指导价值与文献引用意义。

1. 故障诊断试验台:性能台架与故障信号采集之间的落差在哪

做电动汽车驱动电机测试的人大多有同感:常规台架能测效率、拉外特性、做温升,可真要定位匝间短路、轴承失效、永磁体失磁这类典型故障,普通性能台架就使不上劲了。原因在于性能测试只关心电机达不达标,故障诊断则要求在典型工况下把电流、振动、温度、转速、转矩几路特征信号同步采下来,再对照故障机理。济南大学学报这篇论文的方案,是用NI cRIO-9030做主控,S7-200 PLC和ACS880变频器做从站走Modbus组网,靠PID把转速波动压到±15 r/min以内,再用NI 9234和NI 9220完成振动与电气信号的高速同步采集,整套台架按GB/T 18488.1-2015与GB/T 18488.2-2015搭建。对做驱动电机故障诊断和性能优化的人,最值得读的是从工况加载到信号落盘整条链路的参数取舍,而不是硬件选型本身。

2. Modbus总线与PID控制:cRIO主站下的双电机协同调速

这套试验台的突出之处,是把原本各自独立的电机驱动链路统一到了一条 RS485 总线上。NI cRIO-9030 集成了 1.33 GHz Intel Atom 双核处理器和 Kintex-7 FPGA,自带 RS485 接口,所以它既是实时控制器,又是 Modbus 主站;西门子 S7-200 PLC 和 ACS880 变频器作为从站,分别承担被测电机和负载电机的底层驱动。这样一来,工况决策、转速闭环与转矩加载都被收拢到同一个实时循环里,上位机只做参数下发和显示,改工况逻辑时不需要动 PLC 梯形图。

2.1 主从站职责划分与工况角色

被测电机选用额定功率 10 kW 的 HPQ10SF-96 永磁同步电机,负载电机是额定功率 15 kW 的 QABP160M2A 交流变频电机。实验时被测电机工作在转速模式,负载电机工作在转矩模式,即转速闭环被侧在被测电机一侧,而载荷大小由负载电机通过变频器给定。

设备Modbus角色控制接口实验中的任务
NI cRIO-9030主站RS485 + FPGA运行动作、运行PID、时序控制、信号汇总
西门子 S7-200从站1模拟量输出 + IO模拟油门踏板与档位,控制被测电机控制器
ACS880 变频器从站2Modbus 保持寄存器驱动负载电机,按给定转矩加载

这个分工带了一个工程上的好处:S7-200 只做模拟量旁路,不参与转矩闭环,ACS880 只做转矩执行,真正意义上的工况决策与转速闭环全部收归 cRIO 的实时系统。调试时只需要改 cRIO 里的程序和上位机参数,不碰 PLC 梯形图。负载电机选 15 kW、比被测电机的 10 kW 高出一档,是为了低转速大转矩区留出加载余量,避免负载电机先进入过载区,这个选型比例在台架设计里可以照抄。

2.2 轮询ACS880运行状态:pymodbus的常见写法

ACS880 内置 Modbus 通讯模块,不同固件版本的寄存器映射不一致。常见做法是先在变频器参数组里把通讯协议设为 Modbus RTU,配置站地址、波特率、数据位和校验位,再按固件手册查母线电压、输出电流和输出频率对应的保持寄存器地址。轮询代码用 pymodbus 实现如下:

from pymodbus.client import ModbusSerialClient import time client = ModbusSerialClient( port='COM3', baudrate=19200, bytesize=8, parity='N', stopbits=1, timeout=0.5 ) client.connect() def read_inverter_state(unit_id=2): # 从起始寄存器0读10个保持寄存器,地址以固件手册为准 resp = client.read_holding_registers(0, 10, slave=unit_id) if resp.isError(): return None regs = resp.registers return { 'dc_bus_voltage': regs[0] * 0.1, 'output_current': regs[1] * 0.01, 'output_speed': regs[2] * 0.1, } while True: state = read_inverter_state() if state: print(state) time.sleep(0.1)

这段代码把寄存器地址和比例系数集中在一个返回字典里,换固件时只需要改一处。轮询周期放在 100 ms 量级,不是越快越好:RS485 半双工总线上还挂着 S7-200,轮询太密会导致从站响应超时;实验里转速采样率本来就设计为 100 Hz,0.1 s 一次轮询已经覆盖观测需求;总线余量要留给转矩给定和转速给定这类写操作,避免读操作把写操作堵在后面。实际做故障诊断实验时,我一般会同时读回 ACS880 的实际转矩和给定转矩,两者差值超过 5% 就说明加载机构有卡滞,这比事后看数据发现问题要快得多。

2.3 英博尔MC33360控制器的模拟量旁路方案

英博尔 MC33360-5V 是试验台配的电动汽车控制器,不支持 Modbus,原车控制方式是档位开关加油门踏板,油门踏板输出本质是一路模拟电压,档位是一组开关量。论文里的做法是用 S7-200 的模拟量输出和 IO 口替代这两个物理输入。

S7-200 的模拟量通道按 0~10 V 输出对应油门开度,IO 口的高低电平对应前进、空档、倒车三个档位。工程上需要抠两个细节:一是上电和程序复位瞬间,模拟量必须先归零、档位先回空档,否则被测电机会出现上电即转的危险动作;二是模拟量输出的地必须和英博尔控制器的油门信号地共地,浮地会造成油门电压漂移,转速给定就不稳定。S7-200 CPU224 自带的模拟量输出是 12 位,做 0~1500 r/min 的转速给定,一个 LSB 对应不到 0.4 r/min,分辨率够用。论文结论里转速波动能控制在 ±15 r/min 以内,共地和时序初始化这两条是前提条件。

2.4 PID恒转速控制的离散化与积分饱和处理

恒转速控制是试验台的基础闭环。传感器采集的转速与设定转速做差,送入 PID 模块,输出作为电机给定;PID 参数在上位机前面板里可调,这意味着整定时不需要重新编译 FPGA 或 RT 程序,改面板数值就能观察阶跃响应。离散 PID 的工程实现如下,积分做抗饱和限幅:

class PID: def __init__(self, kp, ki, kd, ts, out_min=0.0, out_max=100.0): self.kp, self.ki, self.kd = kp, ki, kd self.ts = ts self.out_min, self.out_max = out_min, out_max self.integral = 0.0 self.prev_err = 0.0 def step(self, setpoint, feedback): err = setpoint - feedback self.integral += err * self.ts if self.integral * self.ki > self.out_max: self.integral = self.out_max / self.ki elif self.integral * self.ki < self.out_min: self.integral = self.out_min / self.ki u = (self.kp * err + self.ki * self.integral + self.kd * (err - self.prev_err) / self.ts) self.prev_err = err return max(self.out_min, min(self.out_max, u))

积分项如果不做限幅,给定顶到上限后积分还在累加,转速会长时间超调拉不回来,这在电机启动阶段尤其明显。微分项用的是误差差分,循环周期 Ts 必须和实际执行周期一致,LabVIEW 里 PID 模块的循环定时器要单独核对。按论文实验结果,1500 r/min 下转速波动 ±15 r/min 以内,对应约 2% 的误差带;如果发现稳态误差偏大,优先检查转速反馈通道的标定而不是加大 Ki,因为 ZJ-100A 的 0.2% 精度已经比控制误差带高一个数量级,反馈标定不准会直接吃掉闭环余量。

2.5 再生电能回馈的象限问题

负载电机在被测电机拖动下工作在第 4 象限,处于倒拉反转的反接制动状态,电磁功率为负,再生电能灌回 ACS880 的直流母线。论文里用的 ACS880 配置不具备第 4 象限运行能力,不能直接把再生电能送回三相电网,所以增加了一套能量回收装置:变频器直流母线出来的直流电先逆变回三相交流,再经过整流变成 50 Hz 工频电流送到电网。这条逆变整流回馈链路对原调速控制完全不侵入,母线电压被钳在安全范围内,既避免了制动电阻长时间发热,也实现了论文里强调的能源回收。接入回馈装置后,直流母线电压会被抬升,要确认 ACS880 的直流过压保护阈值高于回馈装置的工作点,否则负载电机在反接制动的瞬间会频繁跳 OVC 过压故障,这个问题在实际调试里比控制算法更容易踩坑。

3. 多路故障信号同步采集:NI 9220与NI 9234的通道规划

电动机是机电磁耦合的复杂装置,单一故障往往在电流、振动、温度等多个特征量上同时有表现。匝间短路引起发热、转矩降低、电流增大、转速下降;轴承失效改变电磁振动和噪声;失磁导致温度升高、电枢电流增大、启动转矩降低。这套试验台的采集设计理念不是每个信号各自为政,而是把多路信号放到同一时间基准下同步采集,后续做特征融合才有对齐基础。

3.1 传感器与采集模块的信号链路映射

论文的信号链路非常清晰:NI 9234 是四通道动态信号采集模块,每通道最高 51.2 kHz 采样率,用于振动信号;NI 9220 是 16 路 ±10 V 模拟量输入模块,最大采样速率 100 kS/s,16 位精度,承担电流、转速、转矩和温度的采集。

特征信号传感器采集模块实验设定采样率
振动 x/y/z北智振动传感器(分辨率0.0001 g)NI 923410.24 kHz
三相电流电流互感器NI 92202 kHz
转速ZJ-100A 扭矩转速传感器NI 9220100 Hz
转矩ZJ-100A(精度0.2%)NI 9220100 Hz
绕组温度KTY84-150(埋入绕组)NI 9220(经变送器)慢速周期读取

温度信号变化慢,KTY84-150 是正温度系数热敏电阻,埋在电机绕组内部。需要注意,KTY84-150 输出的是电阻值不是电压,直接进 NI 9220 前必须经过变送器或恒流源调理电路,否则测到的只是分压网络的非线性电压。配置 NI 9234 通道时,如果用的是压电式加速度计,必须在软件里打开 IEPE 激励并设置正确的激励电流,电压量程按传感器灵敏度换算,防止振动冲击削顶。

3.2 采样率设计的依据与抗混叠处理

三档采样率的选择有明确依据。转速信号取 100 Hz,是因为转速闭环时间常数在百毫秒级,100 Hz 足以还原闭环动态,又不会和电流数据混在一起增大存储压力。电流取 2 kHz,覆盖 1500 r/min 下永磁同步电机的基波和主要边带,按典型极对数算基波频率在几百 Hz 以内,2 kHz 留出了 4~10 倍裕量。振动取 10.24 kHz,是因为轴承故障的早期特征常分布到几千 Hz,而 10.24 kHz 是 2 的幂次,正好匹配 NI 9234 的采样时钟分频,FFT 长度友好。

提示:NI 9234 的 51.2 kHz 是模块上限,论文选 10.24 kHz 不是越高越好。采样率翻倍数据量翻倍,FPGA 到 RT 之间的 FIFO 带宽有限,长时间工况模拟会把 FIFO 塞满,丢帧比采样不足更危险。做 10 分钟以上连续采集时,宁可降采样率也不要关掉 FIFO 的溢出保护。

3.3 FPGA同步采集与数据落盘后的特征计算

NI cRIO-9030 内部,FPGA 负责所有信号采集,实时系统负责处理和与上位机交互;FPGA 与实时系统之间用 FIFO 传数据,实时系统与上位机之间走 TCP。多路信号同步的关键在于所有采集通道的采样时钟都来自 FPGA 背板,而不是各板卡自由运行,这样电流、振动、转速采样率不同,但起始时刻和时钟源一致,后处理按时间戳对齐即可。

数据从 LabVIEW 落盘后,我一般先用 Python 做特征计算,下面是 A 相电流有效值和振动频谱的常见处理:

import numpy as np import pandas as pd df = pd.read_csv('run_1500rpm_5Nm.csv') ia = df['A相电流'].values fs_i = 2000 # 取稳态段,避免启动暂态污染 steady = ia[len(ia)//2:] ia_rms = np.sqrt(np.mean(steady**2)) # 振动信号去直流、加窗后做FFT vib = df['振动_x'].values fs_v = 10240 vib = vib - np.mean(vib) w = np.hanning(len(vib)) spec = np.abs(np.fft.rfft(vib * w)) freq = np.fft.rfftfreq(len(vib), 1/fs_v)

说明:A 相电流有效值在论文的失磁诊断里作为特征量,取稳态段后半段是为了避开启动电流冲击。振动 FFT 前先减直流再乘 Hanning 窗,Hanning 窗对轴承冲击这类宽频信号泄漏抑制好;分析时在轴承故障特征频率附近取频段能量积分,而不是只看单根谱线,因为真实轴承故障的谱线会分散到边带里。ZJ-100A 的转速通道采样率虽然只有 100 Hz,但它的脉冲或电压信号要和电流通道同源采集,否则转速-电流联合分析时时间对齐会出偏差,故障特征的相关性计算就失真了。

4. LabVIEW上位机与典型工况模拟的控制实现

上位机是试验台的人机接口。论文基于 LabVIEW 编写,实现了实时电机控制和信号显示,这部分的价值不只是前面板好看,而是把实时控制、参数标定、数据存储三个需求揉在一起,让研究人员不用碰底层代码就能完成完整实验。

4.1 前面板的功能组织

上位机软件需要提供几个操作维度:被测电机运行方向和运行速度;负载电机运行模式选择,即恒转速或恒转矩;负载电机转速或转矩的实时修改;负载电机母线电压、输出电流等参数的读取;电流、振动、转速、转矩信号的实时存储与显示。这些功能在 LabVIEW 里对应三块逻辑:控制指令通过 Modbus 写入从站保持寄存器,状态读取循环定时轮询从站,信号显示线程从 TCP 接收实时系统转发过来的采集数据。写控制和读状态必须分线程,否则前面板上拖动转矩滑块时读操作被阻塞,显示会卡顿。

4.2 PID参数现场整定的操作顺序

PID 参数可以在前面板设定,现场整定常见做法是 Ziegler-Nichols 闭环临界比例法,试验台上的流程可以按下面这个顺序走:

步骤操作观察指标
1Ki、Kd 置 0,逐步加大 Kp转速响应是否出现等幅振荡
2记录临界增益 Ku 和振荡周期 Tu用于经验公式计算
3按 Z-N 公式折算 Kp=0.6Ku,Ki=2Kp/Tu,Kd=KpTu/8得到初值
4空载试运行,微调 Ki 消除稳态误差1500 r/min 静态偏差
5突加 5 N·m 负载,检查超调与恢复时间转速波动是否在 ±15 r/min 内

1500 r/min 的目标下,转速波动 ±15 r/min 对应 1% 的波动率。步骤 5 超调过大时不要只降 Kp,先把微分项加上看效果。论文里转速采样率 100 Hz,PID 循环周期应取 10 ms 以内,微分项才有足够分辨率;循环周期超过 50 ms 时,微分项会退化成噪声放大器,速度环反而更不稳。

4.3 城市与市郊工况循环的时序控制

工况模拟的依据是 GB/T 18488.1-2006 中电动汽车驱动电机城市工况和市郊工况的循环曲线。程序逻辑不复杂,就是把工况曲线离散成时间-转速-转矩点序列:

cycle = [ (0, 0, 0), (10, 500, 5), (25, 1500, 5), (35, 1000, 8), (50, 0, 0), (60, 800, 3), (75, 1500, 5), (90, 0, 0), ] # (时刻s, 转速r/min, 转矩N·m) for t, n_target, tq_load in cycle: set_speed(n_target) # 经Modbus/S7-200写入被测电机给定 set_load_torque(tq_load) # 经Modbus写入ACS880转矩给定 wait_until_next(t)

容易出问题的是转速给定和转矩给定更新的同步性。先卸负载而转速没降,电机会在惯性下超速;先降转速而负载还挂着,电机会被强制拉低,电流冲击很大。工程处理办法是在一个 Modbus 写事务里同时写两个从站的给定值,主站循环每 100 ms 刷新一次,每次刷新后校验转速反馈是否落在目标值 ±15 r/min 窗口内,超窗就降载报警。上位机里还要放一个看门狗,Modbus 通讯超时超过 500 ms 直接让负载电机回到零转矩,防止通讯中断时电机带载失控。

4.4 负载实验的复现参数

论文最后的负载实验设置是固定工况:负载转矩 5 N·m,被测电机转速 1500 r/min,转速采样 100 Hz,电流采样 2 kHz,振动采样 10.24 kHz。复现时电流和振动的采样时长要覆盖至少 10 个转速周期,也就是 0.4 s 以上;实际工程里建议采 10 s,留足稳态段给特征提取,避免启动暂态和负载突变段混入统计。从论文的转速曲线看,启动后约 0.2~0.3 s 即进入稳态,特征提取的截取位置选在启动后 1 s 到结束前 1 s 之间比较稳妥。

5. 失磁诊断的落地:Simulink仿真 + SVR回归 + 试验台验证

永磁体失磁是永磁同步电机的典型故障,论文用这套试验台把它变成一个可量化的任务:输入是试验台采到的电流和转矩信号,输出是失磁率。

实现路径分三步:先在 MATLAB Simulink 里搭建永磁同步电机模型,对不同失磁率做仿真,提取 A 相电流有效值和启动转矩的平方差作为特征值;再用支持向量回归(SVR)在仿真数据上训练回归模型,得到失磁率与特征的映射;最后把试验台实测电流和转矩按同样的特征定义处理,导入回归模型得到失磁率。sklearn 的核心代码:

from sklearn.svm import SVR from sklearn.preprocessing import StandardScaler from sklearn.model_selection import cross_val_predict from sklearn.metrics import mean_absolute_error import numpy as np # 仿真数据:列1为A相电流有效值,列2为启动转矩平方差 X = np.array([ [42.1, 1.02], [43.8, 0.91], [47.6, 0.72], [52.3, 0.48], [58.9, 0.21], [66.2, 0.05], ]) y = np.array([0.0, 0.1, 0.2, 0.3, 0.5, 0.7]) # 失磁率 scaler = StandardScaler() X_s = scaler.fit_transform(X) svr = SVR(kernel='rbf', C=10, gamma=0.5, epsilon=0.02) y_pred = cross_val_predict(svr, X_s, y, cv=3) print('MAE:', mean_absolute_error(y, y_pred)) svr.fit(X_s, y) # 试验台实测:同一工况点(1500r/min, 5N·m)下提取的特征 rms_real = 54.1 tq_feature_real = 0.39 rate = svr.predict(scaler.transform([[rms_real, tq_feature_real]]))[0] print('失磁率估计: %.2f' % rate)

落地时有几个细节必须处理。第一,特征提取工况必须和仿真对齐,实测特征只能在同样的 5 N·m、1500 r/min 稳态工况下截取,转速或载荷漂移超过阈值的数据直接丢弃,否则特征偏移会被模型放大成失磁率误差。第二,电流有效值和启动转矩平方差的量纲差异大,不标准化直接进 SVR,欧氏距离会被电流特征主导,RBF 核的 gamma 参数失效。第三,SVR 的 C 和 gamma 建议用网格搜索确定,论文只给到方法层面,具体数值要在仿真数据上交叉验证,C 过大会把失磁率预测推到训练样本范围外。

仿真模型换到试验台数据时,最容易忽略的是传感器噪声差异——Simulink 里的电流是理想正弦,实测电流带开关谐波。处理手法是先做 FFT 确认基波幅值,再用窄带带通滤波器提取基波分量后计算有效值,使实测特征和仿真特征的定义口径一致。失磁率预测值出来之后,对照电机温度曲线复核:预测失磁率超过 0.3 时,绕组温度通常会有可观测的抬升,温度信号在这里不是特征,而是交叉验证的旁证。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询