EMC-CBR故障诊断研究(一)

          该系列文章致力于建立一个基于CBR(Case-Based Reasoning)的电磁兼容故障诊断系统模型。这篇文章将首先阐述用语义网络对故障进行表示。


Case6

         【故障特征】:辐射骚扰测试,120MHz附近多个频点超标

合式公式表示为(默认频率单位MHz)

Test_content(RE) Exceed_standard(Range(120))

         【系统结构】:某模块安装在屏蔽底板上,模块与底板连接器处已经用导电胶条进行了屏蔽处理,并与底板的金属部分之间采用了“360°”搭接;产品采用屏蔽结构;模块安装处辐射最大

合式公式表示为

Part_of(module_x, product)Connect_to(module_x, connector)Shielding(connector ,conductive_tape)Main_problem(connector, RE)Connect_to(bottom_plane, connector)Part_of(bottom_plane, product)Part_of(metal_area, bottom_plane)Object(bond, metal_area)Main_body(bond, module_x)Bond_type(bond, 360_degree)

 

         【原因分析】:产品采用了屏蔽结构,所以必定是缝隙辐射造成的超标;产品进行了屏蔽和搭接,还能测到很大的辐射,必定是因为导电胶条与模块屏蔽体或导电胶条与底板屏蔽体之间的“360°”搭接不理想,存在阻抗不连续或结构意义上的缝隙。

【解决措施】:

(1)           用较厚的导电橡胶代替原来的导电橡胶,使导电橡胶的压缩量增加,便可以满足测试要求;

(2)           将底板中的PCB模块垫高(也可达到同样效果)。

【相关结论】:

(1)           使用导电橡胶、衬垫之类的屏蔽材料时,不但要保证接触面上的良好的导电性(接触面去除所有漆),而且还要保证一定的压缩量。

(2)           缝隙也是天线。

(3)           一个EMC观点上搭接良好的等电位系统是指:搭接点直接的电阻小于2mΩ,并且整个预期的等电位系统的任何两点之间的电阻小于25mΩ。

《电磁设备防干扰原理与技术》读书笔记(一)

 

《电磁设备防干扰原理与技术》读书笔记

——周旭编著,《电磁设备防干扰原理与技术》,国防工业出版社,2005

 

1、电偶极子、磁偶极子和实际干扰源的简化

实际的辐射干扰源大致分为两类:类似于对称阵子天线的非闭合载流导线辐射源和类似于变压器绕组的闭合载流导线辐射源。电偶极子和磁偶极子是上述两类源的最基本的形式。实际的辐射源在空间某点产生的场,均可由若干个基本源的场叠加而成;实际天线可近似为许多偶极子的组合,天线所产生的电磁波也就是这些偶极子所产生的电磁波的合成。因此研究电磁辐射,最简单的是电偶极子和磁偶极子的辐射。通过对电偶极子和磁偶极子所产生的场进行分析,就可得出实际辐射源的远近场及波阻抗和远近场的场特性。

1.1 电偶极子和磁偶极子的概念

电偶极子是指一段载有高频电流的短导线,短是指其长度Δl远小于其辐射的电磁波的工作波长,这时导线上各点电流的振幅和相位可视为相同。虽然实际的线天线上各处电流的大小和相位不相同,但其上的电流分布可以看成是由许多首尾相连的一系列电偶极子的电流组成,而各电偶极子上的电流可分别看作常数,因此电偶极子也称为电基本振子、电流元或时变电偶极子。

磁偶极子也被称为磁基本振子,是一个半径为a(a<<λ)的细导线小圆环,载有高频电流。当此细导线小圆环的周长远小于波长时,可以认为流过圆环电流的振幅和相位处处相等。磁偶极子的电场强度矢量和磁场强度矢量互相垂直,这一点和电偶极子的电磁场相同。

1.2 两类源在远近场的特性比较

1.2.1 传播特性

1.1 两类源的场于传播特性

场源类型

场特性

传播特性

场特性

传播特性

电偶极子

非平面波

1/r3衰减

平面波

1/r衰减

磁偶极子

非平面波

1/r2衰减

平面波

1/r衰减

近场区的电场和磁场方向处在以场源为中心的大曲率半径球面上。理想的电偶极子和磁偶极子是不存在的。杆状天线及电子设备内部的一些高电压小电流元器件等场源,都可视为等效的电偶极子场源,其近区场的电磁场以容性高阻抗电场为主。环状天线和电子设备中的一些低压大电流元器件及电感线圈等场源可视作等效的磁偶极子场源,其周围电磁场呈现低感性低阻抗磁场的特征。

在远场区电磁场为横电磁波,只有与传播方向垂直的两个场分量,在传播方向上没有场分量。

1.2.2 波阻抗

波阻抗是电磁波中电场分量与磁场分量之比,即

场源不同、远近场不同,则波阻抗也有所不同。

1.2 两类源的波阻抗

场源类型

波阻抗/Ω

电偶极子

120π

磁偶极子

120π

1.2.3 能量密度

能量密度包括电场能量密度和磁场分量能量密度,通过对由同一场源所产生的电场、磁场分量的能量密度进行比较,可以确定场源在不同区域内何种分量占主要成分,以便确定具体的屏蔽分类。

1.3 两类源的能量密度

场源类型

能量密度比较

近场

远场

电偶极子

磁偶极子

 

2、传输线基础

