微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 用单片机系统实现故障诊断

用单片机系统实现故障诊断

时间:03-19 来源:互联网 点击:

0.引言

现代工矿企业设备日益朝向大型化、复杂化、智能化发展,迫切要求对其运行状态进行多参数监测和故障诊断。随着芯片技术的发展及智能技术的应用,诊断技术已开始进入一个新阶段,即智能化阶段,这是一种基于人工智能技术的诊断方法。该方法对复杂大系统的诊断尤其有效,可充分利用现有的经验知识,构造智能模型,进行快速诊断。智能诊断系统的性能取决于所采用的智能模型。

本文用人工神经网络综合实现凝汽器运行状态的诊断判断。其原理是:设备的各种运行状态与其各种物理参数如温度、压力、振动频率等有一定关联。这种关联难以用确定的数学表达式来表达,但可以用神经网络来逼近该模型。

1.基于神经网络的故障诊断

人工神经网络(Artificial Neural Networks 简称ANN)[1]是由大量简单处理单元广泛连接而成的复杂的非线性系统,具有学习能力、自适应能力、非线性逼近能力等。实际应用研究中,大多使用的是 BP网络(Back-Propagation network)即反向传播网络。BP网络因具有较强的非线性逼近能力,能进行故障模式识别,还能进行故障严重程度评估和故障预测,因此,应用最广。但是,由于BP算法在迭代时采用梯度下降法,存在着收敛缓慢、振荡和局部极小等问题,一些改进的BP算法在这些方面有些改善。BP网络属于多层结构,前馈式,它是继Hopfield 网络之后,Rumelhart提出的又一重实用网络模型,其学习算法采用的是反向传播算法,基本思想是构造一个类似于感知机的非线性系统,并让该系统的决策能力与最小误差函数和梯度下降联系起来,从而解决了普遍存在的多层神经网络的学习不易收敛问题。

1989年Robert Hesht Nielson证明了对于任何在闭区间内的一个连续函数,都可以用一个隐含层的BP网络来逼近,因而一个3层BP网络可以完成任意的n维空间到m维的映射,故本文采用的网络是3层网络,中间只有一层隐含层,网络结构如下图所示。

2.系统总体方案介绍

表1为该系统使用的凝汽器11种典型故障的征兆集[2][3]。在征兆集中,“1”表示征兆存在,“0”表示征兆不存在。BP网络的目标输出对应各故障的隶属函数,即为:
q, l-1, 2, …, 11

为了说明起见,仍采用文献[2]中给出的故障征兆来对网络进行训练。

该系统实现的功能有上述17种信号的采集与放大滤波、压力温度信号的补偿、键盘输入、LCD显示输出、与上位机的通信。

注:故障征兆序号的含义为:1.真空急剧下降;2.真空缓慢下降;3.循环水泵电动机电流降至零;4.循环水泵出口压力降至零;5.汽轮机低压胀差为负值;6.凝结水泵出口压力增加;7.凝结水泵出口压力下降;8.凝结水泵电动机电流增加;9.凝结水泵电动机电流减小; 10 .凝结水导电度增加; 11 .低压加热器水位升高; 12 .循环水温升增加; 13 .循环水温升减小; 14.凝汽器端差增加;15.凝结水过冷度增加;16 .抽气器抽出的空气温度与冷却水入口温度之差增加;17.凝汽器抽气口至抽气器入口之间的压差减小。

3.硬件实现

为了硬件系统的小型化,这里选用带有A/D转换、4K ROM和256字节RAM的83C552 CPU。可编程放大器同时具有采样保持的功能。

4.软件实现

用Franklin C51[4]编制BP程序关键部分如下:
uchar data i,j;
float xdata show[17]; //故障征兆
float xdata fault[11]; //故障类型
float xdata weight[10][17]; //输入层与隐含层间的权重
float xdata vweight[11][10]; //隐含层与输出层间的权重
//这两种权重已在PC机中训练好,烧录在EPROM中。
float xdata Inet[10];
…… //初始化,从采集滤波保存的信号中读取show[17]
for(i=0; i10; i++)
for(j=0; j17; j++)
Inet[i] += weight[i][j]*show[j];
for(i=0; i11; i++)
for(j=0; j10; j++)
fault[i] += vweight[i][j] / (1.0 + exp(-Inet[j]));
for(i=0; i11; i++)
{ if(fault[i] > 0.1)
…… // 显示出故障并调用通信程序上位机
// 进行通信告知故障
}

实现通信功能的主要程序如下:
//这里略去了中断服务程序的初始化
uchar idata transmit_buf[8] = fault1;
uchar idata receive_buf[8];
void transmit_data(void)
{ uchar p, i;
transmit_ready = 0;
do{ p = 0; //清校验和
for(i=0; i8; i++)
{ SBUF = transmit_buf[i];//发送一数据
p += transmit_buf;
while(TI != 1);
TI = 0;
}
SBUF = p; //发送校验和
while(TI == 0); TI = 0;
while(RI == 0); RI = 0;
}while (SBUF != 0)//接收不正确,重新发送
SM2 = 1; //设置监听状态
ES = 1; //开串行口中断
}
void receive_data(void)
{
uchar p, i;
receive_ready = 0;
while(1)
{
p=0; //清校验和
for(i=0; i8; i++)
{
while(RI != 1); RI = 0;
receive_buf[i] = SBUF; //接收一数据
p += receive_buf[i];
}
while(RI != 1); RI = 0;
if(SBUF==p) {SBUF=0x00; break;}
//校验和相同,发00
else{
SBUF=0xff; //校验和不同,发0FF
while(TI == 0); TI = 0;}
}
SM2 = 1;
ES = 1;
}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top