您的当前位置:首页正文

多测试仪器数据采集与控制系统

2024-06-10 来源:客趣旅游网


硕 士 学 位 论 文

题 目:多测试仪器数据采集与控制系统

研 究 生 李 华 专 业 电路与系统 指导教师 胡永才 教授

秦会斌 教授

完成日期 2013年12月

杭州电子科技大学硕士学位论文

多测试仪器数据采集与控制系统

研 究 生: 李 华 指导教师: 胡永才 教授 秦会斌 教授

2013年12月

Dissertation Submitted to Hangzhou Dianzi University

for the Degree of Master

Multiple test instrument data acquisition

and control system

Candidate: Li Hua Supervisor: Hu YongCai

Qin HuiBin

December,2013

杭州电子科技大学

学位论文原创性声明和使用授权说明

原创性声明

本人郑重声明: 所呈交的学位论文,是本人在导师的指导下,独立进行研究工作所取得的成果。除文中已经注明引用的内容外,本论文不含任何其他个人或集体已经发表或撰写过的作品或成果。对本文的研究做出重要贡献的个人和集体,均已在文中以明确方式标明。

申请学位论文与资料若有不实之处,本人承担一切相关责任。

论文作者签名: 日期: 年 月 日

学位论文使用授权说明

本人完全了解杭州电子科技大学关于保留和使用学位论文的规定,即:研究生在校攻读学位期间论文工作的知识产权单位属杭州电子科技大学。本人保证毕业离校后,发表论文或使用论文工作成果时署名单位仍然为杭州电子科技大学。学校有权保留送交论文的复印件,允许查阅和借阅论文;学校可以公布论文的全部或部分内容,可以允许采用影印、缩印或其它复制手段保存论文。(保密论文在解密后遵守此规定)

论文作者签名: 日期: 年 月 日

指导教师签名: 日期: 年 月

杭州电子科技大学硕士学位论文

摘 要

本文的主要研究内容是设计和实现了一个多测试仪器数据采集与控制系统。该系统针对工业环境中传统模式下不同类型的测试仪器分别采用独立的数控系统进行数据采集与控制的弊端,将各种不同类型的测试系统整合到一个系统中,实现了统一监视,集中控制,使其能够更加宏观的反映整个生产过程,提高生产效率,避免资源浪费。

本系统的创新之处在于通过对工业生产中各种不同类型的测试仪器的分析和研究,将测试仪器的信息统一抽象成为一张信息资源表并保存在测试仪器中,上位机和测试仪器连接成功以后,测试仪器通过将自己的信息资源表发送给上位机,使上位机中镜像的建立起一个虚拟测试仪器模型,上位机利用这个虚拟模型进一步获取测试仪器所采集的数据和实现对测试仪器的控制。这种设计方案可以屏蔽测试仪器的具体差异,将各种不同的测试仪器通过同样的标准接入到同一个系统中,实现同时对多个不同类型的测试仪器进行数据采集与控制的任务。

本系统的下位机由测试仪器和STM32单片机组成,单片机实现中转服务器功能,单片机将多个测试仪器的数据经过打包以后再发送给上位机,减少了直接接入上位机的设备数量,使系统可以容纳更多的测试仪器。上位机软件系统在VS2010平台下,采用MFC进行研发,数据传输基于TCP/IP协议标准。上位机系统能在工业以太网环境中自动扫描和连接工作状态的下位机,从而实现对多个下位机设备的连接,并通过多线程建立和下位机系统的独立通信过程,从而获取下位机采集的数据和实现对下位机的控制。根据实际应用需求,上位机系统还编写了数据库模块和管理员模块。

本系统实现了课题要求,经大量模拟测试系统运行良好,证明此系统设计合理、切实可行。

关键词:测试仪器、单片机、多线程、网络扫描

I

杭州电子科技大学硕士学位论文

ABSTRACT

The main content of this paper is to design and implement a multi- test instrument data acquisition and control system. Different types of test equipment in industrial environments were used to separate the traditional model of CNC system for data acquisition and control. The system will based on these drawbacks, make various different types of test systems into one system to achieve a unified monitoring, centralized control, so that it can reflect more macro entire production process to improve production efficiency and avoid waste of resources.

The innovation of system is through the types of test equipment analysis and research during industrial production, equipment information abstracted into a unified information resource table and stored in test equipment. After test equipment connected to the PC successful, test instruments will sending their resource table to the PC that builds a virtual test equipment module.PC uses virtual module obtains further data collection instrument testing and implementation of test instruments control. This design can mask different test equipment, access several standard test equipment to one system through the only standard that achieves data acquisition and control task together with types of test equipment.

The system of lower computer is composed by test instruments and STM32 microcontroller.MCU transit server functionality. It will be packing test instrument data, sent to the PC that reduces amount of equipment direct access that system can contain more equipment. PC system under VS2010 platform is using MFC to research, data transmission based on TCP / IP protocol standards.PC system can auto scan and connect work state in the industrial Ethernet environment that enable to connect several lower machine. Also, through multi-threading, PC system could establish and independent communication process controller system, thereby obtaining lower machine data collection and implementation of control to the next. According to actual demand, PC systems also prepared a database and the administrator module. The system realizes the requirements of the subject. Since many times of simulation test is running well, it can provide the system design is feasible.

Keywords:test instruments, microcontroller, multi-threading, network scanning

II

杭州电子科技大学硕士学位论文

目 录

摘 要 ........................................................................................................................................ I ABSTRACT .............................................................................................................................. II 目 录 ..................................................................................................................................... III 第一章 绪 论 ........................................................................................................................... 1 1.1选题背景及意义 ............................................................................................................. 1 1.2国内外发展状况 ............................................................................................................. 1 1.3课题研究内容及章节安排 ............................................................................................. 3 第二章 整体设计 ..................................................................................................................... 5 2.1系统结构组成 ................................................................................................................. 5 2.2组网方式及拓扑结构 ..................................................................................................... 6 2.2.1TCP/IP协议简介 ...................................................................................................... 6 2.2.2拓扑结构 .................................................................................................................. 6 2.3方案设计思路 ................................................................................................................. 8 2.4系统通信协议 ............................................................................................................... 11 第三章 下机系统设计 ........................................................................................................... 15 3.1下位机系统简介 ........................................................................................................... 15 3.2操作系统移植 ............................................................................................................... 16 3.2.1OS_CPU.H .............................................................................................................. 17 3.2.2OS_CPU_A.ASM ................................................................................................. 18 3.2.3OS_CPU_C.C .......................................................................................................... 19 3.3LwIP的移植 .................................................................................................................. 20 3.3.1LwIP简介 ............................................................................................................... 20 3.3.2相关头文件的修改 ................................................................................................ 22 3.3.3操作系统接口的实现 ............................................................................................ 22 3.3.4网络设备驱动程序 ................................................................................................ 24 3.4下位机服务器功能的实现 ........................................................................................... 25 3.5本章小结 ....................................................................................................................... 26 第四章 上位机软件系统 ....................................................................................................... 27

III

杭州电子科技大学硕士学位论文

4.1软件功能需求 ............................................................................................................... 27 4.2软件开发平台介绍 ....................................................................................................... 28 4.3上位机软件界面 ........................................................................................................... 30 4.4网络扫描及通信模块 ................................................................................................... 33 4.4.1网络扫描技术简介 ................................................................................................ 33 4.4.2多线程技术简介 .................................................................................................... 34 4.4.3网络扫描方案 ........................................................................................................ 36 4.4.4网络扫描和通信模块实现过程 ............................................................................ 38 4.5测试仪器设置 ............................................................................................................... 40 4.6数据库模块 ................................................................................................................... 44 4.6.1数据库访问技术简介 ............................................................................................ 44 4.6.2数据库整体设计 .................................................................................................... 46 4.6.3数据库主要功能 .................................................................................................... 49 4.7管理员功能模块 ........................................................................................................... 56 4.7.1管理员功能模块简介 ............................................................................................ 56 4.7.2超级管理员功能 .................................................................................................... 57 4.7.3管理员功能 ............................................................................................................ 60 4.7.4管理员日志功能 .................................................................................................... 61 4.8本章小结 ....................................................................................................................... 63 第五章 测试结果与讨论 ....................................................................................................... 64 5.1测试环境和测试要求 ................................................................................................... 64 5.2测试结果及讨论 ........................................................................................................... 64 5.3本章小结 ....................................................................................................................... 68 第六章 总结与展望 ............................................................................................................... 69 致 谢 ..................................................................................................................................... 70 参考文献 ................................................................................................................................. 71 附录 ......................................................................................................................................... 73

IV

杭州电子科技大学硕士学位论文

第一章 绪 论

1.1选题背景及意义

数据采集与控制系统的诞生彻底颠覆了传统方式下数据采集只能依靠熟练工人手动进行记录的落后模式,使数据采集与控制的工作能在很多恶劣的工业现场环境下由系统自动完成,且由于系统操作简便,非专业人士也可以完成复杂的控制过程,在工业、航天等领域,数据采集与控制系统被得到了广泛的应用。

伴随着单片机和嵌入式技术、计算机技术和测控技术的日趋成熟和不断发展,将嵌入式技术、计算机技术和测控技术结合起来形成的新一代智能测控系统使得现代的数据采集与控制系统摆脱了过去传统模式下传输速率低下、采集对象单一、采集数据量小的缺点,而是向着高速化、智能化、多样化、模块化的方向不断发展。在20世纪70年代工业出现的工业以太网以其标准统一、传输速率高、技术成熟、成本低等诸多优点逐渐代替了传统的工业总线成为工业现场设备之间进行数据交换、网络通信的新标准。

在工业现场中往往需要同时对现场多个不同类型的测试仪器进行监控的,从而获取到整个生产过程的状态。传统模式下每类测试仪器会有其独立的系统进行数据采集和控制,仪表将采集到的数据通过串口传递给自己独立系统中的计算机进行显示和处理,这种模式既不利于宏观地反应整个生产过程,也不便于计算机集中监视、统一控制,同时增加了生产成本。根据工业生产的实际需要和现在数据采集与控制系统技术的发展趋势,本文将计算机技术、单片机技术、智能仪器仪表技术以及工业以太网标准结合起来设计了一套多测试仪器数据采集与控制系统。采用本系统设计方案可以将所有的仪表通过工业以太网动态地接入到一个系统中,克服了以上缺点,同时增加了数据传输的可靠性、稳定性,便于对数据进行统一监视、管理,还实现了对各类仪表的远程控制。

本文采取的设计方法是一种面向对象的设计方法,而不是传统模式中面向器件的设计方法,此设计方案实现了对不同种类仪表的兼容,利用本文介绍的设计方案可以对原系统进行改造、升级,从而减少再次开发所消耗的费用。

1.2国内外发展状况

数据采集与控制系统最早出现在20世纪50年代,美国在军事上首次由非熟练人员不依靠测试文件,通过高速测试设备自动控制完成了对数据的采集与控制。由于这种系统具有灵活性、高速性等优点,可以满足很多传统测试模式下不

1

杭州电子科技大学硕士学位论文

可能完成的任务,受到了广泛的认可。60年代后期,成套的基于专属系统的数据采集与控制设备就已经开始进入市场。

20世纪中后期,微型机的快速发展使得将以其、仪表、计算机融为一体的数据采集与控制系统开始出现,这种系统以优良的性能,超越了传统的专用数据控制系统和自动检测仪表,从而获得了飞速的发展。70年代开始,数据采集与控制系统划分成为了用于实验室和用于工业现场的两类不同的数据采集与控制系统。

20世纪80年代,计算机开始普及并应用到了社会、生产、科研的各个领域,数据采集与控制系统获得了极大的发展,开始出现了通用的系统。一类系统由计算机、仪器、仪表、通用总线接口构成。另一类由控制卡、总线和计算机组成,这种系统将接口卡放在机箱内,由计算机进行控制,这类系统在工业中使用较为普遍,如果测试任务更改只需通过新的电缆将测试箱接入系统,再在测试箱中的插入新的测试卡就可以根据测试任务要求完成硬件平台的搭建。

20世纪末,数据采集与控制系统在发达国家已经被广泛的用于军事、工业、航空等领域。随着集成电路技术的不断进步,一种高精度的单片机采集与控制系统诞生了,由于其高可靠性、高性能的特点,在工业领域获得了极为广泛的应用。该阶段的系统采用模块结构,只需要简单的增加或者减少相应的模块就能快速的改变系统,变为一个新的系统 [1]。

国外发展状况:

1. 随着微电子技术、计算机技术、通信技术以及测控技术的飞速发展[2],国外的数据采集与控制系统较发展之初已经有了巨大的进步,国外数据采集与控制系统主要向着体积小型化、功能多样化、操作简便化等方向发展,此外,其主要特点还体现在以下几个方面。

2. 既可以进行数据采集和控制,还可以作为状态分析仪,能够实现频域分析、时域分析,还能实现细化、倒谱、包络谱等功能。

3. 即可以作为数据采集器,还可以作为其他仪器来使用。

4. 存储量大、测量范围宽、适应范围广,能够适应从低频到高频,从低速到高速地各种类型的测量。

5. 可根据需要对各种不同的数据进行采集,如电流、电压、温度、湿度、浓度、转速、位移、压力等等,形成多参数的测量系统。

6. 数据采集与控制系统的配套软件系统应具有较强的功能和适应性,能够使用多种类型不同用途多种参数的数据采集与控制器。

7. 元器件集成度高、机身重量轻、密封性好,能够在各种恶劣的工业环境下正常工作。

2

杭州电子科技大学硕士学位论文

国内发展状况:

我国已经自主研制除了多种类型的数据采集与控制系统,能够适应基本的状况检测、频谱分析以及故障处理的要求,基本达到了国外测试采集与控制器初期的水平,但是同国外先进的系统相比,技术上仍有较大差距,主要体现在:

1. 传感器技术落后,精度不够高,限制了很多环境下的进行测试以及分析条件,给数据采集和诊断造成了困难。

2. 由于数据控制与采集系统内存空间小,处理能力差在现场只能做简单的诊断,精密地分析需要到计算机上完成,现场分析诊断能力差。

3. 配套软件水平落后,诊断系统还不完善,人机界面有待改进,局限性较大,软件适应度差。

1.3课题研究内容及章节安排

本系统基本功能是:上位机通过主动扫描查找网络中的下位机,并接入所有的工作状态的下位机,下位机设备即时地将采集到的数据发送给上位机,上位机能够对数据进行显示、保存并能通过发送指令给下位机设备实现对仪测试仪器的控制。

下位机系统由单片机和测试仪器组成,主要完成以下任务:

1. 利用测试仪器对数据进行采集,采集到的数据先发送给单片机,单片机对采集到的数据进行预处理,并按照规定好的协议对数据进行打包,最后通过以太网将采集到的数据传输给上位机。

2. 单片机作为中间环节,能够将所采集的数据发送给指定的上位机设备,并且能对接入的上位机设备进行识别,防止恶意侵入,屏蔽不明数据源。

上位机软件系统除了满足具有较好的人机交互体验、界面简洁直观、功能设置齐全等基本要求还应具备以下功能:

1. 主动查找网络中打开的下位机设备,当检测到下位机设备打开时能够立刻与下位机设备连接,实现下位机设备的动态接入。

2. 实时接收从下位机发送来的数据,保证数据准确无误,并将数据在界面上直观显示出来,以实现对下位机的远程监控;

3. 根据制定好的协议解析从下位机设备所得到的数据包,并能够判断数据的来源,数据类型,将数据与下位机的测试仪器对应,保证数据的正确性;

4. 具有数据处理的能力,能够实时、高速地对数据进行计算、分析,根据计算的结果智能化地实现预警、故障诊断、自动控制等功能;

5. 具有控制功能,能够实现远程对下位机进行各种操作,而不必依赖现场人员的控制,并保证控制的实时性、有效性、准确性;