传输线是一种能在两点之间高效率地传输功率与信号的器材。场源产生的能量沿着传输线所引导的方向以横电磁波模式传播,即只在传输过程中电场和磁场相互垂直,且都垂直于传输线导向的传播方向。传输线只能在一定的频率范围内使用,超出范围将会使传输损耗大大增加。

传输线通常分为三类:双线传输线、双线平行板传输线和同轴线。

传输线和普通电路网络的差别:普通电路网络的几何尺寸远小于工作波长,因此网络中的电路元件可以认为是分立的,并以集总参数来描述,电流通过集总参数电路元件时,不用考虑电流在空间的变化;传输线的长度通常可与传输信号的波长相比拟,它的分布参数已直接影响到信号的传输,必须用分布于整个长度的电路参数来描述其自身的特性。

如果传输线终端的负载阻抗与传输线特性阻抗不相等,那么床竖线终端的不连续性会引起电压和电流的反射。这时入射波(从源端传出)和反射波(从负载传出)在线上将同时存在,形成有别于行波的另一种波——驻波。

负载端的反射系数定义为反射波与入射波之比,它与负载阻抗及传输线特性阻抗有关。

 

3、波导

到微波波段(300MHz300GHz),普通传输线传输信号的泄漏急剧上升,只好采用波导作为微波能量的导波载体。波导实质上是一根空心金属管,其横截面一般为矩形或圆形。

波导传输的重要特点:

1)每种既定的波导都有最低可传输频率,低于此频率的电磁波就不能再在波导中传输,该频率称为截止频率,它只与报道的横截面尺寸及波导内介质的特性有关。

2)由于波导内没有同轴电缆那样的导体,所以沿传播方向总存在一个场分量。

3)波导波长始终大于同频率的电磁波的自由空间波长。

 

4、电磁干扰源的分类

4.1 按存在区域分类——外部电磁干扰和内部电磁干扰

         所谓外部电磁干扰,是指电子设备或系统以外的因素对线路、设备或系统的干扰,这些干扰是通过外壳、天线及各种输入馈线等途径输入设备内部的,其中有些是自然干扰,有些是人为干扰。具体而言,外部干扰包括:

(1)       外部的高电压、电源通过绝缘漏电而干扰电子设备或系统。

(2)       外部大功率设备在空间产生很强的磁场,通过互感耦合干扰电子设备或系统。

(3)       空间电磁波对电子线路或系统产生的干扰。

(4)       工作环境温度不稳定,引起电子设备或系统内部元器件参数改变造成的干扰。

(5)       由工业电网供电的设备和由电网电压通过电源变压器所产生的干扰。

所谓内部电磁干扰,是指设备内部电路单元之间、元器件之间及导线之间的电磁干扰。具体而言,内部干扰包括:

(1)           工作电源通过线路的分布电容和绝缘电阻产生漏电造成的干扰(与工作频率有关)。

(2)           信号通过地线、电源和传输导线的阻抗相互耦合,或导线之间的互感造成的干扰。

(3)           设备或系统内部某些元件发热,影响元件本身或其它元件的稳定性造成的干扰。

(4)           大功率和高电压部件产生的磁场、电场通过耦合影响其他部件造成的干扰。

在电子设备内部,这些电磁干扰都是通过寄生耦合形成的。寄生耦合有电容耦合、电感耦合。

 

4.2 按频率范围分类

1)工频干扰源:50Hz及其谐波,波长为6000km,包括输配电以及电力牵引系统。

2)甚低频干扰源:30KHz以下,波长大于10km

3)载频干扰源:10KHz300KHz,波长大于1km,包括高压直流输电谐波干扰、交流输电谐波干扰及交流电气铁道的谐波干扰。

4)射频及视频干扰源:300KHz300MHz,波长在1m1000km之间,包括工业、科学和医用射频设备、输电线电晕放电、高压设备和电力牵引系统的火花放电以及内燃机、电动机、家用电器和照明电器等。

5)微波干扰:300MHz300GHz,波长在1mm1m之间,包括特高频、超高频、极高频干扰。

6)雷电及核电磁脉冲:频谱在01GHz之间。

 

4.3 按产生原因分类

3.1 按照产生电磁干扰的原因来分类

大类别

产生原因

小类别及说明

放电噪声

放电产生噪声

火花放电——在电路绝缘破坏的过渡状态下放电;

连续放电——电晕放电(部分绝缘破坏);

辉光放电——弧光放电(全电路绝缘破坏);

静电噪声——带静电的火花放电噪声;

雷击——雷云和大地之间的放电。

接触噪声

电流通过接触部分,由接触电阻变化而引起电压变化

静接触噪声——接点接触压力变化,使接触电阻变化而引起的干扰;

滑动噪声——滑动过程中接触电阻变化而产生的噪声;

振动噪声——机械振动使接触电阻发生变化而产生的噪声;

皮膜破坏噪声——接点表面破坏使电阻变化而产生的噪声。

金属的接触面接触不良

接点振动——断开的接点,当接触时由接点跳动而产生的噪声;

不完全接触噪声——不完全接触,由接触断续而产生的噪声。

极化电荷波动

电极噪声——医疗电子设备的电极,由于涂料极化可引起电压变化而产生的噪声。

金属氧化物整流作用

检波输出信号——由金属和氧化物引起的被调制波的检波作用。

热电势

直流噪声——由不同金属接点的温差而引起的电势。

过度现象(transient)干扰

过渡现象所产生的电压和电流引起的干扰

电子开关——硅整流器等产生的噪声;

高速数字回路——设备内的电源开关,集成电路的尖峰电流;

通电瞬间的冲击电流——白炽灯泡,电动机;

