电子百科
在很多应用程序,特别是工控程序中,经常需要读入并显示一些开关量,比如串口通信是否正常,电源是否打开,电机工作是否正常等等。这些开关量的显示最好用一些控件来实现。这些控件根据输入的开关量显示不同颜色和文字用来表示打开和关闭。NI公司专门开发了一套LabWindows控件,专门用于程序开发,当然这是要花钱的.本文以CStatic为基类,编写了一个LED灯,它可根据输入的bool值显示开关,类似于vb里的shape控件。
NI控件
具体实现请请参考CLED类,当然这个类很简单,完全可以自己实现,当时如过你不想自己动手编写,那么可以发邮件向我要:visualsan@yahoo.cn.也可以直接复制文章低部的类的头文件和cpp文件。下面是程序运行时的截图:
//类头文件
#if!defined(AFX[_]LED[_]H[_][_]BDAD9442[_]11BB[_]4917[_]8E43[_]0E2ACC246FE3[_][_]INCLUDED[_])
#define AFX[_]LED[_]H[_][_]BDAD9442[_]11BB[_]4917[_]8E43[_]0E2ACC246FE3[_][_]INCLUDED[_]
#if [_]MSC[_]VER 1000
#pragma once
#endif//[_]MSC[_]VER 1000
//LED.h:header file
//
#define CIRCLE 0
#define SQUARE 1
#define ELLIPSE 2
/////////////////////////////////////////////////////////////////////////////
//CLED window class CLED:public CStatic
{
//Construction public:
CLED();
//Attributes public:
//Operations public:
COLORREF m[_]crBK,m[_]crOnFG,m[_]crOffFG;
CBrush*m[_]brOnFG,*m[_]brOffFG;
int m[_]iType;
bool m[_]bOn;
CString m[_]sOnString,m[_]sOffString;
bool m[_]bTextOn;
//Overrides
//ClassWizard generated virtual function overrides
//{{AFX[_]VIRTUAL(CLED)
//}}AFX[_]VIRTUAL
//Implementation public:
int GetType();
bool GetTextOnOff();
CString GetOnText();
BOOL GetOnOff();
COLORREF GetOnFgColor();
CString GOffText();
COLORREF GetOffFgColor();
COLORREF GetBKColor();
void SetTextOnOff(bool val);
void SetOffText(CString str);
void SetOnText(CString str);
void SetBKColor(COLORREF C);
void SetOnOff(bool val);
void SetType(int type);
void SetOffFgColor(COLORREF C);
void SetOnFgColor(COLORREF C);
virtual~CLED();
//Generated message map functions protected:
//{{AFX[_]MSG(CLED)
afx[_]msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
afx[_]msg void OnPaint();
afx[_]msg void OnDestroy();
afx[_]msg void OnSize(UINT nType,int cx,int cy);
//}}AFX[_]MSG DECLARE[_]MESSAGE[_]MAP()
private:
void DrawFigure();
};
/////////////////////////////////////////////////////////////////////////////
//{{AFX[_]INSERT[_]LOCATION}}
//Microsoft Visual C++will insert additional declarations immediately before the previous line.
#endif//!defined(AFX[_]LED[_]H[_][_]BDAD9442[_]11BB[_]4917[_]8E43[_]0E2ACC246FE3[_][_]INCLUDED[_])
/////////////////////////////////////////////////////////////////
///////////////类cpp文件
//LED.cpp:implementation file
//
#include"stdafx.h"
#include"colortext.h"
#include"LED.h"
#ifdef [_]DEBUG
#define new DEBUG[_]NEW
#undef THIS[_]FILE static char THIS[_]FILE=[_][_]FILE[_][_];
#endif
/////////////////////////////////////////////////////////////////////////////
//CLED CLED:CLED()
{
m[_]crBK=RGB(255,255,255);
m[_]crOnFG=RGB(0,255,0);
m[_]crOffFG=RGB(255,0,0);
m[_]iType=0;
m[_]bOn=true;
m[_]brOnFG=new CBrush(m[_]crOnFG);
m[_]brOffFG=new CBrush(m[_]crOffFG);
m[_]sOnString="on";
m[_]sOffString="off";
m[_]bTextOn=true;
}
CLED:~CLED()
{
delete m[_]brOffFG;
delete m[_]brOnFG;
}
BEGIN[_]MESSAGE[_]MAP(CLED,CStatic)
//{{AFX[_]MSG[_]MAP(CLED)
ON[_]WM[_]CREATE()
ON[_]WM[_]PAINT()
ON[_]WM[_]DESTROY()
ON[_]WM[_]SIZE()
//}}AFX[_]MSG[_]MAP END[_]MESSAGE[_]MAP()
/////////////////////////////////////////////////////////////////////////////
//CLED message handlers int CLED:OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if(CStatic:OnCreate(lpCreateStruct)==-1)
return-1;
//TODO:Add your specialized creation code here return 0;
}
void CLED:OnPaint()
{
CPaintDC dc(this);//device context for painting
//TODO:Add your message handler code here DrawFigure();
//Do not call CStatic:OnPaint()for painting messages
}
void CLED:OnDestroy()
{
CStatic:OnDestroy();
//TODO:Add your message handler code here
}
void CLED:SetOnFgColor(COLORREF C)
{
m[_]brOnFG-DeleteObject();
m[_]crOnFG=C;
m[_]brOnFG-CreateSolidBrush(m[_]crOnFG);
OnPaint();
}
COLORREF CLED:GetOnFgColor()
{
return m[_]crOnFG;
}
void CLED:SetOffFgColor(COLORREF C)
{
m[_]brOffFG-DeleteObject();
m[_]crOffFG=C;
m[_]brOffFG-CreateSolidBrush(m[_]crOffFG);
OnPaint();
}
COLORREF CLED:GetOffFgColor()
{
return m[_]crOffFG;
}
void CLED:SetType(int type)
{
if(type 0||type 2)
{
return;
}
m[_]iType=type;
OnPaint();
}
int CLED:GetType()
{
return m[_]iType;
}
void CLED:DrawFigure()
{
CClientDC pdc(this);
CBrush b;
CRect r;
GetClientRect(r);
b.CreateSolidBrush(m[_]crBK);
pdc.SelectObject(&b);
pdc.FillRect(r,&b);
pdc.SetBkMode(TRANSPARENT);
if(m[_]bOn==true)
{
CPen pen(0,0,m[_]crOnFG);
pdc.SelectObject(&pen);
pdc.SelectObject(m[_]brOnFG);
}
else
{
CPen pen(0,0,m[_]crOffFG);
pdc.SelectObject(&pen);
pdc.SelectObject(m[_]brOffFG);
}
if(m[_]iType==0)//circle
{
CRect r1;
if(r.Width()r.Height())
{
r1.left=r.left+(r.Width()-r.Height())/2.0;
r1.right=r.right-(r.Width()-r.Height())/2.0;
r1.top=r.top;
r1.bottom=r.bottom;
}
else
{
r1.left=r.left;
r1.right=r.right;
r1.top=r.top+(r.Height()-r.Width())/2.0;
r1.bottom=r.bottom-(r.Height()-r.Width())/2.0;
}
pdc.Ellipse(r1);
}
if(m[_]iType==1)//squre
{
pdc.Rectangle(r);
}
if(m[_]iType==2)//ellipse
{
pdc.Ellipse(r);
}
if(!m[_]bTextOn)
return;
if(m[_]bOn)
pdc.TextOut(r.CenterPoint().x-m[_]sOnString.GetLength()*3.5,r.CenterPoint().y-10,m[_]sOnString,m[_]sOnString.GetLength());
else pdc.TextOut(r.CenterPoint().x-m[_]sOffString.GetLength()*3.5,r.CenterPoint().y-10,m[_]sOffString,m[_]sOffString.GetLength());
}
void CLED:SetOnOff(bool val)
{
m[_]bOn=val;
OnPaint();
}
BOOL CLED:GetOnOff()
{
return m[_]bOn;
}
void CLED:OnSize(UINT nType,int cx,int cy)
{
CStatic:OnSize(nType,cx,cy);
OnPaint();
}
void CLED:SetBKColor(COLORREF C)
{
m[_]crBK=C;
OnPaint();
}
COLORREF CLED:GetBKColor()
{
return m[_]crBK;
}
void CLED:SetOnText(CString str)
{
m[_]sOnString=str;
OnPaint();
}
CString CLED:GetOnText()
{
return m[_]sOnString;
}
void CLED:SetOffText(CString str)
{
m[_]sOffString=str;
OnPaint();
}
CString CLED:GOffText()
{
return m[_]sOffString;
}
void CLED:SetTextOnOff(bool val)
{
m[_]bTextOn=val;
OnPaint();
}
bool CLED:GetTextOnOff()
{
return m[_]bTextOn;
}
在常见网络设备上都有几个指示灯,用于监控设备的状态和运行,这些指示灯称之为发光二极管(LED)。充分了解这些指示灯的意义,往往能在网络故障诊断的过程中,简单快捷的判断出故障原因,达到意想不到的效果。
一、网卡
在网卡后侧RJ45接口一边有两个指示灯。它们分别为连接状态指示灯和信号传输指示灯,其中正常状态下连接状态指示灯呈绿色并且长亮,信号指示灯呈红色,正常应该不停地闪烁。
如果连接指示灯,也就是绿灯不亮,那么表示网卡连接到H U B或交换机之间的连接有故障。一般情况下这种故障发生多半是网线没有接牢或水晶头故障所造成的。而且故障点大多是在连接的两端,例如交换机的端口处和连接计算机的网卡处,可以借助测线仪或者采用更换网线的方法进行解决。如果不是接头的原因造成的,则需对整个链路用测线仪进行分段排除。
如果信号指示灯,也就是红灯不亮,那么则说明没有信号进行传输,但在绿灯亮的情况下,可以肯定的是线路之间是正常的。可以采用替换法换一台计算机连接到该网线上试试,如果所换计算机不能正常上网,则需更换该计算机连接的交换机端口或者重启动交换机。如果所换计算机能正常上网,则可以肯定有信号传送,进而确定是本地网卡的问题。可以尝试Ping一下本机的IP地址,如果不能Ping通,可以尝试重新插拔网卡、安装网卡驱动来解决;如果能够Ping通则说明网卡的安装没有太大问题,这时需要检查IP设置是否存在错误,是否存在IP冲突的情况。另外如果使用了集成网卡或质量不高的网卡,容易出现不稳定的现象,即所有设置都正确,但网络却不通。对此可以将网卡禁用,然后再重新启用的方法,可能会解决红灯不亮不闪的问题。
二、光纤收发器
光纤收发器是一种将短距离的双绞线电信号和长距离的光信号进行互换的以太网传输转换单元,又称为光电转换器。光纤收发器延伸了以太网的连接距离,打破了双绞线只能传输100 m的距离限制,因此广泛应用于使用长距离光纤的网络环境中。伴随着光纤收发器应用的不断增多,它也成为网络中一个比较重要的故障点。利用收发器的指示灯是否正常,可以快速的判断出故障所在。
1.光路LINK灯不亮。首先检查光纤链路是否有问题,光纤断裂和光纤中间环节过多,都可能引起LINK灯不亮。比如中间有几个接续包或者通过法兰盘跳接等使光纤损耗过大,超出了收发器接收范围,用光功率机测试一下就可知道。然后看收发器的两个光纤接口与光纤的连接是否正确,A端的TX口应与B端的RX口连接,A端的RX口应与B端的TX连接。测试连接正确与否的方法很简单,将与光纤收发器相连接的两根光纤跳线互换,互换后,LINK灯亮了,即可证明原来的连接错误。
2.电路LINK灯不亮。首先检查网线是否有问题,是否存在网线不通、水晶头故障等问题。然后根据与收发器连接的设备选用直通线或者交叉线,一般与交换机等多地址网络设备连接时用交叉线,与服务器工作站等单地址网络设备连接时用直通线。有些收发器有两个RJ45端口,一个直通一个交叉,有些侧面有MPR和DTE两个选择开关,MPR表示直通连接,DTE表示交叉连接。还有一种情况是收发器与其他网络设备(网卡、集线器、交换机等)的速率不匹配,比如100M的收发器接了个10M网卡或1 G交换机端口,因此电路LINK灯始终不亮。最后要注意的是,有些收发器必须等光路连通后电路LINK灯才亮,因此要注意看收发器使用说明书。
3.收发器各指示灯都亮着,但光路LINK灯和电路LINK灯闪烁过慢或闪烁明显不对称,从而导致网络不通,一般重启一下收发器就可恢复正常。
三、交换机
交换机因其品牌、类型、模块等差异,设备上的指示灯也存在不同,但是交换机前面板上一般都存在下列几种指示灯:电源指示灯、连接指示灯、端口模式指示灯、端口状态指示灯。根据这些指示灯的异常,可以判断出交换机很多的故障原因,并快速采取相应解决方法。
1.电源指示灯(POWER LED)
POWER LED为绿灯表示电源供应正常,熄灭表示没有电源供应。电源指示灯不亮时,确认交换机的电源线连接是否正确,使用的电源插座是否完好。可以重新安装交换机的电源线或换用另外的电源插座。
2.连接指示灯 (LNK/ACT LED)
LINK LED不亮表示没有连接,需确认交换机与其他设备的设置是否一致,并确认线缆连接正确。另外,交换机与其它网络设备之间的连接线缆为五类线,且距离超过100米,也会造成LINK LED不亮。
3.端口模式指示灯(MODE LED)
端口模式指示灯显示交换机端口所处的模式。如果要选择或修改端口模式,连续的按压Mode按钮直到端口模式指示灯指示在所需的模式。
端口模式决定如何对端口状态指示灯进行解释。也就是说对应于不同的模式,端口状态指示灯的颜色等情况表示的是不同的含义。
Mode 按钮有三种状态:
。STAT(状态,states)
。UTL (利用率,Utilization)
。FDUP(全双工,full duplex)
如果交换机的状态灯为闪烁的橙色,一般表明在某一个端口或者模块有硬件故障。
以华为S2100型交换机为例,按MODE按纽,按下后A/L和D/S的指示灯相互切换,当用MODE按钮切换到A/L模式时,A/L灯亮,端口状态指示灯用来指示端口的Active和Link状态,此时端口状态指示灯为绿色,表示链路正常运行。当切换到D/S模式的时候,D/S灯亮, 此时端口状态指示灯表示端口的双工模式和速率情况,端口上方的黄灯就跟着亮了,表示双工的工作方式。
4.端口状态指示灯
端口状态指示灯能代表多种含义,取决于端口模式指示灯的当前值。
端口模式的缺省模式为STAT状态,此时某端口状态指示灯若关闭,表示无链路,即确定没有连接到端口的设备;指示灯持续绿色,表示链路正常运行;指示灯闪烁绿色,表示发送或者接收数据;指示灯绿色/琥珀色交替,表示是链路错误;指示灯持续琥珀色,表示是非转发状态.是阻塞状态。
端口模式处于不同状态时,各个厂商对于不同颜色的LED指示灯的功能定义是各不相同的,根据端口状态指示灯判断交换机的端口状态之前,应认真阅读相关产品的说明书。
四、路由器
路由器相比交换机而言,主要用于较大型的局域网和城域网。但随着局域网的快速发展,路由器的应用也出现快速上升的趋势,各种路由器故障也随之接踵而来。
路由器的LED指示灯较交换机的指示灯作用更局限,因为路由器的绝大部分故障都出现在软件和设置上,而路由器的LED指示灯主要用来辅助查看设备的硬件故障。比如:电源模块上有一个绿色的POWER状态指示灯。当这个指示灯亮着时,表示电源工作正常。接口模块上的TX、RX指示灯。RX指示灯为绿色表示端口正在接收数据包;如果为橙色,则表示正在接收流控制的数据包。TX指示灯为绿色表示端口正在发送数据包;如果为橙色,则表示正在发送流控制的数据包。
同样,不同品牌和型号的路由器对指示灯意义的定义不尽相同,除参考经验之外,还要认真阅读产品说明书。
一般来讲,每块网路卡(NIC)都具有1个以上的 LED (Light Emitting Diode,发光二极体)指示灯,用来表示网卡的不同工作状态,以方便我们查看网卡是否工作正常。典型的LED指示灯有Link/Act、Full、 Power等。Link/Act表示连接活动状态,Full表示是否全双工(Full Duplex),而Power是电源指示等。
在正常情况下,在不传送资料时,网卡的指示灯闪烁较慢,传送资料时,闪烁较快。无论是不亮,还是长亮不灭,都表明有故障存在。如果网卡的指示灯不正常,需关掉电脑更换网卡。对于Hub的指示灯,凡是插有网线的埠,指示灯都亮。由于是Hub,所以,指示灯的作用只能指示该埠是否连接有终端设备,不能显示通信状态。
LED应用在这类产品的指示灯时,所选用的 LED产品 等级普遍是比较一般的产品,像是Lamp型LED。而比较高阶的网路卡产品,会采用SMD型LED,除了省空间外,使用的电流也会比较校
除了手机背光以外,SMD型LED也很适合担任各种电子装置的指示灯,普遍是绿色、红色、橘色、蓝色等??色,价格上的差异日益缩小化。