VC控制范文(精选12篇)
VC控制 第1篇
Word作为一个文字处理器应用程序, 具有强大的文档编排能力, 是一款不可或缺的字处理软件。因此, 如何用自主研发的软件操纵Word文档, 按照用户所需的格式生成报告, 成为大家所关注的问题。可以用VC调用组件对象的方式, 操纵Word文档, 生成所需的报告, 实现Word文档自动化。由于自动化程序接口及COM技术原理和细节的复杂性, 在这里不对其进行详细介绍, 旨在通过文中介绍的编程实例, 让大家从应用角度对其进行理解和掌握。目前, 关于实现Word文档自动化的文章较多, 但生成的文档大都格式简单, 不能达到专业性报告文档的需要。详细介绍了Word文档自动化操作的细节, 使VC控制Word文档像用户手动操作一样, 生成格式多样的报告。
2 程序
用VC实现Word文档自动化的方法有多种, 本文通过在VC环境下导入Word类库, 最终生成格式固定的仿真报告, 报告中包含文字、表格和图片。
2.1 建立工程并加载Word类库
启动Visual C++6.0, 用MFC AppWizard (exe) 创建一个名为Test的基于对话框的工程。然后在工程中加载Word类 (对象) 库, 步骤如下:
(1) 点击View菜单下的ClassWizard菜单项, 选择Add ClassFrom a type Library。
(2) 在Office的安装目录下找到格式为.olb的Word类库。一般情况下类库的位置为Microsoft Officeoffice11msword.olb或Microsoft Officeofficemsword9.olb等。
(3) 点击所需的对象, 如:_Application、Documents等。可按住Ctrl键, 一次选择多个对象, 点击OK加入工程。表1列出了所需的全部对象及其基本含义。
(4) 在CTestDlg类的.h文件中添加#include"msword.h"和#include
2.2 初始化COM组件
在CTestApp类中InitInstance () 函数里添加如下代码, 进行COM组件初始化:
2.3 生成Word文档
为简便起见, 只在对话框中添加一个名为“生成报告”的按钮, 点击这个按钮, 程序就在用户指定的位置生成一个格式如图1的Word报告。
2.3.1 创建Word对象, 启动Word应用程序
要用VC操纵Word应用程序, 首先要创建一个Word应用程序的对象 (本例程序中的app) 。在“生成报告”按钮的消息响应函数OnCreatrepor中添加如下代码:
电路仿真报告
报告人:XX
仿真环境:XXX仿真软件
内容:
1) 元器件参数
2) 仿真数据
步骤:
1) XXXXXXXX
2) XXXXXXXX
3) XXXXXXXX
一、元器件参数
仿真电路的元器件参数如表1所列
二、仿真结果
图1仿真报告
2.3.2 添加报告文字内容和图片
至此, 报告第1段标题行输入完毕, 接着顺序输入报告的其他段。除第13, 18段是表格所在段落, 其余各段的格式设置方法与第1段类似, 只需修改相应参数即可。有首行缩进的段落需要调用Paragraph类的SetCharacterUnitFirstLineIndent函数, 将函数的参数设为2, 代表首行缩进两个字符。
第16段是仿真波形图所在段落, 其实现代码如下:
2.3.3 在报告中插入表格
前面先输入文字和图片, 用TypeParagraph预留出表格所在段落, 最后再插入表格, 这么做的原因是:表格插入后, 原有的段落序号会发生改变, 例如图1中, 表格的每一个单元格里都有一个换行符, 这说明每个单元格都代表一个段落。这将影响原来设定的段落格式。在OnCreatreport函数里继续添加代码如下:
以上4行5列的表格1就以指定格式插入在第13段了。表格2的插入方法与表格1类似, 但要注意表格插入的段落位置:由于表格1的插入, 原先应该位于第18段的表格2变成了第41 (18+4*6-1) 段。
2.3.4 保存文档, 退出程序
在报告的所用内容输入完毕以后, 要保存写好的文档, 然后退出Word应用程序, 并释放所有用到的资源。
2.3.5 自定义函数
下面给出自定义函数SetEleparatabProperty、SetTableBorderBlack和FillElePaTab的代码。
SetEleparatabProperty函数的作用是设置表格的行高和列宽等属性, 参数*ptable代表需要被设置属性的表格。
SetTableBorderBlack函数的作用是设置表格边框为黑色, 之所以调用这个函数是因为在程序开发过程中发现, 在不同的计算机中, 缺省情况下, Word表格的边框属性不一致, 有的表格边框可见, 有的不可见, 有的是黑色, 有的是灰色。当表格边框不可见时, 生成的表格就不利于用户阅读, 为克服这个缺陷, 编写了SetTableBorderBlack函数。
FillElePaTab函数的作用是将仿真数据填写到表格中。参数*ptable代表填写数据的表格, elelist是保存数据的链表, Elepara是这个链表元素的结构体。
3 结语
文中程序在VC++6.0、Office2003、Office2007环境下测试通过, 运行正常。
介绍了用VC操纵Word应用程序生成仿真报告的实例。文中是用VC顺序输出了文档的全部内容。对于格式固定的文档, 也可以先建立一个.dot格式的Word文档模板, 将文档中的固定内容 (如文档标题等) 先添加到模板中, 在需要动态添加内容的位置添加书签, 然后在2.3.1中标号为 (1) 的代码中添加模板的路径, 如:
CComVariant Template (_T ("F:仿真资料报告模板Mytemplate.dot") ) ;
然后在程序中添加Bookmarks和Bookmark类, 用这两个类的成员函数动态添加文档内容即可。
Word具有强大的文档编排能力, 操作灵活方便, 要想在VC环境下同样实现其强大的功能, 要对Word类库以及类成员函数较为熟悉, 作为专业化的标准类库, Word类库中类以及相关方法和属性的命名都做到了见名知意的命名原则, 可以通过观察函数名称来猜测它的作用, 例如Paragraph类的SetCharacterUnitFirstLineIndent函数根据Indent判断可能是缩进排版。另外还要灵活运用已有函数达到自己的目的。例如需要表格在文档中居中, 而Table类并没有相关的居中函数, 参照Paragraph类里居中函数的名称, 在整个工程中搜索SetAlignment, 搜索结果显示在Rows和Row类中都有SetAlignment函数, 经试验, 它们都能实现表格居中的效果, 为方便起见, 利用Rows类的SetAlignment函数来实现目标。
摘要:在EDA软件开发过程中, 为了方便用户分析仿真结果, 经常需要让软件“自动”生成各种仿真报告。介绍在VC环境下控制Word文档自动生成仿真报告的方法, 实现了Word与其他软件的无缝连接。
关键词:VC,Word自动化,表格,图片
参考文献
[1]孙鑫.VC++深入详解.北京:电子工业出版社, 2006.
[2]Dale Rogerson.COM技术内幕-微软组件对象模型.北京:清华大学出版社, 1999.
GSM:如何控制Vc注射液残氧量 第2篇
维生素C(维C)注射液是人们非常常用的药物,它可以加快人体新陈代谢,增强机体免疫力,延缓衰老。维生素C又叫抗坏血酸,可以用于治疗坏血病。
维C的生产会收到如PH值,温度等因素影响导致变色,变黄。据专业人士分析,影响维C变色的因素里,包装内的氧气含量是至关重要的一点。所以,生产维C大输液产品或是维C小容量注射剂时,控制好包装内的残留氧含量就成为最关键的问题。
很多用户选择使用SYSTECH公司研发的GSM微量顶空残氧仪解决这个问题。
GSM微量顶空分析仪搭载了SYSTECH专利的U型传感器,只需1cc的气体量分析精度就可以达到0.001%,所以可以轻松而准确的测试小容量维C注射液的残氧量。并且SYSTECH还针对小容量注射液测试困难的特点,开发了水针采样的全套简便方法,更加方便了客户的使用。
VC控制 第3篇
关键词:
共焦成像; 扫描控制; VC++开发平台
中图分类号: O 433 文献标识码: A
引 言
共焦显微镜一种是以光学系统的共焦成像为基础,利用光扫描技术对样品进行动态测量的装置,具有很高的分辨力和层析能力[1]。目前,它已成为半导体,微电子器件,陶瓷元件的生产检测和生物学,医学研究珍断的重要工具[2],为开拓新学科和促进各学科领域向更高层次发展起了重要作用。它利用单点成像,从而突破了限制传统光学显微镜的瑞利衍射极限,大幅度提高了成像分辨力,共焦显微镜有很好的层析能力,采用适当的图像处理技术,对样品纵向连续层析,再将二维图像进行重构,可以得到物体的三维图像,其特点是可以对样品进行断层扫描和成像,进行无损伤观察和分析细胞的三维空间结构[3]。共焦显微镜的横向扫描方式起初以单点扫描为主,之后发展为以nipkow盘扫描和微透镜阵列扫描为主的多点并行扫描等阶段[4]。2011年,官志超等人设计了基于DMD共焦显微并行检测系统,该系统光能利用率高,具有高分辨、非接触、速度快和可柔性测量等优点[5]。
综上所述,实验开展了纳米分辨远场光学共焦成像系统研究,其中控制软件的合理设计可提高系统的自动化程度,既节省时间,又能降低人工操作的出错概率。根据系统的界面控制特点,鉴于VC++在Windows界面开发中的优势,采用VC++设计和开发了控制系统的控制程序和操作子系统。软件平台设计如下[6]:
1 系统硬件介绍
1.1 实验原理
纳米分辨远场光学共焦成像系统采用激光作为光源。在传统光学显微镜的基础上采用了共轭聚焦原理和装置。并利用计算机对所观察的对象进行数字图像处理的一整套观测、分析和输出系统。
系统硬件主要包括激光光源、物镜、纳米移动平台、光电倍增管、计算机等。原理如图1所示。共焦系统利用物镜使光束聚焦形成的小光点对样品逐点成像。该系统采用共轭焦点技术,使光源、被测物点、探测器处于彼此对应的共轭位置,光源经物镜在样品表面锐聚焦成衍射限制的斑点,其反射光再次通过物镜或聚光镜在空间滤波器的共焦针孔平面成像,由靠近像面位置的探测器接收光信号。出于焦面以外的光线在成像针孔前和成像针孔后聚焦,使得焦面以外的光信号被大大抑制,极大地提高了共焦显微镜的纵向分辨力,故共焦显微镜具有很好的层析能力;采用适当的图像处理技术,对样品纵向连续层析,再将二维图像进行重构,可以得到物体的三维图像。共聚焦显微镜常见的扫描方式有三种:一是物体移动,而聚焦在被测物上的光点保持不动;二是利用反射镜构成的扫描系统;三是利用声光偏转器。现采用物体移动的扫描方式,将被扫描的物体放置于PI纳米平台中,通过VC++编程控制纳米平台运动,从而带动被扫描物体的运动,再通过计算机进行控制和操作。
1.2 纳米控制平台介绍
现采用的纳米移动控制平台型号为E-517.i3,由两部分组成:控制器和移动平台,如图2所示。控制器通过输出电压信号来控制三维运动平台在XYZ三个方向上的运动,运动的最大幅度为200 μm。其输出有三个通道a、b、c,其中通道a控制X轴的运动,b控制Y轴,c控制Z轴。
PI控制器通过输出电压信号的变化来控制三维运动平台的运动。实验通过RS232口将计算机和控制器相连。为了让三维运动平台按照要求的方式进行扫描运动,实验前需对控制器进行一些初始设置。设置过程的流程图如图3所示。要实现计算机与控制器间的通信,以及对控制器模式的选择主要用到三个函数:
(1)int PI_ConnectRS232 (int iPortNumber,int iBaudRate)
此函数用途是建立计算机与控制器的连接。如果连接成功将返回控制器的ID值;如果连接失败将返-1。参数iPortNumber是一个整形变量,其含义是连接到控制器上的串口的编号。参数iBaudRate是一个整形变量,其含义是所设置的控制器的波特率。
(2)BOOL PI_ONL (long ID,int iPiezoChannels,int pdValarray,int iArraySize)
此函数的用途是设置控制器的控制模式。参数ID就是控制器的ID值,此值是函数PI_ConnectRS232()返回得来的。参数iPiezoChannels是一个整形变量,此变量的含义是选择要设置的控制器的通道,控制器总共有三个通道,其中数字‘1’代表通道1,‘2’代表通道2,‘3’代表通道3。参数pdValarray是一个整形变量,用来设置通道的工作模式,‘0’代表非联机模式,‘1’代表联机模式。参数iArraySize也是一个整形变量,此变量用来显示数组的大小,因为现要同时对三个通道进行控制模式的设置,即将参数iPiezoChannels设置为一个维数为三的整形数组,所以此时此整形变量应设置为常数3。
(3)BOOL PI_SVO (int ID,char szAxes,BOOL pbValueArray)
此函数用来设置控制器的伺服模式。通过此函数,可设置控制器工作在开环模式或闭环模式。参数ID就是控制器的ID值,此值是函数PI_ConnectRS232()返回得来的。参数szAxes是一个字符类型的变量,其值由函数PI_qSAI()返回得来,用来存放被选定的三维纳米平台的运动方向的标识符,其中‘a’代表X轴,‘b’代表Y轴,‘c’代表Z轴。如果返回abc,说明此纳米平台为三维运动平台,能在XYZ三个方向上进行运动。由于所选用纳米平台的类型为三维运动平台,因此当调用函数PI_qSAI()时,将返回abc。参数pbValueArray是一个布尔类型的变量,通过对此变量的设置,可以选择控制器的伺服模式,其中true代表闭环模式,false代表开环模式。
现选择采用联机模式,在调用函数PI_ONL()时只需将参数pdValarray设置为“1”即可。只需调用函数PI_SVO(),并且将参数pbValueArray设置为true即可。初始设置完成以后就可以通过计算机输入命令,控制纳米平台的运动。此时的纳米平台将会在默认的速率下运动,这个默认速率会比要求的速度快或者慢。
2.2 扫描速率设置
扫描速率是指纳米平台从初始位置运动到目标位置的运动速率,它是否合理直接影响实验的最终结果。现必须对纳米平台的扫描速率[7]进行设置,才能在一个合理的范围内找个一到最佳的点,将纳米平台的速率设置在这个点上时,随即得到最理想的实验结果。软件设计的思路如图4所示。
由图4可知,要想对纳米平台的扫描速率进行设置,首先需要打开速率控制模块,只有在速率控制模块打开成功的前提下才能对纳米平台的运动速率进行设置,同时纳米平台为三维运动平台,现必须对三个方向的速率同时进行设置。在此过程中主要用到两个函数PI_VCO()和PI_VEL(),下面分别介绍这两个函数。
(1)BOOL PI_VCO
此函数用来设置速率控制模块“打开”或“关闭”两种状态,当处于“打开”状态时,当前轴将会在所设置速率的状态下运动,参数ID为控制器的ID号,由上文可知,ID号是由函数PI_ConnectRS232()返回得来的。参数szAxes是一个字符类型的变量,用来存放被选定的三维纳米平台的标识符,其中‘a’代表X轴,‘b’代表Y轴,‘c’代表Z轴。参数pbValueArray是一个布尔类型的变量,通过对此变量的设置可以选择速率控制模块的打开或者关闭状态。其中‘true’代表打开状态,‘false’代表关闭状态。
(2)BOOL PI_VEL
此函数用来设置纳米平台的扫描速率,它可以同时对纳米平台在X、Y、Z轴三个方向上的运动速率同时进行设置。参数ID代表控制器的ID号,由上文可知,此ID号是由函数PI_ConnectRS232()返回得来的。参数szAxes是一个字符类型的变量,是用来存放被选定的三维纳米平台运动方向的标识符,其中‘a’代表X轴,‘b’代表Y轴,‘c’代表Z轴。参数PdValueArray是一个双精度类型的变量,此变量是用来接收由对话框所输入的要设置的扫描速率的大小。
通过上面对函数用途和参数的介绍,现只需调用函数PI_VCO(),并且将true送给布尔类型的变量pbValueArray,同时,将由函数PI_ConnectRS232()返回得来的ID和由函数PI_qSAI()返回得来szAxes送给相应的变量,此时速率控制模块便可以成功打开。现还需要调用函数PI_VEL(),并且将由函数GetDlgItemText()和函数atof()从编辑框控件中转化得来的浮点型的数值送给参数pdValueArray,这样纳米平台的扫描速率便可以成功设定。
2.3 运动控制与实时显示
初始设置和扫面速率设置成功完成以后,就可以通过指令控制纳米平台的运动了。首先,在对话框中加入三个编辑框控件,此编辑框控件分别用来接收纳米平台在三个轴方向上将要运动到的目标位置,然后再添加一个按钮控件,在此按钮控件的消息响应函数中加载纳米平台的扫描运动函数PI_MOV(),下面重点介绍这个函数。
BOOL PI_MOV (int ID,char szAxes,double pdValueArray)
此函数的作用是如果所设定的目标位置在纳米平台所能到达的最大幅度之内的话,将驱动纳米平台向着所设定的目标位置运动,此时函数返回‘真’,否则,将返回‘假’。参数ID为控制器的ID号,由上文可知,此ID号是由函数PI_ConnectRS232()返回得来的。参数 szAxes是一个字符类型的变量,是用来存放被选定的三维纳米平台运动方向的标识符,其中‘a’代表X轴,‘b’代表Y轴,‘c’代表Z轴。参数PdValueArray是一个双精度类型的变量,此变量用来接收由对话框所输入的纳米平台所要运动到的目标位置。
BOOL PI_qPOS (int ID,char szAxes,double pdValueArray)
此函数是用来得到纳米平台当前时刻在XYZ三个方向上的位置坐标,并将此位置保存在参数pdValueArray中。参数ID为控制器的ID号,由上文可知,此ID号是由函数PI_ConnectRS232()返回得来的。参数szAxes是一个字符类型的变量,是用来存放被选定的三维纳米平台运动方向的标识符,其中‘a’代表X轴,‘b’代表Y轴,‘c’代表Z轴。参数 pdValueArray是一个双精度类型的变量,此变量用来接收由函数PI_qPOS ()返回的来的纳米平台的当前坐标。
通过对函数PI_qPOS()的介绍可知,此函数来可以得到纳米平台的当前坐标,则只要每隔一个时间段就执行一次这个函数,纳米平台的位置便可以实时动态的显示出来。可以利用CWnd类中SetTimer()这个函数,通过这个函数设置时间间隔的大小,此时间间隔默认单位为ms,若这个函数的回调函数设置为空,将会使用系统默认的onTime()这个回调函数,在ClassWizard里,选择CPi_movefirstDlg类,添加WM_TIME消息映射,就自动生成onTime函数,然后在这个函数中加载函数PI_qPOS(),这样只要设置合理的时间间隔,纳米平台的当前位置便能实时动态的显示到对话框窗口中。
2.4 扫描方式选择
当被观察的物体放置在纳米平台上进行扫描时,总是希望被扫描的物体能够进行有规律的扫描运动,只有这样物体上被扫描的点与光电倍增管上接受到的光信号才有可能吻合起来,从而提高实验的精确度,减少实验误差,进而提高被观测样本的分辨力。现根据纳米平台的运动控制,编写了几种波形,当被测样品固定于纳米平台上时,可根据实际情况选择一种或几种波形做扫描运动。
首先,添加了两个编辑框控件,通过此编辑框控件可以限定被测物体在一个二维(XY)平面上的扫描范围,然后分别设置在X、Y方向上的步距。现有扫描范围和步距,就得到了在此二维平面上被扫描的点数。设置好扫描范围和步距以后,被测的点数就应单直接返回对话框窗口中,接下来就可以选择波形从而使被测物体按照此波形做扫描运动。
操作控制界面整体效果如图5、图6所示,图5左侧主要包括初始设置、图扫描速率设置、目标位置。右侧主要包含实时显示、波形选择。图6为整个实验装置实物图。
3 结 论
文中设计了纳米分辨远场光学共焦成像系统的扫描控制子系统,纳米分辨远场光学共焦成像系统的主要组成器件为纳米移动平台。为了实现成像系统实验的方便快捷,降低出错概率,提高实验效率,鉴于VC++软件丰富的类库和API函数库、界面编制灵活等特点,现采用VC++开发平台设计了扫描控制子系统。该子系统经测试检验,运行正常,使用方便,界面友好,有助于实现纳米分辨远场光学共焦成像系统的自动控制。
参考文献:
[1] 李 楠,王黎明,杨 军.激光共聚焦显微镜的原理和应用[J].解放军进修学院学报,1996,25(9):232-234.
[2] BRAKENHOFF G T.Three dimensional imaging in fluorescence by confocal scanning microscopy[J].Micros,1989,153(2):151-159.
[3] 李 楠,尹 岭,苏振伦.激光扫描共聚焦显微术[M].北京:人民军医出版社,1997:111-114.
[4] XIAO G Q,KING G S.A real-time scanning optical microscope[J].SPIE,1987,809:107-113.
[5] 官志超,张运波,侯文玫.基于数字微镜的共焦显微系统的光路设计[J].光学仪器,2011,33(3):57-61.
[6] 褚福涛,黄 平.基于VC++的GPIB仪器控制库的设计[J].工业控制计算机,2005,18(7):36-37.
基于VC的电源远程控制系统设计 第4篇
1 控制系统设计
MSComm是微软公司提供的简化Windows下串口通讯编程的Active X控件, 可以通过串行端口进行命令的下发和数据的传输, 为上位机软件提供串行通信功能。MSComm控件提供了两种处理通信问题的方法[1]: (1) 事件驱动法; (2) 查询法。事件驱动方式是处理串行端口交互作用的一种非常有效的方法。当某一通信事件或通信错误发生时, 可以通过MSComm控件的On Comm事件捕获并处理这些通信事件。在编程过程中, 就可以在On Comm事件处理函数中加入自己的处理代码。这种方法的优点是程序响应及时, 可靠性高。查询方式实际上还是事件驱动, 可以通过检查Comm Event属性的值来查询事件和错误。本设计采用事件驱动法来实现串口通信。
图1为该电源远程控制系统的设计原理, PC机通过9针RS232串口线与HMP系列直流电源相连接, 上位机的人机交互界面下发命令给电源端口, 经过电源端的命令译码模块对命令进行解析, 进而控制电源。
1.1 RS232接口
在PC机和电源之间进行串行通讯时, 需要通讯双方均使用同一种标准接口, 以便不同的2个设备连接起来通讯。PC机和电源均带有9引脚的RS232通讯接口, 并且具有较高的性价比和传输的可靠性, 因此本设计采用了RS232串口线连接。
9针引脚的RS232接口如图2所示, 其各引脚说明如表1所示[2]。
1.2 MSComm控件
MSComm控件的属性有很重要的作用, 本文介绍几种常见的属性。Comm Port设置并返回通讯端口号;Settings以字符串的形式设置并返回波特率、奇偶校验、数据位、停止位;Port Open用于打开或关闭串口, 也可以返回串口的开、关状态;Input从接收缓冲区读取数据, 返回数据类型为VARIANT型变量, 该属性在串口没有打开时不能用, 在运行时是只读的;Output向发送缓冲区写数据, 或返回发送缓冲区当前的数据, 该属性可以发送文本或二进制数据[3]。用MSComm控件进行串口编程的流程如图3所示。
1.2.1 串口初始化
在函数CPower Dlg::On Comopen () 添加通讯串口的初始化语句, 设置变量m_ctrl_CMSComm Comm与IDC_MSCOMM的CMSComm控件相关联, 可以通过变量m_ctrl_CMSComm Comm改变串口控件的属性。核心代码如下无关代码将被”……”省略。
其中整型变量mycom和字符型变量my Baud Rate值是通过串口设置界面的组合框选择的结果, 默认情况下mycom选择COM1, my Baud Rate选择9600。
1.2.2 消息处理函数
由串口初始化中m_ctrl_CMSCommComm.Set RThreshold (1) 可知, 接收缓冲区大于等于一个字符, 触发On Comm事件, 利用Class Wizard可以完成串口消息处理函数On Comm () 的添加。
消息处理函数功能主要是从串口接收数据并显示在接收编辑框中。
1.3 控制界面设计
打开电源远程控制软件后出现的主要操作界面如图4所示, 可由此界面进行串口设置、遥控模式、参数设置、发送命令、显示输出状态等操作。
串口的设置:插入串口设置对话框, 在对话框中加入通信端口号和波特率2个组合框供用户选择, 默认情况下通信端口号为COM1, 波特率为9600。只有进行了串口设置才能打开串口。
遥控模式:用户只有选择遥控模式, PC机才能对直流电源进行远程控制。点击遥控/复位按钮给电源下发SYSTem:REMote命令, 只能进行PC机远程操作, 电源前面板按键操作被锁死, 避免远程控制模式下其他人员按键操作。复位模式下发*RST命令, 对电源进行复位清零操作。
参数设置:用户可以对HMP系列电源的输出通道进行选择, 输出电压、限制电流设置。电压的输入范围为0~32V, 电流输入范围0~10A, 同时对超出160W输出功率进行软保护, 提高了电源输出保护级别。
发送命令:HMP系列电源采用SCPI (Standard Commands for Programmable Instruments) 程控命令进行远程控制, 为了避免通信错误产生, 用户需要逐条发送命令, 命令之间用换行符n隔开。若设置通道1的电压为2V, 最大电流0.5A, 则命令为“INST OUT1n”“VOLT 2n”“CURR0.500n”“OUTP ONn”。若读取通道1的实际输出电压电流值, 则命令为“INST OUT1n”“MEAS:CURR?n”“MEAS:VOLT?n”。
显示输出状态:通过下发读取输出电压电流命令, 采集数值并在编辑框中显示, 完成了实时监控功能。
为了保证电源远程控制软件的正常运行, 首先需要进行串口设置再将其打开, 然后选择遥控模式, 最后进行电源通道的选择和电压电流的设置, 输出电源, 同时可以发送查询命令进行输出状态的显示, 如图5所示。
2 软件测试
测试的目的是观察上位机的远程控制系统能否在遥控模式下对电源的输出进行控制并通过命令采集输出状态和显示。根据要求将PC机通过RS232串口线与HMP系列电源相连接, 将电源的1, 2通道接上负载, 打开电源按钮同时打开远程控制软件。设置串口将其打开, 在遥控模式下选择4个通道进行电压电流的设置并输出电源, 发送通道状态查询命令“OUTP:SEL ONn”“MEAS:VOLT?n”“MEAS:CURR?n”, 测试结果如图5所示。由于通道3, 4没有加负载, 采集到的电流显示为0, 此远程控制系统达到了理想的效果, 实现了对电源的实时监控。
3 结语
电源远程控制系统使用VC++6.0中的MSComm控件, 设计了计算机和HMP系列电源的串口通讯程序, 实现了对可编程直流电源的控制, 同时结合功率过载软保护保证了电源输出的安全性。本系统将电源前面板的英文按键转换为人机交互界面的中文化, 使用户操作简单, 对电源实验使用具有积极的意义。
摘要:针对德国HAMEG系列多通道电源, 文章设计了基于RS-232和VC++6.0的电源远程控制系统用于电源管理。该软件将控制指令中文化、组合化用于人机交互。通过MSComm通信控件实现电源和计算机间的数据通信和实时监控, 采用了内部控制算法和实时对话机制, 对各路电源提供软保护, 减少误操作。测试表明, 该设计可以实现该系列电源的有效控制, 而且方便用户使用, 有效避免电源硬按钮失灵。
关键词:多通道电源,串口通信,人机交互,实时监控
参考文献
[1]杨平, 彭道刚, 张世玺, 等.用VC++6.0实现工控机与数字万用表的串行通信[J].计算机应用, 2003 (S2) :227-228, 241.
[2]葛磊蛟, 毛一之, 李歧, 等.基于C语言的RS232串行接口通信实现[J].河北工业大学学报, 2008 (6) :11-16.
VC调试篇 第5篇
我以前接触的程序大多是有比较成形的思路和方法,调试起来出的问题都比较小,最近这个是我自己慢慢摸索调试,接触了很多新的调试方法,并查了很多前辈的总结,受益匪浅,总结以前的和新的收获如下:
VC调试篇
设置
为了调试一个程序,首先必须使程序中包含调试信息。一般情况下,一个从AppWizard创建的工程中包含的Debug Configuration自动包含调试信息,但是是不是Debug版本并不是程序包含调试信息的决定因素,程序设计者可以在任意的Configuration中增加调试信息,包括Release版本。
为了增加调试信息,可以按照下述步骤进行:
打开Project settings对话框(可以通过快捷键ALT+F7打开,也可以通过IDE菜单Project/Settings打开)
选择C/C++页,Category中选择general,则出现一个Debug Info下拉列表框,可供选择的调试信息方式包括:
命令行
Project settings
说明
无
None
没有调试信息
/Zd
Line Numbers Only
目标文件或者可执行文件中只包含全局和导出符号以及代码行信息,不包含符号调试信息
/Z7
C 7.0- Compatible
目标文件或者可执行文件中包含行号和所有符号调试信息,包括变量名及类型,函数及原型等
/Zi
Program Database
创建一个程序库(PDB),包括类型信息和符号调试信息。
/ZI
Program Database for Edit and Continue
除了前面/Zi的功能外,这个选项允许对代码进行调试过程中的修改和继续执行。这个选项同时使#pragma设置的优化功能无效
选择Link页,选中复选框“Generate Debug Info”,这个选项将使连接器把调试信息写进可执行文件和DLL
如果C/C++页中设置了Program Database以上的选项,则Link incrementally可以选择。选中这个选项,将使程序可以在上一次编译的基础上被编译(即增量编译),而不必每次都从头开始编译。
调试方法:
1、使用Assert(原则:尽量简单)assert只在debug下生效,release下不会被编译。
2、防御性的编程
3、使用Trace
4、用GetLastError来检测返回值,通过得到错误代码来分析错误原因
5、把错误信息记录到文件中
位置断点(Location Breakpoint)
大家最常用的断点是普通的位置断点,在源程序的某一行按F9就设置了一个位置断点。但对于很多问题,这种朴素的断点作用有限。譬如下面这段代码:
void CForDebugDlg::OnOK
{
for (int i = 0; i < 1000; i++)//A
{
int k = i * 10 - 2;//B
SendTo(k);//C
int tmp = DoSome(i);//D
int j = i / tmp;//E
}
}
执行此函数,程序崩溃于E行,发现此时tmp为0,假设tmp本不应该为0,怎么这个时候为0呢?所以最好能够跟踪此次循环时DoSome函数是如何运行的,但由于是在循环体内,如果在E行设置断点,可能需要按F5(GO)许多次。这样手要不停的按,很痛苦。使用VC6断点修饰条件就可以轻易解决此问题。步骤如下。
1 Ctrl+B打开断点设置框,如下图:
Figure 1设置高级位置断点
2然后选择D行所在的断点,然后点击condition按钮,在弹出对话框的最下面一个编辑框中输入一个很大数目,具体视应用而定,这里1000就够了。
3按F5重新运行程序,程序中断。Ctrl+B打开断点框,发现此断点后跟随一串说明:...487 times remaining。意思是还剩下487次没有执行,那就是说执行到513(1000-487)次时候出错的。因此,我们按步骤2所讲,更改此断点的skip次数,将1000改为513。
4再次重新运行程序,程序执行了513次循环,然后自动停在断点处。这时,我们就可以仔细查看DoSome是如何返回0的。这样,你就避免了手指的痛苦,节省了时间。
再看位置断点其他修饰条件。如Figure 1所示,在“Enter the expression to be evaluated:”下面,可以输入一些条件,当这些条件满足时,断点才启动。譬如,刚才的程序,我们需要i为100时程序停下来,我们就可以输入在编辑框中输入“i==100”。
另外,如果在此编辑框中如果只输入变量名称,则变量发生改变时,断点才会启动。这对检测一个变量何时被修改很方便,特别对一些大程序。
用好位置断点的修饰条件,可以大大方便解决某些问题。
数据断点(Data Breakpoint)
软件调试过程中,有时会发现一些数据会莫名其妙的被修改掉(如一些数组的越界写导致覆盖了另外的变量),找出何处代码导致这块内存被更改是一件棘手的事情(如果没有调试器的帮助)。恰当运用数据断点可以快速帮你定位何时何处这个数据被修改。譬如下面一段程序:
#include “stdafx.h”
#include
int main(int argc, char* argv[])
{
char szName1[10];
char szName2[4];
strcpy(szName1,“shenzhen”);
printf(“%s”, szName1);//A
strcpy(szName2, “vckbase”);//B
printf(“%s”, szName1);
printf(“%s”, szName2);
return 0;
}
这段程序的输出是
szName1: shenzhen
szName1: ase
szName2: vckbase
szName1何时被修改呢?因为没有明显的修改szName1代码。我们可以首先在A行设置普通断点,F5运行程序,程序停在A行。然后我们再设置一个数据断点。如下图:
Figure 2数据断点
F5继续运行,程序停在B行,说明B处代码修改了szName1。B处明明没有修改szName1呀?但调试器指明是这一行,一般不会错,所以还是静下心来看看程序,哦,你发现了:szName2只有4个字节,而strcpy了7个字节,所以覆写了szName1,
数据断点不只是对变量改变有效,还可以设置变量是否等于某个值。譬如,你可以将Figure 2中红圈处改为条件”szName2[0]==“”“”y“”“”“,那么当szName2第一个字符为y时断点就会启动。
可以看出,数据断点相对位置断点一个很大的区别是不用明确指明在哪一行代码设置断点。
其他调试手段:系统提供一系列特殊的函数或者宏来处理Debug版本相关的信息,如下:
宏名/函数名
说明
TRACE
使用方法和printf完全一致,他在output框中输出调试信息
ASSERT
它接收一个表达式,如果这个表达式为TRUE,则无动作,否则中断当前程序执行。对于系统中出现这个宏 导致的中断,应该认为你的函数调用未能满足系统的调用此函数的前提条件。例如,对于一个还没有创建的窗口调用SetWindowText等。
VERIFY
和ASSERT功能类似,所不同的是,在Release版本中,ASSERT不计算输入的表达式的值,而VERIFY计算表达式的值。
值
Watch
VC支持查看变量、表达式和内存的值。所有这些观察都必须是在断点中断的情况下进行。
观看变量的值最简单,当断点到达时,把光标移动到这个变量上,停留一会就可以看到变量的值。
VC提供一种被成为Watch的机制来观看变量和表达式的值。在断点状态下,在变量上单击右键,选择Quick Watch,就弹出一个对话框,显示这个变量的值。
单击Debug工具条上的Watch按钮,就出现一个Watch视图(Watch1,Watch2,Watch3,Watch4),在该视图中输入变量或者表达式,就可以观察变量或者表达式的值。注意:这个表达式不能有副作用,例如++运算符绝对禁止用于这个表达式中,因为这个运算符将修改变量的值,导致软件的逻辑被破坏。
Memory
由于指针指向的数组,Watch只能显示第一个元素的值。为了显示数组的后续内容,或者要显示一片内存的内容,可以使用memory功能。在Debug工具条上点memory按钮,就弹出一个对话框,在其中输入地址,就可以显示该地址指向的内存的内容。
Varibles
Debug工具条上的Varibles按钮弹出一个框,显示所有当前执行上下文中可见的变量的值。特别是当前指令涉及的变量,以红色显示。
寄存器
Debug工具条上的Reigsters按钮弹出一个框,显示当前的所有寄存器的值。
调试技巧:
1、VC++中F5进行调试运行
a)、在output Debug窗口中可以看到用TRACE打印的信息
b)、Call Stack窗口中能看到程序的调用堆栈
2、当Debug版本运行时发生崩溃,选择retry进行调试,通过看Call Stack分析出错的位置及原因
3、使用映射文件调试
a)、创建映射文件:Project settings中link项,选中Generate mapfile,输出程序代码地址:/MAPINFO: LINES,得到引出序号:/MAPINFO: EXPORTS。
b)、程序发布时,应该把所有模块的映射文件都存档。
c)、查看映射文件:见” 通过崩溃地址找出源代码的出错行”文件。
4、可以调试的Release版本
Project settings中C++项的Debug Info选择为Program Database,Link项的Debug中选择Debug Info和Microsoft format。
5、查看API的错误码,在watch窗口输入@err可以查看或者@err,hr,其中”,hr”表示错误码的说明。
6、Set Next Statement:该功能可以直接跳转到指定的代码行执行,一般用来测试异常处理的代码。
7、调试内存变量的变化:当内存发生变化时停下来。???
进程控制
VC允许被中断的程序继续运行、单步运行和运行到指定光标处,分别对应快捷键F5、F10/F11和CTRL+F10。各个快捷键功能如下:
快捷键
说明
F5
调试/继续运行
F10
单步,如果涉及到子函数,不进入子函数内部
F11
单步,如果涉及到子函数,进入子函数内部
CTRL+F10
运行到当前光标处。
F7
重建
F9
设置断点/清除断点
Ctrl+Shift+F9
清除所有断点
Shift+F5
结束调试
Call Stack
调用堆栈反映了当前断点处函数是被那些函数按照什么顺序调用的。单击Debug工具条上的Call stack就显示Call Stack对话框。在CallStack对话框中显示了一个调用系列,最上面的是当前函数,往下依次是调用函数的上级函数。单击这些函数名可以跳到对应的函数中去。
关注
一个好的程序员不应该把所有的判断交给编译器和调试器,应该在程序中自己加以程序保护和错误定位,具体措施包括:
对于所有有返回值的函数,都应该检查返回值,除非你确信这个函数调用绝对不会出错,或者不关心它是否出错。
一些函数返回错误,需要用其他函数获得错误的具体信息。例如accept返回INVALID_SOCKET表示accept失败,为了查明具体的失败原因,应该立刻用WSAGetLastError获得错误码,并针对性的解决问题。
有些函数通过异常机制抛出错误,应该用TRY-CATCH语句来检查错误
程序员对于能处理的错误,应该自己在底层处理,对于不能处理的,应该报告给用户让他们决定怎么处理。如果程序出了异常,却不对返回值和其他机制返回的错误信息进行判断,只能是加大了找错误的难度。
另外:VC中要编制程序不应该一开始就写cpp/h文件,而应该首先创建一个合适的工程。因为只有这样,VC才能选择合适的编译、连接选项。对于加入到工程中的cpp文件,应该检查是否在第一行显式的包含stdafx.h头文件,这是Microsoft Visual Studio为了加快编译速度而设置的预编译头文件。在这个#include “stdafx.h”行前面的所有代码将被忽略,所以其他头文件应该在这一行后面被包含。
对于.c文件,由于不能包含stdafx.h,因此可以通过Project settings把它的预编译头设置为“不使用”,方法是:
弹出Project settings对话框
选择C/C++
Category选择Precompilation Header
选择不使用预编译头。
便于调试的代码风格:
不用全局变量
所有变量都要初始化,成员变量在构造函数中初始化
尽量使用const
详尽的注释
总结
调试最重要的还是你要思考,要猜测你的程序可能出错的地方,然后运用你的调试器来证实你的猜测。
徐新:再创VC 第6篇
本月劲爆:
2004年12月31日,是徐新在霸菱亚洲投资基金董事总经理和中国区总裁任职的最后一天。
2005年,对于这位被美国《商业周刊》评为亚洲25位最具有影响力的VC之一的“铁娘子”有了一个新的计划:自己寻找合伙人组建一个新的风险投资公司,然后准备从LP的手中募集到两亿美元的资金,关于这部分资金的使用,她现在已经有了一个明确的投资方向,就是投资中国内地的制造业,消费领域等。
徐新对自己运作资金的能力显得非常自信;快速的语速,让人无法质疑的论点,都成为她屡屡说服别人的必杀武器,但是她和其他的VC一样,更注重实际的投资回报而不是“看谁更能讲故事”。
在霸菱vc徐新工作了近7年,并一直负责该基金在中国的投资业务:先后在中国内地投资9家公司,现在已经有5家公司实现退出,并取得以6800万美元的投入获得1.21亿美元的收益成绩,随后的几家被投公司目前也发展得不错。
但是,这些成功的案例并没有让徐新满足。她期待着在2005年自己主导运作的风险投资基金中再次刷新投资回报的纪录。
贾志强另类VC
让所有的员工都过上好日子,是第一个企业老总的期望,吉富VC在短短的半年时间就实现了这个初步的设想。从这家风险投资公司的资金构成上看,贾志强更像是财富的代言人。
本月劲爆:
贾志强带领的深圳吉富创业投资公司(简称吉富VC)也许是最近在深圳市创业投资同业公会通过审核最为特殊的VC。
2004年1月21日,吉富VC与广发证券工会签订协议,后者将所持有的8429.18万股辽宁成大股权,以6327.87万元的价格转让给前者。这笔交易为吉富VC的账面贡献的利润不菲:截至辽宁成大第三季度财务报表显示,该公司每股净资产为2.3元,吉富VC收购辽宁成大的第股价格却仅为0.75元,相当于辽宁成大每股净资产的三分之一,仅这一笔交易,就为这个成立不到半年的吉富VC带来了上亿元的收入。
天上难有掉馅饼的好事,为何惟独砸中吉富VC?
从有关资料上显示,吉富VC注册资本为2.48亿元,共有2126名自然人股东,其前三名股东分别为广发证券总裁董正青,出资800万元,广发证券董事长王志伟出资430万元,广发证券副总裁李建勇出资318.8万元,前十大股东共计持有11.3%的股份。
据广发证券有关人士介绍,深圳吉富是在整个广发系统的员工中集资发起的,包括广发证券、广发华福、广发北方、广发基金及广发期货在内的5家公司的员工,均可认购深圳吉富的股份。当初,贾志强等原广发证券老员工在2004年8月份仓促成立的这家创业投资公司的目的就是为了和中信证券争夺广发证券的控股权,如今,中信证券早已偃旗息鼓,深圳吉富却仍然在证券市场并且越战越勇。
VC控制 第7篇
通用性和开放性作为一项重要指标业已渗透到工业生产与科学研究的各个领域中, 而传统的运动控制系统主要存在体系独立和结构封闭的缺陷。设计者一般采用专用计算机、专用编程语言与操作系统、专用微处理器的封闭式体系结构。这种结构存在制造和使用成本高, 开发周期长, 升级换代困难, 无法添加系统的新功能等一系列缺点[4]。因此, 如何构建开放式运动控制系统的软硬件系统成为工业界和学术界所研究的一大热点。
近年来, 机器人系统在各类工业生产中得到了广泛运用, 对提高生产效率与自动化程度发挥出重要作用。而并联机器人作为一类全新的机器人与传统的串联机器人在概念和用途上形成了互补, 并且该机构能够实现运动轨迹、运动速度、定位以及重复定位的高精度精确控制的要求, 故在精密加工和制造业中具有举足轻重的作用, 因此已成为控制科学领域与精密加工应用领域中一个很有意义的研究方向。本文所研究的控制系统以六自由度并联机构本体为对象, 采用PC/104总线工控机为上位机, PMAC2A-PC104运动控制器作为下位机, 以VC++开发工具实现机器人各控制模块的软件设计, 从而完成控制目标任务的要求。因此本文将基于本系统的硬件体系结构, 按开放性和系统稳定性要求开发出控制软件来实现高精度精密加工的目标。
2 并联机器人系统硬件结构
本机器人系统采用两级计算机系统的结构, 系统结构如图1所示。其硬件配置为:
上位机采用研华嵌入式PC/104工控机 (IPC) , 下位机采用Delta T a u的开放式可编程多轴运动控制器P M A C。P M A C是一种非常灵活的高性能运动控制器, 具有实时性强、稳定性好、效率高等优点, 用来与上下层系统进行数据通信和控制信号的交互。它是整个控制系统的核心。而工控机具有运行速度快、存储量大、应用灵活的优点[4]。正是由于采用了两级计算机控制系统, 故就能充分利用各自的特点, 发挥出各自的优越性来协调系统的整体稳定性。
并联机器人控制系统的体系结构中, 上位机的主要作用是:基于人机交互, 完成目标任务相关的数据输入、参数设定、路径规划、任务指定以及任务决策等工作。PMAC运动控制器主要用于对伺服更新的在线计算以及目标轨迹的生成, 反映出并联机器人各轴电机的实时状态, 响应上位机的执行命令。
3 并联机器人控制软件设计
3.1 软件设计总体方案
由于本系统软件是建立在Windows操作系统之上, 故具备了多线程协调处理的能力, 能及时应对并联机器人在运行中出现的各种状况, 并对出现的状况作出相应的处理。作为上层软件的可执行32位Windows应用程序, 通过调用PMAC自带的通讯模块PComm32与PMAC的内核程序进行通讯, 再由上位机软件灵活调用运动控制的各种函数, 以此来监控机器人的各种工况。PComm32是一个非常有效的开发工具, 几乎囊括了所有与PMAC通讯的方法, 并且与VC++开发软件有很好的兼容性。它由PMAC.DLL、PMAC.SYS和PMAC.VXD 3个文件组成, 共包含了250多个函数[3]。上位机与运动控制器的内核驱动程序的关系如图2所示。
开放式控制软件系统一般采用模块化的思想来设计, 在此以典型的运动轨迹和基本的机械加工功能要求来编制软件。软件开发中主要用到VC++的动态链接库以及多线程的编程方法来实现。软件的整体设计框架为图3所示。
3.2 控制软件的具体设计[3]
3.2.1 编程准备
(1) 首先将运动控制器插入工控机的PCI插槽中并安装好驱动程序。
(2) 安装运动控制器的测试程序并且调试坐标系中各轴伺服电机。具体调试界面如图4所示。
3.2.2 PMAC内核程序设计
在成功安装了运动器后, 就需编写与控制目标和任务相应的PMAC内核运动程序。PMAC能够支持多达256个运动程序[3], 这体现了P M A C强大的伺服功能。首先按P M A C的指令设置坐标系, P M A C中的坐标系是指一个或者一组为了同步的目的而组织起来的电机, 然后通过轴定义语句为电机分配轴来建立坐标系。坐标系在任何时候都可以按要求执行程序中的任意一个。其次根据所需运动要求来选择适当的运动指令, 然后按照P M A C语法编写运动程序, 下载到PMAC内存后运行。并联机器人的P M A C运动程序如下:
控制系统功能设置 (Setting up and Definition) [6]
当设置好了运动程序后, 就须利用PMAC的在线命令语句来设置运功程序所要求的各种变量参数。可在图4所示软件中反复调试Ix30-Ix35 (x=1~6轴) , Ix87-Ix88 (x=1~6轴) 的参数来精确调节机器人各轴电机的运动效果。调试界面如图4所示。
3.2.3 相关运动控制器接口函数的说明
开放式运动控制器最大的优点是该运动控制器为用户提供了相关不同分类的接口函数, 用户在软件编制过程中可以依据相关要求灵活调用。本系统中用到的常用函数为
(1) BOOL Open Pmac Device (DWORD dw Device)
此函数为应用程序使用PMAC打开了一个通道。应用的前提是已经安装调试好动态链接库, 并且PMAC已经在这个操作环境下注册完毕, 能够有效地寻址。其参数dw Device为希望打开的设备号, 一般为0。返回值为T R U E则表示连接成功。
(2) BOOL Close Pmac Device (DWORD dw Device)
当程序运行完毕, 必须关闭所打开的通道, 此函数就是实现这个功能。参数及返回值意义与打开通道函数Open Pmac Device () 相同, 且必须与Open Pmac Device () 配对使用。
(3) BOOL Pmac Configure (HWNDhwnd, DWORDdw Device)
该函数可以设置PMAC与上位机的通讯方式:总线通讯或者串行口通讯。当第一次安装PMAC或者P M A C跳线地址发生改变的时候, 必须调用该函数设置P M A C的通讯方式和总线地址。
(4) Pmac Send Line (LPCTSTR outstr)
该函数作用是给PMAC发送指令, 参数Outstr为发送给PMAC的指令字符串。
(5) Pmac Get Response (DWORD dw Device, LPTSTR s, UINT maxchar, LPCTSTR outstr)
该函数的作用为向PMAC卡发送请求/命令, 并接收PMAC的响应放入用户响应缓冲区。参数意义为:dw Device是设备号;s为响应缓冲区;maxchar代表接收最大字符数;outstr是发送给PMAC的指令字符串。
4 控制软件的实验及其分析
上文已建立了坐标系, 设置了坐标系内的轴以及匹配好了各轴的电机, 亦依据目标任务编写好了P M A C运动程序。就可以依据相关的要求编写上位机程序来实现并联机器人作业的目的。在此以机械制造中斜面加工的实验来证实此控制软件设计的实用性。
(1) 利用VC++中MFC的类库设计加工要求所需的用户界面。将P M A C运动控制器所提供的基本运动函数类以及动态链接库函数隐式调用到软件工程中, 将config.ini, mac2ssp2v101.dll, config.pmc等文件与本文所编写的Parallel Robot.dll文件放在同一目录下。
(2) 在建立好了主程序工程后, 再在V C集成环境中点击“/project/settings...”菜单弹出“project settings”对话框。选“Link”选项卡, 在“object/library modules”栏中导入刚生成的链接库函数文件名Parallel Robot.lib后, 再在主工程实现文件中添加头文件Parallel Robot.h该头文件是运动控制器的相关运动函数的声明。
(3) 软件程序中对运动控制器的初始化:在程序的开始必须调用运动控制器的初始化函数, 只有在调用初始化函数成功后才能进行卡内封装运动函数的调用。
在本实验中, 由于斜面加工的实验中要保持并联机器人末端铣刀与垂直方向成α角度的姿态 (这里α=30度) , 沿被加工物件的一个面方向运动, 用旋转铣刀铣去金属零件的棱, 这样就能铣出一个α为30度的斜面。设计能够实现并联机器人控制的目的, 能够达到斜面加工的作业要求。
5 结论
本文依据并联机器人开放式的硬件结构, 充分利用上位工控机的多任务协调工作的性能和开放式运动控制器的强大运动功能, 设计出符合要求的软件系统。实验证明所设计的软件具备良好的稳定性和广泛的应用性, 能进行系统升级和移植, 为开放式运动控制系统的运用提供了参考。
摘要:结合IPC+PMAC+SERVOMOTER的层次结构, 开发出一种六自由度并联机器人的控制软件。采用VC++编程开发工具, 利用开放式运动控制器PMAC的强大功能, 所设计的软件满足并联机器人高实时性, 高精度的运动控制要求, 体现出开放性的特点。实验进一步验证了整个控制软件的可靠性与稳定性。
关键词:PMAC,并联机器人,开放式结构,控制软件设计,Visual C++
参考文献
[1]范永, 谭民.机器人控制器的现状及展[J].机器人Robot, 1999 (21) .
[2]Delta Tau Data system Inc.PMACUSER’SMANUAL, 2003.
VC控制 第8篇
信号采集系统由高速宽带电压传感器、电流传感器和高速数据采集卡组成, 对产品输入、输出电量进行检测, 被测电压电流或频率信号经传感器进入模拟量输入卡, 通过软件测得。
1.1 传感器测量
模拟信号通过电量传感器测得, 电量传感器在选型过程中要考虑的因素很多, 例如, 线性范围、响应时间、输入阻抗、负载能力、隔离耐压、温度漂移和环境条件等等, 但实际工作中最重要的几个因素有精度范围、输入电压范围、输出电压范围和电源模块, 本数据采集系统要求精度达到0.2级, 输入电压范围要根据所要测量的电压电流的范围来确定, 一般情况下应该留有一定的余度, 输出电压范围要根据数据采集卡的输入电压范围来确定。
试验用交流信号源的频率变化为300-800Hz, 电压变化范围0-10V, 频率和电压变化范围都比较大, 而且两者同时变化, 一般测量有效值的传感器无法进行准确有效地测量其电压和频率, 因此选用跟踪式交流电压传感器, 下面将讲述如何利用跟踪测量的电压值软件获得被测交流信号的频率, 所选跟踪电压传感器输出也是与其输入形状相同的正弦信号, 但幅值在0-5V范围内, 主要思路为过零检测法, 考虑到干扰, 为上下设置阈值, 以提高抗干扰性能, 使测量更加准确 (图1) 。
实现代码如下:
1.2 数据采集卡实验
模拟量输入卡可直接插入具备PCI插槽的工控机或个人微机, 构成模拟量信号采集系统。为了保证模拟量输入卡能够正常采集数据, 每个通道都必须经过严格的测试, 测试方法为给该通道输入一个标准电压信号, 在VC++6.0环境下隔0.1秒钟采集一次电压值, 并将此电压绘在界面上, 之后每半秒钟采集一个数据并将其与上一个点连接起来, 最后看画出的波形是不是正弦波, 当然时间间隔越短, 画出的波形越精确。采集卡初始化程序为:
用信号发生器产生正弦波信号, 接入模拟量输入卡的通道0, 运行测试程序, 如图2所示。在界面上显示出所接入的通道号为0, 增益设置为0, 每隔0.1s采样, 采得的波形如图中所示, 基本上是一个标准的正弦波。当然由于干扰存在一定的误差, 但至少可以说明采集卡测试通过。切换通道继续试验, 测试各个通道是否能够正常采集。
2 模拟数字表盘的实现
系统要求用户界面图形化, 直观清晰, 易操作, 界面上的模拟表盘要实时显示相应的电量值, Visual C++6.0自带的控件很难实现这样的功能, 必须通过自绘表盘类来实现。数字表盘用一个编辑框配以黑底绿字来完成, 模拟表盘的实现比较复杂, 表盘的绘制面临弧形边缘绘制、指针的绘制和刷新、刻度绘制等问题。
弧形边缘的绘制使用画圆弧函数啊arc () 来实现, 其功能是使用当前绘图色用实线画一圆弧, 函数调用方式为:
void arc (int x, int y, int startangle, int endangle, int radius) ;定义中, 参数x, y为圆心坐标, startangle和endangle为起始角和终止角, radius为半径, 该函数可以画一个整圆或者任意角度的圆弧。
指针的绘制是根据当前的数值计算转过的角度, 并根据此角度计算指针的顶坐标和底坐标绘制出当前指针位置从而刷新指针指向, 计算方法如下:
dTemp=m_ptMeterCenter.x+m_nRadiusFrame*cos (dAngleRad) *95/100;
pointNeedle[1].x=ROUND (dTemp) ;//计算横坐标并四舍五入
dTemp=m_ptMeterCenter.y-m_nRadiusFrame*sin (dAngleRad) *95/100;
pointNeedle[1].y=ROUND (dTemp) ;//计算纵坐标并四舍五入
刻度分为主刻度和子刻度, 绘制方法为从外圆向内圆计算坐标并画线而成, 主要代码为:
表盘运行后效果图如图3所示。
3 软件延时
在飞机电源控制器试验台中常常需要计算延时时间, VC++有几种实现延时计算的方法, 测试流程中根据项目要求来确定使用何种方法定时, 各自实现方法如下:
方法一:WM_TIMER消息映射能进行简单的时间控制。首先调用函数SetTimer () 设置定时间隔, 如SetTimer (0, 200, NULL) 即为设置200ms的时间间隔。然后在应用程序中增加定时响应函数OnTimer () , 并在该函数中添加相应的处理语句, 用来完成到达定时时间的操作。这种定时方法可以实现一定的定时功能, 但其定时功能如同Sleep () 函数的延时功能一样, 精度非常低, 最小计时精度仅为30ms, CPU占用低, 且定时器消息在多任务操作系统中的优先级很低, 不能得到及时响应, 往往不能满足实时控制环境下的应用, 仅可以用来实现诸如位图的动态显示等对定时精度要求不高的情况。
方法二:使用Sleep () 函数可以实现延时, 它的单位是ms, 如延时2秒, 用Sleep (2000) , 精度非常低, 最小计时精度仅为30ms, 用Sleep函数的不利之处在于延时期间不能处理其他的消息, 如果时间太长, 如同死机一样, CPU占用率非常高, 只能用于要求不高的延时程序中。
方法三:在精度要求较高的情况下, 可以利用GetTickCount () 函数, 该函数的返回值是DWORD型, 表示以ms为单位的计算机启动后经历的时间间隔, 精度比WM_TIMER消息映射高, 在较短的定时中其计时误差为15ms, 在较长的定时中其计时误差较低, 如果定时时间太长, 也像死机一样, CPU占用率非常高, 只能用于要求不高的延时程序中。下列代码可以实现50ms的精确定时:
虽然这样可以降低CPU的占有率, 并在延时或定时期间也能处理其他的消息, 但降低了延时或定时精度。
方法四:对于精确度要求更高的定时操作, 则应该使用QueryPerformanceFrequency () 和QueryPerformanceCounter () 函数。这两个函数是VC提供的仅供Windows 95及其后续版本使用的精确时间函数, 并要求计算机从硬件上支持精确定时器。
QueryPerformanceFrequency () 函数和QueryPerformanceCounter (函) 数的原型为:
BOOL QueryPerformanceFrequency (LARGE_INTEGER*lpFrequency) ;
BOOL QueryPerformanceCounter (LARGE_INTEGER*lpCount) ;
数据类型LARGE_INTEGER既可以是一个8字节长的整型数, 也可以是两个4字节长的整型数的联合结构, 其具体用法根据编译器是否支持64位而定。该类型的定义如下:|
在进行定时之前, 先调用QueryPerformanceFrequency () 函数获得机器内部定时器的时钟频率, 然后在需要严格定时的事件发生之前和之后分别调用QueryPerformanceCounter () 函数, 利用两次获得的计数之差及时钟频率, 计算出事件经历的精确时间。下列代码实现1微秒的精确定时:
LARGE_INTEGER litmp;
LONGLONG QPart1, QPart2;
double dfMinus, dfFreq, dfTim;
QueryPerformanceFrequency (&litmp) ;
dfFreq= (double) litmp.QuadPart;//获得计数器的时钟频率
QueryPerformanceCounter (&litmp) ;
QPart1=litmp.QuadPart;//获得初始值
其定时误差一般不超过0.5微秒, 精度与CPU等机器配置有关。
4 数据库管理
测试软件使用MFC的ODBC类实现数据库管理设计。
Access数据库是目前应用最广泛的数据库之一, 创建一个Access数据库, 新建数据表, 设计数据表的结构, 数据库管理界面的数据显示区可以将数据库结构和内容显示出来, 可以看到字段名称有编号、测试日期、产品型号、产品序号、测试人、试验编号以及所有测试参数等, 数据库操作有数据查询浏览、添加、修改、删除, 左下角可以通过测试日期或产品序号来查找相关的数据记录, 右下角按钮可以删除单条或者所有记录。
数据库查询的sql语句为:
CString m_SearchObject1="测试日期";
sqlsearch1="2008-11-18";
SearchConditions=m_SearchObject1+"='"+sqlsearch1+"'";
m_Data71.m_strFilter=SearchConditions;//m_Data71是KZH-
71数据库的类对象
//在KZH-71数据库表中查询2008年11月18日的所有数据记录
数据库记录添加代码如下:
5 数据报表打印
试验台实现了从数据库中取出所需数据然后打印在报表相应位置, 在OnDraw函数中添加代码如下:
6 结束语
本文给出了飞机电源控制器试验台的设计方法和VC++6.0应用于试验台的一些实例。VC++6.0用于飞机电源控制器试验台具有明显的优势, 试验系统首次采用计算机控制, 实现了准确的数据采集和存储, 具有测试界面友好、直观, 系统运行稳定可靠, 响应速度快, 操作方便等特点。现已投入使用, 在运行中已经取得良好的试验效果。
参考文献
[1]刁修民, 刘亚斌, 于守谦, 等.在Visual C++环境下实现高速数据采集的几个问题[J].计算机测量与控制, 2003 (2) .
[2]谷庆华, 李成贵.基于VC++6.0和数据库的温度监控系统软件的开发[J].青岛科技大学学报, 2008 (1) .
[3]阳文学.VC++对话框程序打印及打印预览的实现[J].湖北三峡职业技术学院学报, 2006 (1) .
[4]罗建军, 朱丹军, 顾刚.大学C++程序设计教程[M].北京:高等教育出版社, 2004.
[5]谭浩强.C语言程序设计[M].北京:清华大学出版社, 2000.
[6]王能斌.数据库系统原理统[M].北京:电子工业出版社, 2001.
[7]明日科技.Visual C++程序开发范例宝典[M].北京:人民邮电出版社, 2007.
[8]沈颂华.航空航天器供电系统[M].北京:航空航天大学出版社, 2005.
[9]网冠科技.Visual C++6.0基础培训百例[M].北京:机械工业出版社, 2006.
[10]木林森, 高峰霞, 罗丽琼, 等.Visual C++6.0使用与开发[M].北京:清华大学出版社, 1999.
VC控制 第9篇
关键词:VC++6.0,FORTRAN,混合编程,造波机控制软件
0 引言
造波机是港口工程试验中用于模拟自然波浪,研究海浪对港口建筑的冲击作用的专用设备。造波机系统性能的好坏,除了与其伺服驱动系统的性能有关外,主要取决于系统控制软件的性能。造波机控制软件负责造波参数设置、目标波浪数据的计算、板前水位的实时显示、控制信号的生成与输出、造波机工作状态的监控等,是造波机控制系统的一个重要组成部分,其设计的好坏对于整个造波机系统的性能有着决定性的影响。
为了提高造波机系统的控制精度,加快运算和响应速度,方便用户使用,应用软件采用了基于Windows平台的Visual C++6.0和FORTRAN编程软件进行混合编程。Visual C++6.0与操作系统的结合十分紧密,是一种具有高度综合性能的软件开发工具。用它开发出的程序有着运行速度快,可移植能力强、图形处理能力强等特点,但它在科学运算的实现过程上却相对复杂。FORTRAN语言是一种面向过程的、适用于科学计算的高级语言,虽然它在人机交互和图形处理等方面的效果不理想,但它在实现数据的精确计算上很有简便易行的优势。因此,用VC++6.0和FORTRAN两种语言进行混合编程可以使它们取长补短,编制出具有友好界面和良好计算功能的应用程序。
1 控制软件的控制原理
控制软件对造波机系统的控制通过造波机的传递函数实现。在假定造波机控制系统是线性系统的前提下,传递函数反映了拟实现的波高、波长与控制信号之间的关系。当进行模拟实验时,控制程序首先根据实验要求计算需要模拟的波浪波高序列,然后根据造波机系统的传递函数生成控制造波机的数字信号,数字信号经数模转换(D/A)模块转换为模拟信号控制造波机伺服系统运行。同时,控制软件实时采集推波板前的波浪信号以提取反射波信号,并将该信号反馈到控制系统,实现造波机吸收二次反射波的功能。
造波机控制软件具有一套完善可靠的控制算法,能够实现吸收式造波的控制功能;采用高精度时间函数实现精确定时,提高了造波机系统的控制精度;采用端口输入、输出函数GetPortVal()与SetPortVal()实现PC并行端口数字信息的输入/输出,完成了数值计算与控制系统的通信;将目标波波高序列的计算、造波机的控制、板前波浪信号的采集、控制信号与板前波浪信号的显示以及造波机状态监控集于一体,增强了控制界面的友好性,使得不熟悉控制理论和波浪理论的操作人员也能够方便、灵活地使用设备。
2 控制软件的开发研究
2.1 控制软件的功能及控制过程
造波机控制软件主要包括以下功能:造波机的启动、推波板的零点定位、造波参数的设置、规则波波高序列的计算、不规则波波高序列的计算、板前波浪信号的实时采集、规则波的生成、不规则波的生成、其他波(孤立波、奇异波等)的生成、推波板运动的显示、实测板前波浪的显示等。
造波机系统启动后,先检查推波板的位置是否在零位,若不在零位程序会通过Winlo库函数向控制系统发出信号,控制造波机进行推波板调零定位。调零完成后,程序计算用户输入的波谱数据,并将其转化为控制推波板运动的电信号,达到控制推波板运动,模拟出目标波浪的目的。
造波机控制软件的程序流程如图1所示。
2.2 VC++6.0和FORTRAN语言混合编程的实现
VC++6.0和FORTRAN语言混合编程通过用VC++6.0调用FORTRAN语言编译的动态链接库来实现,其实现过程如下:
首先使用FORTRAN语言在其开发环境MS Developer Studio下编译生成动态链接库(如TEST dll),然后用VC++6.0实现对该动态链接库的调用。在VC6.0调用动态链接库编译链接时,不需要动态链接库的导入库,但要在程序代码中调用Library()函数,它负责将指定的可执行模块映射到调用进程的地址空间中。调用GetProcAddress()函数获得一个动态链接库地址的句柄,并将返回指定的动态链接库函数的入口地址。在调用动态链接库执行完成后,调用FreeLibrary()函数释放动态链接库。
由于港口工程中处理各种波谱的FORTRAN代码都较复杂,不便在这里列出。以下以一段简单的FORTRAN代码编译的动态链接库(TEST.dll)为例,说明VC++6.0与FORTRAN语言混合编程的实现。
用于生成动态链接库的FORTRAN代码如下:
用VC++6.0调用TEST.dll的实现代码如下:
在造波机控制软件中将各种波谱的处理程序利用FORTRAN语言编译成动态链接库,再用VC++6.0调用之即可实现对各种波谱的精确计算。
2.3 控制软件和造波机控制系统间通信的实现
控制软件在对各种波谱处理计算,将波高序列转化为电信号后,还要将电信号输出到伺服电机驱动器以控制造波机系统推动推波板产生波浪,这就需要控制软件和造波机伺服系统间可以很好地通信。
在VC++中,利用WinIo库中提供的端口输入函数GetPortVal()、端口输出函数SetPortVal()以面向对象的方式实现PC并行端口数字信息的输入/输出。Winlo库通过使用内核模式下设备驱动程序和其他一些底层编程技巧绕过Windows安全保护机制,允许32位Windows程序直接对I/O口进行操作。GetPortVal()与SetPortVal()实现对I/O口的读写,其原型如下:
GetPortVal函数从指定端口读取一个BYTE/WORD/DWORD类型的值,wPortAddr是指定一个端口地址值;pdwPortVal为指向一双字节型变量的指针,该变量存储从wPortAddr端口读取的值;bSize指定读取字节数,值可以为1,2或4。
SetPortVal函数向指定端口写入一个BYTE/WORD/DWORD类型的值;wPortAddr是待写入的端口地址值;dwPortVal为输入参数,表示待写入的数值;bSize为待写入值的字节数。
在造波机控制程序中,应用Winlo库的SetPortVal函数来实现编码器的清零和继电器的启停,用SetPortVal来获取造波机伺服系统的运行状态,如用SetPortVal(0x384,254,1)来启动地址值为0x384的继电器;用SetPortVal(0x384,255,1)来停止地址值为0x384的继电器;用SetPortVal(Qj,128,1)控制编码器清零复位;用GetPortVal(Po,&dwPortVal,1)来获取伺服驱动器的状态,并用读取到dwPortVal地址中的数据判断伺服驱动是否已经准备好,从而来控制造波机系统下一步的动作。
2.4 控制软件精确定时的实现
造波机系统的控制精度不仅与伺服系统有关,还取决于控制软件的精确定时。在Windows XP环境下定时的方法有:空循环定时、系统定时器、多媒体时钟、板载高精度计时/计数器定时、高精度定时函数定时等。由于造波机控制软件要实现实时吸收二次反射波的功能,其对定时的精确性有很高要求,通过综合考虑比较以上定时方法,高精度定时函数定时的方法更适用于造波机控制软件。
QueryPerformanceFrequency()和QueryPerforrmanceCounter()是VC提供的供Windows系统使用的两个高精度定时函数,它们的原型为:
数据类型LARGEINTEGER既可以是1个8字节长的整型数,也可以是2个4字节长的整型数的联合结构,该类型的定义如下:
在造波机控制软件中实现高精度定时,为实现程序的封装性,要创建CElapsed类以方便函数的使用,在进行计时之前,先调用QueryPerformanceFrequency()函数获得机器内部计时器的时钟频率,调用CElapsed::Begin()函数开始计时,调用CElapsed::End()停止计时。返回经历的时间,可以达到微秒级精确定时,如下代码是CElapsed类的实现。
这样在控制程序中就可以使用Begin()函数开始定时,用End()函数结束定时。
3 实例与效果
造波机控制软件应用于交通部天津水运工程科学研究所lm水槽造波机,经过多次试验和实际工程应用,并不断改进,造波机控制软件可以很好地实现对造波机系统的实时控制,满足各种造波实验的需要。控制软件的工作界面如图2所示,控制软件工作时对造波过程的监控界面如图3所示。
4 结束语
本文基于Windows平台,应用Visual C++6.0和FORTRAN 6.5混合编程的方法进行造波机控制软件的研究开发。研究利用了Winlo进行I/O通信的技术以及高精度定时的实现技术,研究了新一代造波机控制软件的开发技术。实践证明,该套控制软件完全满足了工程应用的需要。
参考文献
[1]章大勇,郑海,VC++与Fortran混合编程方法研究[J].计算机工程与设计,2006,27(12):2247-2262.
[2]韩英杰.实现VC++和FORTRAN混合编程的几个技术[J].安徽电气工程职业技术学院学报,2005,10(11):11:66-69.
[3]Microsoft Corp.Msdn Library Visual Studio 6.0[DB/OL]. http://msdn.microsoft.com/zh-cn/library/default.aspx.2003- 9-22.
[4]Microsoft Corp.MS Developer Studio[DB/OL].http://msdn microsoft.com/zh-cn/library/aa187916-aspx.2003-4-25.
[5]LIU Shu-xue,etc.,Active Absorption Wave Maker System for Irregular Waves[J].China Ocean Engineering,2003,17(2): 203-214.
[6]John E.Swanke.Visual C++MFC编程实例[M].北京:机械工业出版社,2000.
[7]David J.kruglinski.VISUAL C++技术内幕[M].北京:清华大学出版社,2001.
VC控制 第10篇
1材料与方法
1. 1试验材料
1. 1. 1仪器
752N紫外可见分光光度计,上海精密仪器仪表有限公司; DK-98 - IIA电热恒温水浴锅,天津泰斯特仪器有限公司; ESJ210-4A分析天平,沈阳龙腾电子有限公司。
1. 1. 2样品和试剂
供试样品:
成熟度相仿的新鲜水果( 猕候桃、橙子、橘子、柠檬、番茄、黄瓜、香蕉、苹果、梨) 。
供试试剂:
VC标准溶液( 1 mg / m L) : 精确称取VC 100 mg,以10 g / L草酸溶解并稀释至100 m L,冰箱保存;
20 g / L 2,4-二硝基苯肼溶液: 称取2,4 - 二硝基苯肼2 g, 溶解于100 m L 4. 5 mol/L硫酸中,过滤。不用时置于冰箱中保存,每次使用前均须过滤;
活性炭: 取100 g活性炭用1000 m L 0. 5 mol盐酸煮沸1 h, 煮沸时搅动。煮后用蒸馏水多次冲洗,至滤液中无Fe2+离子( 硫氰化钾溶液检测) 。110 ℃ 烤箱中干燥过夜,取出置于干燥器备用;
20 g / L草酸溶液: 20 g草酸溶解于700 m L蒸馏水中,用蒸馏水稀释至1000 m L;
10 g / L草酸溶液: 用蒸馏水稀释500 m L 20 g / L草酸溶液至1000 m L;
20 g / L硫脲溶液: 称取硫脲10 g,溶解于500 m L 10 g / L草酸溶液中;
10 g / L硫脲溶液: 用蒸馏水稀释500 m L 20 g / L硫脲溶液至1000 m L;
硫酸、盐酸等溶液均按照常规方法配制。
1. 2试验方法
1. 2. 1样品的处理
将水果洗净,分别称取20 g不同水果放入研钵,加20 g/L草酸溶液20 g研磨,待研磨均匀后,用两层纱布过滤,用10 g / L草酸溶液清洗滤渣及研钵,将滤液离心,所得上清液置入100 m L容量瓶,用10 g/L草酸溶液定容,备用。
1. 2. 2标准曲线绘制
分别移取2. 5、5、10、20、40、80和160 m L的100 μg/m L VC标准溶液至6个100 m L容量瓶中,用10 g / L的硫脲溶液稀释至刻度,得到稀释液中VC的浓度分别为2. 5 μg/m L, 5 μg / m L,10 μg / m L, 20 μg / m L, 40 μg / m L, 80 μg / m L和160 μg / m L。
分别取4 m L不同浓度的VC标准溶液以及一个空白管,于样品管中加入1 m L 20 g/L 2,4-二硝基苯肼溶液,混匀,加盖后连同空白管置入( 37±0. 5) ℃ 水浴中保温3 h后取出,空白管于室温静置10 ~ 15 min后置入冰上,样品管则直接置入冰上, 之后向每管&逐滴缓慢滴加5 m L 85% 硫酸,摇匀,滴加完毕后从冰上取出,待溶液恢复至室温,即刻用分光光度计测定其吸光值,检测波长为500 nm。取得结果后,以VC浓度为横坐标,吸光值为纵坐标,绘制标准曲线。
1. 2. 3样品的测定
分别从100 m L不同水果样品准备液中取25 m L置于100 m L容量瓶中,加入2 g活性炭,振摇1 min,离心过滤,取10 m L滤液,加入10 m L 20 g/L硫脲溶液,混匀。以蒸馏水作为空白对照,测定样品的吸光值,检测波长为500 nm。
1. 2. 4不同贮藏温度下样品的测定
选取成熟度相仿的猕猴桃和梨作为试验材料,贮藏温度分别设置为低温( 冰箱4 ℃ ) 、常温( 室内最低温度16 ℃ ,最高温度27 ℃ ) 和高温( 37 ℃ 恒温) 。贮藏48 h后分别测定样品中VC的含量,每个样设置3个重复。测定方法同1. 2. 3。
1. 2. 5计算
按下式计算样品中的VC含量:
式中: X———样品中VC含量,mg/100 g
ρ———由标准曲线查得氧化处理后的样品提取液中总VC的浓度,μg/m L
F———样品氧化处理过程中的稀释倍数
V———试样用10 g/L草酸溶液定容的体积,m L
m———试样质量,g
2结果与分析
2. 1校准曲线的绘制
将样品溶液进行全波长扫描,结果显示在500 nm处具有最大吸光值,因此,本试验采用500 nm为检测波长。VC标准曲线( 图1) 显示VC的吸光值与VC浓度的线性回归方程为Y = 0. 0279X + 0. 0173,相关系数为0. 9992,表明VC浓度在0 ~ 160 μg / m L范围内,VC浓度与吸光值呈良好的线性关系。
2. 2不同样品中VC的含量
由表1结果可以看出,9种供测试的水果VC含量顺序依次为猕猴桃>橙子>橘子>柠檬>番茄>黄瓜>香蕉>苹果>梨,其中VC含量最高为猕猴桃,其VC含量为150 mg/100 g,VC含量最低的梨VC含量为3. 6 mg/100 g,前者约为后者的42倍。
2. 3不同贮藏温度下样品中VC的含量
由表2结果可以看出,VC含量最高的猕猴桃和VC含量最低的梨分别置于低温、常温以及高温贮藏48 h之后,VC含量均有不同程度的减少,减少程度均为低温<常温<高温,其中猕猴桃在高温条件下贮藏48 h后VC的含量为在低温条件下的77% ,为常温下的84% ; 梨在高温条件下贮藏48 h后VC的含量为在低温条件下的76% ,为常温下的87% 。
3结论
本试验利用2,4-二硝基苯肼法测定了9种常见水果的VC含量,VC标准曲线结果显示VC浓度与吸光值于500 nm波长处在0 ~ 160 μg/m L范围内呈良好的线性关系。表明该方法准确可靠。
水果VC不能替代蔬菜 第11篇
25%—35%的酒精物理降温用
对高热病人,在服用退烧药效果不明显时,通常选择酒精擦浴来降温。擦浴时应该用含量为25%—35%的酒精,擦拭四肢及血管丰富的腋下、腹股沟、颈部、前额等部位,可使局部血管扩张、皮肤发红,加速血液循环以利散热;且酒精挥发时也会带走热量利于降温。
中医保养耳朵法—鸣天鼓
用掌心的劳宫穴(微握拳,中指所指之处就是劳宫穴)贴住耳孔,手掌搭在后脑勺上。食指放在中指上,往下弹拨,弹几次再压紧耳孔,再突然放松。反复几次后耳朵就会有特别清爽的感觉。
孕妇内衣选购原则
首先视自身的外型改变来考虑需求;多询问有经验的亲朋好友,她们是过来人,有第一手的经验和资讯。市面上的孕产妇用品种类多、品牌杂,有些商品的功能过于夸大,因此必须多了解、多比较,才能买到自己最需要的用品;材质重于外观。内衣的材料、质地需要把握吸汗、舒适的原则。
给牙齿补充营养
给牙齿补钙 牙骨疏松容易导致牙龈炎,多吃富含钙质的食物,可强化骨骼,预防牙龈炎和牙周炎的发生。
戒烟酒 烟和酒会降低人体的免疫力,流失维持口腔健康所需的维生素及矿物质,要想拥有健康的牙齿,必须戒烟和酒。
多吃生的蔬菜 生的蔬菜含有很多纤维素,能帮助清洁,对牙齿及牙龈产生有益刺激,防止牙龈炎。
补充营养素 如维生素A、B族维生素、维生素C及锌,预防感染、治疗炎症,防治牙龈出血。
解决便秘有妙招
若想大便通畅,必须要有规则正常的生活及运动,并要养成规则性的排便习惯,尽量不要依赖药品来治疗便秘,优化食物的摄入才是根本。
1.选择高纤维食物。
2.早起马上喝一大杯温开水,再稍微按摩腹部。
3.可沿肚脐周围作环形按压,有助于排便。每天定时去厕所,养成定时排便的习惯。
VC实现窗体换肤 第12篇
1 Windows消息机制
Windows的图像化界面是建立在其消息机制基础之上的。Windows消息是指Windows发送给窗体的通知, 以表示某一事件的发生。例如当用户点击了窗口的关闭按钮, Windows就会发送WM_DESTROY消息给窗口, 而窗口的窗体过程就会对该消息进行相应的处理关闭窗口以反映用户的操作。当多个消息同时发生时, 如何进行处理呢?答案是Windows会将消息排队到窗口的消息队列中, 以便依次进行处理。
Windows程序通常是GUI程序一旦启动就进入了消息循环, 直到程序结束。消息循环不停地从窗口的消息队列中提取消息, 将消息进行转换分发, 然后窗体过程被调用, 用户操作得到及时地响应。当使用VC创建一般的Win32项目时, 应用程序向导会为自动生成基本的窗体框架代码。
各种各样的Windows消息中, 与窗体皮肤更换相关的消息主要有以下几个。通过适时地响应这些消息, 完成窗体的重新绘制和相关逻辑的处理, 从而达到给窗体改头换面的目的。以NC开头的消息代表Not Client, 即与非客户区相关的消息。
(1) WM_NCPAINT窗体的非客户区需要绘制时, 该消息被发送给窗体。窗体过程如果不处理该消息, 就会被默认的窗体过程处理, 从而产生默认的皮肤。所以, 要处理该消息重新绘制窗体的非客户区。
(2) WM_NCHITTEST当用户在窗体上移动鼠标时, 该消息被发送给窗体, 告诉窗体用户将要操作窗体的哪一部分, 是边框、标题栏还是关闭按钮。由于实例中改变了标题栏、最小和关闭按钮的位置和大小, 所以要处理该消息, 以返回正确HITCLOSE、HTMINBUTTON、HITCAPTION值。对于其他的HITTEST值直接交给默认的窗口过程DefWindowProc去处理。
(3) WM_NCLBUTTONDOWN、WM_NCLBUTTONUP当用户在非客户区点击鼠标左键时, 该消息被发送。这两个消息通常与WM_NCHITTEST消息结合使用, 以完成窗体的移动、最小化和关闭。
(4) WM_SIZE当窗体大小改变时, 该消息被发送。窗体换肤时, 该消息不是必须要处理的。在例子程序中处理该消息以生成直角窗体, 而不是默认的圆角窗体。
(5) WM_PAINT当客户区需要重画时, 该消息被发送给窗体。处理该消息, 可以对客户区进行重新绘制。
程序中还简单地截获了WM_NCACTIVATE消息, 以避免默认窗体过程对其进行处理。默认窗体过程通过响应该消息, 重画窗体被激活时的外观。窗体过程代码如下:
2 重新绘制窗体
要绘制的窗体很简单:带有黑色边框的直角窗体, 在右上角画上灰色的最小、最大和关闭按钮, 客户区用银色背景填充, 并输出“Hello, Window Skin”的文字。最终效果如图1所示。
定义了几个全局变量来描述窗体:
3 客户区的绘制
客户区的绘制相当简单, 只需要响应WM_PAINT消息即可。实现代码如下:
需要注意的是这里没有填充银色背景的代码, 背景画刷是在注册窗体类别时设置的, Windows会用该画刷填充背景。这是默认窗口过程通过响应WM_ERASEBKGND消息实现的, 当然也可以在OnPaint中自己刷出背景。下面是注册窗口类别的代码:
代码中除了自定义画刷部分外, 都是VC生成的, 在此省略。
4 非客户区的绘制
非客户区的绘制是窗体换肤的难点, 也是关键所在。主要是通过响应WM_NCPAINT消息实现的。选择更加友好的GDI+接口实现窗体重画, 而不是GDI。并使用了双缓冲技术以避免绘图过程中闪烁先在内存位图中绘制所有的对象, 最后一次更新到显示设备。
另外, 通过响应WM_SIZE消息, 在每次窗口大小改变时都将窗口区域设置为直角矩形。
5 用户交换的处理
响应WM_NCHITTEST、WM_NCLBUTTONDOWN和WM_NCLBUTTONUP消息以响应用户的最小化窗体、关闭窗体、移动窗体的操作。为了保持代码简单, 没有支持窗体的最大化。这3个消息是相互协作的:当鼠标在窗体矩形范围内移动时, 就会产生WM_NCHITTEST消息, 通过处理该消息返回正确的HITCAPTION、HITCLOSE和HTMINBUTTON值, 告诉Windows窗体的标题栏、关闭和最小化按钮的位置;当按下鼠标左键时, 产生WM_NCLBUTTONDOWN消息, 通过判断HITTEST值, 如果是感兴趣的值就交给DefWindowProc去处理;当松开鼠标左键时, 产生WM_NCLBUTTONUP消息, 根据HITTEST值移动标题栏, 关闭和最小化窗体。
6 结语
皮肤更换的核心代码就是这么简单, 读者完全可以发挥想象力创建属于自己的个性窗体, 例如可以选择简便画刷或图片, 而不是单一的颜色去绘制窗体边框和标题栏。当然, 可能还要处理其他的Windows消息。本程序在VS2008和Windows XP下测试通过。
摘要:用户界面编程在软件编程中的地位越来越重要像QQ、360安全卫士等软件都拥有漂亮的用户界面。讨论窗体皮肤更换的关键技术, 代码不依赖于任何类库, 而是使用Win32 API实现。为了让代码易于阅读, 并让读者能够快速掌握关键的知识点, 所举例子非常简单, 完全可以举一反三, 制作出非常漂亮的用户界面。
关键词:Windows,消息机制,GDI+,GUI编程
参考文献
[1]Microsoft Corporation.MSDN Library for Visual Studio 2008.