电力线路过渡的异常电压——线路开闭和故障时的异常电压;

雷电感应——雷云使电线产生电荷,并使放电的自由电荷在电线中形成行波。

无用信号的干扰

对电路而言,是毫无用处的信号

市用电源——电源哼声,感应障碍所引起的波形失真;

无线电频率干扰——高频设备,发射机,振荡器等;

脉冲信号干扰——数字回路,偏转回路等;

无用辐射——发射机的高频调制,接收机的局部震荡等。

反射干扰

由信号本身反射而引起的干扰

延迟信号干扰——由空间或传输线反射波引起的干扰;

不匹配噪声——由于传输线的阻抗不匹配而引起的噪声。

等离子

放电等离子区内的离子、电子固有振动

由核爆炸噪声,太阳噪声等产生

 

4.4 按传输状态分类

4.2 按传输的状态来分类

传输路径

大类别

说明

小类别

空间

辐射干扰

同波长相比,距离大的场合

 

感应干扰

由近距离电磁场引起,如平行布线、多芯电缆串音等

静电感应——高阻抗场的静电耦合

电磁感应——低阻抗场的电磁耦合

导线

传导干扰

在传播中侵入导线的干扰

按状态分类

差动干扰——往复两导线间的干扰

同相干扰——导线和大地之间所产生的干扰

按传输线路不同分类

电源噪声——由电源回路侵入的噪声

信号输入线——从信号输入线直接侵入

控制线等——从信号输出线间接侵入

地线即接地回路——接地点相互之间的电位差

 

故障智能诊断读书笔记(一)

1、故障智能诊断系统的发展趋势

1)多种知识表示方法的结合;

2)经验知识(浅层知识)与原理知识(深层知识)的紧密结合;

3)诊断系统与神经网络的结合;

4)虚拟现实技术将得到重视和应用;

5)数据库技术与人工智能技术相互渗透。

——王道平,张义忠著《故障智能诊断系统的理论与方法》,冶金工业出版社

 

2、故障诊断方法分类示意图

——王道平,张义忠著《故障智能诊断系统的理论与方法》,冶金工业出版社

 

3、故障智能诊断系统的概念

定义3.1:元素是指构成复杂设备的最基本的、具有相对独立功能的结构。

定义3.2:联系是指设备元素之间的关系。

定义3.3:系统是指由若干个相互联系、相互制约的元素组成的具有某种特定功能的整体。

定义3.4:设备系统的层次性是指从系统到元素之间的纵向可分解性。

         较低层的元素可以聚合成较大的高层元素,以此类推,直至最高层的元素,也就是原级系统。一般来说,一个复杂设备系统可以分解为系统级、子系统级、……、部件级和元件级等多个层次。

定义3.5:系统的功能是指在系统设计时要求系统所要实现的一些行为。

         功能的实现是系统设计的根本目的,也是系统设计时所要求必备的行为。功能失调与否是设备运行是否正常的主要标志,也是必不可少的、最重要的检测内容和诊断信息。

定义3.6:系统的输出是系统所有行为的表现。

         系统的输出是系统当前工作状态的外部表现,它以两种形式表现:一些能直接表现系统的功能行为,称之为功能输出;另一些则是实现系统功能时附带产生的,称之为附加输出。如导弹发动机产生的功率和发热都是它的输出,前者是其功能的直接表现,是功能输出;后者则是附带产生的,属附加输出。(在电磁干扰故障诊断时,既要关心待测设备的功能输出,即在外加干扰的情况下能否正常工作;更要关心的是待测设备的附加输出,即在设备正常工作时附加输出如电磁辐射是否超标。

定义3.7:系统的故障是指该系统的非正常状态,即在正常条件下,系统实际的功能输出或附加输出超越规定界限的现象。

定义3.8:所谓故障诊断,就是在一定的检测策略的指导下实施对被诊断系统的自动检测。通过检测获取诊断对象的故障模型,提取故障特征,在此基础上,根据预定的推理原则,对故障信息作出综合评估,并向系统的操纵者或控制者提示所要采取的措施。

定义3.9:诊断系统的智能就是它有效地获取、传递、处理、再生和利用诊断信息,从而对给定环境下的诊断对象进行正确的状态识别、诊断和预测的能力。

定义3.10:故障智能诊断系统是由人、当代模拟人脑功能的硬件及其必要的外部设备、物理器件以及支持这些硬件的软件所组成的具有智能的故障诊断系统。

以上定义可以用于限定电磁干扰故障诊断的概念

——王道平,张义忠著《故障智能诊断系统的理论与方法》,冶金工业出版社

  

场耦合到导线/电缆的预估

这几天事情比较多,知道今天才完成 “场耦合到导线/电缆的预估”该部分的程序。

该程序依然是根据《电磁兼容原理与应用》一书中的QBASIC程序改编而成。程序运行截图如下:

 

导线辐射预估

今天完成了导线辐射预估的编程。导线辐射预估分为三部分:电流元预估、电流环路预估、谐振传输线预估。

因为涉及到很多电磁兼容专业公式,因此有需要代码的朋友可以和我联系。

电流元预估

电流元预估截图

电流环路预估截图

谐振传输线预估截图

关于测试工程提示信息功能的说明

关于测试工程提示信息功能的说明

该功能的实现完全依赖于CPPToolTip类,该类可以在 http://www.codeproject.com/
上下载到。具体说明见该网站的介绍。
本程序所需要的功能是点击工具栏的“属性”按钮之后,屏幕右下角弹出测试工程的详细属性。在屏幕任何地方单击鼠标左键之后,信息提示框消失。
因此,本程序没有直接按照codeproject上的介绍那样使用CPPToolTip类,而是当点击“属性”按钮之后,调用ShowHelpTooltip函数。
在ShowHelpTooltip函数的重载版本void ShowHelpTooltip (LPPOINT pt, LPCTSTR lpszString, HICON hIcon = NULL)中,lpszString支持HTML文本,因此可以利用HTML控制显示信息的格式。

弹出的信息提示框如下图所示。

信息提示框

源代码如下:

 




///
/ MainFrm.h中定义



public
:

    CPPToolTip m_toolTip;    

//
 显示测试属性的提示框





///
/ MainFrm.cpp中



int
 CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)




