简介:这份基于无线数据传输的智能电机监测系统设计PDF,是一篇面向嵌入式开发、工业设备状态监测及物联网应用相关从业者与学习者的技术文献,出自湖北文理学院团队,发表于《物理通报》。文档以STM32F103C8T6单片机为核心,围绕电机振动、温度、湿度等关键工况参数,给出从传感器选型、信号采集电路到GPRS无线传输与服务器端报警的完整设计思路。文中具体讲解了HS1101LF湿敏传感器、NTC热敏电阻测温、压电陶瓷振动检测及SIM800C通信模块的应用要点,并附有相对湿度与温度计算公式、系统结构框图等细节,适合作为智能监测系统开发的项目参考或课程设计资料。压缩包仅含1个PDF文件,文件大小约1MB,内容可直接阅读与打印。该资源目前已有136人学习浏览,对正在规划电机远程监测方案、需要快速理解系统架构与硬件选型逻辑的读者而言,具有较好的参考与指导价值。
1. 为什么“智能电机监测”必须先解决无线数据传输链路
在工业现场做电机预测性维护,最常听到的一句话是:“传感器都选好了,数据线怎么拉?”柜内电机、轨道移动小车、户外泵组,几乎都是因为布线成本才放弃在线监测。基于无线数据传输的智能电机监测系统,就是把振动采集、电流分析、温度检测这套监测逻辑与无线链路绑定在一起的整体设计:电机侧只做边缘特征提取和上行上报,网关侧承担数据汇聚与故障研判,最终解决的是“不停机加装”这个现实约束。这篇文章写给要做预测性维护的工程师,我会从传感器选型开始,把无线参数、数据包结构、报警算法和现场踩坑整个拆开。
2. 采集侧设计:振动、电流、温度三路信号与边缘计算方案
2.1 传感器选型的三重判断:振动是刚需,电流和温度是增强项
电机故障在早期最先暴露在振动信号里,其次是电流谐波变化,最后才是温度漂移。所以一套可用的智能电机监测系统,振动是必选,电流和温度是性价比很高的补充。
振动传感器只有两类主流选择:MEMS加速度计和IEPE压电加速度计。对于绝大多数四极异步电机,转速在1500rpm附近,轴频只有25Hz,滚动轴承的故障特征频率通常分布在1kHz以内,带宽在1~5kHz的MEMS加速度计完全够用,量程选±16g即可。只有遇到高速主轴(转速10000rpm以上)或者齿轮箱级联结构,才需要考虑量程更大、带宽更高的压电传感器。这里要注意,MEMS的带宽标注各不相同,选型时看-3dB带宽而不是看采样率参数,有些传感器数字输出接口的ODR看起来很高,但内部滤波已经把高频成分削掉了。
电流监测用开环霍尔或者开口式电流互感器。在线监测只关心相对变化,不追求计量级精度,所以开口式CT最合适,安装时不用拆动力线。电流采样率不需要高,工频50Hz的系统,关注到5次谐波就够了,1kHz采样率绰绰有余。温度监测用PT100加隔离变送器,布置在电机前端轴承和绕组两个位置;空间受限时用NTC贴片也可以接受,但NTC的非线性一定要做查表校正,否则温度超过80℃以后误差会大到失去参考价值。
把三路信号的基本参数归纳成一张选型表,设计时按着这张表做,能省很多来回沟通的时间:
| 信号 | 传感器 | 采样率 | 关注特征 | 主要故障指向 |
|---|---|---|---|---|
| 振动 | MEMS加速度计 ±16g | 4kHz | 峭度、RMS、频率峰值 | 轴承磨损、不平衡、松动 |
| 电流 | 开口式霍尔CT | 1kHz | 有效值、5次谐波占比 | 负载异常、匝间短路 |
| 温度 | PT100/NTC | 0.1Hz轮询 | 绝对温度、变化斜率 | 润滑失效、散热恶化 |
2.2 MCU采样策略:采样率、抗混叠与本地计算
主控选型上,ESP32和STM32是两条主流路线。ESP32自带Wi-Fi和蓝牙,省掉外部无线模组,缺点是内置ADC精度一般,12位分辨率在采集复杂振动波形时会引入可感知的量化噪声。STM32则要外挂LoRa或Wi-Fi模组,但ADC性能和定时器资源更可控。我的习惯是:如果无线方案走LoRa,用STM32L系列做主控,低功耗和ADC精度兼顾;如果走Wi-Fi直连,直接用ESP32,省一块模组成本。
采样策略上,振动通道4kHz采样率是经过折算的:轴承故障特征频率最高到1kHz左右,FFT分析带宽取2kHz,采样率4kHz留出充足余量。每次采集4096点,时间窗口约1秒。电流通道1kHz采样,窗口取2秒,覆盖两个工频周期,便于准确计算有效值和谐波占比。温度通道0.1Hz轮询,不用进高速采样队列。
抗混叠滤波是这里最容易翻车的一环。如果加速度计输出是模拟电压,进ADC之前必须过一次RC低通,截止频率设为采样率的0.4倍左右,也就是1600Hz附近。否则车间里变频器的高频谐波会折叠进低频段,频谱图上会出现一些跳来跳去的假频率成分,看起来像“频段能量随机漂移”。这类问题在时域指标上表现不明显,一进FFT就原形毕露,排查时很浪费时间。后续章节我会专门讲一次被供电纹波坑到的经历,那个案例和抗混叠是两个不同方向的高频干扰,但现象很接近。
2.3 边缘特征提取:4个时域指标和一个触发上报逻辑
原始波形每个周期都上传是不现实的。以4kHz采样率、4096点、2字节量化的原始块计算,一帧就是8KB,就算压缩到短整型也有4KB,Wi-Fi都嫌多,LoRa链路根本撑不住。正确做法是在MCU本地计算时域统计量,只把特征值推上链路。
// 采集4096点加速度数据,计算RMS、峰值、峰值因子与峭度 #include <math.h> typedef struct { float rms; float peak; float peak_factor; float kurtosis; } time_features_t; time_features_t calc_time_features(const float *buf, int n) { time_features_t feat; float sum = 0.0f, sum_sq = 0.0f, max_abs = 0.0f; float mean, variance; for (int i = 0; i < n; i++) { sum += buf[i]; sum_sq += buf[i] * buf[i]; if (fabsf(buf[i]) > max_abs) { max_abs = fabsf(buf[i]); } } mean = sum / n; variance = sum_sq / n - mean * mean; // 方差 feat.rms = sqrtf(sum_sq / n); feat.peak = max_abs; feat.peak_factor = max_abs / feat.rms; // 峰值因子 float fourth = 0.0f; for (int i = 0; i < n; i++) { fourth += powf(buf[i] - mean, 4); } feat.kurtosis = (fourth / n) / (variance * variance); return feat; }代码说明:这里计算了四个指标——RMS反映振动能量整体水平,峰值反映瞬时冲击强度,峰值因子是峰值与RMS的比值,峭度是四阶矩对二阶矩平方的比值。正常滚动轴承的振动信号接近高斯分布,峭度值在3附近;早期轴承损伤会产生周期性冲击,峭度会拉到5甚至更高。这个偏差幅度远大于RMS的缓慢变化,所以峭度适合做“要不要上传原始波形”的触发条件。
触发上报逻辑是这样组织的:节点平时按5分钟周期采集一次,计算特征后只上传8字节的特征帧;只有当峭度超过4.5,或者峰值因子超过6时,节点才把整段4096点原始波形压缩后上传到网关做频谱分析。这种设计下,链路负载下降了三个数量级,而故障诊断所需的信息几乎无损。需要强调的是,触发阈值不要拍脑袋定死,第一节部署最好先跑一周,“只记录不报警”,把正常工况的峭度基线统计出来后再定阈值。
3. 无线数据传输层:LoRa、Wi-Fi、BLE选型与参数落地
3.1 距离、速率、功耗三角权衡:为什么LoRa是工业默认选项
无线方案首先要分清楚场景,不是越先进越好。BLE 5.0在空旷视距下能做到50米左右,穿一堵金属墙就衰减到基本不可用,适合单柜内近场调试或调试阶段用手机直连传感器。Wi-Fi速率高、延展性好,车间有现成AP覆盖时数据可以直接上内网,但2.4GHz频段在金属机柜、线槽、电机外壳面前衰减非常明显,而且节点功耗降不下来。NB-IoT适合完全没有本地网关的场景,数据直接上云,但模组成本高、有运营商资费,且很多厂区内部信号并不好。
工业电机监测最常见的部署形态,是LoRa网关加若干个传感节点。选LoRa的理由集中在三点:470MHz免授权频段对金属障碍物的绕射能力远强于2.4GHz;接收灵敏度能到-137dBm左右,比Wi-Fi的-85dBm低出近50dB,链路余量完全不同量级;节点休眠时电流只有微安级别,电池供电能撑过整个检修周期。即使只有一台电机要监测,LoRa点对点方案也比Wi-Fi省心,因为不用跟IT部门申请AP权限,也不用担心车间电磁环境把Wi-Fi链路打穿。
整理一张对比表,选型时直接对号入座:
| 方案 | 典型距离 | 有效数据率 | 节点功耗 | 适用场景 |
|---|---|---|---|---|
| BLE 5.0 | 室内小于50m | 1~2Mbps | 低 | 短距离调试、柜内监测 |
| Wi-Fi 4/6 | 视距100m,穿墙差 | 数十Mbps | 中高 | 车间有全覆盖AP、数据量大 |
| LoRa SX1278 | 视距300m~2km | 0.3~5kbps | 极低 | 金属遮蔽环境、户外电机 |
| NB-IoT | 基站覆盖 | 几十kbps | 低 | 无网关条件、直接上云 |
3.2 LoRa调制参数:扩频因子、带宽、编码率的真实效果
LoRa参数调起来有点“玄学”,因为扩频因子、带宽、编码率三个参数互相耦合,动一个就要重新评估链路余量和空口时间。扩频因子SF每增加1,接收灵敏度大约提升3dB,但同一包数据的空中传输时间翻倍。带宽BW越窄灵敏度越高,但对晶振频偏越敏感,室外温差大的环境容易失锁。编码率CR越高纠错能力越强,但有效数据率下降。
// SX1278在470MHz频段的P2P配置示例 // 目标:SF=7, BW=125kHz, CR=4/5, 中心频率470MHz #include "sx1278_regs.h" void lora_configure_470mhz(void) { uint64_t frf = (uint64_t)470000000ULL * 256 / 32000000ULL; write_reg(REG_OPMODE, 0x80); // 切到LoRa模式 write_reg(REG_FRF_MSB, (frf >> 16) & 0xFF); // 频率高字节 write_reg(REG_FRF_MID, (frf >> 8) & 0xFF); // 频率中字节 write_reg(REG_FRF_LSB, frf & 0xFF); // 频率低字节 // ModemConfig1: 0x72 = BW125kHz, 0x01<<1 = CR 4/5 write_reg(REG_MODEM_CONFIG1, 0x72 | (0x01 << 1)); // ModemConfig2: (7<<4) = SF7, 0x04 = 显式头部模式 write_reg(REG_MODEM_CONFIG2, (7 << 4) | 0x04); // 接收超时与同步字按默认值,不看具体驱动不必改 }代码说明:频率寄存器计算公式里的256和32000000分别对应SX1278内部的FSTEP步进和晶振频率,改频率时照这个公式换算就行。SF配置在ModemConfig2的高四位,Bandwidth和CodingRate都在ModemConfig1的低字节里,不同厂商驱动封装不同,但寄存器定义是统一的。这里要提醒一个坑:不要一上来把所有节点都设成SF12追求最远距离,SF12的空口时间可能是SF7的十倍以上,在多节点共用一个网关时,空中占用时间长了,碰撞概率同步升高,整个网络的吞吐量反而下降。
我自己的实测经验是:在金属机柜密度很高的车间里,SF7在100米距离只有70%的交付率,调到SF9后同样距离跑到99.8%。但代价是单包空口时间从34ms升到约80ms,这意味着如果设计了时分时隙,每个时隙的时长必须同步拉长,否则两个节点会撞在同一个窗口里。调参数不是调完就结束,链路层的时间参数要一起改。
3.3 链路层设计:心跳、时隙与数据包结构
无线链路是共享介质,两个节点同时上报必然碰撞,碰撞触发重传,重传进一步抬高功耗和占用率。推荐的做法是网关广播同步信标,节点在指定的时隙内发送上行数据。这个迷你TDMA方案实现成本不高,但能从根本上把碰撞概率压下去。
数据包结构按固定长度设计,便于解析和校验:
| 字段 | 字节数 | 说明 |
|---|---|---|
| 帧头 | 1 | 固定0x7E,用于字节流重同步 |
| 节点ID | 1 | 1~255,区分电机编号 |
| 数据类型 | 1 | 1=心跳 2=特征 3=原始波形 4=报警回执 |
| 特征值 | 12 | RMS、峰值、峭度各4字节Float32 |
| 序列号 | 2 | 16bit递增,网关用序列号检测丢帧 |
| CRC8 | 1 | 覆盖前16字节 |
节点侧的发送逻辑分三个频率:心跳帧每30秒一次,用于网关判断节点在线状态;特征帧每5分钟一次,携带时域指标;原始波形帧仅在报警触发时上传。如果节点发出报警波形帧后没有收到网关的回执,就按退避策略每30秒重发一次,最多重发5次,避免无效重传把链路占满。
链路层还有一个容易被忽视的点:网关的同步信标本身也可能丢失。节点连续三个周期收不到信标,就应该进入自由发送模式,按预设的随机退避时间主动上报,等下一周期再尝试同步。这个降级策略能在网关信标模块异常时保住最基本的数据通道,不至于整条链路瘫痪。我见过不少项目只做了“等待信标”的逻辑,信标一断全网静默,这是典型的单点故障考虑不足。
4. 数据接收端与监测算法落地:从解析网关数据到分级报警
4.1 网关串口解析:一个可复用的Python数据包解析骨架
LoRa网关一般通过串口或USB转串口把收到的数据交给上位机,典型设备是RAK7258或者树莓派外接LoRa集中器。上位机侧第一步是把字节流还原成结构化数据,这一步的可靠性决定了后面所有报警判断的可信度。
import serial import struct def crc8(data: bytes) -> int: crc = 0 for b in data: crc ^= b for _ in range(8): if crc & 0x80: crc = ((crc << 1) ^ 0x07) & 0xFF else: crc = (crc << 1) & 0xFF return crc def parse_frame(raw: bytes): # 帧格式: 0x7E(1) + node_id(1) + type(1) + features(12) + seq(2) + crc(1) if len(raw) != 18 or raw[0] != 0x7E: return None node_id, dtype = raw[1], raw[2] rms, peak, kurt = struct.unpack('<fff', raw[3:15]) seq = struct.unpack('<H', raw[15:17])[0] if crc8(raw[1:17]) != raw[17]: return None return { 'node': node_id, 'type': dtype, 'rms': round(rms, 4), 'peak': round(peak, 4), 'kurt': round(kurt, 4), 'seq': seq, } ser = serial.Serial('/dev/ttyUSB0', 115200, timeout=1) buffer = bytearray() while True: chunk = ser.read(256) if not chunk: continue buffer.extend(chunk) # 用帧头0x7E做重同步,丢弃帧头之前的不完整数据 while len(buffer) >= 18: start = buffer.find(0x7E) if start < 0: buffer.clear() break if start > 0: del buffer[:start] frame = parse_frame(bytes(buffer[:18])) if frame: print(frame) del buffer[:18]代码说明:代码里做了两件关键事。一是CRC校验放在业务处理前,校验失败的数据直接丢弃,不进入报警判断,错误数据一旦进入基线计算,污染的是后续一周的报警阈值。二是用帧头0x7E做字节流重同步,而不是依赖串口的readline,因为LoRa网关串口在电磁干扰下可能偶发错位,没有帧头扫描机制,一帧错位会导致后续所有帧都解析失败,表现就是“信号很好但数据不上报”。
4.2 报警阈值:先建基线再定阈值,而不是拍脑袋
电机振动监测里最忌讳的事,是全厂共用一个报警阈值。两台工况完全不同的电机,一台是刚出厂的新电机,RMS在1.5mm/s;另一台带偏心负载,RMS稳定在4.0mm/s。用同一个阈值,要么天天误报,要么真故障被掩盖。正确做法是每台电机独立建基线。
部署的头一周设为观察期,网关只收数据不触发报警。一周后,对每个节点的RMS、峰值因子、峭度做统计,计算均值和P90分位值,作为这台电机的基线。报警阈值从基线推导出来,而不是从国标手册里抄一个数。某台电机实际负载波动大,看P90而不是看均值更合理;负载稳定的电机,用均值加固定比例就足够。
# 报警分级:结合RMS比值与峭度比值双重判断 def evaluate_alarm(frame, baseline): # baseline: {'rms_p90': 2.8, 'kurt_p90': 3.6} rms_ratio = frame['rms'] / baseline['rms_p90'] kurt_ratio = frame['kurt'] / baseline['kurt_p90'] if rms_ratio > 2.0 and kurt_ratio > 1.8: return 2 # 检修告警:有明确故障特征 if rms_ratio > 1.5 or kurt_ratio > 1.6: return 1 # 观察告警:数据异常但不足以判定 return 0 # 正常参数说明:这里的2.0和1.5是经验起始点,不是绝对标准。误报多的站点把RMS比值上限放到2.5,漏报多的站点收紧到1.8。每个节点的阈值单独存成配置文件,现场运维只需要改对应电机的参数,不用重新编译代码。还需要在后端加一条“趋势斜率”规则:连续3个采样周期的RMS做线性回归,斜率超过预设值时触发“加速劣化”告警。这一条能捕捉阈值还没到但趋势已经很明显的早期故障。
4.3 频谱定位:从“知道坏了”到“知道坏在哪”
时域指标能回答“有没有问题”,频谱能回答“问题在哪个部件”。对上传的原始加速度波形做FFT,把频谱峰值与轴承故障特征频率比对,就能定位到内圈、外圈、滚动体还是保持架。
滚动轴承的特征频率计算公式如下:
- 外圈故障频率 BPFO = Z/2 × (1 - d/D × cosα) × fr
- 内圈故障频率 BPFI = Z/2 × (1 + d/D × cosα) × fr
其中Z是滚珠数量,d是滚珠直径,D是轴承节圆直径,α是接触角,fr是轴频。以6205-2RS轴承为例,Z=13,d=7.94mm,D=46mm,接触角近似为0,1560rpm时轴频26Hz,BPFO约68.4Hz,BPFI约108Hz。如果FFT频谱上出现BPFO频率并且有2倍、3倍谐波,同时幅值随运行时间缓慢上升,基本可以锁定外圈故障。
import numpy as np def fft_spectrum(waveform, fs=2000): n = len(waveform) windowed = waveform * np.hanning(n) # 加汉宁窗抑制频谱泄漏 spec = np.fft.rfft(windowed) freqs = np.fft.rfftfreq(n, 1.0 / fs) mag = np.abs(spec) * 2.0 / n return freqs, mag def peak_in_band(freqs, mag, target_hz, band_hz=4): mask = (freqs >= target_hz - band_hz) & (freqs <= target_hz + band_hz) if not np.any(mask): return 0.0 return mag[mask].max()代码说明:FFT前加汉宁窗是为了减少非整周期截断造成的频谱泄漏。峰值搜索带宽设置4Hz,是给异步电机的转速波动留余量——异步电机负载变化时转速会上下飘,带宽太窄会把真正的故障峰漏掉。实际部署中,频谱诊断不要求每台电机都做,只在峭度触发报警后对上传的波形做一次即可,这样网关的计算压力很小。
4.4 温度与电流的辅助仲裁:用多维度数据减少误报
振动指标报警后,温度和电流数据是很好的仲裁依据。把三路信号放在一起判断,能显著降低误报。典型场景:一台电机峭度超标但温度平稳、电流平稳,大概率是外部冲击性负载造成的一次性振动,不需要停机;同一台电机RMS超标伴随温度持续上升、电流也有同步波动,那就该安排停机检查。
| 振动告警 | 温度趋势 | 电流趋势 | 结论建议 |
|---|---|---|---|
| RMS超标 | 上升超过5K | 基本不变 | 可能是机械卡涩,安排检修 |
| 峭度超标 | 不变 | 上升 | 负载波动导致的冲击,复核负载 |
| 峰值因子超标 | 不变 | 不变 | 保持观察,检查润滑周期 |
| RMS超标 | 上升超过5K | 同步上升 | 负载加重,优先检查定子电流 |
温度判据的具体实现是:取当前温度与前24小时同工况温度均值对比,差值超过5K时确认温度漂移。电流判据更简单,直接看电流有效值与基线有效值的比值,超过1.2倍认为电流趋势异常。这些规则用配置项写在告警引擎里,每台电机可以单独开关,现场调试时按实际反馈调整。
5. 避坑指南:无线电机监测系统现场部署的5个翻车点
5.1 天线贴壳:链路丢包率高的“玄学”源头
现象:电机和网关之间直线距离才20米,RSSI却只有-92dBm,隔三差五丢包。
原因:天线紧贴在电机外壳上。电机机壳是大金属体,天线近场辐射被金属吸收,发射效率降到最低。这不是模块质量问题,是天线安装位置问题。
解决:把吸盘天线固定在支架上,天线主体与金属平面保持至少10cm距离,理想是半个波长以上。470MHz频段的波长约64cm,实际施工中能做到10cm以上就有明显改善。我整改过一次,RSSI从-92dBm提升到-72dBm,丢包率从20%降到0.5%。这条经验适用于所有金属环境下的无线节点部署。
5.2 频繁误报:基线错位造成的“假报警”
现象:上位机每天深夜弹出好几条“峭度超标”告警,白天反而没有。
原因:夜间车间其他生产线停机,母线电压抬升,电机的实际工况和白天完全不同。但基线是按白班工况统计的,夜间的振动水平落入误报警区间。
解决:按负载区间分组建立基线。观察期内把数据按功率区间划分为50%以下、50%~80%、80%~100%三组,分别统计基线。报警时先查询当前功率所在区间,取对应的阈值判断。这个改动彻底解决了夜间误报问题。此处没有捷径,工况分得越细,误报越少,实际做三组就够了。
5.3 节点电池两个月耗尽:没有进休眠模式的代价
现象:用户频繁换电池,一个季度换两次,反馈“无线监测比有线还费人工”。
原因:节点的MCU一直处于全速运行状态,LED调试灯常亮,ADC持续采样,平均功耗拉到50mA。
解决:改成定期唤醒模式。节点默认进入deep sleep,RTC每5分钟唤醒一次,采集2秒后继续休眠。传感器VDD用GPIO控制,采集前拉高、采集后拉低,避免传感器在休眠期间空耗电流。实测这两项改动后平均功耗降到0.2mA左右,两节18650电池可以撑半年以上。调试阶段的LED指示灯在生产版本里要彻底去掉,这是一笔容易被忽略的电流开支。
5.4 数据校验失败被静默丢弃:链路好但数据不上报
现象:串口调试工具里能看到数据包,但上位机显示节点离线,上报率极低。
原因:部分网关固件在串口输出时会在包尾附加换行符,或者受电磁干扰偶发字节错位,导致等长帧解析失败。解析代码用的是固定长度读取,一旦错位,后续所有帧跟着错。
解决:解析逻辑改为帧头0x7E重同步,收到数据先找帧头,再按固定长度切帧,最后做CRC校验。字节流异常时自动丢弃当前帧并重新同步。改完这个解析逻辑后,数据上报率恢复到了正常水平。另外,校验失败的数据不要重传,特征数据是周期性的,丢一帧不影响判断,重传反而增加链路拥堵。
5.5 开关电源纹波串入模拟链路:振动信号持续失真
现象:振动波形RMS稳定,但频谱中高频部分始终存在固定的尖峰,不随转速变化。
原因:传感器使用24V开关电源供电,电源纹波通过地环路耦合进模拟信号链路。开关频率约20kHz,虽然高于关注频段,但会与振动信号互调产生低频杂波。
解决:加速度计改用隔离式DC-DC供电,信号线用双绞屏蔽线且屏蔽层单端接地,ADC参考电压用独立基准芯片TL431而非电源输出。排查这个问题花了我半天时间,最后用示波器看传感器供电纹波才定位到,纹波超过50mV pp就需要处理电源。从此我养成了一个习惯:新节点装配后,先测供电纹波再装车,不把隐患带到现场。
6. 从单机到集群:现场验收与扩展部署的3个验证技巧
单台电机监测跑通,只能算系统可用,离可靠还有距离。我每次交付前都做三个验证步骤。
第一步是故障注入验证。用手持式测振仪对同一台电机测RMS,与节点上传值对比,偏差在正负15%以内说明采集链路可信。然后人为制造一次异常,比如在联轴器上加一个不平衡配重块,观察报警等级是否按预期上升。这一步能同时验证传感器灵敏度、无线链路实时性和报警规则有效性。
第二步是链路余量验收。遍历现场所有节点,在网关侧记录每个节点的RSSI。链路余量要求至少保留30dB,才会在季节性湿度、极端温差下不出问题。车间里天线高度对链路影响很大,同样一台电机,天线从贴地改到离地3米,RSSI能改善20dB以上。节点安装时天线高度这一项要写进施工规范。
第三步是离线数据回归。把第一周观察期收集的原始数据重新放回报警算法里回放,统计误报率和漏报率。误报率低于5%、漏报率为0,是交付底线。如果回归结果不理想,先调阈值再回放,直到达标为止。这一步很多项目跳过,结果上线两周后开始误报,运维团队对系统的信任度就崩了。
我现在的习惯是,现场部署头七天每天早晚各看一次网关接收率和异常节点日志,完整一周数据跑完离线回归后才把系统交给运维。这个习惯帮我躲过了好几次“通电时正常、两周后乱报警”的返工。希望帮到你。
本文还有配套的精品资源,点击获取