3

杭州电子科技大学硕士学位论文

6. 软件具有学习的能力,能够广泛应用于各类硬件设备、仪表,且可用于升级以后的硬件设备;

7. 软件具备自我保护的能力,能实现对操作人员的操作过程进行记录。并提供操作分级机制,以便不同权限的人对系统进行操作。

8. 软件具有数据库功能,利用高性能计算机的优越性,通过SQL2008建立专门的数据库,能够将所采集到的数据以时间点的形式分类进行有效保存,并支持数据库容量扩展,能够随时对数据库中的数据进行添加、删除、更改等操作,便于以后对数据进行再次分析和研究。

结合所研究课题的内容安排章节如下:

第一章 绪论。主要阐释课题研究意义、国内外发展状况、简要介绍本课题研究内容。

第二章 整体设计及拓扑结构。主要介绍本系统的整体设计框架、结构以及大致的设计思路。

第三章 下位机系统的设计与实现。详细介绍下位机系统的功能、设计方法以及具体的实现方法。

第四章 上位机软件系统的设计与实现。主要对上位机位机软件系统的开发平台、各功能模块的所使用的关键技术以及各功能设计与实现过程进行详细介绍。

第五章 本章详细的介绍了如何利用面向对象的设计方案对本系统进行设计,使本系统具有更强的灵活性、适应性以及更强的生命力

第六章 测试结果与讨论。进行系统测试,针对本系统在实际运行过程中的结果进行讨

4

杭州电子科技大学硕士学位论文

第二章 整体设计

2.1系统结构组成

本系统主要由上位机软件系统和下位机系统组成,上位机主要满足对下位机发送的数据进行实时显示、后台保存、分析处理以及对下位机测试进行参数测试、操作控制等要求。下位机由两部分组成,第一部分是各类仪器、仪表、测试箱等数据采集器,主要负责数据采集,第二部分是STM32单片机,它作为中介的服务器,使上位机和下位机某组测试仪器可以通过网络连接组成一个系统。

STM32单片机既是上位机程序和下位机的数据采集器之间的实现连接的桥梁,也是进行数据交换的中间环节,它将下位机中各测试仪器的资源信息、工作状态以及采集到的数据进行预处理、打包封装以后发送给上位机,同时将上位机发送的指令传递给数据采集器,以改变它们的工作方式和测量结果。

系统整体构架下图所示:

上位机以太网STM32单片机下位机系统以太网测试仪器PPPTTPTT

图2.1整体构架

本系统基于TCP/IP协议采用工业以太网做为传输网络,同串口总线通信相比,以太网具有传输距离远、通信信号稳定、数据流量大、可接入设备多的优点。而传统的串口设备也可以通过硬件改造成为具有以太网接口的设备,从而与本系统兼容。

5

杭州电子科技大学硕士学位论文

2.2组网方式及拓扑结构 2.2.1TCP/IP协议简介

本系统基于TCP/IP协议进行设计,TCP协议是一种工业标准的面向连接的、端到端的可靠传输协议[3],为跨越不同网络的主机进程间通信提供了可靠的传输机制,它是一个功能非常完善,面向连接,可靠的传输层协议,传输数据前先在两台设备之间建立一条虚拟连接,之后就可以双向传输数据。TCP将数据看做成字节流的形式,他不会对数据的内容进行理解。TCP提供了完善的通信功能,屏蔽了通信的细节,只要告诉TCP数据发送的目的地,TCP就能完成数据发送的任务[4]。

TCP可以完成以下功能:

1.数据封装和传输。TCP建立连接时会与对方协商最大的段大小,应用程序的数据被划分成很多个TCP段,IP协议再把TCP段封装到数据报中发送到网络上。

2.可靠性。TCP协议通过校验和、序号、超时重传等方法保证传输数据的可靠性

3.流量控制。TCP对两端传输的数据流加以管理,发送方根据接收方反馈的通告窗口控制数据的发送数据。

4.拥塞避免。重传定时器超时或收到了重复确认时,发送方认为分组丢失了。一旦发生拥塞,发送方当前拥塞窗口值的一半保存到一个启动门限值中,并把拥塞窗口设置为一个MSS大小,当新数据被确认时再增加拥塞窗口。

5.多路复用。TCP收不中包含源和目的端口,允许同一主机上的多个进程同时使用TCP通信。

6.连接管理。当两个TCP希望进行通信时,他们的TCP必须初始化一些状态信息,并建立一个连接。建立连接使用三次握手机制,每一次都发送它初始的序列号,并接收对方的确认,同步连接使用的序号,避免错误地初始化一个连接。

TCP是一个全双工面向字节流的协议。它提供了完善的连接管理功能,应用程序不需要关心传输的具体细节。鉴于TCP/IP协议的优点,它已广泛地被应用到了工业领域。

2.2.2拓扑结构

本系统采用TCP/IP协议进行数据传输,利用工业以太网技术组网,采用C/S结构进行设计。本系统中并没有将上位机作为服务器端,而是利用STM32单片

6

杭州电子科技大学硕士学位论文

机作为一个中介服务器,上位机和测试仪器都作为客户端根据设定好的IP和端口接入到对应的单片机服务器中组成一个小的独立系统,上位机会单独开辟一个独立的线程在这个小系统中进行通信,并独立地对采集到的数据进行显示、存储等操作同时控制该系统中的仪器设备。当有新的下位机设备接入时上位机会开辟新的线程同下位机中的仪器、仪表作为客户端接入到新的下位机系统的服务器上组成一个新的独立系统。该结构如下图所示:

上位机程序上位机程序线程客户端上位机程序线程客户端上位机程序线程客户端……单片机服务器单片机服务器单片机服务器……仪器客户端仪器客户端仪器客户端 图2.2网络结构

采用这样的设计结构有以下优点:

1.能够支持多个上位机程序接入。传统模式以上位机为服务器,下位机为客户端的模型只支持多个下位机接入上位机,却无法支持多个上位机同时与下位机连接并进行数据监控,采用本系统的模型,即能过支持多个上位机同时接入到下位机系统中实现对仪表的监控,同时多个仪表也能接入到同一个系统中。

2.保证了上位机对每个下位机系统操作的独立性。虽然将各仪器、仪表采集到的数据显示到同一个界面下有利于对整个生产过程以及生产状态地宏观控制,但是对于每个仪器、仪表的控制必须保证其独立性不能相互干扰,上位机软件通过线程同单片机以及对应的仪器仪表组成独立的系统,即满足了集中显示、统一控制的要求,又避免了相互影响造成控制失误。

3.可以接入更多的测试仪器。如果采用上位机直接通测试仪器连接的方式,当测试仪器数量增多的时候会给上位机的数据处理造成较大的压力,采用这种设计模式,可以将一个大系统分成多个小系统,利用STM32单片机连接多个测试

7

杭州电子科技大学硕士学位论文

仪器可以实现将多个测试数据进行封装以后再发送给上位机,减轻了上位机对数据处理的压力。

4.系统灵活性较强,有利于旧系统的改造和新设备的加入。对于传统模式下仪器设备是通过串口总线同上位机进行连接或者是作为客户端和上位机进行连接的都很容易通过改造适应本系统,第一种情况下只需要通过串口转网口,然后通过网口与单片机实现连接即可,第二种情况下只需要直接同单片机进行连接即可。而新的仪器设备只要和单片机连接成功以后接入系统中,上位机即可通过网络扫描实现同新设备的连接、通信。

5.系统更加安全。STM32单片机作为中介服务器除了实现简单的数据交换功能外,还可以利用STM32设置安全规范,防止恶意入侵。

2.3方案设计思路

在传统的上下位机通信系统中,上位机通常会将下位机的测试资源固化到自己的系统中,下位机只需要将自己所测得的数据按照一定的协议发送给上位机,上位机根据系统中固化的资源就可以判断所采集到的数据信息,这样做的优点是容易编程,且传输过程简单,缺点在于可拓展性差,一个上位机系统只能和一个下位机配套兼容,如果下位机中的测试仪器的测试资源项发生了改变,或是采用了其他种类的测试仪器则必须要求同时改变上位机中的系统,对上位机软件重新进行编程。

这种传统的设计方案主要面向某种特定的测试仪器,是一种面向过程的解决方案,在本系统中,由于上位机需要实时动态地连接多个不同类型的测试仪表,传统的解决方案已不适用于本系统,本系统采用了一种面向对象的设计方案。

面向对象[5]即面向测试仪器这一概念,而不是特指某一类测试仪器,这种设计方案屏蔽了测试仪器的具体差异,真正实现了测试仪器的动态接入,动态建立,面向对象的设计方法也是该系统得以实现的关键所在,为了能够案这一方法得以实现,首先需要将各类测试仪器的统一抽象成一张模型一致的资源设定表,该资源设定表表如下图所示:

8

杭州电子科技大学硕士学位论文

图2.3资源设定表

几乎所有的测试仪器都可以抽象成这样一张资源表的形式,资源表主要分为两大部分,测试的设定部分以及测试结果设定部分。测试设定部分主要功能是实现对测试的过程、方式进行详细的设定,如测试内容、测试持续时间、测试范围等等,对于两个不同的测试仪器而言,其测试设定项下设定内容可能完全不同,在传统模式下,如果需要对两个不同类型的测试仪器进行控制,往往需要采用两套不同的系统,而将所有测试仪器抽象成同样类型的一张表的设计方法则大大增加了上位机软件程序的灵活性,根据下位机发送到上位机的测试资源设定表上位机就可以知道此下位机有哪些测试资源,测试资源有何种测试类型、测试方式,而上位机可以根据需要灵活的进行设置。因此上位机程序中不需要固化下位机设备任何的信息,当上位机和下位机连接成功以后会由下位机通过发送资源表到上位机主动告诉上位机自己的所有信息,通过这种方式真正实现了下位机的动态接入、下位机信息的动态建立、数据的动态发送,使整个过程更加灵活、更加智能。

本系统设计方案的关键在于在上位机和下位机连接成功以后在发送数据以前将下位机的所有信息告知上位机,上下位机通过应答的方式将下位机的所有信息发送给上位机,使上位机根据所获得的信息在后台建立起同样形式的一个镜像的下位机,从而为下一步工作做好准备。上位机对下位机信息获取过程的实现如下图所示:

9

杭州电子科技大学硕士学位论文

上位机连接成功请求下位机发送设备标识请求发送测试资源表请求发送测试资源详细设定表请求发送测试序列请求发送测试序列项目的详细设定表否是否已获取所有测试仪器的信息是请求下位机进行数据发送下位机连接成功发送名称标识到上位机发送测试资源表到上位机发送测试资源详细设定表到上位机发送测试序列到上位机发送测试序列项目的详细设定表到上位机将采集到的数据发送到上位机 图2.4:上位机获取下位机信息过程

整个过程采用问答的方式由上位机主控,主动向下位机发起发送请求。上位机程序打开时不包含任何信息,当有下位机连接成功以后,上位机首先请求下位机发送仪表名称标识到上位机作为唯一标识,标识此下位机,然后请求下位机发送测试资源表以及每一个测试资源的详细设定表到上位机中。

测试资源表中的内容表示此仪表所能测试的所有测试项目,测试资源表是一组最大长度为24KB的ASCII码字符,用于对测试资源进行描述。每一个测试资源的详细设定表用于设定本条测试项目的具体测定信息,如:测试内容,测试方式,测试时间,测试持续时间等等。同时在上位机根据收到的表镜像地建立起和下位机同样的测试资源信息,此时上位机可以抽象地被认为是一个和下位机同样的测试仪器。测试资源是每个下位机的测试仪器所固有的信息,在上位机中这些信息也会以静态形式保存起来,它们可以被查看、调用,但是本身不可以被更改。

接下来上位机请求下位机将正在测试的项目组成的测试序列,以及正在测试项目的设定数据发送到上位机,从而获取到下位机正在工作的状态,上位机同样镜像地将工作状态信息保存在上位机中,这些信息是反应下位机工作状态的信

10

杭州电子科技大学硕士学位论文

息,上位机可以对这些信息进行设置、更改,从而改变下位机的工作状态。此时,上位机中已经获取到下位机的所有信息资源,虚拟的建立起一个和下位机同样的测试仪器。至此一个测试仪表对象的实例化过程已经完成,根据动态接入的下位机的数量不同,上位机中将会建立起同样多个同样的测试仪表的实例,对于上位机而言它并不知道下一个会接入的仪表的信息、状态,但是当下位机接入后通过以上步骤上位机就可以建立起同样的一个测试仪表的实例,最后下位机将测试仪器所采集到的数据发送给上位机,完成一个基本的数据采集过程。

采用本设计方案使得下位机系统的动态接入得以实现,对于上位机的开发而言,完全不用关心下位机连接了何种仪表,更不用针对某类仪器、仪表进行特定的编程,只需要在下位机成功接入系统以后由下位机主动告知上位机,上位机根据所获得的信息在主界面中建立表头,赋予数据意义。

而将测试的测试资源抽象成一张表,是面向对象设计方案得以实现的关键所在,它将各类测试仪器抽象成为了一个对象,而不再是各个分散的实例,从而使得所有的仪器、仪表都能按照同样的模式将自身信息发送给上位机,是设计思路上的重大转变。

2.4系统通信协议

为了实现上下位机对下位机信息的获取、以及下位机数据的发送本系统制定了详细的通信协议用于上下位机的通信,根据上位机获取下位机信息实现流程,制定通信协议内容如下所示。 (1)步骤1:请求下位机发送设备名称 上位机请求包数据:

表2.1上位机请求发送仪表名称数据格式 序号 1 内容 请求包命令 属性 char[1] 说明 请求仪表名称命令为0x80 上位机与下位机建立连接之后发送1个字节的值为0x80的char变量到下位机,请求其发送仪表名称,数据包内容为{0x80}。然后等待下位机发送仪表名称。

下位机应答包数据:

表2.2下位机应答包数据格式

序号 1 2 3 内容 应答包命令 包体数据长度 仪表名称 属性 说明 char[1] 请求仪表名称命令为0x80 char[4] 仪表名称长度 char[length] length为仪表名称的长度 11

杭州电子科技大学硕士学位论文

下位机收到请求仪表名称命令0x80后发送应答数据包,应答数据包为char形数组。数组第一位为返回应答命令0x80。如下位机返回仪表名称为“Test1”,则应答数据包全部内容为{0x80,’0’,’0’,’0’,’5’,’T’,’e’,’s’,’t’,’1’}。

(2)步骤2请求下位机发送测试资源表 上位机请求包数据

表2.3请求下位机发送测试资源表数据格式

序号 1 2 内容 请求包命令 请求端口号 属性 char[1] char[1] 说明 请求测试资源表命令为0x81 Eg:请求第一个口则值为1 上位机接收到仪表名称之后发送2个字节char数组到下位机,按照端口号依次遍历,请求下位机发送遍历到端口的测试资源表。数组第一位为请求测试资源表命令0x81,第二位为请求的端口号,从第1个端口开始请求。例如请求下位机发送第1个口的测试资源表,则char数组内容为{0x81,0x02}。

下位机应答包数据:

表2.4下位机应答包数据格式 序号 1 2 3 4 内容 应答包命令 包体长度 应答端口号 测试资源表 属性 char[1] char[4] Char[1] char[length] 说明 请求测试资源表命令为0x82 应答端口号加上测试资源表 下位机接收到0x81命令和请求端口号之后返回该端口号下的测试资源表。例如端口号为2,测试资源表长度为123。则应答包char数组前面6个字节内容为{0x81,’0’,’1’,’2’,’3’,0x02},后面添加上测试资源表的内容。如果该端口下的测试资源表内容为空则不添加,包体长度为应答端口号的1个字节,应答包内容为{0x81,’0’,’0’,’0’,’1’,0x02}。