{

       ……

    m_toolTip.Create(

this
);

    

//
Adds tooltip for toolbar



    m_toolTip.AddToolBar(
&
m_ProperBar);

       ……

}







//
    显示测试工程的属性



void
 CEMCView::OnEditProper()




{

    

//
 TODO: 在此添加命令处理程序代码



    
if
(m_bIsWorking 
&&
 
!
m_bOldVersion)


    


{

        CEMCDoc

*
 pDoc
=
GetDocument();



        CMainFrame

*
 pmfrm
=
(CMainFrame
*
)AfxGetMainWnd();

        pmfrm

->
m_toolTip.SetDirection(PPTOOLTIP_BOTTOMEDGE_CENTER);

        pmfrm

->
m_toolTip.AddTool(
this
,L
"
测试文件属性
"
);


//
        pmfrm->m_toolTip.SetColorBk(RGB(0,0,255),RGB(192,192,192));





        CPoint pt;

        CRect rc;  

        GetClientRect(

&
rc);

        ClientToScreen(

&
rc);

        pt.x

=
rc.right;

        pt.y

=
rc.bottom;    
//
 pt为客户区窗口右下角对应的点



        

//
    利用HTML控制提示框的显示格式

        

//
 显示测试工程属性



        CString info
=
L
""
;

        CString str

=
L
"
<center><h2><font face="黑体" color=red>测试工程属性</font></h2><br><hr color=blue></center><br>
"
;

        info

+=
str;

        str.Format(L

"
<font size=14>测试类型:</font>
"
);

        info

+=
str;

        

if
(pDoc
->
m_pTestPrj
->
m_TestCon
==
CE102)


        


{

            str.Format(L

"
<span class=cpp-comment>CE102测试</span>
"
);

        }




        

else
 
if
(pDoc
->
m_pTestPrj
->
m_TestCon
==
RE102)


        


{

            str.Format(L

"
<span class=cpp-comment>RE102测试</span>
"
);

        }




        info

+=
str;

        str.Format(L

"
    <font size=14>测试设备:</font>
"
);

        info

+=
str;

        

switch
(pDoc
->
m_pTestPrj
->
m_TestEquip)


        


{

        

case
 TEST_EQUIP_NONE:

            str.Format(L

"
<span class=cpp-comment>无</span><br>
"
);

            

break
;

        

case
 CUR_PROBE:

            str.Format(L

"
<span class=cpp-comment>电流探头</span><br>
"
);

            

break
;

        

case
 ET_G:

            str.Format(L

"
<span class=cpp-comment>ET-G</span><br>
"
);

            

break
;

        

case
 ET_Q:

            str.Format(L

"
<span class=cpp-comment>ET-Q</span><br>
"
);

            

break
;

        

case
 HT_1:

            str.Format(L

"
<span class=cpp-comment>HT-1</span><br>
"
);

            

break
;

        

case
 HT_6:

            str.Format(L

"
<span class=cpp-comment>HT-6</span><br>
"
);

            

break
;

        

case
 LISN:

            str.Format(L

"
<span class=cpp-comment>LISN</span><br>
"
);

            

break
;

        

case
 EZ_17:

            str.Format(L

"
<span class=cpp-comment>EZ-17</span><br>
"
);

            

break
;

        }




        info

+=
str;

        str.Format(L

"
<font size=14>起始频率:</font>
"
);

        info

+=
str;

        str.Format(L

"
<span class=cpp-comment>%5.2fMHz</span>
"
,pDoc
->
m_pTestPrj
->
m_StartFreq);

        info

+=
str;

        str.Format(L

"
    <font size=14>终止频率:</font>
"
);

        info

+=
str;

        str.Format(L

"
<span class=cpp-comment>%5.2fMHz</span><br>
"
,pDoc
->
m_pTestPrj
->
m_StopFreq);

        info

+=
str;    

        str.Format(L

"
<font size=14>EUT电压:</font>
"
);

        info

+=
str;

        

if
(pDoc
->
m_pTestPrj
->
m_TestCon
==
RE102)

            str.Format(L

"
<span class=cpp-comment>N/A</span>    
"
);

        

else


            str.Format(L

"
<span class=cpp-comment>%5.2fV</span>
"
,pDoc
->
m_pTestPrj
->
m_EUTVolt);

        info

+=
str;

        str.Format(L

"
    <font size=14>待测设备:</font>
"
);

        info

+=
str;    

        

if
(pDoc
->
m_pTestPrj
->
m_EUTName
!=
L
""
)

            str.Format(L

"
<span class=cpp-comment>%s</span><br>
"
,pDoc
->
m_pTestPrj
->
m_EUTName);

        

else


            str.Format(L

"
<span class=cpp-comment>N/A</span><br>
"
);

        info

+=
str;

        str.Format(L

"
<font size=14>测试模式:</font>
"
);

        info

+=
str;

        

if
(pDoc
->
m_pTestPrj
->
m_TestCon
==
RE102)

            str.Format(L

"
    <span class=cpp-comment>N/A</span>    
"
);

        

else



        


{

            

switch
(pDoc
->
m_pTestPrj
->
m_TestMode)


            


{

            

case
 TEST_MODE_NONE:

                str.Format(L

"
<span class=cpp-comment>无</span>    
"
);

                

break
;

            

case
 DIFFER:

                str.Format(L

"
<span class=cpp-comment>差模</span>
"
);

                

break
;

            

case
 COMMON:

                str.Format(L

"
<span class=cpp-comment>共模</span>
"
);

                

break
;

            }




        }




        info

+=
str;

        str.Format(L

"
    <font size=14>测试距离:</font>
"
);

        info

+=
str;

        

if
(pDoc
->
m_pTestPrj
->
m_TestCon
==
CE102)

            str.Format(L

"
<span class=cpp-comment>N/A</span><br>
"
);

        

else


            str.Format(L

"
<span class=cpp-comment>%5.2fm</span><br>
"
,pDoc
->
m_pTestPrj
->
m_TestDist);

        info

+=
str;



        

//
    显示频谱仪设置



        str.Format(L
"
<br><center><h2><font face="黑体" color=red>频谱仪设置</font></h2><br><hr color=blue></center><br>
"
);

        info

+=
str;

        str.Format(L

"
<font size=14>RBW     :</font>
"
);

        info

+=
str;

        

if
(pDoc
->
m_pTestPrj
->
m_TestBand
==
9
)

            str.Format(L

"
<span class=cpp-comment>9KHz</span>    
"
);

        

else
 
if
(pDoc
->
m_pTestPrj
->
m_TestBand
==
120
)

            str.Format(L

"
<span class=cpp-comment>120KHz</span>
"
);

        

else


            str.Format(L

"
<span class=cpp-comment>AUTO</span>    
"
);

        info

+=
str;

        str.Format(L

"
    <font size=14>显示模式:</font>
"
);

        info

+=
str;

        

switch
(pDoc
->
m_pTestPrj
->
m_DispPattern)


        


{

        

case
 SAMPLE:

            str.Format(L

"
<span class=cpp-comment>SAMPLE</span><br>
"
);

            

break
;

        

case
 MIN_HOLD:

            str.Format(L

"
<span class=cpp-comment>MIN.HOLD</span><br>
"
);

            

break
;

        

case
 MAX_HOLD:

            str.Format(L

"
<span class=cpp-comment>MAX.HOLD</span><br>
"
);

            

break
;

        }




        info

+=
str;

        str.Format(L

"
<font size=14>内部衰减:</font>
"
);

        info

+=
str;

        str.Format(L

"
<span class=cpp-comment>%ddB</span>    
"
,pDoc
->
m_pTestPrj
->
m_InnerAttenuator);

        info

+=
str;

        str.Format(L

"
    <font size=14>外部衰减:</font>
"
);

        info

+=
str;

        str.Format(L

"
<span class=cpp-comment>%ddB</span><br>
"
,pDoc
->
m_pTestPrj
->
m_OuterAttenuator);

        info

+=
str;



        pmfrm

->
m_toolTip.ShowHelpTooltip(
&
pt,info);

    }




}

 

