王勇,魏建中,陈波
(工业和信息化部电子第五研究所,广东 广州 510610)
Keithley 2000仪表是一种高性能的数字型仪表,主要用于电流、电压、电阻和频率等参数的测量,在工业上和实验室中具有广泛的用途。该表测量精度高、噪声低和功能全,但对于非专业测试人员,使用该表进行专业参数测量还是比较困难的,测量速度慢,测量效率低。
随着智能仪表和虚拟仪表技术的快速发展,上下位机通讯的地位日益凸现,如何通过上位机实现仪表数据的自动化采集已成为测试现场急需解决的问题。有了性能强大的硬件检测平台,如果没有合适的软件与之匹配,那么检测仪表的性能将得不到充分的发挥。
本文将结合实验室中电阻温度循环前后阻值变化的测试过程,提出Keithley仪表数据采集系统,该系统可以实现PC机对仪表的自动化采集、分析和合格判定。
Keithley 2000仪表通过RS 232[1-2]接口与上位机PC进行通信,采集的数据通过上位机中的软件进行比较分析,系统结构如图1所示。
图1 系统结构
本系统采用Delphi 7进行上位机编程,在进行通信程序的设计过程中,为了避免底层串口参数编程的初始化设置过程,提高开发效率,选用了功能强大的第三方SPComm控件,SPComm控件通过串行端口传输和接收数据,为应用程序提供串行通信功能。程序流程如图2所示。
图2 程序流程图
SPComm控件具有丰富的、与串口通信密切相关的属性,提供了对串口所进行的多种操作,进而使串行通信变得十分简便。
SPComm共实现了3个类:串口类Tcomm、读线程类TreadThread以及写线程类TwriteThread[1]。Tcomm的某个实例在方法StartComm中打开串口,并实例化了一个读线程ReadThread和一个写线程WriteThread,它们和主线程之间进行消息的传递,实现串口通信。
Spcomm串口通信控件的基本属性、方法和事件的说明如下:
1.1.1 基本属性
a)CommName属性
计算机串口端口号的名字,COM1、COM2……等;在打开串口前,必须填写好此值。
b)Parity属性
校验位None、Odd、Even、Mark和Space等。
c)BaudRate
设定支持串口通信用的波特率9600,4800等,根据实际需要来定;在串口打开后也可更改波特率,实际的波特率随之更改。
d)ByteSize属性
表示一个字节中,使用多少个数据位来收发数据,根据具体的情况设定5、6、7、8等。
e)StopBits属性
表示一个字节中,使用停止位的位数,根据具体的情况设定1、1.5、2等。
f)SendDataEmpty 属性
布尔属性,为True时表示发送缓存为空,或者发送队列里没有信息;为False时表示发送缓存不为空,或者发送队列里有信息。
1.1.2 方法
a)StartComm方法
用来打开通信串口,开始通信。如果失败,则会导致串行口错误。错误类型大致分为串行口己处于打开状态,所以不能打开串行口,不能创建读写进程,不能建立串行口缓冲区等。
b)StopComm方法用来停止通信串行口的所有进程,关闭串口。c)WriteCommData(1)pDataToWrite: PChar;2)dwSizeofDataToWrite: Word)方法
这是带有布尔型返回值的函数,其中参量pDataToWrite是要写入串行口的字符串,dwSizeof-DataToWrite是要写入的字符串的长度。该函数通过一个写线程向串行口输出缓冲区发送数据。发送操作将在后台默认执行。如果写线程PostMessage成功,则返回值是True;若写线程失败,则返回值是False。
1.1.3 事件
Spcomm串行通信控件具有多线程的特性,接收和发送数据分别在两个线程内完成,接收线程负责收到数据时触发OnReceiveData事件;用WriteCommData()函数将待发送的数据写入输出缓冲器,发送线程在后台完成数据发送工作。在接收和发送数据前需要初始化串口,用StartComm方法打开串口,退出程序时用StopComm方法关闭串口。
Spcomm应用的核心在于主线程、读线程和写线程之间的消息传递机制,而通信数据相关信息的传递也是以消息传递的方式进行的。在使用Spcomm进行串口通信编程时,需要特别注意以下两个问题:
a)Spcomm是通过ReadIntervalTimeout属性的设置来确定所接收到的数据是否属子同一帧数据,其默认值是100 ms;也就是说,只要任何两个字节到达的时间间隔小于100 ms,都被认为是属于同一帧数据,在与仪表机协同工作时,要特别注意这个问题[2]。
b)Spcomm的默认属性设置是支持软件流控制的,用于流控制的字符是13 H(XoffChar)和11 H(XonChar),当仪表以二进制方式发送数据时,必须要禁用Spcomm对于软件流控制的支持;否则,在数据帧中出现的13 H和11 H会被Spcomm作为控制字符而加以忽略。
由于Delphi 7中没有直接集成串口控件,所以,首先需要把SPComm控件添加到Delphi 7中。
在Delphi 7.0中安装SPComm串口通信控件的方法为:选择 Delphi 7.0的 “Component” 菜单,点击 “Install Component..” 菜单项,然后在弹出的Into existing package属性页中的Unit file name输人框中选择SPCOMM.pas文件,单击两次 “OK”按钮后,就可以将SPComm控件安装到Delphi 7.0的System组件页上。
对SPComm控件进行初始化,初始化的指令如下:
正常的串口通信建立后,就可以由PC上位机通过SPComm控件提供函数WriteCommData(pDataToWrite:PChar; dwSizeofDataToWrite:Word):Boolean;向Keithley 2000发出操控指令。
以下是采集数据的指令举例,可以完成电阻阻值的基本参数测量。
指令以回车符结束,如 “DATA?”指令的程序代码如下:
由于SPComm采用事件驱动机制,只要仪表向PC机发送数据,SPComm就触发一次接收事件,相应的数据存放在接收缓冲区,SPComm以接收数据的时间间隔区分不同的事件,事件间隔在Read-InteralTimeout中设置。接收事件驱动机制的最大优点是无需程序对接收缓存一直处于检查状态,只要有数据到达就会触发接收事件而执行相应的程序代码。
SPComm控件提供 OnReceiveData事件,当控件接收数据时执行该事件,可在该事件中对接收到的数据进行分析处理。以下是对采集的数据进行分析的代码,可以实现阻值的自动判定,超出指标,则显示为红色。
电阻初次测量阻值、温度循环试验后再次测量阻值,并计算两次测量的阻值变化,每次测量值及变化量有相应的指标范围,针对笔者所在的实验室测量样品多,测试指标相对简单的特点,为提高工作效率,采用Delphi 7编写上位机软件,通过RS 232接口连接Keithley仪表实现数据自动采集,系统界面如图3所示。
图3 系统界面
系统有如下特点:
系统对读取的数值设置了量级和精度,可自定义量级和精度;实现了数据的自动计算、储存整套数据及查询,大大简化了操作步骤,实现了全程无纸化测量,有效地避免人为误差,极大地方便了后续数据处理;成功读取数据后对样品编号自动加一,便于读取下一样品数据;对数据自动分析后,不合格的数据将用红色标识;测试数据可以保存到Excel表中,方便保存及后期处理;系统出错采用多媒体声音报警,操作人员不必时刻监视计算机和仪表了;配合USB串口转换器即可实现Keithley全系列数字万用表即插即用,没有RS 232串口的计算机同样可以方便地通过此软件控制Keithley数字万用表。
在实际的测量过程中,操作人员将样品放置好后,直接按回车键即可完成所有的工作。如果这一测试工作同样由人工手动完成,则不仅效率低下,而且测量精度也得不到保证。人工测试和自动采集性能的比较如表1所示。
表1 人工测试和自动采集性能比较
本系统采用计算机软件技术实现数据自动采集,对传统的人工测量电阻的测试方法进行了重大的改进,实现了电阻阻值的自动测量及温度循环前后的阻值变化比较,大大提高了电阻阻值参数测试的自动化水平,减少了人员的工作量,提高了数据的可信度;另外,本系统也可对电压、电流等参数进行测量。
[1]范逸之,陈立元.Delphi与RS-232串行通信控制[M].北京:清华大学出版社,2002.
[2]黄军,熊勇.Delphi串口通信编程[M].北京:人民邮电出版社,2002.