(3)步骤3请求下位机发送测试资源详细设定表。 上位机请求包数据:

表2.5上位机请求发送试资源详细设定表数据格式 序号 1 2 内容 请求包命令 请求端口号 属性 char[1] char[1] 说明 请求测试资源详细表命令为0x82 Eg:请求第一个口则值为1 上位机接收到一个端口的测试资源表之后,上位机发送2个字节char数组到下位机,请求发送该端口测试资源详细表。数组第1位为请求命令0x82,第2位为请求端口号。例如请求下位机发送第2个口的测试资源详细表,则char数组内容为{0x80,0x02}。

12

杭州电子科技大学硕士学位论文

下位机应答包数据:

表2.6下位机应答包数据格式

序号 1 2 3 4 内容 应答包命令 包体长度 应答端口号 测试资源详细表 属性 char[1] char[4] char[1] char[length] 说明 请求测试资源详细表命令为0x82 应答端口号加上测试序列表长度 下位机接收到0x82命令和请求端口号之后返回该端口号下的测试资源详细表。例如应答端口号为2,测试资源详细表长度为123。则应答包char数组前面6个字节内容为{0x82,’0’,’1’,’2’,’3’,0x02},后面跟随的为测试资源详细表的具体内容。如果该端口下的测试资源详细表内容为空则不添加,包体长度为应答端口号的1个字节。

(4)步骤4请求下位机发送测试序列 上位机请求包数据

表2.7上位机请求下位机测试序列表数据格式

序号 内容 1 请求包命令 2 请求端口号 属性 char[1] char[1] 说明 请求测试序列表命令为0x84 Eg:请求第一个口则值为1 上位机接收完一个端口的测试资源详细设定表之后,发送2个字节char数组到下位机,请求其发送该端口的测试序列表。数组第1位为请求测试序列表命令0x84,第2位为请求端口号。例如请求下位机发送第2个口的测试序列表,则char数组内容为{0x84,0x02}。

下位机应答包数据:

表2.8下位机应答数据格式 序号 1 2 3 4 内容 应答包命令 包体长度 应答端口号 测试序列表 属性 char[1] char[4] char[1] char[length] 说明 请求测试序列表命令为0x84 应答端口号加上测试序列表长度 下位机接收到0x84命令和请求端口号之后返回该端口号下的测试序列表。例如应答端口号为2,测试序列表长度为3,测试序列为123。则应答包char数组内容为{0x84,’0’,’0’,’0’,’3’,’2’,0x01,0x02,0x03}。如果测试序列为空则应答包char数组内容为{0x84,’0’,’0’,’0’,’1’,’2’}。

(5)步骤5请求下位机发送测试序列详细设定表 上位机请求包数据:

表2.9:上位机请求发送测试序列详细数据格式 序号 1 内容 请求包命令 属性 char[1] 说明 请求测试序列详细数据表命令为0x88 13

杭州电子科技大学硕士学位论文

2 请求端口号 char[1] Eg:请求第一个口则值为1 上位机接收到一个端口的测试序列表之后,发送2个字节char数组到下位机,请求其发送该端口的测试序列详细数据表。数组第1位为请求测试序列详细数据表命令0x88,第2位为请求端口号。例如请求下位机发送第2个口的测试序列详细数据表,则char数组内容为{0x88,0x02}。

下位机应答包数据:

表2.10下位机应答数据格式

序号 1 2 3 4 内容 应答包命令 包体长度 应答端口号 测试序列详细表 属性 char[1] char[4] 说明 请求测试序列详细表命令为0x88 应答端口号加上测试序列详细表长度 char[1] char[length] 下位机接收到0x88命令和请求端口号之后返回该端口号下的测试序列详细数据表。例如应答端口号为2,测试序列详细数据表长度为123。则应答包char数组前面6个字节内容为{0x88,’0’,’1’,’2’,’3’,0x02},后面跟随的为测试序列详细数据表的具体内容。上位机在收到0x88命令的应答包完成数据处理之后,跳转到第2个步骤,向下一个端口发送命令为0x81的请求包并重复2、3、4、5这4个步骤直到遍历完成所有端口。在遍历结束所有端口后完成自举过程。

(6)步骤6请求下位机发送测试数据 上位机请求包数据:

表2.11上位机请求发送数据命令格式

序号 1 内容 请求包命令 属性 char[1] 说明 请求发送数据命令为0x00 上位机在遍历完所有端口之后,发送1个字节的值为0x00的char变量到下位机,告诉下位机可以开始循环发送测试数据。

下位机应答包数据:

表2.12下位机应答数据格式 序号 1 2 3 内容 应答包命令 包体长度 测试数据 属性 char[1] char[4] char[length] 说明 请求测试数据命令为0x00 测试数据长度 下位机收到请求命令0x00后,开始发送测试数据。发送测试数据的应答包为char形数组。例如发送的测试数据长度为1234,则应答包前5个字节内容为{0x00,’1’,’2’,’3’,’4’}。后面跟随具体测试数据。

14

杭州电子科技大学硕士学位论文

第三章 下机系统设计

3.1下位机系统简介

下位机中STM32单片机作为服务器首先通过网口同多个测试仪器进行连接,然后等待上位机的接入,上位机对下位机设备的查找其实就是查找STM32单片机服务器,因此在下位机系统中STM32单片机扮演着重要的角色[6],是上位机和下位机中的测试仪器能够成功连接并组成系统的关键,当上位机软件通过网络查找到开启的单片机服务器以后,STM32单片机会通过以下流程建立起上位机和下位机测试之间的通信。

上位机连接成功将下位机中测试仪器的信息发送给上位机是否全部发送完成将下位机中测试仪器的工作状态发送给上位机上位机是否对测试仪器参数进行修改将命令转发给对应的测试仪器,测试仪器根据新的测试参数进行测试将测试仪器的测试数据进行预处理、打包发送给上位机

图3.1 STM32单片机工作流程

上位机成功连接到STM32单片机以后,STM32单片机首先会向上位机发送自己的唯一标识,用于上位机对此下位机系统的识别。然后上位机会向单片机发送命令,要求轮询所有已接入的测试仪器,将测试仪器的资源信息、工作状态发送给上位机,从而使上位机获取到下位机系统中各测试仪器的详细信息。上位机中不会保存任何测试仪器的信息,每次上位机和下位机连接成功以后都会重新获取下位机的信息。上位机系统获取到测试仪仪器的信息以后会根据实际需要决定是否更改测试仪器的测试参数,如果需要进行参数更改,上位机会发送指令到STM32单片机,STM32单片机通过解析协议再将指令转发给对应的测试仪器。

15

杭州电子科技大学硕士学位论文

设置完成以后测试仪器将采集到的数据发送给单片机,单片机对数据进行预处理,打包以后发送给上位机。

本系统采用的STM32单片机是意法半导体公司以ARM Cortex-M3为内核开发生产的32位微控制器,专为低成本、低功耗、高性能的嵌入式应用设计。根据性能分为几个不同的系列, STM32F101为“基本型”, STM32F103为“增强型”,STM32F107为“互联型”[7]。

根据设计的需要,本系统选择了STM32F107系列,它在USB OTG和CAN2.0B接口基础上增加了以太网10/100MAC模块,通过以太网收发数据,符合IEEE 802.3-2002标准。 STM32F107系列以太网模块灵活可调,使之能适应各种不同的客户需求。该模块支持两种标准接口,连接到外接的物理层(PHY)模块:IEEE 802.3协议定义的独立于介质的接口(MII)和简化的独立于介质的接口(RMII)。适用于各类应用,如交换机、网络接口卡等。通过以太网模块可以实现以下功能:MAC控制器功能,DMA功能,PTP功能。因此利用STM32F107系列单片机可以轻松地实现联网功能。

实现下位机STM32的服务器功能需要通过移植一个轻量级的TCP/IP协议栈LwIP来实现,虽然LwIP可以支持无操作系统的环境,但是由于下位机服务器需要多线程的支持,因此在移植LwIP之前需先移植一个小型的嵌入式操作系统μC/OS-Ⅱ,它可以利用多任务可以实现多线程的需求,从而使单片机服务器满足功能需求。

3.2操作系统移植

μC/OS-Ⅱ是一个实时的多任务操作系统。μC/OS-Ⅱ除了少数与处理器关系密切的代码使用汇编语言进行编写外其余部分几乎都采用C语言进行编写,因此μC/OS-Ⅱ系统只需要进行少量的修改就可以简单地移植到各种不同类型的处理器上。μC/OS-Ⅱ结构精简、执行效率高、具有极强的可读性和可拓展性,同时又具备了实时嵌入式系统应具备的基本功能,被广泛的移植到各种类型的单片机或者嵌入式芯片上[8]。

μC/OS-Ⅱ在STM32上的应用系统结构如下图所示:

16

杭州电子科技大学硕士学位论文

Section5Your ApplicationAPP.CAPP_VECT.CAPP_CFG.CINCLUDES.HOS_CFG.HμC/OS-ⅡBookμC/OS-ⅡOS_CORE.COS_FLAG.COS_MBOX.COS_MEM.COS_MUTEX.COS_Q.COS_SEM.COS_TASK.COS_TIME.COS_TMR.CμC/OS_Ⅱ.HSection3μC/OS-ⅡCortex32 M3 PortOS_CPU_C.COS_CPU_A.ASMOS_CPU.HOS_DBG.CBSPBSP.CBSP.HSection6Section2ARM Cortex-M3/Target Board

图3.2:μC/OS-Ⅱ的ARM Cotex-M3应用体系结构

移植前从网上下载μC/OS-Ⅱ源代码,然后根据μC/OS-Ⅱ在STM32上的移植需要,修改三个与内核相关的文件,os_cpu.h、OS_CPU_A.ASM和OS_CPU_C.C

3.2.1OS_CPU.H

os_cpu.h需要针对与编译器相关的数据类型、允许和禁止中断宏、栈生长方向和OS_TASK_SW()宏进行修改。

1.数据类型:为了使系统便于移植,程序中没有使用与处理器相关的C语言数据类型,而采用了便于进行移植的整数数据类型,这些数据类型的定义如下图所示[9]。

17

杭州电子科技大学硕士学位论文

typedef unsigned char BOOLEAN;typedef sigend char INT8U;typedef unsigend char INT8S;typedef unsigend short INT16U;typedef sigend short INT16S;typedef unsigned int INT32U;typedef signed int INT32S;typedef float FP32;typedef double FP64;typedef INT32U OS_STK;

图3.3数据类型定义

2.允许和禁止中断宏

μC/OS-Ⅱ在访问代码临界区之前必须先要禁止中断,访问结束以后再重新允许中断,从而避免代码被中断或者多任务程序锁破坏。在STM32上实现如下:

#define OS_CRITICAL_METHOD 3#if OS_CRITICAL_METHOD=3#define OS_ENTER_CRITICAL() {cpu_sr=OS_CPU_SR_Save();}#define OS_EXIT_CRITICAL() {OS_CPU_SR_Restore(cpu_sr);}#endif图3.4允许和禁止中断宏

3.栈生长方向:将OS_STK_GROWT置为1则栈从上往下生长否则置为0。 4.OS_TASK_SW()宏的修改:OS_TASK_SW()是一个宏,总在任务级代码中被调用,当系统从低优先级切换到高优先级时会被用到。另一个函数OSInitEXit在中断子程序中完成任务切换的功能[10]。

3.2.2OS_CPU_A.ASM

OS_CPU_A.ASM 中主要更改PendSV ()子程序和OSStartHighRdy() 的中断服务子程序。

OSStart()调用OSStartHighRdy()来使优先级最高的已经准备就绪的任务开始执行,它通过从优先级最高的任务控制模块中获取任务的栈指针来恢复CPU现场。OSStartHighRdy()包括将处理机寄存器保存到栈的操作。

OSPendSV()在μC/OS-Ⅱ系统中处理全部的上下文切换,OSPendSV()可以通过像普通中断一样来减缓执行一个异常,挂起PendSV的方法是:往PendSV挂起寄存器中写1,由于优先级不够高,PendSV异常会延迟任务上下文切换的请

18

杭州电子科技大学硕士学位论文

求,直到其他ISR都处理完成以后才放行。为了实现这个目的,必须将PendSV编程为优先级最低的异常。由于上下文切换是在PendSV处理函数里实现的,因此STM32在发生异常时会有一半的寄存器自动保存到任务堆栈里,PendSV处理只需要保存R4-R11并修改堆栈指针即可[11]。

PendSV中断处理函数如下:

OS_CPU_PendSVHandler(){ if (PSP != NULL) {Save R4-R11 onto task stack;OSTCBCur->OSTCBStkPtr = SP; }OSTaskSwHook();OSPrioCur = OSPrioHighRdy;OSTCBCur = OSTCBHighRdy;OSTCBCurPtr = OSTCBHighRdyPtr;PSP = OSTCBHighRdy->OSTCBStkPtr;LR=LR|0x04;Restore R4~R11 fromnew task stack;Return fromexception; }图3.5 PendSV中断处理函数伪代码

如果PSP=0,说明这是OSStartHighRdy()启动后所做的首次任务切换,R4-R11在任务创建时就已经被保存在了堆栈中,不必要对任务再次进行保存,OSTCBStkPtr是结构体中的第一个变量,它的值等于SP,由于中断处理函数中使用了MSP,因此在返回任务后需使用PSP,且D2位必须等于1[12]。

3.2.3OS_CPU_C.C

在将μC/OS-III 移植到STM32 的过程中对需要对OS_CPU_C.C 的修改10个C语言函数,而这些文件中最主要的是修改是任务栈初始化函数

OSTaskStkInit(),它在任务创建时供OSTaskCreate()调用,OSTaskStkInit()的作用是把任务堆栈初始化成像中断刚发生的状态[13],并返回新的栈指针stk。用C 语言编写OSTaskStkInit()函数如下:

19

杭州电子科技大学硕士学位论文

OS_STK *OSTaskStkInit ( void (*task)(void *p_arg), void *p_arg, OS_STK *ptos,INT16U opt){ OS_STK *stk; (void)opt;stk = ptos; *(stk) = (INT32U)0x01000000L;*(--stk) = (INT32U)task;*(--stk) = (INT32U)0xFFFFFFFEL;*(--stk) = (INT32U)0x12121212L; *(--stk) = (INT32U)0x03030303L;*(--stk) = (INT32U)0x02020202L;*(--stk) = (INT32U)0x01010101L;*(--stk) = (INT32U)p_arg;*(--stk) = (INT32U)0x11111111L; *(--stk) = (INT32U)0x10101010L;*(--stk) = (INT32U)0x09090909L;*(--stk) = (INT32U)0x08080808L;*(--stk) = (INT32U)0x07070707L;*(--stk) = (INT32U)0x06060606L;*(--stk) = (INT32U)0x05050505L;*(--stk) = (INT32U)0x04040404L; return (stk);}图3.6 OS_TaskStkInit()代码

剩余几个钩子函数必须声明但是可以不用包含任何代码。

3.3LwIP的移植 3.3.1LwIP简介

LwIP协议是针对嵌入式系统所研发的小型开源型TCP/IP协议栈,可支持无操作系统的环境。LwIP的关键在于既减少了对RAM的占用,又保持了TCP/IP协议的基本功能。它的运行只需要占用四十多KB的ROM和十多KB的RAM空间,这使得它可以在空间较小的嵌入式系统中使用。为了降低对内存的要求和实现对处理流程的简化,LWIP协议通过对API进行剪裁和减少对不必须要数据的复制,减少了内存的使用以及代码的大小。

LwIP提供三种API

20

杭州电子科技大学硕士学位论文