加载真彩色工具栏

       首先利用Visual Toolbar工具将自.bmp图片制作成工具条。Visual Toolbar工具可以利用Google去搜,尽管这款软件需要注册,但笔者不提倡下载注册机破解注册或者直接下载破解版。

       然后在VC的资源中添加工具栏,导入已经制作好的工具条(此时为bmp格式),然后利用CtrueColorToolBar 类加载图片到工具条。CtrueColorToolBar 类的下载地址为:http://www.codeproject.com/docking/TrueColorToolBar.asp

以上两步可以参考《一步步制作真彩工具条》。

      接下来就要将多个工具条加载到同一个工具栏里。我也是在网上找到的源代码,然后自己修改。不便赘述,直接贴上代码:

 

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
    
if (CMDIFrameWnd::OnCreate(lpCreateStruct) == -1)
        
return -1;
    
    
if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP|
         CBRS_FLOAT_MULTI 
| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
        
!m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
    
{
        TRACE0(
"未能创建工具栏 ");
        
return -1;      // 未能创建
    }


    
if (!m_wndStatusBar.Create(this||
        
!m_wndStatusBar.SetIndicators(indicators,
          
sizeof(indicators)/sizeof(UINT)))
    
{
        TRACE0(
"未能创建状态栏 ");
        
return -1;      // 未能创建
    }


    
// TODO: 如果不需要工具栏可停靠,则删除这三行
    m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
    EnableDocking(CBRS_ALIGN_ANY);
    DockControlBar(
&m_wndToolBar);
    
    CRect rect;
        
// 创建属性工具栏
//    m_ProperBar.SetBorders(1,1,1,1);
    if(!m_ProperBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP|
         CBRS_FLOAT_MULTI 
| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC)||
         
!m_ProperBar.LoadToolBar(IDR_TOOLBAR_PROPER))
    
{
        TRACE0(
"未能创建缩放工具栏 ");
        
return -2;      // 未能创建
    }

    m_ProperBar.LoadTrueColorToolBar(
16,IDB_BITMAP_PROPER_HOT,IDB_BITMAP_PROPER_HOT,IDB_BITMAP_PROPER_DISABLED);
    m_ProperBar.GetWindowRect(
&rect);
    rect.OffsetRect(
1,0);
    
