工程建设行业资讯新闻 人工客服公众号
建设工程资讯新闻
新闻时间:2015-08-25,来源:中国建材-商业资讯,作者:

动态链接库在工业仪表数据通信中的应用

    1 系统工作原理  气体渗碳是一个相当复杂的物理化学过程,一般分为(1)介质间的化学反应分解出渗碳组分;(2)介质分解出的活性组分通过边界向表面扩散;(3)相界面反应产生活性碳原子;(4)碳原子在钢铁内部的扩散,介质中的化学反应和气氛中的扩散可以用气氛碳势来衡量,表面反应和金属内部的扩散可以用FICK第二定律结合第三类边界条件来描述。该系统以按照集散控制系统的思想进行设计,采用工控机作为控制系统的核心,建立相应的数学模型,实{TodayHot}现对气体渗碳工艺的精确控制。(1)该系统主要的控制过程有:(a)信号采集过程  使用热电偶检测炉温,用氧探头检测碳势,并将温度、碳势、动作等信号转换为电压信号,送至控制仪表。控制仪表经过内部转换,将得到的实际值通过串口卡传送至上位机。(b)控制过程  上位机的控制软件根据下位机(智能仪表)传来的实时工艺参数值决定发给下位机的控制信号。下位机则根据收到的信号控制调节阀和可控硅,从而实现对渗碳炉温度和碳势的控制。我们使用的数显智能型碳势控制仪采用多层抗干扰技术,可适合各种复杂工业现场使用。具有可变换的多种复杂输出驱动能力,例如可接电磁阀,脉冲阀,变通径电动调节阀和接受模拟输出的各种执行文件。该仪表有断电保持、报警、氧碳头自动清洗、氧探头内阻测量、CO值补偿、热电偶选择、数字通讯{HotTag}等功能。仪表可存储至多100个工艺,有PID整定和温度、氧势和碳势的补偿的设置。仪表的显示精度为0.001%CP,控制精度为0.001%CP。该智能仪表有通讯和手动两种工作状态。在通讯状态,仪表接受上位机的控制,在上位机出现问题时,可转换为手动方式,按照事先编制、储存在仪表中的工艺自动运行,保证了运行的连续,增强了可靠性和安全性。(2)RS-232与RS-485  计算机与计算机或计算机与终端之间的数据传送可以采用串行通讯和并行通讯二种方式。由于串行通讯方式具有使用线路少、成本低,特别是在远程传输时,避免了多条线路特性的不一致而被广泛采用。 在串行通讯时,要求通讯双方都采用一个标准接口,使不同 的设备可以方便地连接起来进行通讯。 RS-232-C接口(又称 EIA RS-232-C)是目前最常用的一种串行通讯接口。它是在1970年由美国电子工业协会(EIA)联合贝尔系统、 调制解调器厂家及计算机终端生产厂家共同制定的用于串行通讯的标准。  由于RS-232-C接口标准出现较早,难免有不足之处,主要有以下四点: (a)接口的信号电平值较高;(b)传输速率较低,在异步传输时,波特率为20Kbps;(c)接口使用一根信号线和一根信号返回线而构成共地的传输形式, 这种共地传输容易产生共模干扰,所以抗噪声干扰性弱;(d)传输距离有限,最大传输距离标准值为50英尺,实际上也只能 用在50米左右。  针对RS-232-C的不足,于是就不断出现了一些新的接口标准,RS-485就是其中之一,它具有以下特点: (a)RS-485的电气特性:逻辑“1”以两线间的电压差为+(2~6)V表示;逻辑“0”以两线间的电压差为-(2~6)V表示。接口信号电平比RS-232-C降低了,就不易损坏接口电路的芯片, 且该电平与TTL电平兼容,可方便与TTL 电路连接。 (b)RS-485的数据最高传输速率为10Mbps (c)RS-485接口是采用平衡驱动器和差分接收器的组合,抗共模干能力增强,即抗噪声干扰性好。 (d)RS-485接口的最大传输距离标准值为4000英尺,实际上可达 3000米,另外RS-232-C接口在总线上只允许连接1个收发器, 即单站能力。而RS-485接口在总线上是允许连接多达128个收发器,即具有多站能力,这样用户可以利用单一的RS-485接口方便地建立起设备网络。 因RS-485接口具有良好的抗噪声干扰性、长的传输距离和多站能力等上述优点就使其成为首选的串行接口。 因为RS485接口组成的半双工网络,一般只需二根连线,所以RS485接口均采用屏蔽双绞线传输。 RS485接口连接器采用DB-9的9芯插头座,与智能终端RS485接口采用DB-9(孔),与键盘连接的键盘接口RS485采用DB-9(针)。(3)计算机群控方式  在RS232/RS485转换卡后可并行连接至多32 个智能仪表,利用上位机实时的并发控制,组成了一个计算机群控系统。智能仪表的地址在表中事先设定,上位机通过寻址对各个智能仪表分别的进行读写数据,以实现对多个生产过程的集中管理和控制。2 动态链接库  所谓动态链接库DLL(Dynamic Link Library)就是允许用户的应用程序分享代码和资源的非任务可执行模块,也就是一个包含许多函数和数据的库文件(模块)。Windows操作提供很多DLL库,包括“User.Exe”(由完成窗口创建和消息传送等用户界面任务的函数组成)、“Kernel.exe”(由管理内存、进程和线程的函数组成)、“Gdi.exe”(由绘制图形和显示文本的函数组成)等。另外,Windows还包含一些别的DLL,用它来包含那些更专门化任务的函数。Windows应用程序接口(API)是一组动态链接库,任何使用Windows API的过程都使用动态链接。程序员还可以根据需要编写自己新硬件设备的DLL设备驱动函数库,使Windows很方便地支持它们的应用与开发。2.1 动态链接库和其它应用程序的区别  Windows程序组织结构采用的是模块方式:应用程序和DLL。这两种模块使用相同的文件格式,它们之间的最大区别在于应用程序可以运行多个实例,每个实例都由实例句柄(hInstance即默认数据段句柄)来作为唯一标识。而对于DLL来说,它在内存中只有一个实例,应用程序对它的多次调用是通过库模块中的引用次数来标记的。应用程序存在着与之相联系的一个任务数据库(TDB)来保存每个应用程序的特定信息。对于应用程序来说,任务数据库的句柄同样也可以成为它的每个实例的唯一标识hTask。在Windows操作系统中,DLL被看作应用程序代码的一部分,但它并不是一个独立的任务,因此,DLL也就不存在有自己的任务数据库。它是通过继承调用它的应用程序(一般都是当放任务)的TDB来使用其中的相关信息的,如文件打开等操作信息。  动态链接库模块和应用程序之间的另一个区别是应用程序被称之为任务化的可执行模块,一个DLL被看作一个非任务化的可执行模块。前者主要通过WinMain()函数中的消息循环来获取、发送和处理信息,只要在消息队列中存在着消息,应用程序就能获得控制;而后者装入后,虽然此库的入口点函数被调用,但是通常只执行微小的初始化工作。因此,应用程序模块是主动的,它们自己提要求,DLL是被动的并等待被请求。还有一个重要的区别就是每个应用程序都有自己的堆栈段,以保存临时数据相局部变量,这个堆栈段就建立在应用程序的献认数据段内,因此对于应用程序来说,DS=SS是成立的。DLL却没有自己的堆栈,当应用程序对DLL中的函数调用而导致DLL被载入时,只有它的数据段和代码段被装入内存,而堆栈段仍然是沿用其调用者的,因此在动态链接库中,DS和SS的值并不相等。2.2 动态链接库与静态链接库的区别  动态链接库与静态链接库之间的主要区别是,在运行时DLL是由应用程序链接的,而静态链接库是在编译时,通过链接程序将本身的代码加到.EXE模块中,并使它们一起形成一个单独的、不可分的文件。而DLL在“物理”上保持分离。  所谓动态链接是指一个允许可以执行模块在运行时刻定位外部DLL函数的可执行代码进程。应用程序所调用的外部函数(也就是DLL中的引出函数)的代码在进行链接时并没有真正放入到程序之中,仅仅是在应用程序中为每一个DLL函数建立一个调用链表和重定位记录,只有在Windows的装载程序把它们都装入到内存以后,才能够根据这些重定位记录来编辑函数调用链表,并将DLL中的函数内存中的入口(段:偏移)填入到链表中的每个节点上(这就完成了一次动态链接)。当以后另外的应用程序再调用DLL中的引出函数时,就不必再次加载DLL。库装载函数LoadLibrary()只要把DLL模块表中的引用次数加1就行了,然后再对该应用程序重复进行一次重定位操作就可以完成一次动态链接。如果应用程序从内存中卸载下来,也只要把相应的DLL引用次数减1就行了。只有当DLL的引用次数变为0时,Windows才会把它所占据的内存空间释放出来。2.3 动态链接库的访问机制  从DLL中导出函数有两种方法:1)创建模块定义文件(DEF)并在建立DLL时使用DEF文件;2)在函数的定义中使用关健字_declspec(dllexport)。  可以使用关健字_declspec(dllexport)来从DLL中导出数据、函数和类,或者类的成员函数。如果使用关健字_declsPec(dIlexport),则不需要DEF文件。DLL链接到应用程序的方式通常有两种:载入时刻动态链接和运行时刻动态链接。载入时刻动态链接(Load-Time Dynamic Library)有时又称为隐式链接。如果应用程序使用了隐式链接,操作系统在加载应用程序的同时加载应用程序所使用的DLL。运行时刻动态链接(Run-Time Dynamic Library)又称为显示链接。使用显示链接的应用程序必须在代码申明确地加载所使用的DLL,并用指针来调用DLL,中的导出函数,使用完毕之后,应用程序必须卸载所使用的DLL。载入时刻动态链接要求在应用程序创建时提供定位DLL函数的定位信息,从而链接DLL的导入库。通过链接DLL的导入库,每次调用DLL函数都在目标代码中产生一次外部函数引用。链接时每当发现DLL函数的外部引用时,链接器就加入信息,从而告诉系统函数代码在DLL中的位置。与载入时刻动态链接不同,运行时刻动态链接要求使用LoadLibrary()和GetAddress()函数,这种方式的优点在于应用程序链接时不需要导入库.本程序采用隐式链接实现。3 程序实现3.1 用VC编制动态链接库  在Visual C++6.0集成开发环境下选择File菜单下New子项创建工程文件.mpr,项目类型选为Win32 Dynamic_Link_Library〔.DLL),在该项目.h文件中加入:_declspec (dllexport) char * read ();并把以下源程序加入该项目.cpp中:_declspec (dllexport) char * read ()LONG len,k;BYTE receive_data[2048]; //设置BYTE数组CString str_tmp;//定义临时的字符串变量char * m_strread[2048];//定义数组存放返回值VARIANT variant_input=m_ctrlComm.GetInput(); //读缓冲区COleSafeArray safearray_input=variant_input;//VARIANT型变量转换为ColeSafeArray型变量len=safearray_input.GetOneDimSize(); //得到有效数据长度for(k=0;ksafearray_input.GetElement(&k,receive_data+k);//转换为BYTE型数组for(k=0;kBYTE bt=*(char*)(receive_data+k); //字符型Str_tmp.Format("%c",bt); //将字符送入临时变量str_tmp存放m_strread[k]=str_tmp; //加入接收编辑框对应字符串 return m_strread;经过编译后自动生成动态链接库文件.DLL。将此DLL文件存放在与应用程序相同的目录中,就可以在编写应用程序时调用。3.2 在主程序中我们用下面的程序代码进行调用:  首先要使用Microsoft Visual C++的通信控件(MSComm)为应用程序提供串行通信功能。串行端口的本质功能是作为CPU和串行设备间的编码转换器。当数据从 CPU经过串行端口发送出去时,字节数据转换为串行的位。在接收数据时,串行的位被转换为字节数据。在Windows环境(Windows NT、Win98、Windows2000)下,串口是系统资源的一部分。应用程序要使用串口进行通信,必须在使用之前向操作系统提出资源申请要求(打开串口),通信完成后必须释放资源(关闭串口)。  选择Project菜单下Add To Project子菜单中的 Components and Controls…选项,在弹出的对话框中双击Registered ActiveX Controls项,则所有注册过的ActiveX控件出现在列表框中。 选择Microsoft Communications Control, version 6.0,单击Insert按钮将它插入到我们的Project中来,接受缺省的选项。这时在ClassView视窗中就可以看到CMSComm类,并且在控件工具栏中出现了电话图标。 在主程序的开头加入如下代码:_declspec (dllimport) char * read ();MSComm控件可以使用查询或者事件驱动的方法从端口获取数据,我们采用的是应用比较广泛的事件驱动方法调用动态链接库接收数据:在OnComm()函数加入相应的处理代码:{// TODO: Add your control notification handler code herem_str_Rxdata = read();//调用DLL中的read() 函数将返回值赋给m_str_Rxdata(编辑框内容)UpdateData(FALSE); //更新编辑框内容4 总结  本系统通过采用VC编制DLL的方法进行工业中普遍应用的数据通信,既实现了系统的集散式控制,又便于软件日后的维护及升级,达到了系统设计的预期目标。

工程预算价
文章字数:6459
点击数:1843
[ 打印当前页 ]