RAW API。 RAW API模式下应用程序会先注册一个回调函数,并将这个回调函数同特定的连接关联起来,当连接事件被触发以后回调函数就会被调用进行响应的操作。这种模式下协议栈和应用程序在同一个程序中,避免了频繁的进程切换,但是由于TCP/IP处理和连续运算不能同时进行,长时间运行后会导致系统效率低下,通讯性能下降[14]。

lwip API。lwip API把应用程序和接收放在同一个进程中。但是由于处理过程和接收过程同时在进行,如果处理过任务复杂,处理不及时就会导致传输过程阻塞、严重丢包、程序失去响应等问题。通过以下方式可以解决这个问题,当收到数据到以后,首先去掉以太网包头获得IP包,然后通过tcpip_input() 函数将数据包投递到mbox邮箱[15],投递完成以后,接收任务继续进行数据接收,同时TCP/IP线程会对被投递的IP包进行处理,这样使得数据接收与投递过程分开,即使需要长时间对某IP包进行处理也不会出现网络阻塞的状况,这就是LWIP API。

BSD API。BSD API提供了基于open-read-write-close模型的UNIX标准API,它的优点在于移植简单,很容易将程序移植到其它系统,缺点在于在嵌入式系统占用资源多,效率低下,不符合某些嵌入式系统对应用的要求。

LWIP具有以下主要特性:

(1)提供专门的内部回调接口(Raw API),用于提高应用程序性能; (2)新版本中增加了的IP fragment的支持; (3)在最新的版本中支持ppp; (4)支持多网络接口下的IP转发;

(5)包括阻塞控制、RTT 估算、快速恢复和快速转发的TCP; (6)可选择的Berkeley接口API (在多线程情况下使用) ; (7)包括实验性扩展的UDP; (8)支持ICMP协议;

(9)支持DHCP协议,动态分配ip地址;

为了使LwIP能够适应不同类型的操作系统,LwIP在设计时没有针对任何一个操作系统设计数据结构和调用函数,而是通过在LwIP和操作系统之间的提供一个接口层,该接口层可以实现系统初始化、任务同步、内存和时间管理等功能。因此LwIP在μC/OS-II的移植就是利用对这个这个接口层进行剪裁和修改[15],从而实现相关的网络功能

21

杭州电子科技大学硕士学位论文

3.3.2相关头文件的修改

在头文件cpu.h、perf.h、cc.h中定义了与CPU及编译器相关的信息,通过对这些文件的更改可以改变数据类型、存储模式、高低顺位、字节长度、等相关内容的定义。因此根据需要在头文件中进行如下定义:

#define BYTE ORDERLITTLE ENDIAN //小端存储系统typedef unsigned char u8 t;typedef signed char s8 t;typedef unsigned short u16 t;typedef signed short s16 t;typedef unsigned int u32 t;typedef signed int s32 t;

图3.7 头文件修改

3.3.3操作系统接口的实现

在文件 sys.c 和 sys_arch.c中定义了和操作系统相关的结构和函数。其中主要包含信号量、消息队列、定时器函数和创建新进程函数四部分内容。 1.信号量

LwIP协议中所需要的信号量在μC/OS-II系统中已经实现,只需要在sys_arch中定义一个truct sys_sem_t信号量结构体,并通过对μC/OS-II中的函数的封装成可供LWIP调用的函数即可。

sys_sem_new() //创建信号量; sys_sem_signal() //发送信号量; sys_sem_wait() //等待信号量; sys_sem_free() //释放信号量; 2.消息队列

μC/OS-II中实现了基本的OS_EVENT的操作,但是没有实现对消息队列中消息的管理。在LwIP中的消息队列是用来进行数据缓冲、传递数据报文以及进行任务调度的任务,因此需要通过消息队列结构sys_mbox_t封装以下操作函数来实现LWIP消息队列的各种功能[16]。

22

杭州电子科技大学硕士学位论文

ypedef struct{OS EVENT *pQ; void *pvQEntrie[MAX_QUEUE_ENTRIES];}sys_mbox_t;sys_mbox_new() //创建消息队列;sys_mbox_post() //发送消息;sys_arch_mbox_fetch() //读取消息;sys_mbox_free() //释放消息队列;

图3.8消息队列结构体及功能函数

3.定时器

定时器是TCP/IP协议中不可缺少的部分,LwIP协议中会为每个和TCP/IP相关的线程分配一个等待超时的数据结构,并将所有的结构组成一个链表,在sys_timeouts对应的表项中保存着每个链表的起始指针,通过μC/OS-II的任务查 询机制返回指定定时任务的指针,如果为空,则表示无限期等待。在sys.h头文件中的结构体sys_timeouts中已经包括了超时等待的时间长度,达到时间后的处理函数以及指向sys_timeouts的指针。因此移植时需要通过实现struct sys_timeouts * sys_arch_timeouts (void)函数来返回当前线程的对应的起始指针。结构体和函数如下所示:

struct sys_timeout {struct sys_ timeout *next;//指向下一个定时结构u32_ t time;sys timeout_ handler h; //处理函数void *arg; //处理函数的参数.};struct sys_timeouts {struct sys_timeout *next;}; //定时事件链表struct sys_timeouts * sys_arch_timeouts(void) //返回的结构指针

图3.9 sys_arch_timeouts结构体

4.线程的创建

在网络任务的处理中经常会用到线程函数,线程可以显著提高网络处理的效率,增强网络处理的能力,但是在μC/OS-II系统中只有任务的概念没有线程的概念,因此在μC/OS-II中需要利用创建任务来实现线程的创建要求。通过将μC/OS-II中的任务创建函数OSTaskCreste(),封装到线程创建函数函数

23

杭州电子科技大学硕士学位论文

sys_thread_new()中,可以实现在μC/OS-II系统中创建线程的要求,在函数的创建时应事先为线程创建好优先级,在LWIP中没有优先级的概念[17]。创建线程函数如下:

sys_thread_t sys_thread_new (void (*thread)(void *arg), void*arg, int prio) 其中参数thread为所创建线程的入口地址,arg为传递给thread的参数,prio为所创建线程的优先级。

3.3.4网络设备驱动程序

本系统所用以太网控制芯片芯片是由美国国家半导体公司生产的集成以太网控制芯片DP83848C,该芯片是一种10/100Mbit/s单路物理层以太网收发器器件,支持10/100M的以太网通信,同时也支持MII和RMI接口模式,集成度高,具有全功能、低功耗等性能。由于远超过IEEE规格的电缆长度性能,以及为10BASE-T和100BASE-TX以太网协议的应用提供低成本解决方案的特性,该器件在基于高端外围设备、工业控制、工厂自动化、通用的嵌入式应用等领域中广泛采用,并确保与基于其他标准的以太网产品相互兼容及实现互操作。在LwIP中有基本的网络驱动模板,用户可以模板实现自己的网络驱动。

在 LwIP 中每个网络接口都对应一个数据结构 struct netif,该结构体如下所示:

struct netif {struct netif *next;struct ip_addr ip_addr;struct ip_addr netmask;struct ip_addr gw;err_t (* input)(struct pbuf *p, struct netif *inp);err_t (* output)(struct netif *netif, struct pbuf *p,struct ip_ad-dr *ipaddr);};

图3.10 struct netif结构体

在该数据结构中定义了指向下个网络接口的指针、IP 地址、网络掩码、网关以及用于实现以太网接收、发送数据包的函数等内容[18]。在驱动中所要完成的任务就是实现网络的初始化,数据的接收发送以及终端等任务,因此通过硬件接口函数可以实现对硬件的驱动。

24

杭州电子科技大学硕士学位论文

3.4下位机服务器功能的实现

LwIP移植到STM32单片机以后,就可以利用LwIP实现服务器功能了,本系统采用LwIP API模式进行设计,初始化程序中,通过sys_thread_new()创建应用任务,其在应用程序实现框架如下图所示:

μC/OS-Ⅱ初始化创建LwIP初始化任务LwIP_Init_Task(),其优先级为0启动μC/OS-Ⅱ任务调度图3.11 LwIP API应用程序实现框架

其中LwIP_Init_Task()的实现过程如下图所示:

硬件初始化TCP/IP初始化设置网卡地址并初始化启动应用任务初始化函数Apply_Init()创建信号量或消息邮箱等待信号量或消息邮箱

图3.12 LwIP_Init_Task()的实现过程

在LwIP_Init_Task()的实现过程的第四步中Apply_Init()的实现过程如下图所示:

25

杭州电子科技大学硕士学位论文

创建新的连接标识,比如TCP/UDP类型将该接连接绑定到相应的端口监听该端口While(1){接收外部到来的连接;接收数据;处理;发送数据;关闭本次连接;}创建信号量或者消息邮箱等待信号量或者消息邮箱图3.13 Apply_Init()的实现过程

循环体中的处理则是根据具体需要调用不同的处理函数就可以进行不同的处理过程。通过以上流程就建立起了一个基于LwIP的服务器程序。

3.5本章小结

本章主要介绍了如何通过利用移植μC/OS-Ⅱ操作系统和LwIP协议栈实现单片机服务器功能,使得下位机中的仪器、仪表能与单片机连接组成下位机系统,同时能使下位机系统以服务器的形式接入到以太网中。

26

杭州电子科技大学硕士学位论文

第四章 上位机软件系统

4.1软件功能需求

结合下位机工作模式,同时根据上位机工作人员对上位机的操作需求,上位机系统软件的主要功能模块划分成为了基本界面功能,数据库管理功能,管理员功能以及网络功能四个基本模块,各模块具体功能如下图所示:

软件系统基本界面模块数据库管理模块数据库管理管理员模块网络模块数据显示工具栏操作多级窗口数据存储数据查询数据删除数据统计导出数据清理数据管理员功能超级管理员功能管理员日志网络扫描网络数据通信 图4.1 上位机软件系统功能模块划分

基本界面模块:能反映测试仪器接入状态,显示测试数据,具备完整的功能按键,同时根据需要设计多级窗口,以满足各种不同功能下的界面显示需求,从而建立起良好的人机交互系统。

数据库管理模块:数据库管理功能体现了上位机系统对下位机所发送数据的完整处理流程,既包括对数据的保存,查询,删除等基本功能,同样也包括数据统计,数据库清理,数据导出等高级功能。

管理员模块:管理员功能是实现上位机软件系统安全的一个保障,只有利用管理员登录成功以后才可以对下位机系统进行各项设定,同时管理员日志会记录下管理员对下位机进行的各种操作,以便于后期进行追溯。同时超级管理员提供了对普通管理员的管理功能模式,使管理员功能更加灵活。

网络模块:由于本系统中的数据是通过TCP/IP协议在局域网中进行传输,网络功能则成为了本系统最基本也是最必不可少的环节。上位机需要通过不断扫描发现网络中打开的下位机,以实现下位机的动态接入。同时上位机和下位机之

27

杭州电子科技大学硕士学位论文

间还需要通过制定好的应用层协议进行数据交互以实现下位机向上位机的数据传输,以及上位机对下位机的功能控制。

根据系统任务需求,上位机系统通过利用这四个功能模块实现以下基本工作流程。

开启上位机程序,设置网络扫描IP和端口开启扫描线程,扫描网络中开启的下位机否连接成功是创建通信线程超级管理员登录获取下位机中测试仪器的信息注册新管理员是设置测试仪器工作参数,将参数发送给下位机中的测试仪器是是否需要重新设定测试仪器工作参数否获取下位机中测试仪器采集的数据将数据保存到数据库管理员登录对数据进行查找、清理、删除、统计等操作关闭此通信线程并释放内存空间下位机关闭否关闭上位机程序,测试仪器按照最后一次设定的工作参数继续运行

图4.2上位机基本工作流程

4.2软件开发平台介绍

本软件系统在Microsoft Visual Studio 2010下利用MFC进行开发。VS 2010是由微软公司推出的目前最流行的Window平台应用程序集成开发环境,包括代码编辑器、编译器、调试器和图形用户界面工具,集成了代码编写功能、分析功能、编译功能、调试功能等一体化的开发软件服务套。同时VS2010支持C#,C++,VB等多语言的开发,可以快速的实现相应的功能。同传统的C++开发环境VC++ 6.0相比VS2010具有以下优点:

28

杭州电子科技大学硕士学位论文

1.系统兼容性更好。现在主流的操作系统已经从Windows XP转移到了Windows 7, Windows7提供对VS2010的全面支持,而VC++6.0由于版本过旧新的Windows平台已无法对其实现完美兼容。

2.可以开发新平台的应用程序。例如:VS2010开发的应用软件可以在Windows7下支持界面窗口透明化,以实现更好的渲染效果和视觉体验。

3.支持最新C++标准。

4.增强了IDE,提高了可读性。为了减少杂乱,删除了不必要的行和渐变。 5.VS2010开发出来的程序可以自动根据特定的CPU翻译成高效的目标代码,VC++6.0开发出来的程序,要想换成其它的CPU必须要重新开发。

6.增加了更多智能化的提示,极大的方便了编写过程提高了编写效率。 7.支持多个监视器。并实现对窗口的动态调整,可将窗口自由拖动、悬浮。 8.支持office。

9.可兼容VC++6.0工程文件。

综上,尽管VC++ 6.0最为一款经典的软件开发工具,相比于VS2010具有体积更小,启动速度更快,对计算机配置要求更低等优点,但是其缺点与不足已使其不适合在新的操作系统平台上进行软件开发,因此本系统采用VS2010进行开发。

MFC是微软公司提供的在C++环境下用来编写Windows程序的一个类库,该类库以C++类的形式封装了大量Windows的控件和API。利用简单的向导设置就可以生成一个基于MFC的应用程序框架,隐藏了程序中很多必要的细节,给编程人员带来了极大的方便,减少了编程人员的工作量[19]。

MFC将程序员从switch-case模式中解放出来,简化了了开发过程,其框架结构使得控件、对话框窗口等windows类变得可以如同对普通C++类一样进行操作。MFC采用面向对象设计,提供了各种功能不同的类供编程人员调用。绝大多数的类都由CObject类派生而来,CObject类为其派生类提供了三个重要特性支持。

1.类的连载支持[20]。MFC的连续存储机制可以将你类中的各种不同类型的持久性数据流水一样按顺序输出到外部存储介质中,又能按顺序地取回变成各种不同类型的数据。

2.类诊断支持[21]。派生类可以对CObject类中的虚拟函数AssertValid()进行重载,通过当前对象的状态,诊断其有效性,并可在调试窗口中输出诊断信息。诊断条件根据需要而定,通过ASSERT宏对程序进行诊断,当程序调试出现错误时程序会在ASSERT处中断。

29

杭州电子科技大学硕士学位论文

3.运行时类信息支持[22]。类的运行时信息包括类名称、尺寸,以及不知道名称而创建类实例的能力。运行时类可以获取另一个类运行时的信息。

由CObject类派生除了庞大的MFC类体系,MFC类主要结构如下图所示。

CObject应用程序结构异常类分支文件服务分支绘图设备类分支CCmdTargetCWinThreadCWinAppCDocTemplateCExceptionCDocumentCFileCDCCLientDCCMetaFileDCCPaintDcCWindowDCCGdiObjectCBitmapCBrushCPenCSingleDocTemplateCMultiDocTemplateCWnd构架窗口类分支对话框窗口类分支视图类分支控件类分支CFrameWndCMDIChildWndCMDIFrameWndCSplitterWndCControlBarCDialogBarCReBarCStatusBarCToolBarCPropertySheetCPropertySheettExCDialogCCmmonDialogCColorDialogCFileDialogCFontDialogCProperPageCProperPageExCViewCCtrlViewCEditViewCListViewCRichViewCTreeViewCScrolViewCFormViewCAnimatectrlCButtonCComboBoxCDateTimeCtrlCEditCListBoxClistCtrlCreBarCtrl……CDaoRecordViewCHtmlViewCOleDBRecordViewCRecordView 图4.3 MFC类结构 采用微软公司提供的MFC类库能够很方便的进行软件程序设计,减少开发工作量,且代码执行效率高,运行速度快。结合以上优点,本系统在VS2010平台上利用MFC进行开发。 4.3上位机软件界面

根据上位机功能的需求以及对上位机界面美观、人机交互友好、操作简便的要求设计上位机主界面如下图所示:

30

杭州电子科技大学硕士学位论文

图4.4上位机主界面

上位机主界面窗口由菜单栏,工具栏,主数据显示区,状态栏四部分组成。 菜单栏包括系统、网络、数据库、关于、帮助五个一级菜单项。

系统菜单项下包括管理员和系统设置两个二级菜单项,点击系统设置可以打开系统设置对话框,进行一些基本的系统设置。管理员菜单项下包括超级管理员登录,管理员登录,管理员操作日志三个三级菜单项,点击管理员登录可以打开超级管理员登录界面,此界面用于超级管理员登录,修改密码等功能。点击管理员登录可以打开管理员登录界面,此界面用于管理员登录。点击管理员操作日志可以打开管理员操作日志界面,此界面用于显示管理员所进行的操作的内容以及操作日期。

网络菜单项下包括网络设置、扫描、断开三个二级菜单项,点击网络设置可以打开网络设置对话框,此界面用于设置网络设置的IP范围,端口范围,以及扫描时间间隔。点击扫描可以进行网络扫描,点击断开则断开所有的网络连接。

数据库菜单项下包含连接到数据库和数据库操作两个二级菜单项,点击连接到数据库可以打开数据库登录对话框,设置正确的数据源名称,数据库用户名,数据库密码可以登录到相应的数据库。点击数据库操作则会打开数据操作主界面对话框,在此界面下可以实现对数据的查找、删除、导出等一系列功能。

点击关于项会弹出此软件版本号等基本信息。

点击帮助项会打开帮助文本,介绍该软件的基本操作方法和使用须知。

31

杭州电子科技大学硕士学位论文

菜单的具体层级结构如下图所示:

系统管理员超级管理员登录管理员登录管理员操作日志系统设置网络设置扫描断开连接到数据库数据库操作网络数据库关于帮助 图4.5菜单栏结构

工具栏提供菜单栏下一些常用功能的快捷操作。工具栏中的网络扫描、中断连接、数据库、设置、管理员、日志等按钮分别对应菜单栏下二级或三级菜单中的扫描、断开、数据库操作、系统设置、管理员登录、管理员操作日志菜单项。工具栏比菜单栏更加形象直观,增强了人机操作体验,使操作更加简便快捷。

主界面数据显示区主要分为两部分,左边的树形控件区用于显示所有接入上位机软件系统的下位机名称,点击对应的名称右边的数据显示区域则会显示该下位机所采集到的数据,数据显示区左边的列表框显示的是该下位机所连接的工作状态的仪表,右边的列表框显示所有仪表采集到的数据,并实时进行更新。右键单击标签栏的标签页则会弹出设置菜单,点击设置即可进入该下位机设备对应的设置界面,实现对该下位机的各项设置和命令发送。

状态栏分为三部分,第一部分用于管理员登录状态的提示,当某管理员成功登录了以后,第一栏则会显示该程序员的登录帐号并提示已登录成功,第二部分用于数据库连接状态的提示,当成功连接数据库以后第二栏则会提示数据库连接成功。第三栏用于显示系统时间。

为了进一步简化操作,增强操作体验,本软件还设置了快捷键功能,按键F2,F3,F4,F6,F7,F8,F10分别对应工具栏上相应位置的按钮。快捷键功能的实现流程如下:

1.在资源文件中的Accelerator中插入一个新的Accelerator Table。 2.在Accelerator Table中新建F2、F3、F4、F6、F7、F8、F10,7个快捷键资源,设置ID格式为以ID_ACCELERATOR_作为前缀加上快捷键名称作为后缀的形式。

3.在主对话框的消息映射中添加

ON_COMMAND_RANGE(ID_ACCELERATOR_F2,ID_ACCELERATOR_F10,OnAccelerator)。和普通的消息映射ON_COMMAND()相比

ON_COMMAND_RANGE()能够处理连续范围内的消息响应函数。因此只需一个消息响应函数则可实现多个按键的消息响应。

32

杭州电子科技大学硕士学位论文

4.在主对话框类中添加消息响应函数OnAccelerator(UINT nID),在该函数中通过switch(nID)判断传入的不同的按键消息,从而决定调用匹配的函数来完成本次消息响应。

5.重载虚函数PreTranslateMessage(MSG *pMsg),在函数中添加以下代码: if(TranslateAccelerator(GetSafeHwnd(),hAcc,pMsg)) return TRUE; else

return CDialog::PreTranslateMessage(pMsg); 从而起到翻译快捷键的作用。

通过以上步骤可以实现该软件系统下快捷键功能,快捷键使得上位机界面的操作更加简单多样化,使人机交互更加友好。

4.4网络扫描及通信模块 4.4.1网络扫描技术简介

网络扫描就是根据对方服务所采取的协议,在一定时间内,通过自身系统对对方协议进行特定读取、猜想验证、恶意破坏,并将对方直接或间接返回的数据作为某指标的判断依据的一种行为[23]。网络扫描包括以下概念:

1.网络扫描的发起方几乎都是客户端一方,所针对的对象为服务器端[24]。 2.网络扫描通常都是主动行为,所以扫描器通常不会对被扫描的主机有过多要求,只能主动适应服务器的要求。

3.网络扫描具有时限性,一般都是接近扫描的最快速度[25]。 4.扫描几乎都要利用工具才能进行[26]。

5.扫描的目的都是作为下一步目的的参考,之后通常都会有下一步动作[27]。 根据扫描的概念可以发现,当一个主机向远端服务器某个端口提出连接请求时,如果对方有此服务就会应答,如果对方未安装此项服务,即使响应的端口发出请求,对方仍无应答。利用这个原理,如果对所有分别建立连接,并记录下远端服务器所给予的应答,通过查看记录就可以知道目标服务器上都安装了哪些服务,这个过程就叫做网络扫描,所使用的程序叫做扫描程序[28]。

常见的扫描器有TCP/UDP扫描器,NetBIOS扫描器,SNMP扫描器,ICMP扫描器,基于协议的服务扫描器等[29]。由于本系统利用TCP/IP协议进行通信,因此本上位机软件系统采用TCP扫描器实现对网络的扫描。TCP主要扫描方式和实现原理如下图所示[30]:

33

杭州电子科技大学硕士学位论文

扫描方式TCP connect扫描扫描方式实现原理这是最基本的扫描方式,其原理是使用系统提供的连接函数完成三次握手。扫描方式实现原理与TCPSYN扫描类似,利用协议规定,当申请方主机向目标主机一个端口发送一个只有ACK标志的TCP数据包,如果目标主机该端口是“开的状态”,则返回一个TCPRST数据包;否则不回复。利用协议规定,当申请方主机向目标主机一个端口发送的TCP数据包所有标志位为空,如果目标主机该端口是“关”状态,则返回一个TCPRST数据包;否则不回复。利用协议规定,当申请方主机向目标主机一个端口发送的FIN、URG和PSH都置位,如果目标主机该端口是“关”状态,则返回一个TCPRST数据包;否则不回复。扫描程序通过TCP链接到对方的WWW端口,然后通过Ident协议判断对方是否正以管理员权限运行。TCP ACK扫描TCP NULL扫描TCP FIN+URG+PSH扫描TCP反向Ident扫描 图4.6 TCP扫描方式简介

本上位机软件利用TCP connect扫描方式实现对下位机的扫描,这种扫描方式不需要关注扫描细节,并且对于用户的使用权限没有太多限制,虽然connect扫描方式安全性较差,但是在本系统中上位机软件是以管理员身份对下位机进行扫描所以不必考虑安全因素。而且利用connect扫描成功以后可以直接同下位机建立连接,简化了操作步骤。

4.4.2多线程技术简介

在本系统很多时候中需要多个任务同时进行,如果多个任务同时交由主进程执行则会大大地影响处理效率,例如:在程序进行数据收发、显示的同时还需要不断的进行网络扫描以监视是否有新打开的下位机设备,由于进行网络扫描需要阻塞等待请求返回,如果将网络扫描放到主进程中势必会造成程序假死无法正常工作,为解决多任务并发执行的问题本系统采取了多线程技术。

线程和进程都是操作系统的概念,进程是应用程序执行的实例,每个进程都是由地址空间、数据、代码和其它各种资源组成,程序终止时这些资源也会一并被销毁[31]。而线程是进程的最小执行单位,每一个进程在被创建好以后就会自动开启一个主执行线程,用户根据需要可以自己创建别的线程,多个线程可以在

34

杭州电子科技大学硕士学位论文

同一个进程并发地被执行,共用同样的虚拟地址空间、全局变量以及其他系统资源。

虽然多线程程序编写难度更大,实际应用中需要考虑的因素很多,但是多线程程序对比于单线程程序有着很多明显的优点[32]。

1.在操作系统中其调度单元就是线程,每个线程会被分配一个时间片,当一个线程时间片被耗尽以后另一个线程会立即激活执行,由于时间间隔较小,时延被隐藏起来,看起来就像多个线程同时在执行,这种方式极大的提高了CPU的使用率。

2.在多线程任务中,往往几个同时运行的任务根据需要会有不同的优先级,而多线程可以给予不同的任务不同的优先级,使重要的任务获得更多的CPU时间。

3.如果应用程序工作在多核的处理器系统中,可以将任务分布到不同的处理器中交由不同的处理器处理,使任务在单独的处理器中独立的运行。

多线程的程序设计方法是程序运行效率获得极大提高,具体表现在:1.并行程度提高;2.系统开销减少;3.快速线程切换;4.进程间通信更容易实现;5.节省了内存空间。

由于线程工作在共享的并行的环境中,不同的线程往往需要访问共享的资源,例如多个线程同时对一个文本进行读写,因此线程间的同步多线程编程中是至关重要的一部分。

线程间的同步主要有以下几种方法[33]:

临界区:程序中不允许被不同的线程交叉执行的一段程序被称为临界区。临界区保证了某一时刻某公用数据或公用变量只有一个线程可以访问,只有当一个线程释放了以后另一个线程才可以占用这段数据或变量。

互斥:互斥是指不允许多线程同时进入统一集合的临界区。互斥运行时应满足以下要求:各线程拥有平等的优先级,每个线程可以随时进入临界区;不在临界区的线程不可以阻止其它线程的进入;一个线程再临界区时其它线程不得进入;只允许一个线程进入;一个线程只能在有限的时间内得以进入不会发生死锁。

信号量:信号量可以设置多个线程访问共享资源,信号量对象采用计数器,能够自动地设置和检测操作,当有线程想要访问资源时,计数器减1并允许该线程进行访问,当计数器为0时,所有访问的线程都必须等待,当有线程退出计数器大于0时才可以进行访问。

事件:事件通过向其他线程发送信号连表示某一操作的进行状态,事件对象有两种:自动重置事件和人工重置事件。自动重置事件只能想单线程发送信号,

35

杭州电子科技大学硕士学位论文

而人工重置事件可以一次向多个线程发送信号以通知某一操作是否结束或者开始[34]。

在本系统中,依赖于多线程技术使得网络扫描和下位机的动态接入得以实现。在主程序运行的过程中,后台会开辟一个扫描线程不断循环扫描所设置的网段和端口用于发现打开的下位机设备,当上位机同下位机设备连接成功以后,上位机程序会开辟一个单独的线程用于和该设备进行通信、以及进行对数据的处理等任务,多线程模式下使上位机能够同时实现多个下位机设备的连接,极大的提高了上位机的利用率。同时在本上位机的软件系统的其他模块中也使用到了多线程技术,如数据库模块中对数据的存储,删除,以及清理。

4.4.3网络扫描方案

本系统下位机中的单片机作为服务器端等待上位机接入,而上位机在后台不断进行扫描尝试发现并且连接打开的下位机。利用网络扫描技术和多线程技术通过上位机对网络的扫描实现下位机的动态接入有以下优点:

1.下位机设备的IP和端口地址可以在某网段内灵活变更。当下位机设备的IP和端口更改以后不用主动告知上位机,且上位机程序不用进行任何修改就可以查找并连接到下位机设备

2.新加入的设备只需要将其IP和地址设置在上位机扫描的范围内就可以实现该设备的自动添加。

3.可以实现多台上位机同时接入下位机监视下位机的运行状态。多线程技术保证了一台上位机可以同时接入多台下位机提高了上位机程序的利用率。该过程在程序后台执行,不影响前台操作。大大简化了上位机操作流程,使上位机软件设计更加人性化、合理化。

由于上位机需要同时连接若干个数量未知的下位机,因此在上位机中需要动态地添加或者删除某个与下位机对应的客户端。利用网络扫描技术和多线程技术可以使得这一需求得以实现。

利用网络扫描技术和多线程技术在本系统中的实现后台主动对网络地扫描以及下位机动态接入的流程如下:

36

杭州电子科技大学硕士学位论文

封装一个网络客户端类CMySocket根据需要扫描的IP和端口范围创建新的CMySocket类指针,将指针依次存入vector中创建扫描线程在扫描线程中循环调用vector中CMySocket类指针的connect()方法,尝试对下位机服务器进行连接否连接成功是创建一个新的线程用于上位机下位机之间的通信图4.7扫描流程

上位机软件初次运行时需点击菜单栏中的网络项下的网络设置,打开网络设置对话框,设置扫描的IP范围,端口范围以及扫描等待时间。该设置界面如下图所示:

图4.8网络设置对话框

设置正确以后点击扫描按钮程序后台就会自动通过上述流程实现对下位机的扫描以及下位机的动态接入,并同时将所设置的参数保存到根目录下的Net.ini文件中,当程序再一次被开启时上位机会自动从Net.ini文件中读取上次设置的参数并作为本次扫描的条件,从而避免了在下位机设备网段和端口没有发生改变的情况下反复对网络进行设置,使上位机操作变得更加简单,较少了上位机操作人员的工作量。

37

杭州电子科技大学硕士学位论文

4.4.4网络扫描和通信模块实现过程

网络扫描的具体实现过程如下: (1)网络功能类的封装

本系统中的网络功能类CMySocket是在socket基础上封装的一个C++类。Socket最初是在UNIX系统上实现TCP/IP协议而设计的网络编程接口,主要用来实现两个程序之间的TCP/IP通信,设计人员并没有将socket局限于TCP/IP协议,而是通过各种函数定义使得socket可以适应各种协议,具有极好的通用性,现在socket已经成为了网络编程最常用的API。

CMySocket类通过将套接字创建、网络连接、数据发送、数据接收等基本网络操作封装到一个类中,体现了一种面向对象的设计方法,在程序的任何地方只需要调用该类下的方法就能轻松实现所需要的基本网络操作。该类的主要类成员函数如下图所示:

图4.9 CMySocket主要类成员

类成员ip_,i_port_对应所需要尝试连接服务器的IP地址与端口,time_为尝试连接的最大等待时间。

SOCKET类型是一个无符号整型数,它用来定义socket句柄的类型。 类成员str_ID用于在同下位机连接成功以后保存下位机设备的名称标识。 类成员Create()方法的主要功能是利用socket()函数创建一个流式套接字。void Close()方法是利用closesocket()函数在通信结束以后关闭所创建的套接字。

38

杭州电子科技大学硕士学位论文

类成员Connect()方法的主要功能是利用select模式尝试对下位机进行连接。在默认的套接字模式下,网络采取的是阻塞模式,在阻塞模式下如果连接失败则需要阻塞等待服务器开启或是默认失败返回,扫描一次需要耗费大量的时间,select模式可以设置失败返回的等待时间,极大的缩短扫描周期,提高扫描速率。该方法主要实现代码如下:

connect(socket_, (sockaddr*)&addr, sizeof(addr)); //尝试对某IP和端口的连接 struct timeval timeout ; fd_set r; FD_ZERO(&r); FD_SET(socket_, &r); timeout.tv_sec = 0;

timeout.tv_usec =time*1000; //设置超时 if (select(0, 0, &r, 0, &timeout)>0) //如果连接成功 AfxBeginThread(RecviveThread,this); //打开一个线程函数

RecviveThread(LPVOID pParam)为数据接收线程函数。当上位机和下位机连接成功以后则创建一个单独的线程用于上位机和该下位机之间数据的通信,采用多线程并发通信的技术不仅可以使上位机同时和多个下位机进行连接而且可以保证数据收发过程的独立性,保障数据的安全,提高工作效率。

线程接收函数通过while()循环不断的等待接收下位机所发送的数据,当数据接收完成以后则调用ReciveMsgProcessing()函数对收到的数据进行处理,ReciveMsgProcessing()会根据所收到数据的协议头进一步将数据交由对应的处理函数进行处理。

(2)类指针的创建和保存

扫描开始前根据需要扫描的IP和端口范围创建新的类指针,并将IP和端口分别传递给类成员ip_和port_,最后将指针依次放入vector中,vector是STL中的内容,它就像一个动态数组,是典型的“将元素置于动态数组中加以管理”的抽象概念。这里创建一个CMySocket*类型的容器vector socket_array用于保存CMySocket类指针。以下是该步骤的主要实现代码:

for(ip=Ip_Begin;ip<=Ip_End;ip++) //遍历所有的IP for(port=Port_Begin;port<=Port_End;port++){ //遍历所有的端口 ClientSocket *m_socket=new CLientSocket; //创建新的类指针 m_socket->ip_=ip; //将IP地址传递给类成员 m_socket->port_=port; //将端口传递给类成员 m_socket->Create(TRUE); //创建套接字

39

杭州电子科技大学硕士学位论文

socket_array.push_back(m_socket);} //将类指针放入到vector数组中 通过以上代码可以实现为设置范围内的每一个IP和端口都新创建一个类指针并保存到vector数组中,通过socket_array[]则可以查找某个IP和端口对应的类,并调用该类下的类成员。 (3)创建扫描线程进行扫描