this->RecalcLayout();
    m_ProperBar.EnableDocking(CBRS_ALIGN_ANY);
    EnableDocking(CBRS_ALIGN_ANY);
    DockControlBar(
&m_ProperBar, AFX_IDW_DOCKBAR_TOP, &rect);

    
// 创建缩放工具栏
//    m_TestBar.SetBorders(1,1,1,1);
    if(!m_ZoomBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP|
         CBRS_FLOAT_MULTI 
| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC)||
         
!m_ZoomBar.LoadToolBar(IDR_TOOLBAR_ZOOM))
    
{
        TRACE0(
"未能创建缩放工具栏 ");
        
return -2;      // 未能创建
    }

    m_ZoomBar.LoadTrueColorToolBar(
16,IDB_BITMAP_ZOOM,IDB_BITMAP_ZOOM_HOT,IDB_BITMAP_ZOOM_DISABLED);
    m_ZoomBar.GetWindowRect(
&rect);
    rect.OffsetRect(
2,0);
    
this->RecalcLayout();
    m_ZoomBar.EnableDocking(CBRS_ALIGN_ANY);
    EnableDocking(CBRS_ALIGN_ANY);
    DockControlBar(
&m_ZoomBar, AFX_IDW_DOCKBAR_TOP, &rect);

    
// 创建测试工具栏
//    m_TestBar.SetBorders(1,1,1,1);
    if(!m_TestBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP|
         CBRS_FLOAT_MULTI 
| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC)||
         
!m_TestBar.LoadToolBar(IDR_TOOLBAR_TEST))
    
{
        TRACE0(
"未能创建测试工具栏 ");
        
return -2;      // 未能创建
    }

    m_TestBar.LoadTrueColorToolBar(
16,IDB_BITMAP_TEST,IDB_BITMAP_TEST_HOT,IDB_BITMAP_TEST_DISABLED);
    m_TestBar.GetWindowRect(
&rect);
    rect.OffsetRect(
1,0);
    
this->RecalcLayout();
    m_TestBar.EnableDocking(CBRS_ALIGN_ANY);
    EnableDocking(CBRS_ALIGN_ANY);
    DockControlBar(
&m_TestBar, AFX_IDW_DOCKBAR_TOP, &rect);

    m_toolTip.Create(
this);
    
//Adds tooltip for toolbar
    m_toolTip.AddToolBar(&m_ProperBar);

    
return 0;
}

       但是这样做有一个问题,就是两个工具条之间有空白间隙,显得很难看,如下图所示。已经在论坛里发帖了,希望有高手指点一二。

 

高手给出的答案为:

这种效果是正常的,如果不想要这样,可以把CBRS_GRIPPER风格去掉,或者用CReBar。

关于ROHDE SCHWARZ公司电流探头EZ-17系数修正的说明

        关于EZ-17探头系数修正的说明

///// 电流探头EZ17测试结果修正 /////
// 根据ROHDE&SCHWARZ公司的手册,EZ17的测试结果需要
// 进行修正,加上转移电阻K。由手册给出的曲线(第二页)
// 和测试数据(第12页,表4-1),可知在对数坐标中,500KHz
// 以下可看作一条直线;500KHz~10MHz为一非线性变化段;
// 10MHz~200MHz为另一非线性变化段。据此,对测试数据进行
// 校正。以下所有拟合函数均为对数坐标系下的拟合函数。
//
// 20Hz~500KHz拟合函数为:
//  p1=-19.1838*x-8.1953
// 500KHz~10MHz拟合函数为:
//  p4=18.2253*x^4-31.3557*x^3+16.5565*x^2-6.6261*x-6.8
// 10MHz~20MHz拟合函数为:
//  p0=-10
// 20MHz~100MHz拟合函数为:
//  p2=0.1157*x^2-0.0959*x-10.0711
// 100MHz~200MHz拟合函数为:
//  p3=175.6*x^3-1044.5*x^2+2067.7*x-1371.9
// 以上各式中,x为频率的对数,p为频率所对应的修正因子。
//

 

// 参数freq为频率,单位MHz。
// 
double CEMCView::EZ17CorrectionFactor(double freq)
{
    
double factor;
    
if(freq>=0.000020 && freq<=0.5)
        factor
=-19.1838*log10(freq)-8.1953;
    
else if(freq>0.5 && freq<10)
        factor
=18.2253*pow(log10(freq),4)-31.3557*pow(log10(freq),3)+16.5565*log10(freq)*log10(freq)-6.6261*log10(freq)-6.8;
    
else if(freq>=10 && freq<=20)
        factor
=-10.0;
    
else if(freq>20 && freq<=100)
        factor
=0.1157*log10(freq)*log10(freq)-0.0959*log10(freq)-10.0711;
    
else if(freq>100 && freq<=200)
        factor
=175.6*pow(log10(freq),3)-1044.5*log10(freq)*log10(freq)+2067.7*log10(freq)-1371.9;

    
return factor;
}

利用VC绘制对数坐标系


利用VC绘制对数坐标系

目标:绘制以任意频率为起点、任意频率为终点的对数坐标,并能对坐标进行任意缩放。

实现方法:

