简介:这份资源是一份面向工业自动化、电气控制方向学习者与工程技术人员的PLC电机故障诊断系统设计方案文档,适合课程设计、毕业设计及工程入门参考。方案围绕电机运行中相间短路、断相、低电压、单相接地、过负荷、过电流等典型故障,讲解如何借助西门子S7-200、S7-300、S7-400系列PLC完成I/O分配与梯形图编程,实现启动前断路器状态检测、运行中循环诊断、故障声光报警与保护动作、报警复位等完整控制逻辑。资源包共1个doc文件,约211KB,内容涵盖绪论、PLC原理与设备总体结构、系统硬件选型、软件梯形图设计等章节,结构完整,便于直接借鉴与二次修改。目前已有64人学习下载,适合需要快速搭建PLC故障诊断方案框架、理解诊断流程与保护逻辑的读者参考使用。
1. 从一份 PLC 电机故障诊断系统设计方案说起:它到底能解决什么
产线上的电机一旦罢工,留给工程师的反应时间往往只有几分钟。问题在于,电机故障的早期征兆——电流谐波畸变、绕组温升异常、轴承振动频谱偏移——这些信号在 PLC 的常规逻辑控制里根本不会被记录,更谈不上分析。很多现场的做法是等设备彻底停机了,再拿万用表逐段排查,运气好半小时找到断点,运气不好拆到电机本体才发现是匝间短路。这份 PLC 电机故障诊断系统设计方案,要解决的正是这个断层:把故障判断从“事后维修”前移到“实时监测与预警”。
它适合两类人:一是做产线电气维护的工程师,需要一套能落地的诊断逻辑框架,而不是停留在论文里的算法描述;二是自动化项目的方案设计者,手头有 PLC 和上位机,但不确定诊断功能该放在 PLC 层还是上位机层、采样频率取多少、报警阈值怎么定。方案本身是一份设计文档,不是可执行代码,但它的价值在于给出了完整的信号链路定义——从传感器选型、PLC 模拟量模块配置,到诊断算法在梯形图或结构化文本中的实现思路,再到上位机 HMI 的报警分级。换句话说,它是一张施工图,不是成品设备,但照着这张图,你能把诊断功能嵌进现有的 PLC 控制系统里。
2. 信号链路拆解:从电流互感器到 PLC 模拟量输入
2.1 为什么诊断功能不能只靠 PLC 的开关量输入
常规 PLC 控制电机,用的是接触器辅助触点或热继电器反馈的开关量信号。这种信号只有两个状态:正常和跳闸。但电机故障的物理过程是渐变的——绝缘老化、轴承磨损、负载波动,这些在跳闸之前都有可观测的电气特征。方案里明确了一点:诊断功能必须引入模拟量输入,采集电机的三相电流和母线电压,必要时加装振动传感器和温度探头。
常见做法是每台电机配三个电流互感器(CT),变比根据电机额定电流选取,比如 5A 额定电流的电机用 50/5 的 CT,二次侧输出 0-5A 交流信号,再经过变送器转成 4-20mA 或 0-10V 送入 PLC 的模拟量输入模块。这里有个容易翻车的地方:CT 二次侧绝对不能开路,否则感应高压会直接击穿变送器。我一般会在 CT 二次侧并联一个短接端子排,检修时先短接再拆线。
方案里给出的信号链路是:CT → 电流变送器 → PLC 模拟量模块 → 内部数据区 → 诊断逻辑。振动信号走另一路:加速度传感器 → 电荷放大器 → 4-20mA 变送器 → PLC 模拟量模块。温度信号可以用 PT100 直接进 PLC 的热电阻模块,省掉变送器。
2.2 PLC 模拟量模块的配置参数怎么定
模拟量模块的选型直接决定诊断精度的上限。方案里建议用 16 位分辨率的模块,而不是 12 位。原因很简单:电机电流的谐波分量幅值往往只有基波的百分之几,12 位模块在满量程 27648 的范围内,最小分辨力约 6.7mA,折算到电流值可能把 3 次谐波直接淹掉。16 位模块的分辨力能到 0.3mA 左右,才够用。
配置参数上,采样周期是关键。方案里写的是每通道 1ms 采样一次,8 个通道轮询,实际每通道刷新周期 8ms。这个速度对于工频 50Hz 的信号来说,一个周期 20ms 只能采到 2-3 个点,做 FFT 是不够的。所以方案里补了一句:诊断算法不依赖 PLC 内部做 FFT,而是把原始波形数据通过 Profinet 或 Modbus TCP 传到上位机,由上位机做频谱分析。PLC 层只做阈值判断和趋势记录。
这个分工很重要。PLC 的强项是逻辑控制和实时响应,不是数字信号处理。硬要在 PLC 里跑 FFT,扫描周期会被拖垮,反而影响正常的控制逻辑。方案里把诊断分成两级:PLC 层做快速保护(过流、堵转、缺相),响应时间在 10ms 以内;上位机做深度分析(谐波、频谱、趋势),响应时间在秒级。两级之间通过工业以太网交换数据。
2.3 一个可复现的模拟量读取与阈值判断示例
下面这段结构化文本(ST)代码,演示的是 PLC 层如何读取模拟量通道、做标度变换、判断过流和缺相。代码基于常见的 IEC 61131-3 语法,不同品牌的 PLC 指令名可能略有差异,但逻辑是通用的。
(* 电机诊断功能块:模拟量读取与快速保护 *) FUNCTION_BLOCK FB_MotorDiag VAR_INPUT RawCurrentA : INT; (* 通道1原始值,范围0-27648 *) RawCurrentB : INT; (* 通道2原始值 *) RawCurrentC : INT; (* 通道3原始值 *) RatedCurrent : REAL := 5.0; (* 电机额定电流,单位A *) OverloadFactor : REAL := 1.2; (* 过载系数,1.2倍额定值报警 *) PhaseLossThreshold : REAL := 0.3; (* 缺相判断阈值,低于额定值30%视为缺相 *) END_VAR VAR_OUTPUT CurrentA : REAL; (* 实际电流值,单位A *) CurrentB : REAL; CurrentC : REAL; AlarmOverload : BOOL; (* 过载报警 *) AlarmPhaseLoss : BOOL; (* 缺相报警 *) END_VAR VAR ScaleFactor : REAL; (* 标度变换系数 *) END_VAR (* 标度变换:将0-27648的原始值映射到0-2倍额定电流 *) ScaleFactor := (RatedCurrent * 2.0) / 27648.0; CurrentA := INT_TO_REAL(RawCurrentA) * ScaleFactor; CurrentB := INT_TO_REAL(RawCurrentB) * ScaleFactor; CurrentC := INT_TO_REAL(RawCurrentC) * ScaleFactor; (* 过载判断:任一相电流超过额定值*过载系数 *) AlarmOverload := (CurrentA > RatedCurrent * OverloadFactor) OR (CurrentB > RatedCurrent * OverloadFactor) OR (CurrentC > RatedCurrent * OverloadFactor); (* 缺相判断:任一相电流低于额定值*缺相阈值,且另外两相有电流 *) AlarmPhaseLoss := ((CurrentA < RatedCurrent * PhaseLossThreshold) AND (CurrentB > RatedCurrent * PhaseLossThreshold) AND (CurrentC > RatedCurrent * PhaseLossThreshold)) OR ((CurrentB < RatedCurrent * PhaseLossThreshold) AND (CurrentA > RatedCurrent * PhaseLossThreshold) AND (CurrentC > RatedCurrent * PhaseLossThreshold)) OR ((CurrentC < RatedCurrent * PhaseLossThreshold) AND (CurrentA > RatedCurrent * PhaseLossThreshold) AND (CurrentB > RatedCurrent * PhaseLossThreshold)); END_FUNCTION_BLOCK这段代码的逻辑说明:标度变换把 PLC 模拟量模块的整数原始值转成实际电流值。参数RatedCurrent需要根据电机铭牌填写,OverloadFactor默认 1.2,意思是电流超过额定值 20% 就报警。缺相判断的逻辑是:某一相电流低于额定值的 30%,同时另外两相高于 30%,才判定为缺相。这样设计是为了避免电机空载时三相电流都很低导致的误报。
参数调整上,PhaseLossThreshold如果设得太高,比如 0.5,空载时容易误报;设得太低,比如 0.1,轻微缺相又检测不到。我一般会在现场先让电机空载运行,记录三相电流的实际值,再带载运行记录一次,取两个工况下最小电流的 60% 作为阈值。这个值不是拍脑袋定的,得看实际波形。
3. 诊断算法在 PLC 与上位机之间的分工:FFT 放哪一层
3.1 PLC 层做时域分析,上位机做频域分析
方案里把诊断算法拆成两部分,这个思路值得展开说。PLC 层适合做时域分析:有效值计算、峰值检测、变化率判断。这些运算量小,扫描周期内能完成。上位机适合做频域分析:FFT、包络谱、倒频谱。这些运算量大,但上位机的 CPU 和内存不受 PLC 扫描周期的限制。
时域分析在 PLC 里的实现,常见做法是用滑动窗口计算电流有效值。比如每 100ms 采集 10 个点,算一次 RMS,和额定值比较。这个窗口长度对应工频 50Hz 的 5 个周期,能覆盖大部分稳态特征。代码上用一个数组做环形缓冲区,每次采样覆盖最旧的数据,然后遍历数组算平方和。
频域分析在上位机的实现,方案里建议用 Python 或 C# 写一个后台服务,通过 OPC UA 或 Modbus TCP 从 PLC 读原始波形数据。采样率至少 2kHz,才能覆盖到 40 次谐波(50Hz × 40 = 2000Hz)。数据量上,8 个通道 × 2kHz × 2 字节 = 32KB/s,一小时约 115MB。这个量级对工控机来说不算大,但要注意存储策略,不能无限增长。
3.2 上位机 FFT 分析的 Python 实现框架
下面这段 Python 代码演示的是从 PLC 读取原始数据后做 FFT 并提取特征频率的流程。代码用了numpy和scipy,这是常见做法。实际部署时,数据读取部分需要根据 PLC 的通信协议替换成对应的库,比如pymodbus或opcua。
import numpy as np from scipy.fft import fft, fftfreq from scipy.signal import find_peaks def analyze_motor_current(samples, sample_rate, line_freq=50.0): """ 对电机电流采样数据做FFT分析,提取谐波特征 :param samples: 电流采样数组,单位A :param sample_rate: 采样率,单位Hz :param line_freq: 工频,默认50Hz :return: 特征字典,包含基波幅值、谐波幅值、总谐波畸变率 """ n = len(samples) # 去直流分量,避免直流偏置影响谐波分析 samples = samples - np.mean(samples) # 加汉宁窗,减少频谱泄漏 window = np.hanning(n) samples_windowed = samples * window # FFT计算 yf = fft(samples_windowed) xf = fftfreq(n, 1.0 / sample_rate) # 只取正频率部分 positive_mask = xf > 0 xf_pos = xf[positive_mask] yf_pos = np.abs(yf[positive_mask]) * 2.0 / n # 幅值归一化 # 提取基波幅值(50Hz附近) fundamental_idx = np.argmin(np.abs(xf_pos - line_freq)) fundamental_amp = yf_pos[fundamental_idx] # 提取2-10次谐波幅值 harmonics = {} for order in range(2, 11): target_freq = line_freq * order idx = np.argmin(np.abs(xf_pos - target_freq)) harmonics[order] = yf_pos[idx] # 计算总谐波畸变率(THD) harmonic_sum_sq = sum(amp**2 for amp in harmonics.values()) thd = np.sqrt(harmonic_sum_sq) / fundamental_amp if fundamental_amp > 0 else 0 # 找峰值,用于识别异常频率成分 peaks, properties = find_peaks(yf_pos, height=fundamental_amp * 0.05) peak_freqs = xf_pos[peaks] return { 'fundamental_amp': fundamental_amp, 'harmonics': harmonics, 'thd': thd, 'peak_frequencies': peak_freqs } # 模拟数据:50Hz基波 + 3次谐波 + 5次谐波 + 噪声 t = np.linspace(0, 1.0, 2000, endpoint=False) signal = (5.0 * np.sin(2 * np.pi * 50 * t) + 0.5 * np.sin(2 * np.pi * 150 * t) + 0.3 * np.sin(2 * np.pi * 250 * t) + 0.1 * np.random.randn(len(t))) result = analyze_motor_current(signal, sample_rate=2000) print(f"基波幅值: {result['fundamental_amp']:.3f} A") print(f"THD: {result['thd']:.2%}") print(f"3次谐波: {result['harmonics'][3]:.3f} A") print(f"5次谐波: {result['harmonics'][5]:.3f} A")这段代码的关键参数说明:sample_rate必须大于信号最高频率的 2 倍,这是奈奎斯特采样定理。要分析 10 次谐波(500Hz),采样率至少 1000Hz,实际取 2000Hz 留余量。np.hanning(n)是加窗函数,不加窗的话,非整数周期采样会导致频谱泄漏,谐波幅值测不准。find_peaks的height参数设成基波幅值的 5%,用来过滤噪声引起的假峰。
实际使用中,THD 超过 5% 通常意味着电机绕组有绝缘问题或电源质量差。3 次谐波异常升高往往和绕组匝间短路有关,5 次谐波升高可能和负载的机械特性有关。这些判断规则不是绝对的,需要结合电机的历史数据做趋势对比。方案里建议给每台电机建一个基线档案,记录新投运时的谐波分布,后续每次诊断都和基线比。
3.3 数据通信的坑:Modbus TCP 和 OPC UA 怎么选
PLC 和上位机之间的数据通信,方案里提到了两种协议:Modbus TCP 和 OPC UA。Modbus TCP 的优点是简单、通用,几乎所有 PLC 都支持,缺点是数据类型只有寄存器和线圈,传浮点数需要自己拆字,而且没有订阅机制,只能轮询。OPC UA 的优点是原生支持复杂数据类型、有订阅和报警机制,缺点是配置复杂,老型号 PLC 可能不支持。
我一般会这样选:如果只是读几个模拟量通道的原始值,Modbus TCP 够用,轮询周期设 100ms,对网络压力不大。如果要传波形数据或者做事件驱动的报警,OPC UA 更合适,订阅模式能减少无效通信。方案里没有指定具体协议,这是合理的,因为不同品牌的 PLC 支持情况不一样。但方案里强调了一点:通信层必须做心跳检测,通信断了要能自动重连,并且在上位机记录断线时间。这个细节很关键,否则诊断系统本身成了黑匣子,出了问题都不知道是电机故障还是通信故障。
4. 避坑与排查:诊断系统落地时最容易翻车的五个地方
4.1 电流互感器选型不当导致小电流测不准
现象:电机空载时,PLC 读到的三相电流都是零,但用钳形表实测有 0.5A 左右。原因:CT 变比选得太大,比如 5A 额定电流的电机用了 100/5 的 CT,二次侧输出电流只有 0.025A,经过变送器后信号太弱,被 PLC 模拟量模块的底噪淹没了。解决:CT 变比按电机额定电流的 1.5-2 倍选取,5A 电机用 10/5 或 15/5 的 CT,保证额定工况下二次侧输出在 1-2A 左右。
4.2 模拟量模块未做滤波导致报警频繁抖动
现象:过流报警频繁触发又自动复位,查电流波形发现毛刺很多。原因:PLC 模拟量模块的输入滤波时间设得太短,或者根本没设,工频干扰和变频器的高频噪声直接进了采样通道。解决:在 PLC 硬件配置里把模拟量输入滤波设成 20ms(对应工频一个周期),同时在变送器输出端并联 100nF 电容做硬件滤波。如果电机由变频器驱动,还要在变频器输出侧加装输出电抗器,减少高频谐波反馈到 PLC。
4.3 FFT 分析时采样率不够导致谐波混叠
现象:上位机 FFT 结果里出现了 50Hz 以下的频率成分,但电机电流里不应该有这些。原因:采样率太低,比如只用了 500Hz,分析 10 次谐波(500Hz)时发生了混叠,高频成分被折叠到低频。解决:采样率至少设为最高分析频率的 2.5 倍。要分析 10 次谐波,采样率不低于 1250Hz,实际取 2000Hz 或 2560Hz。同时要在采样前加抗混叠滤波器,硬件上用低通滤波器,软件上可以先做一次滑动平均。
4.4 诊断阈值照搬手册导致误报漏报
现象:按照电机铭牌上的额定电流设阈值,结果夏天环境温度高时频繁过载报警,冬天又该报不报。原因:电机的实际负载电流受环境温度、电网电压、机械磨损等多种因素影响,铭牌值只是设计值,不是运行值。解决:在电机投运初期做带载测试,记录不同工况下的实际电流,取最大值的 1.1 倍作为过载阈值,取最小值的 0.6 倍作为缺相阈值。阈值不是固定值,应该随季节和负载类型做微调。
4.5 通信中断后诊断系统静默失效
现象:电机真的出了故障,但上位机没有任何报警,查日志发现通信已经断了三天。原因:Modbus TCP 轮询失败后,程序没有做异常处理,读不到数据就跳过,不报警也不记录。解决:在通信层加心跳计数,连续 3 次轮询失败就触发通信故障报警,并在 HMI 上显示“诊断系统离线”。同时 PLC 层保留独立的快速保护逻辑,不依赖上位机。这样即使通信断了,过流和缺相保护仍然有效。
5. 从方案到现场:把诊断逻辑做成可复用的功能块
方案给的是设计思路,落到现场还得把它变成可复用的代码。我的习惯是把每台电机的诊断逻辑封装成一个功能块(FB),输入输出接口固定,内部参数通过 HMI 可调。这样新增电机时,只需要在程序里调用一次 FB,填上通道号和额定电流就行,不用复制粘贴代码。
功能块的接口设计上,输入侧放原始值、额定电流、报警阈值,输出侧放实际电流、报警状态、故障码。故障码用整数表示:0 正常,1 过载,2 缺相,3 通信故障。这样上位机读一个寄存器就能知道故障类型,不用读多个布尔量。
参数整定上,我一般会在 HMI 上做一个调试页面,显示每台电机的实时电流、THD、报警状态,并且允许工程师在线修改阈值。修改后的阈值存在 PLC 的保持寄存器里,断电不丢失。这个页面在调试阶段特别有用,不用反复下载程序。
验证方法上,方案里没有写,但现场必须做。我的做法是:用信号发生器模拟电流信号,注入到 PLC 模拟量通道,验证过载和缺相报警是否按预期触发。信号发生器的输出设成 0-5A 对应的 4-20mA,先给 4mA(对应 0A),确认无报警;再给 12mA(对应 2.5A,额定值的 50%),确认无报警;再给 24mA(对应 5A,额定值的 100%),确认无报警;再给 28mA(对应 6A,额定值的 120%),确认过载报警触发。缺相测试时,把某一相的输入拔掉,另外两相保持额定值,确认缺相报警触发。
从那以后我每次做诊断系统,都强制走一遍信号注入测试,不管方案写得多完整。现场的情况比实验室复杂得多,电磁干扰、接地环路、电源波动,任何一个因素都可能让诊断逻辑失效。希望帮到你。
本文还有配套的精品资源,点击获取