在主对话框类中利用AfxBeginThread (ScanThread,this)可以创建线程扫描函数,多线程可以增加程序的吞吐能力,当一个线程阻塞时另外一个线程可以执行,因此即使扫描线程需要不断阻塞等待下位机的接入,主程序依旧可以正常运行。

扫描函数ScanThread()的主要功能是依次循环遍历vector中所有的ClientSocket类指针,并调用ClientSocket类中的connect()方法对整个网段进行扫描,以确定下位机是否开启。以下是主要实现代码:

while(1)

for (unsigned int i=0;i< socket_array.size();i++)

socket_array[i]->Connect(socket_array[i]->port_,socket_array[i]->time_, socket_array[i]->ip_); //循环调用vector下所有的类指针中的connect()方法尝试

当某一个类指针所指向的类对象通过调用connect()方法与下位机连接成功以后,该类对象则会创建一个新的线程与下位机进行通信。因此上位机程序只需要在程序开始时自动创建一个扫描线程上位机就会一直循环的扫描网络中的下位机是否已经打开,而不会影响整个程序的运行效率。

4.5测试仪器设置

本系统中上位机没有固化任何测试仪器的信息,当需要对下位机的工作参数、工作状态进行设置时需打开设置界面调用下位机发送给上位机的测试资源、测试资源设定表、测试序列等各项信息,通过这些信息实现对测试仪器的设置。对因此上位机对下位机的设置过程就是对测试仪器对象的实例化过程,对所收到的各项信息数据的处理依靠网络功能类CMySocket类得以实现,通过TestingListProcessing() 、TestablityListProcessing() 、void

ResourceSetTableProcessing() 、CurentTestSetTableProcessing()等函数将测试资源表存入到vector > testability_list中,将测试资源设定表保存到vector > testablity_Settable中将测试序列保存到vector testing_list中将测试项目的设定数据保存到vector >

testing_Settable中,当上位机需要对某个下位机中的测试仪器进行设置时就可以从数组中调用对应的信息。

进行测试仪器的设置基本流程如下图所示:

40

杭州电子科技大学硕士学位论文

打开设置主界面是否采用已保存的设置方案否从左侧选取需要进行参数设置的测试仪器是是否对测试结果进行分BIN否在当前界面设置最大值和最小值是打开BIN分类设置界面设置最大值和最小值选择添加,打开添加测试资源对话框对右侧需要进行参数的测试项目单击右键,选择对该项目进行删除、设置或添加、插入一个新测试项目打开综合设定对话框设置综合设定参数从添加测试资源对话框中选取一个测试资源,点击确定添加到测试序列中选择设置,打开详细设定表是否保存该设置方案否设置完成是保存该设置方案对项目的设定项和测试结果项进行参数设置

图4.10测试仪器设置基本流程

上位机通过自举过程获取到下位机的信息以后上位机就可以在主界面下右键单击数据显示区的标签栏,弹出操作菜单,点击该菜单下设置选项打开与标签栏名称对应的下位机设备的设置界面,也可以点击开始测试和停止测试使该下位机设备执行相应的命令。

设置界面如下图所示:

图4.11设置主界面

41

杭州电子科技大学硕士学位论文

设置界面左边的列表框显示的是该下位机设备中处于工作状态的测试仪器,点击左边列表框中的某一栏则会在右边的列表框中显示对应测试仪器的测试序列,该测试序列即在自举过程中由下位机发送给上位机并保存到vector testing_list中的数据,右键点击测试序列中的某一项可弹出一个新的菜单,该菜单包括添加、插入、删除和设置。

添加是在所点击的测试序列的上方新添加一个测试项目,插入则是在所点击的测试序列的下方新增加一个测试项目,添加和插入都会打开测试资源表界面,测试资源表界面如下图所示:

图4.12测试资源表界面

该界面下所列举的信息则是由自举过程中由下位机发送给上位机的测试资源表中的信息,上位机软件将所接收的信息保存到vector > testability_list数组中,当打开测试资源表界面时,后台会读取其中相应的数据并显示出来。

在测试资源列表框中选取想要添加到测试序列中的项目,并点击确定,程序会将vector > testablity_Settable数组即测试资源详细设定表数组中与所选项目对应的数据提取出来添加到vector > testing_Settable数组即测试序列的数组中,从而实现相应的功能。

在菜单栏下点击删除,则会从vector > testing_Settable数组中对应的位置将数据删除,并在测试序列框中显示更新后的测试序列。

在菜单栏下点击设置则会打开测试序列中该项目的设定界面,设定界面如下图所示:

42

杭州电子科技大学硕士学位论文

图4.13测试序列项目设定界面

该界面下所显示的表则是由自举过程中由下位机发送给上位机的测试序列详细设定表,上位机接受成功以后将该表保存到vector > testing_Settable数组中,打开界面以后,程序会读取数组中相应的数据并显示出来。下位机系统中各类测试仪器的差别都在这张表中体现出来,根据测试内容、测试环境的不同,这张表中所设定的内容、数据范围、数据含义可能完全不同,这张表是某仪器、仪表对抽象资源表的实例,这张表同资源表一样分为测试设定部分和测试结果设定部分。测试设定部分会根据下位机发送上来的表中的隐含信息判断可否对参数进行设定,以及设定的具体范围。测试结果设定部分如果选择为部分BIN,则会将所有的BIN分类范围都统一成在这个界面下所设定的范围,如果选择成为分BIN则需要在设置界面下点击BIN分类设置,打开BIN分类设置对BIN分类的范围进行详细设定,BN分类界面如下图所示:

图4.14 BIN分类界面

43

杭州电子科技大学硕士学位论文

在此界面下可对BIN分类的范围进行详细设定,用以决定测试结果将怎样进行分类。

在设置界面下点击综合设置则会弹出综合设置对话框,综合设置界面如下图所示:

图4.15综合设置界面

在此界面下可以根据实际情况对下位机的通用工作条件进行设置。 为了使上位机的操作更加简便、人性化、减少操作人员的工作量,设置界面中还提供了保存方案和打开方案功能,保存方案可以选取保存的路径将现在已经设置好的工作方案以.txt的形式保存到计算机中,当下次下位机需要继续采取这种方案进行工作时只需要点击打开方案从上次的保存路径中找到该方案文件,则可以快速导入该方案,而不必再进行一次设置,大大简化了上位机的操作过程节省了时间。

当所有的设置都已经完成以后点击确定按钮,上位机会将重新设置好的数据发回给下位机系统,下位机则会按照所设定的信息改变自己的工作状态、工作方式,从而使下位机的仪器、仪表按照新的要求进行数据采集。

4.6数据库模块

4.6.1数据库访问技术简介

本软件采用SQL Server 2008数据库实现对数据的管理[35]。SQL Server 2008是微软公司推出的数据库产品,是一种基于服务器/客户端模式的关系数据库管理系统,它采用Transact-SQL在客户机和服务器之间传递信息,扮演着后端数据库的角色,是数据的汇总与管理中心[36]。

实现对数据库的连接和访问主要有以下几种技术:

44

杭州电子科技大学硕士学位论文

ODBC :ODBC是Open Database Connect 即开放数据库连接的简称。它不仅提供一组标准的API实现对数据库的访问,同时还能使应用程序通过结构化查询语言做为访问标准访问数据库中的数据[37]。

DAO:DAO是DatabaseAccessObject即数据访问对象的缩写。它使用Microsoft Jet数据库引擎访问数据库,DAO比较适合桌面应用程序及小范围分布式应用[38]。

OLE DB:OLE DB是Object Linking and Embedding, Database即对象连接嵌入数据库的缩写。OLE DB采用COM技术实现,采用OLE DB可以实现三类程序:数据提供程序、数据应用程序和服务提供程序。它们可以有机地结合在一个完整的数据库系统中[39]。

ADO:ADO是ActiveX Data Object即活动数据对象的缩写。他是一种基于OLE DB的高层数据库访问技术,因此ADO也是基于COM的。使用ADO不仅可以同时访问关系型和非关系型数据库[40]。

主要数据库连接技术如下图所示:

访问接口ODBCDAOOLE DB易用性差好较难运行性能较高较高高可拓展性差一般好突出特点可进行底层控制访问JET性能最好可访问非关系数据库可访问非关系数据库,有多种接口能否访问非关系数据库否能能技术层次底层高层高层ADO最好高好能高层 图4.16数据库连接技术

结合各种数据库访问的技术特点以及本系统的需求,本软件系统采用ADO技术实现对数据库的访问,ADO使用方便,存取速度快,适应性强,内存支出少,ADO涉及的数据存储有DSN(数据源名称)、ODBC(开放式数据连接)以及OLE DB三种方式,因此ADO可以实现对ODBC,OLEDB等系统级的编程接口的汇接,在使用上大为方便[41]。

ADO库包含三个基本接口[42]:

45

杭州电子科技大学硕士学位论文

返回一个记录集或一个空指针。通常使用_ConnectionPtr它来创建一个数据连接或执行一条不返回接口任何结果的SQL语句,如一个存储过程。_CommandPtr接口_RecordsetPtr接口返回一个记录集。它提供了一种简单的方法来执行返回记录集的存储过程和SQL语句。是一个记录集对象。与以上两种对象相比,它对记录集提供了更多的控制功能,如记录锁定,游标控制等。图4.17 ADO基本接口机功能介绍

合理利用这三个基本接口可以实现对数据库的基本操作要求。

4.6.2数据库整体设计

根据用户需求,本软件系统为数据库设计了存储、导出、清理、查询、删除、统计六大功能,满足了对下位机所发送数据的各种处理需要。数据库模块主要功能如下图所示:

数据库模块数据保存功能数据查找功能数据删除功能数据导出功能数据清理功能数据统计功能按内容查找按内容时间按内容导出按时间导出数据统计统计结果打印统计结果保存 图4.18 数据库模块主要功能

本软件利用一个C++类对数据库功能进行了封装,体现了一种面向对象的设计思路,极大地方便了对数据库功能的维护,简化了对数据库功能的调用操作,该类主要成员如下图所示:

46

杭州电子科技大学硕士学位论文

图4.19数据库功能类CDataBase

打开数据库主界面之前需先通过数据库登录界面实现与数据库的连接。数据库登录界面如下图所示:

图4.20数据库登录界面

输入需要登录的数据库的数据源名称,数据库用户名,数据库用户密码即可登录到已配置好的数据库中,成功登录到数据库后主界面的状态栏中的第二栏会提示已成功登录到数据库中,如下图所示:

图4.21数据库登录成功状态栏提示

47

杭州电子科技大学硕士学位论文

数据库登录的实现是通过调用数据库类中的BOOL OpenDataBase(CString m_datasource, CString m_user, CString m_password)函数实现与数据库的连接,该函数的主要实现代码如下:

