蒋贵芳
(贵州省计量测试院,贵阳 550003)
随着计量测量技术的飞速发展,出现了越来越多的精密测量仪器,在精密测量中对环境的监测和控制是非常关键的。在精密测量实验室,常用的是中央空调控温系统,它能够对实验室起到一个整体宏观的控温效果。具体测量时,计量工作者在测量过程中需要采集被测量仪器的温度和材料的具体温度,这种情况下中央空调就无法做到具体点的温度测量。在高可靠性温度测量硬件基础上,基于Visual C#平台开发了一个Windows环境下的自动测温系统,通过软硬件的结合,利用软件实现了诸如测量时间间隔设置、温度显示、通道显示、曲线绘制、数据图像保存等功能。并且,多通道的设计模式,可以做到对具体的仪器和材料温度的测量,取得实时的温度值,避免了人工记录,应用方便。
系统硬件部分由传感器、测温仪主机、RS232接口、PC机等组成。结构图见图1。
图1 系统硬件结构图
在选择测温系统软件设计平台时,由于C#简洁的语法、精心面向对象的设计、灵活性与兼容性等优点,选择了它作为程序设计语言,本文的自动化测温仪核心运行部分就是用C#开发的。该软件的结构主要由五大模块组成,分别为通信模块、动态链接库的调用功能模块、画图模块、数据存取模块、时间记录模块。
1.2.1 通信模块
通常,在C#中实现串口通信,一般有四种方法:1)通过MSCOMM控件,这是最简便的方法,可功能上很难做到控制自如;2)微软在.NET新推出的一个串口控件,基于.NET的P/Invoke调用方法实现;3)用第三方控件,一般要付费,不太合实际,不作考虑;4)自己用API写串口通信,这样难度很高。现在在.NET Framework中提供了SerialPort类,进行串口通信时,可以通过设置SerialPort类的属性来进行,包括口号选择、波特率选择、测量间隔选择等。在串口操作中用于读取串口数据的主要代码如下:
ports=comboPortName.Text; //(设置端口号)
serialPort1.PortName=“com”+ports;//(设置串口)
serialPort1.BaudRate=int.Parse(comboBox1.Text); //(设置波特率)
serialPort1.Open(); //(打开串口)
}
data=serialPort1.ReadExisting();// (串口读取数据)
t1=Convert.ToString(data);
x=int.Parse(t1);
serialPort1.Close();//(关闭串口)
1.2.2 动态链接库的调用功能模块
自动测温系统运用了动态链接库的调用,动态链接库应用范围广、独立于编程语言,且动态链接库对代码有很好的封装、能很好的保护源代码,C#可以调用C#自身创建的或其它语言创建的动态链接库,比如Delphi、C++等等。
下面是调用一个动态链接库的例子,将测温仪传输的数据转换为温度值。
在C#中声明:
using tcsdll;
调用函数:Triple(x, d2, d1, jzxs)
d0=Class1.Triple(x, d2, d1, jzxs);//调用动态连接库tcsdll.dll 返回值赋给d0
函数中;x,d1,d2为整形数,jzxs,d0为浮点数。
Jzxs:为校准系数,存在程序安装后的文件夹中,以文本格式的形式存在,
d0 :为测出的温度值。
1.2.3 画图模块
在C#里,可以直接调用画图工具出来画图,也可以用Graphics类,但用Graphics类画图比较复杂,zedgraph画图工具是目前非常主流的第三方画图控件,操作简单,做出来的图形也比较好看。由于这个类库具有高度的适应性,几乎所有试样的图表都能被创建,代码如下:
private void CreateGraph1(ZedGraphControl zgc)//(定义一个生成曲线控件)
{
GraphPane myPane=zgc.GraphPane;//(兴建图像面板)
for(int i=0; i<=x11-1; i++)
{
list.Add(i, dat2[i]);
}
LineItem myCurve=myPane.AddCurve(″ ″, list, Color.Blue, SymbolType.None);//,
zg0.AxisChange();
zg0.Refresh();
1.2.4 数据存取模块
在C#中,通常存取数据的方法有很多种,方式比较多,可以用access数据库、SQL数据库、Excel文档和TXT文本文件等等。由于TXT文本文件比较快捷、简单,不需要第三方软件,因此优先选用了TXT文本文件存取方式:
SaveFileDialog dlg=new SaveFileDialog(); //(实例化一个SaveFileDialog保存文件对话框)
//(使用SaveFileDialog对话框,设置保存的文件路径)
dlg.Filter=″txt文件.txt″;
dlg.AddExtension=true;
dlg.Title=″请输入要保存的文件名″;
if(dlg.ShowDialog()==DialogResult.OK)
{
myImage.Save(@sf.FileName, ImageFormat.Bmp); //
MessageBox.Show(″图像保存成功″, ″提示″, MessageBoxButtons.OK, MessageBoxIcon.Information);
1.2.5 时间触发模块
因为该测温仪需要连续进行温度采集,所以程序需要时间触发模块,定时器的主要作用是按一定的时间间隔周期性地触发一个名为Tick的事件,一次Tick事件就对应一个温度采集过程。定时器的基本输入参数为this.t.Interval,规定了定时器的触发周期,此参数由前面的输入窗口输入,由“测量开始”按钮触发更新并让定时器使能,由“测量暂停“按钮触发定时器关闭:
this.label3.Text=System.DateTime.Now.ToString(″s″);//(获取当前时间)
this.t.Tick+=new System.EventHandler(this.t.Tick);//(将方法this.t.Tick注册到this.t.的触发事件上,也就是说this.t每个指定时间就执行this.t.Tick)
this.t.Enabled=true; //(一直执行)
测温仪界面如图2所示。
图2 测温仪界面
对实验室进行了92h的测量, 20min计一次数,并存图,共计监测温度276个点。
该测温仪共有6个通道,1、2、3号(分别为通道1、通道2、通道3)测头固定在大理石板上,4、5、6号(分别为通道4、通道5、通道6)测头悬挂在中空位置,根据数据做一个空间梯度分析,并用图分别把1、2、3通道测温数据和4、5、6通道测温数据表示如图3、图4所示。
图3 1、2、3通道测温数据图
图4 4、5、6通道测温数据图
从运行程序里将保存的数据取出,6个通道总的温度变化为0.3℃。1、2、3通道测头固定在大理石板上,温度变化为0.25℃。4、5、6通道测头悬挂在中空位置上,温度变化为0.29℃。
以面向对象编程语言为工具的测温系统软件包将数据采集、自动绘图、数据存储管理有机的合为一个整体,解决了三者分离的疑难问题。多个通道的测量过程可以在30s内完成,尽可能地保证了温度的稳定性和测试数据的自动采集,提高了测量的准确度,减少了人为读数带来的误差,同时数据的存储大大方便了操作人员的使用,为计量检测者提供了一个有力的工具,使用很方便,值得推广。
参考文献
[1] Karli Watson ,Christian Nage. Beginning Visual C# 2010[M]. Wiley,2010
[2] 毛玉苹,李贺鹏,等.一种简单实用的环境试验设备自动检测系统[J].计量技术,2013(4)
[3] 潘光斌.基于C++Builder的自动测温系统设计技术研究[J].计量技术,2002(2)
[4] 侯高雷.基于C#的高低温自动化测试系统设计与实现[J].现代电子技术,2012(5)
[5] 薛宇飏,田社平,等,基于DS18B20的分布式粮仓测温系统[J].计量技术,2009(9)
[6] 黄敬尧,杨爽,张超,赵慧杰,郭昊,等.基于C#的AUV控制软件的设计与实现[J].机械工程师,2013(5)