======【Update 2013-12-18】:=========================================================

  • 今天发现以前的方法其实是很笨的方法。其实只要知道任意两个点的X坐标及其对应的频率f, 就可以根据第三点的频率确定第三点的坐标,或者根据第三点的坐标确定该点的频率。个人感觉对数坐标的本质就是,对于频率取对数之后,该坐标映射成为线性坐标,即屏幕坐标x可以看做log(f)的线性函数。

  • 给定三点(x0,f0), (x1,f1),(x2,f2), 其中x是X坐标,f是对应的频率,有对应关系 
  • (x2-x0)/(x1-x0) = (log(f2)-log(f0))/(log(f1)-log(f0)) = log(f2/f0)/log(f1/f0), 
  • 于是,可以求得
  •  x1=log(f1/f0)/log(f2/f0)*(x2-x0)+x0
  • 和 
  • log(f1) = 1/C* log(f2/f0)+log(f0), where C=(x2-x0)/(X1-x0)。 

  • 根据这两个公式,写成两个函数,一个是根据频率计算x坐标,一个根据x坐标计算频率,然后指定坐标轴的位置,就可以很容易绘制出对数坐标系了。
=====================================================================================

以下内容已经过时,仅供参考。

1、定义

标准频率:频率值为10N的相应的频率点,其中N=…-2,-1,0,1,2,3…,单位MHz。如0.01MHZ0.1MHz1MHz10MHz100MHz等都是标准频率。

2、思路

         首先找出标准频率,画出标准频率线,然后根据标准频率画出其他频率线。

3、实现

         1)对数坐标系数学基础

         如图所示的对数坐标系中:

由此,若知道上图中的三个点的坐标,可以求出另一点的坐标。

         2)找出起始|终止标准频率的代码:

double stdStartFreq,stdStopFreq;//  标准频率起始点、终止点

     // 格式化标准起始频率

     for(int i=0;i<7;++i)

     {

         if(StartFreq==pow((double)10,i-2))

         {

              stdStartFreq=StartFreq;

              break;

         }

         else if(StartFreq>pow((double)10,i-2) && StartFreq<pow((double)10,i-1))

         {

              stdStartFreq=pow((double)10,i-1);

              break;

         }

     }

     // 格式化标准终止频率

     for(int i=0;i<7;++i)

     {

         if(StopFreq==pow((double)10,i-2))

         {

              stdStopFreq=StopFreq;

              break;

         }

         else if(StopFreq>pow((double)10,i-2) && StopFreq<pow((double)10,i-1))

         {

              stdStopFreq=pow((double)10,i-2);

              break;

         }

     }

         起始标准频率就是第一个大于起始频率的标准频率;终止标准频率就是最后一个小于终止频率的标准频率。

举例:如果起始频率为1.9MHz,终止频率为201MHz,那么起始标准频率为10MHz,终止标准频率为100MHz;如果起始频率为1.9MHz,终止频率为20.1MHz,那么起始标准频率为10MHz,终止标准频率为10MHz;如果起始频率为1.9MHz,终止频率为2.01MHz,那么起始标准频率为10MHz,终止标准频率为1MHz

3)三种情况

起始频率≤起始标准频率<终止标准频率≤终止频率

  在这种情况下,首先画出起始|终止标准频率线。对于起始频率和起始标准频率之间的部分,由起始标准频率递减向起始频率画出虚线;对于终止标准频率和终止频率之间的部分,由终止标准频率向终止频率递增画出虚线;对于起始标准频率和终止标准频率之间的部分,首先找到二者之间的标准频率,然后根据标准频率(包括起始|终止标准频率)画出其间的虚线。

起始频率<起始标准频率=终止标准频率<终止频率

这种情况是第一种情况的特例。因为起始标准频率=终止标准频率,所以第一种情况里只有两种情况来画虚线。

终止标准频率<起始频率<终止频率<起始标准频率

在这种情况下,先找出终止标准频率,然后依据终止标准频率递增画出起始频率和终止频率之间的虚线。

4、其他问题

1)细化间隔

由于对数坐标相同频率段的间隔不同,如1020MHz的间隔与8090MHz的间隔不同,前者大于后者;另外,考虑到坐标系放大时,如200MHz300MHz频率段,整个坐标系中无虚线,只有横线,很难对测试曲线中某个点的频率进行粗略判断。因此,对于比较大的间隔,应该进行细化。

方法就是利用相邻两虚线的间隔所占坐标横轴的比例进行判断,若大于某个数值则有必要进行细化。由于间隔有大有小,考虑到细化的间隔不能影响整体对数坐标的效果,因此细化的竖线用灰色虚线表示,且将间隔分成不同等级,不同等级画不同条灰色虚线。

2)坐标标注

         坐标标注同样利用相邻两虚线的间隔所占坐标横轴的比例来进行判断,大于某个设定值后才进行标注,否则不进行标注。

 【源代码如下:】

// 绘制对数坐标
void CEMCView::DrawLogCoords(CDC* pDC, double StartFreq, double StopFreq)
...

目标:绘制以任意频率为起点、任意频率为终点的对数坐标,并能对坐标进行任意缩放。

 

附录:

1 读者来信问道:

您好,我是在校的学生,看了您关于“利用VC绘制对数坐标系”http://blog.csdn.net/bonny95/archive/2008/02/21/2111368.aspx 的博文,于是自己写了一个在不同坐标系(直角坐标系和对数坐标系)上描点并选择一些点进行线性拟合的C++程序,结果发现我的点不能很好的在对数坐标坐标上显示出来。
因此我想问您关于实际点到对数坐标系上的页面坐标点转换的过程,您的想法是什么样的呢?
比如点(1998,200)落在1000-10000的标准频率段内,并且是在1000-2000之间,这其中的如何正确地把该点在对数坐标上绘制出来呢。如果您有时间能给我这个解答的话不胜感激。


