关于EMI多线程分段测试方法的说明

2008年5月15日修正版

利用频谱仪进行电磁干扰测试时,考虑到显示效果,点击测试对话框的“开始”按钮之后视图应该立刻切换到对数坐标系而不是等待测试完成后才切换,因此,必须采用多线程测试方式,也即,需要增加一个测试线程用来向频谱仪发送测试指令。该测试线程定义为CTestThread,由MFCCWinThread派生而来。主线程(在本程序中为CChildFrame类)和辅助线程(CTestThread)之间利用消息进行通信,消息处理函数的参数用来传递测试工程设置数据的指针。

另一方面,根据GJB152A-97《军用设备和分系统电磁发射和敏感度测量》规定,在不同的测试频段,接收机的6dB带宽(RBW)必须采用不同的数值,如下表所示:

 

频率扫描测量6dB带宽

频率范围

6dB带宽

30Hz1KHz

10Hz

110KHz

100Hz

10250KHz

1KHz

250KHz30MHz

10KHz

30MHz1GHz

100KHz

>1GHz

1MHz

如果一次测试横跨多个频段,那么就必须分为多段进行测量。另外,由于接收机或频谱仪一般为数字设备,受限于测量仪器的测量采样精度,如果频段较宽,因为一次测量采样点数是固定的(本文所用频谱仪一帧采样501个点),此时往往也需要将整个测试频段划分为几个更小的频段分段测量。本文中将这样的划分后的一个小频段称为一帧。

综上所述,一次测试是一个多线程逐帧测试的过程。辅助线程CTestThread用于向频谱仪发送测试指令,发送完一段测试指令,便休眠等待;主线程CChildFrame接收测试结果(ASCII格式),接收完一帧向辅助线程发送消息进行下一段测试,同时发送消息更新CEMCView中的测试曲线。测试流程如下图所示:

以下为最初的版本,予以保留。

################ 关于多线程测试方法的说明 ################

      利用频谱仪进行电磁干扰测试时,考虑到显示效果(点击“开始测试”按钮之后视图立刻切换到对数坐标系而不是等待测试完成后才切换),必须采用多线程方式,也即,增加一个TestThread用来向频谱仪发送测试指令。
       主线程和辅助线程(CTestThread)之间利用消息通信。根据GJB规定,CE102测试在10KHz~1000MHz之间需要分为三段:10KHz~250KHz(RBW:1KHz)、250KHz~30MHz(RBW:10KHz)、30MHz~1GHz(RBW:100KHz)。因此,一次测试工程势必要分为多段测量。辅助线程用于向频谱仪发送测试指令,发送完一段测试指令,便休眠等待;主线程接收测试结果(ASCII格式),接收完一帧向辅助线程发送消息进行
下一段测试。辅助线程也可以通过::PostMessage函数向主线程发送消息。
      测试流程如下图所示:


   file="/Best4cUserFiles/20080503/17143_1209816609220";showImage();    如需源代码,请联系本人。

PS:今天本人第一次使用CSDN的Best4c画流程图,很是惊异于网络编程的强大,难怪微软深刻感到Google等公司的在线Office的压力,也要推出自己的Live Office呢。(貌似Best4c采用了Adobe的Flex技术?请求达人指教)但是必须指出的是,Best4c在很多方面还不够理想,仍需努力……

利用自定义消息处理函数的WPARAM或LPARAM参数传递指针

有自定义消息:

#define WM_TEST WM_USER+121

消息处理函数:

afx_msg void OnTest(WPARAM wParam,LPARAM lParam);

该消息是一个主线程向辅助线程发送数据的消息。
主线程中发送消息的代码:

       m_param.pDoc=pDoc;
    m_param.pSpecAnlyz
=m_pSpecAnlyz;
    
//    CWinThread* pThread=AfxBeginThread(ThreadTest,static_cast<LPVOID>(&m_param));
    m_pTestThread=(CTestThread*)AfxBeginThread(RUNTIME_CLASS(CTestThread));
    Sleep(
200);
    
// 必须先把&m_param转化为void*指针,然后才可以进一步强制转化为WPARAM
    m_pTestThread->PostThreadMessageW(WM_TEST,(WPARAM)((void*)&m_param),1);// 发送测试消息

 m_param为自定义类型,其成员为指针变量,因此 m_param无法强制转化为WPARAM。但是m_param的地址指针和WPARAM一样,都是4个字节,因此可以将m_param的地址指针起那个只转换为WPARAM。在VC.NET2005中,直接转换编译报错。考虑到void * 之后,先将&m_param转化为void*指针,然后才可以进一步强制转化为WPARAM

同样的,在OnTest中,必须先将wParam强制转换为void * ,然后进一步转换为其他类型。

PS:网上有高手指出,局部指针变量最好不要作为wParam或 lParam传递,因为当消息响应时改变量可能已经不在了。

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;
}