m_pConnection.CreateInstance(\"ADODB.Connection\"); //初始化数据库连接对象 str_Connect.Format(\"Data

Source=%s;UID=%s;PWD=%s;\

//定义数据库连接字符串

m_pConnection->Open(bstrSRC,\"\ //打开数据库 调用该函数成功连接到数据库以后可以通过点击主界面工具栏上的数据库按钮进入到数据库操作界面或者通过点击菜单栏中的数据库项下的数据库操作打开数据库主界面,数据库主界面如下图所示:

图4.22数据库主界面

数据库主界面由三部分组成,分别是工具栏、数据查询结果显示区以及翻页按钮,工具栏提供了可对数据库进行的操作以及可实现的功能,数据查询结果显示区将根据查找设置条件显示查找结果。

48

杭州电子科技大学硕士学位论文

4.6.3数据库主要功能

(1)数据保存功能

数据库最基本的功能就是数据保存,本软件中数据保存的基本流程如下: 1.当下位机向上位机发送了N组数据以后,上位机软件通过调用数据库类CDataBase类中的StoreIntoDataBase()函数开始向数据库中保存最近所收到的一组数据。该函数的核心实现过程如下图所示:

定义数记录集打开方式利用m_pRecordset.CreateInstance()创建对象实例利用m_pRecordset->Open()打开记录集通过m_pRecordset-> Fields-> Item[]-> PutValue存入数据关闭记录集释放记录集对象

图4.23 StoreIntoDataBase()函数实现过程

2.检查数据库中是否有和本次需要进行保存数据的设备相同的表,如果没有表明是该设备第一次进行数据保存,则在数据库中创建一个与该设备同名的表,以便于在此表中保存该设备下所有的数据,如果有同名的表,表明已经进行过数据保存,则跳过此步骤。创建新的表调用的是数据库类CDataBase类中的CreatTable()函数,该函数核心代码如下:

sql.Format(\"create table 数据控制器.dbo.%s(数据类型 char(10),正测数据 float,反测数据 float,时间datetime)\

_variant_t RecordsAffected;

m_pConnection->Execute(_bstr_t(sql),&RecordsAffected,adCmdText);

49

杭州电子科技大学硕士学位论文

3.数据以和显示在主界面中同样的结构和方式保存到数据库中,并在最后一列加入了存入数据的时间戳,便于以后对数据进行查找追溯。数据在数据库中的保存格式如下图所示:

图4.24数据库中存储的数据格式

通过以上步骤软件实现了将某设备发送的数据存到数据库中与该设备名称相同的表下,以供数据的查找统计等操作。 (2)导出功能

由于计算机硬盘空间有限数据不会在计算机中无限期地被保存,同时一些重要的数据也需要单独被进行保存,因此本软件系统提供了导出功能可以实现将所需要的数据从数据库中导出并保存为EXCEL格式文件,增强了数据保存的灵活性,点击数据库主界面工具栏中的导出按钮可以打开导出数据对话框。导出功能界面如下图所示:

图4.25 导出功能界面

本软件系统提供两种导出方式按时间导出和按内容导出,点击标签页可以切换不同的导出方式。

1.按内容导出的操作过程如下:

2.在下拉菜单中选择需要导出数据的设备名称。

3.输入限定导出的内容名称、数据类型,以及数据的范围。 4.点击导出按钮,弹出保存导出文档对话框。

50

杭州电子科技大学硕士学位论文

5.输入需要保存导出数据文档的名称,选择保存文档的位置,点击确定保存导出数据。

到上一步中选择保存导出数据保存的位置中点击打开保存的EXCEL文档即可以查看所有按照限定条件导出的数据。

按内容导出功能通过调用CDataBase类中ExPortbyContent()函数实现。ExPortbyContent()函数利用_CommandPtr直接执行以下两条Transact-SQL语句即可实现数据导出的功能。

sql=\"EXEC sp_configure 'show advanced options', 1;RECONFIGURE;EXEC sp_configure 'xp_cmdshell', 1;RECONFIGURE; \";

sql1.Format(\"exec master..xp_cmdshell 'bcp \\\" select * from 数据控制器.dbo.%s where %s between %f and %f and 数据类型=''%s''\\\" queryout %s -c -U \\\"sa\\\" -P

\\\"123456\\\"'\ExcelFile);

第一条实现的是打开xp_cmdshell,xp_cmdshell是SQL中运行系统命令行的系统存储过程,由于SQL Server 2008中个默认是关闭的所以需要先打开它。 第二条是利用bcp实现对指定数据内容的导出。

按时间导出操作过程如下:

1.在下拉菜单中选择需要导出数据的设备名称。 2.设定需要导出数据的时间范围。 3-5.与按内容导出相同。

按时间导出功能通过调用CDataBase类中ExPort ()函数实现。其实现方式与按内容导出类似,只是更改了对导出数据的条件限制。 (3)清理功能

由于计算机硬盘有限,数据库不可能无限膨胀,因此需要定期实现对数据库的清理,因此本软件系统设计了数据清理功能,可以很方便的实现对数据库的清理。点击数据库主界面工具栏上的清理按钮即可打开数据库清理对话框,数据库清理对话框界面如下图所示:

`

图4.26数据库清理对话框

51

杭州电子科技大学硕士学位论文

只需在数据库对话框中设定需要清理的几天前的数据,点击确定即可实现对数据库的清理,该功能的实现是通过调用CDataBase类中的Clear()函数实现。考虑到可能需要删除的数据过多为避免对程序运行造成影响,该删除过程在线程中执行,点击确定按钮以后系统会先开辟一个新的线程,在线程中调用Clear()函数,清理过程完毕以后会自定关闭该线程。

Clear()函数的实现过程是首先先获取数据库下所有的表名称,再根据设置的天数作为时间跨度获取需要删除的数据的时间范围,最后通过_CommandPtr对象执行删除指令。

该函数的主要实现过程如下图所示:

利用CTime::GetCurrentTime()获取现在时间通过CTimeSpan span()根据设置的清理天数设置需要清理的数据时间范围循环遍历数据库中所有的表设置删除条件利用pCommand.CreateInstance()创建_CommandPtr对象实例通过利用pCommand->Execute()执行删除命令图4.27 Clear()函数的实现过程

(4)查询功能

数据库查询是数据库最基本的功能之一,点击数据库主界面工具栏中的查找按钮可以打开查找数据对话框。查找功能界面如下图所示:

52

杭州电子科技大学硕士学位论文

图4.28查找功能界面

本软件系统提供两种超找方式:按时间查找和按内容查找,点击标签页可以切换不同的查找方式。

按内容查找的操作过程如下:

1.在下拉菜单中选择需要导出数据的设备名称。

2.输入限定导出的内容名称、数据类型,以及数据的范围。 3.点击确定按钮,在数据库主界面中显示查找到的数据结果。

按内容查找功能的实现是调用了CDataBase类中的SearchByContent()函数,该函数的实现主要是通过_RecordsetPtr对象打开设定范围内的记录集,然后将记录集中的数据依次读取出来显示到主界面上,该函数核心实现过程如下所示:

53

杭州电子科技大学硕士学位论文

设定记录集打开条件通过m_pRecordset.CreateInstance()创建实例利用m_pRecordset->Open()打开记录集是否到达记录集末尾利用m_pRecordset->GetCollect ()将记录集中的数据取出将数据显示到主界面m_pRecordset->MoveNext()指向下一个记录数据查找完成图4.29 SearchByContent()函数的实现过程

按时间查找操作过程如下:

1.在下拉菜单中选择需要导出数据的设备名称。 2.设定需要导出数据的时间范围。

3.点击确定按钮,在数据库主界面中显示查找到的该时间范围内第一个时间点下的数据结果。

4.点击翻页按钮在主界面中显示时间范围内下一个时间点下的数据结果,直至达到最后一个时间点。

按时间查找功能的实现是通过调用CDataBase类中的Search()和ReSearch()函数实现,和按内容查找一样,具体查找功能的实现都是通过_RecordsetPtr对象打开设定范围内的记录集,从而获取到所需要的数据,所不同的是,Search()函数会根据设定的时间范围获取到第一个时间点下的数据,然后显示到数据库主界面上,并将下一个时间点作为查找的开始时间点传递给ReSearch()函数,点击下一页时会调用ReSearch()函数获得下一个时间点的数据。这样做的的优点在于每

54

杭州电子科技大学硕士学位论文

次显示的结果同该时刻下程序主界面数据显示区中显示的结果一致,还原了该时刻下所采集到的数据结果,便于上位机操作人员对数据进行分析。 (5)删除功能

删除功能也是数据库最基本的功能之一,点击数据库主界面工具栏中的删除按钮即可实现对查找结果数据的删除。该功能通过调用CDataBase类中的Delete()函数实现。该函数是通过_CommandPtr对象执行Transact-SQL语言中的删除指令实现。 (6)统计功能

为实现对数据更进一步且更直观的分析,本软件系统还设计了数据统计功能,该功能能将数据更加直观的以柱状图的形式表现出来,并且还提供了对柱状图的保存打印等功能。点击数据库主界面工具栏中的统计按钮可以打开数据统计对话框。统计功能界面如下图所示:

图4.30统计功能界面

统计功能的基本操作流程如下:

1.从下拉列表框中,选择需要进行数据统计的下位机设备名称。

55

杭州电子科技大学硕士学位论文

2.设置需要统计的内容,包括输入统计内容和选择正测以及反测数据。 3.设置需要统计数据的时间范围。

4.根据统计的需求,合理设置统计结果的划分区间。 5.点击统计按钮生成统计结果,显示柱状图。

为实现统计功能界面下的各种功能需求,本程序封装了一个CBarChart类专门用于统计界面下各种功能的实现,只需简单进行调用即可实现所需要的功能。

点击统计按钮以后,程序首先会根据所设定的统计条件,按照所设定的区间范围逐个调用CDataBase类中的Statistics()函数返回需要统计的内容的条数,根据返回的数据,再调用CBarChart类中的各项函数,绘制相应的柱状图。

同时CBarChart类中还封装了打印、将柱状图保存为.bmp格式图片以及清理生成的柱状图的函数,统计功能对话框类只需调用其功能函数就可以实现打印,保存,清理等功能。

4.7管理员功能模块 4.7.1管理员功能模块简介

由于上位机软件系统可直接对下位机的仪器仪表进行设置和控制,因此每一次设置都应该由专业操作人员按照要求严格的、进行,而对于普通人员而言只需要可以监视下位机发送回的数据即可。同时由于上位机操作人员的失误可能对下位机造成误操作,因此上位机还应该具备记录操作人员操作过程的功能。

本软件系统从实际角度出发,设计了管理员功能模块,该功能模块主要有三大部分:超级管理员功能、管理员功能和管理员日志功能,如下图所示:

管理员功能模块超级管理员超级管理员登录密码修改新管理员注册删除管理员清除管理员日志管理员日志记录管理员操作管理员管理员登录密码修改进入设置菜单 图4.31管理员功能模块

56

杭州电子科技大学硕士学位论文

超级管理员功能是一个具有特殊权限的管理员,本系统中只有一个超级管理员,它负责对普通管理员进行管理。

管理员登录成功以后可以获得对下位机进行设置和控制的权限,如果不进行管理员登录只能在主界面中监视下位机所发回的数据。

管理员日志详细记录了某管理员登入软件系统的时间以及进行设置的时间,以便过后进行追溯。

4.7.2超级管理员功能

超级管理员是身份特殊的一类管理员,它的任务实现对普通管理员进行管理,超级管理员登录成功以后可以实现普通管理员的注册,以及删除普通管理员的功能,此外超级管理员还可以利用超级管理员的身份清空管理员日志。

点击主界面菜单栏系统下的管理员项下的超级管理员可打开超级管理员登录界面。超级管理员登录界面如下图所示:

图4.32超级管理员登录界面

超级管理员初始密码为123456,为了超级管理员身份的安全提供了密码修改功能,点击密码修改以后会弹出密码修改对话框,密码修改界面如下图所示:

57

杭州电子科技大学硕士学位论文

图4.33密码修改界面

输入正确的旧密码和两次同样的新密码即可实现密码的修改功能。原始密码输入错误或者两次输入的新密码不一致系统会进行错误提示。

超级管理员登录成功以后可以打开管理员管理界面,管理员管理界面如下图所示:

图4.34管理员管理界面

该界面下会显示所有已注册的管理员,选中某管理员点击删除按钮会删除该管理员,点击注册按钮会弹出注册管理员界面,用以注册新的管理员,注册管理员界面如下图所示:

58

杭州电子科技大学硕士学位论文

图4.35新管理员注册界面

输入用户名和两次同样新密码即可创建一个新的管理员。未输入用户名或者两次新密码输入不一致,系统会进行错误提示。

管理员各项功能的实现依赖于系统中的注册表[43]。注册表包含了系统的初始化信息、软硬件配置,以及其他重要数据[44]。因此本系统将管理员的信息直接保存到注册表中,这样既保证了管理员信息的隐蔽性,同时能够保证管理员信息不会被轻易删除。

当上位机软件在某台计算机初次运行时,系统会在后台自动调在注册表的HKEY-CURRENT-USER/数据控制器/超级管理员路径下创建一个新的项目“SuperMananger”并设置它的值为123456。

当超级管理员登录时,通过以下代码获取上述路径下SuperMananger的值并与输入的值进行比较如果一致则表示密码正确可以成功登录。

CRegKey reg;

DWORD size= MAX_PATH;

reg.Open(HKEY_CURRENT_USER,\"数据控制器\\\\超级管理员\"); //打开注册表

reg.QueryValue(m_Password.GetBuffer(size),\"SuperManager\ //从注册表中获取密码 reg.Close();

超级管理员登录以后,程序会通过以下代码获取所有已经注册的管理员的信息,然后显示到列表框中。

HKEY hkey;

59

杭州电子科技大学硕士学位论文

册名

RegOpenKeyEx(HKEY_CURRENT_USER,数据控制器\\\\用户

while(RegEnumValue(hkey,dIndex,RegBufferCurrent,&dwSize,NULL,NUL

\

L,NULL,NULL)==ERROR_SUCCESS) { //枚举该键下所有的项目名,即用户的注

str_arry.Add(RegBufferCurrent); //将名称存入到CstringArrary数组中 dwSize=100; dIndex++; }

RegCloseKey(hkey); //关闭注册表

管理员注册的实现与超级管理员类似,当新管理员的信息输入好以后点击注册,程序会在HKEY-CURRENT-USER/数据控制器/用户下根据输入的需要注册的管理员名称创建新的项目,并根据输入的密码设置项目的值。

点击删除按钮的时候程序会通过一下代码实现删除对应注册表中的项目,从而达到删除管理员的目的。

reg.Open(HKEY_CURRENT_USER,\"数据控制器\\\\用户\"); //打开注册表

reg.DeleteValue(m_user); //从表中删除选取的用户名项目 m_ManagerList.DeleteItem(nSel); //将用户从列表中删除 reg.Close(); //关闭注册表

4.7.3管理员功能

普通管理员登录成功以后,通过右击数据显示区便签栏上的标签可以进入该下位机设备的设置菜单对各设置项进行设置。点击主界面工具栏上的管理员或菜单栏系统项下的管理员可打开普通管理员登录界面,登录界面如下图所示:

60

杭州电子科技大学硕士学位论文

图4.36管理员登录界面

普通管理员同样提供密码修改功能,其操作方法与超级管理员一致。选择管理员头像,并在下方输入正确的密码则会以该管理员的身份登录系统。普通管理员登录成功以后,状态栏的第一栏会有相应的提示提示管理员已经登录,并且再次点击工具栏上管理员按钮打开管理员登录界面时会提示某管理员已登录成功。

图4.37管理员登录成功提示

图4.38登录界面提示

点击退出登录则会回到管理员登录的界面,此时可以选择别的管理员进行登录。

普通管理员功能的实现也是通过对注册表中HKEY-CURRENT-USER/数据控制器/用户键下数据的操作来实现的。

4.7.4管理员日志功能

管理员日志保存了所有管理员登录和进入设置菜单的情况,点击工具栏上的日志或者点击菜单栏系统项下管理员项下的管理员操作日志即可打开管理员操作记录对话框,管理员日志界面如下图所示。

61

杭州电子科技大学硕士学位论文

图4.39 管理员日志界面

文本记录了所有管理员登入、退出系统和进入设置菜单的时间。点击清空日志则会弹出确认清空的对话框如下图所示:

图4.40 确认清空对话框

输入正确的超级管理员密码点击确认清空则会清空所有的记录。 当管理员进入、退出系统或者进入了设置菜单的时候,后台程序都会通过CFile类的write()函数向diary.txt文档中写入本次操作的内容以及时间,当打开管理员日志界面的时候后台程序会调用CFile类中的read()函数将文档中的信息全部读取出来并显示到文本框中,当点击清理时,后台程序会调用CFile类擦除文档中的全部信息从而实现清理的效果。

62

杭州电子科技大学硕士学位论文

4.8本章小结

根据对整体系统功能的需要,设计了上位机基本界面和基本操作功能。上位机通过网络模块实现了网络扫描、网络连接和数据收发,通过管理员模块提高了系统操作安全性和规范性,通过数据库模块实现了对数据的二次处理。上位机软件程序设计过程中,通过面向对象的方法进行设计,使代码容易维护且更容易被理解。且上位机界面设计遵从人机界面友好、操作简便的宗旨进行设计,提高了软件系统的实用性。

63

杭州电子科技大学硕士学位论文

第五章 测试结果与讨论

5.1测试环境和测试要求

本系统是和绍兴市科盛电子有限公司合作开发的项目,下位机是由科盛电子有限公司针对本系统自主研发的测试机系统,因此本系统测试过程按照科盛电子有限公司提供的技术指标进行测试。根据公司设计的负载要求,共设计了20组下位机,每组下位机设备连接16个测试仪器。每个测试仪器8组测试资源,每个测试仪器最多进行16项测试。

上下位机通过10/100M交换机进行数据交换,上位机软件在Windows 7 64位操作系统下运行,上位机PC机硬件配置如下

处理器:I5-3210四核处理器,主频2.5GHz. 内存:8G

硬盘:750G 5400转

根据系统基本工作流程,主要测试内容和技术要求如下表所示

表5.1 基本测试内容

测试内容 上位机通过网络扫描连接网络中的下位机 后台自动获取下位机中测试仪器的信息 数据收发 数据保存 技术要求 要求下位机设备不管在上位机软件打开前或者打开后开启,上位机都能够立即对下位机设备进行连接且下位机等待时间小于1s 要求上、下位机连接成功以后上位机在后台自动获取下位机中所有测试仪器的信息,并保证数据准确无误。 下位机将测试仪器数据打包后每200ms向上位机发送一次数据 每收取数据20次,保存一次最后收取的数据。所有测试仪器的数据分别保存到不同的表中且保证数据准确性。

5.2测试结果及讨论

1.网络扫描测试

64

杭州电子科技大学硕士学位论文

根据对网络扫描功能的要求设置了下位机设备在上位机软件运行前开启和运行后开启的不同情况,测试当上位机软件系统开启后是否所有处于工作状态的下位机设备都能被上位机软件系统发现并接入到上位机系统中,测试扫描IP段为192.168.1.1-192.168.1.100,设置端口为5000,设置扫描间隔为10ms,测试结果如下表所示:

表6.2网络扫描测试结果

上位机设备开启前处于工作状态的下位机设备数量 0 5 10 15 20 上位机设备开启后新打开下位机设备数量 20 15 10 5 0 成功接入上位机测试全部设备成系统的设备数量 次数 功接入次数 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 为了能更好的体现下位机接入的状况,上位机界面中通过动态的添加和删除标签页以及树形控件的子节点来显示接入状态的下位机,当系统中没有下位机接入时如下图所示:

图6.1系统中无下位机接入

当通过扫描成功接入到下位机机时如下图所示:

65

杭州电子科技大学硕士学位论文

图6.2系统中有16个下位机接入

测试结果讨论:无论下位机设备是在上位机软件系统打开或者关闭之前开启,只要下位机设备打开并进入工作状态上位机设备都能够成功扫描到该下位机设备并成功连接。本测试共扫描了100地址,理论扫描一次时间间隔为1s,因此新打开的设备被识别的时间到的时间间隔为0-1s,符合设计要求。如果扫描范围变大或者扫描时间间隔过长,上位机会开启多个线程进行扫描以缩短扫描时间,这就对系统资源造成了不必要的浪费,实际过程中可以根据下位机服务器的IP和端口号范围合理设置扫描范围进一步缩短扫描时间。

2.获取下位机信息测试

在上下位机发送数据之前上位机需要从下位机中获取下位机设备的信息,根据最大测试要求每台下位机设备会向上位机设备发送128张测试资源表从而使上位机获得16台仪表的所有8个测试项信息,每张测试资源表的最大值为400B,因此在数据发送之前下位机会先向上位机发送50KB的信息。在网络扫描测试中,连接成功以后后台会自动进行此过程,因此两项测试可以同时进行,经测试在5组实验过程中上位机均能完整的接收下位机所发送的信息,并保存到上位机内存中。

测试结果讨论:由于本系统采用TCP/IP协议进行通信,因此基本保证了数据的正确性,本系统中采取了长度校验机制,发送数据按照协议头+数据长度+

66

杭州电子科技大学硕士学位论文

数据的格式,根据所收到的数据的实际长度和数据中的数据长度进行比较,如果数据不吻合会要求重发数据,保证了数据的正确性。

3.数据收发测试

本系统中每个下位机设备每隔200m向上位机系统发送一次数据,每个下位机设备每次发送理论上的最大数据2048B,共20个设备同时向上位机发送数据,由于数据间隔频率过快,无法在主界面中判断数据是否接收完整,因此测试时在程序后台将每一次收到的数据大小叠加起来,自动统计所收到数据的总和,然后同发送的数据量作比较,根据实际情况共进行了多次时间长短不同的测试,发送和接收的数据量都相等。

测试结果讨论:由于本系统采取TCP/IP协议进行传输,保证了数据传输的可靠性,同时由于本系统运行的网络是工业以太网,工业以太网的传输速率最大可达100Mbps,远远大于本系统实际所需要传输的数据量,因此可以保证数据在网络的传输的时效性和正确性。

4.数据库保存测试

在数据接收的同时,当数据库登录成功以后会自动将数据保存到SQL SEVER2008数据库中,根据对数据库存储的要求,设计在普通工作状态下每收取100次数据进行一次数据存储,根据数据的收发频率,实际每20s会对数据进行一次存储,单次存储的数据量为256行。根据存储数据的次数乘以256即可以得到理论保存的数据行数。以下是其中某次测试的结果:

表6.3数据存数结果

下位机设备名称 TR_TEST1 TR_TEST2 TR_TEST3 TR_TEST4 TR_TEST5 TR_TEST6 TR_TEST7 TR_TEST8 TR_TEST9 TR_TEST10 TR_TEST11 TR_TEST12 发送数据次数 14039 15687 15749 15768 15821 15905 16991 16132 16215 16243 16411 16321 应保存数据次数 702 784 787 788 791 795 799 806 810 812 820 816 67

应保存数据行数 190944 213248 214064 214336 215152 216240 217328 219232 220320 220864 223040 221952 实际行数 190944 213248 214064 214336 215152 216240 217328 219232 220320 220864 223040 221952 杭州电子科技大学硕士学位论文

TR_TEST13 TR_TEST14 TR_TEST15 TR_TEST16 TR_TEST17 TR_TEST18 TR_TEST19 TR_TEST20 16473 16520 16320 16347 16406 16462 16510 16570 823 826 825 817 820 823 825 828 223856 224672 224400 222224 223040 223856 224400 225216 223856 224672 224400 222224 223040 223856 224400 225216 实际行数为通过直接操作SQL SEVER2008数据库查询所得。

测试结果讨论:本次测试耗时约为1小时,由于下位机接入的时间不同发送数据的次数有所差异,但是都完成了数据的存储任务,本次测试共写入了4378384行数据,占用了247M的硬盘空间。由于上位机硬盘空间有限,因此需要设置合理的存储间隔以及及时导出重要数据,清理硬盘空间。

5.3本章小结

根据科盛电子有限公司对本系统的具体技术指标要求,利用STM32开发板对本系统进行了多次模拟测试。测试结果表明:上位机能够实现对下位机的主动查找,连接成功后上位机能够实现自动获取下位机仪器的信息,下位机能将所测数据及时、准确地发送到上位机,上位机也能实现对下位机的操作与控制,数据库模块、管理员模块、基本界面模块满足技术设计要求,能够实现其所需功能,证明该方案切实可行。

68

杭州电子科技大学硕士学位论文

第六章 总结与展望

本系统旨在开发一个通用型系统,而不是一个专用型系统,采用本系统不仅能够实现对现有不同测试仪器的连接,当下位机采用了新的数据采集设备以后,利用本系统也同样可以实现对新仪器的连接,从而使本系统更具有生命力,本着这一设计主旨本系统采用了多种设计方法来实现这一目的。

1.STM32单片机的中转。本系统并没有采用上位机和测试仪器直接连接的方法进行设计,而是在其中加入STM32单片机,通过STM32进行数据中转,增加了设计的灵活性,使系统可以容纳更多的测试仪器。

2.多线程技术的运用。为了实现同多个测试仪器的同时连接,本系统采用了多线程技术,根据实际下位机接入的数量开辟相应的线程即避免了资源浪费。

3.抽象表。本系统将测试仪器的资源都抽象成同样形式的一张表,使得不同的仪器资源可以采用同样的形式进行描述,是本系统得以实现的基础。

面向任务、面向对象逐渐取代传统模式下面向器件的设计思路是现在系统进行设计的一个主流发展趋势,特别是对上位机系统的要求,必须要有更好的灵活性、适应性从而使其具有更加广泛的适用范围。

本系统根据科盛有限公司提供的技术指标通过了初步测试,但作为一个企业级的应用产品,本系统还有很多需要改进的地方,如进一步改进操作界面,使界面更加美观直观,简化操作步骤,使其更符合操作习惯。同时该系统还需要进一步同下位机系统进行调试,对系统进行优化,提高上位机对数据的处理能力,使该系统在现有要求外能够容纳更多的测试仪器,符合工业现场的工作要求。

69

杭州电子科技大学硕士学位论文

致 谢

值此论文完成之际,谨向所有在研究生学习期间指导、关心帮助我的老师同学表示衷心的感谢。

首先要感谢我的所长秦会斌教授,在两年半的学习时间里,秦老师在学习和生活上给予了我极大的帮助,正是在秦老师的悉心指导下,才使得我能够顺利完成本论文相关的科研工作和项目课题。秦老师渊博的学识、严谨的科研态度、认真负责的工作方式给我留下了深刻的印象,是我一生都值得去学习的榜样。同样感谢我的导师胡永才教授对我学习生活和工作上的细心关照和无私帮助。

感谢绍兴市科盛有限公司的张文成工程师在毕业设计完成期间对我的帮助,他在系统的设计、研发、测试阶段提出了许多指导性建议和宝贵意见。在此向他表示衷心的感谢!

感谢两年多来和我朝夕相处的同窗:王卫、房媛媛、高晨等人,谢谢他们对我学习生活上提供的无私帮助,和他们一起度过了一生中非常难忘的时光。

感谢两年半来我所有的任课老师和电子信息学院的领导,他们克服种种困难,牺牲休息时间,不辞辛劳,辛勤授课,为国家培养了一批又一批优秀的人才。

感谢这么多年来一直在身后为我默默加油的家人和朋友,正是他们多年以来一如既往的关心、鼓励和支持才使得我能够全身心投入到科研工作中完成我的学业。

最后再次向帮助过我的老师、同学、家人、朋友表示的感谢,由衷的祝福大家工作顺利、家庭幸福、身体健康!

70

杭州电子科技大学硕士学位论文

参考文献

[1]王琳,商周,王学伟.数据采集系统发展与应用[J].电测与仪表,2004,41(8):4-8.

[2]苏世栋.智能仪器及数据采集系统的现状及发展[J].运城学院学报,2004,22(2):18-19. [3]张会勇. Winsock网络编程经络[M]. 北京:电子工业出版社,2012.8:13-69. [4]郑阿奇. Visual C++网络编程[M]. 北京:电子工业出版社,2011.7:29-256.

[5]杰瑞夫,克里斯托夫.Windows核心编程[M]北京:清华大学出版社,2008.9:60-118.

[6]彭刚,秦志强. 基于ARM Cortex-M3的SMT32系列嵌入式微控制器应用实践[M].北京:电子工业出版社,2011.1: 228-238.

[7]聊义奎.Contex-M3之STM32嵌入式系统设计[M]. 北京:中国电力出版社,2012.2: 331-338. [8] 任哲. 嵌入式实时操作系统μC/OS-Ⅱ原理及应用[M]. 北京:北京航空航天大学出版社,2009.10:227-245.

[9]Shi jian ,Guo mian . Embedded digital oscilloscope based on STM32 and μC/OS-II[J]. Applied Mechanics and Materials,2012.190-191:1129-1135.

[10]拉伯罗斯.嵌入式实时操作系统μC/OS-Ⅱ[M].北京:航空航天大学出版社,2003.5:283-316. [11]郑巨明,张和生,贾利明,梁玉庆.基于μC/OS-Ⅱ和LwIP的嵌入式以太网接口设计[J].计算机测量与控制,2009,17(11):2238-2225.

[12]白乔,左飞.把脉VC++[M].北京:电子工业出版社,2009.7:40-337.

[13]C++ Primer Plus. Stephen Prata.[M].北京:人民邮电出版社,2012:19-324. [14]张翠,邓志良.LwIP协议栈在μC/OS-Ⅱ上的移植与应用[J].微计算机信息,2010,26(3):84-95.

[15]Jiang, Jinjian. Transplantation research of the LwIP agreement under the uC/OS-II [J]. 2012 5th International Conference on Biomedical Engineering and Informatics,2012: 1376-1379. [16]程明,余中华,苏艳萍,郭小飞. μC/OS-Ⅱ下LwIP协议栈的移植和测试[J].微计算机信息,2008,(23):79-90.

[17]Shang, Junyan,Ding, Huafeng .Application of lightweight protocol stack LwIP on embedded Ethernet [J]. 2011 International Conference on Electrical and Control Engineering, 2011: 3373-3376.

[18]闫常友,王敏.C++STL标准程序库开发指南[M].北京:中国铁道出版社,2013.5:75-163. [19]Chen, Zai Ping ,Yang, Ya Jing .The application and implementation of ADO technology in industrial management system based on MFC [J]. Advanced Materials Research,2013, 791: 1562-1565.

[20]Hill, Adrian . Building MFC dialogs at runtime [J]. Dr. Dobb's Journal,2004,29(9):11-15. [21]辛长安,王颜国. Visual C++权威剖析—MFC的原理、机制与开发实例[M]. 北京:清华大学出版社,2008.5:8-10.

[22]陈少强.VC++中基于MFC的多线程应用程序设计[J].三明高等专科学校学报,2002,19(2):49-54.

[23]奎因,舒特.Windows Socket网络编程[M].北京:机械工业出版社,2012.8:1-125.

[24]於晓兰.基于TCP/IP的网络扫描策略设计与实现[J].电子与计算机技术,2009,8(5):54-59. [25]汪庆莲.网络扫描系统的设计与实现[J].湖北第二师范学院学报,2010,27(8):118-119. [26]黄家林,姚景周,周婷.网络扫描原理的研究[J].计算机技术与发展,2007,17(6):147-150. [27]C.Leckie,R.Kotagiri.A Probabilistic Aproach to Detecting Network Scans[J]. Network Operations and Management Symposium,2002:359-372.

[28]向全青.基于网络扫描技术的动态蜜罐网络设计与实现[J].信息技术,2013,6:157-165. [29]张义荣,赵志超,鲜明,王国玉,肖顺平.计算机网络扫描技术研究[J].计算机工程与应用,2004,2:173-173.

[30]李健,张国印,顾国昌,张万松.网络扫描技术实现及其在网络安全中的应用[J].计算机应用研究,2004,2:101-105.

71

杭州电子科技大学硕士学位论文

[31]唐洁.VC++多线程开发技术[J].电脑编程技巧与维护,2007,7:25-31.

[32]Qi YueLuo, Xin Qiang,Wang Qin. Dynamic management of hardware multi-threading for network processors[J]. Procedia Engineering,2011,15: 3906-3910.

[33]刘权胜,杨洪斌,吴悦.同时多线程技术[J].计算机工程与设计.2008,29(4):963-967.

[34]杨红军,王金英.基于VC++的多线程通信程序设计[J].电脑知识与技术,2008,4(2):413-415 [35]王瑞,于速,张雨.Visual C++数据库系统开发完全手册[M].北京:人民邮电出版社,2006.3:78-94.

[36]Cao Shu Guo. Grade exam management system design and implementation based on ADO.NET [J]. Applied Mechanics and Materials,2013,347-350:2930-2936. [37]刘增军,向为,孙广富.基于ADO的数据库开发技术研究[J].科学技术与工程,2007,7(3):747-752.

[38]齐永奇,乔文生.基于Visual C++的ADO数据库开发技术[J].华北水利水电学院学报,2008,29(4):68-71.

[39]Ren Zhijun. Practicing for business intelligence application with SQL server 2008 [J]. Applied Mechanics and Material,2010,20-23: 1499-1503.

[40]颜志军.Visual C++数据库开发典型模块与实例精讲[M]. 北京:中国工业出版社,2007.9: 21-69.

[41]侯其锋,李晓华,李莎. Visual C++数据库通用模块开发与系统移植[M]. 北京:清华大学出版社,2007.5: 20-67.

[42]邱李华.SQL Server 2008数据应用教程[M]. 北京:人民邮电出版社,2012.8:26-271. [43]王岩.注册表终极解析2100例[M].北京:中国林业出版社,2006.7:1-10. [44]刘畅.畅通无阻学注册表应用[M].北京:机械工业出版社,2008,1:1-5

72

杭州电子科技大学硕士学位论文

附录

作者在读期间发表的学术论文及参加的科研项目

学术论文

[1]多测试仪器数据采集与控制系统的设计与实现

73

因篇幅问题不能全部显示,请点此查看更多更全内容