【答】首先我觉得有必要明确一下直角坐标系和对数坐标系的区别:直角坐标系的X轴、Y轴全部为线性坐标轴,也即1、2、3、……10、……100,1和2,2和3,99和100之间的距离是相等的;而对数坐标系(确切而言是半对数坐标系)的X轴(横坐标)是对数坐标,是非线性的,而Y轴是线性变化的,X轴上1、10、100之间的距离是相等的,而1和2,2和3,99和100之间的距离是不等的。

对于对数坐标系的横坐标,两个点之间的相对位置与两个点代表的频率值的对数呈正比,即:如果屏幕上某个像素点X1在屏幕上的坐标(计算机屏幕上的坐标系为线性坐标系)为(x1,y),X2的坐标为(x2,y),X3的坐标为(x3,y),X1、X2、X3分别为对数坐标系横轴上的三点,对应的频率值分别为f1, f2, f3,则有:
     屏幕上的像素点位置比例  (x2-x1)/(x2-x3) = [lg(f2)-lg(f1)]/[lg(f2)-lg(f3)]  对数坐标系的频率值取对数之后的比例
根据上述公式,设对数坐标横轴上频率1000对应的屏幕坐标为x1, 1998对应的屏幕坐标为x2, 10000对应的屏幕坐标为x3,带入上述公式就可以了。当然,对数坐标的原点对应的屏幕像素值你要自己设定。
因此,其实把测量仪器测得的直角坐标系的曲线(或像素点)转换成计算机屏幕上显示的对数坐标系的曲线(或像素点)的关键在于计算机屏幕直角坐标系和对数坐标系的转换:屏幕上对数坐标系在屏幕上显示的位置要你自己来设定(比如原点为(200,600),横轴(200~800,600),纵轴(200, 600~150)),你设定了这个坐标系的位置之后,就要进行对数坐标(横轴为频率值;也可以理解为频率值的对数,这样频率值的对数也是线性的)和直角坐标系(横轴为屏幕像素点的位置)的转换。
另外,对于纵轴,尽管都是线性坐标,但也要进行一些等比例变换,不然绘制出来的也有可能不对。
祝你好运!
PS: 你可以参见http://p.blog.csdn.net/images/p_blog_csdn_net/bonny95/工程信息提示栏.JPG,这是我自己绘制的对数坐标系。

关于属性页和属性单的应用总结

                                                         关于属性页和属性单的应用总结

1、属性页(CPropertyPage)中获取
 (1) 程序主框架指针:CMainFrame* pMainFrame=(CMainFrame*)AfxGetMainWnd();
 (2) 程序子框架指针:CChildFrame* pframe=(CChildFrame*)((CMainFrame*)AfxGetMainWnd())->GetActiveFrame();
 (3) 程序活动文档指针:CEMCDoc* m_pDoc=(CEMCDoc*)pframe->GetActiveDocument(); //获取活动的文档
 (4) 属性单(CPropertySheet)指针:CMyPropertySheet* pSheet=(CMyPropertySheet*)this->GetParent(); // 获取CMyPropertySheet指针
 (5) 程序活动视图指针:CEMCView* pView=(CEMCView*)pframe->GetActiveView(); // 获取活动视图

2、在属性单(CPropertySheet)单击OK按钮后,程序框架将逐个遍历加载的CPropertyPage(从GetPage(0)~GetPage(N-1)),查询是否
有CPropertyPage重载了OnOK(),若有则执行重载的代码,否则执行默认的CPropertyPage::OnOK()。

3、CPropertySheet和加载的CPropertyPage通信,可以在CPropertySheet中定义
 CPPageContentMode* pCM=(CPPageContentMode*)this->GetPage(0);
 然后利用pCM操作CPPageContentMode中的成员变量。
 也可以在CPropertyPage中获取CPropertySheet的指针。

4、两个或多个加载的CPropertyPage之间通信,可以借助于CPropertySheet实现。

5、对CPropertySheet标准按钮的操作
 (1)更改标准按钮的标题:
 CWnd* pWnd=GetDlgItem(IDOK);
 pWnd->SetWindowTextW(_T("开始"));
 (2)去掉“应用”按钮:
 pWnd=GetDlgItem(ID_APPLY_NOW);
 pWnd->ShowWindow(FALSE);
 (3)移动标准按钮至对话框中间

CPropertyPage* pPage;
 pPage
=this->GetPage(0);
// CRect rectPage;
 pPage->GetWindowRect(&rectPage);

 CWnd
* pWndOK=GetDlgItem(IDOK);
 CWnd
* pWndCancel=GetDlgItem(IDCANCEL);
 CRect rectOK,rectCancel;
 pWndOK
->GetWindowRect(&rectOK);
 pWndCancel
->GetWindowRect(&rectCancel);

 
int BtnCenter=(rectCancel.right-rectOK.left)/2// OK和CANCEL按钮中轴线
 int PageCenter=(rectPage.right-rectPage.left)/2//属性单的中轴线
 int dist=PageCenter-BtnCenter;
 rectOK.left
+=dist;
 rectOK.right
+=dist;
 rectCancel.left
+=dist;
 rectCancel.right
+=dist; 
 ScreenToClient(
&rectOK);
 ScreenToClient(
&rectCancel);
 pWndOK
->MoveWindow(&rectOK);
 pWndCancel
->MoveWindow(&rectCancel);