基于VISA库的任意波形发生器驱动程序的开发设计说明_第1页
基于VISA库的任意波形发生器驱动程序的开发设计说明_第2页
基于VISA库的任意波形发生器驱动程序的开发设计说明_第3页
基于VISA库的任意波形发生器驱动程序的开发设计说明_第4页
基于VISA库的任意波形发生器驱动程序的开发设计说明_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 PAGE31 / NUMPAGES14第三章 基于VISA库的驱动程序的研究本章简介:VXI总线以其良好的测控性能成为虚拟仪器的一个重要发展方向,作为一个开放式的测控系统,虚拟仪器软件结构(VISA)为不同厂商的VXI器件的驱动程序提供了统一的软件基础。本文通过对VISA库与VXIplug &play规的介绍来阐述仪器驱动程序的开发,并描述了VXI总线寄存器基器件任意波形发生器驱动程序的设计与实现。3.1 VISA简介随着VXI仪器的广泛使用,出现了相应的的I/O控制软件,由于不同厂商的硬件提供的I/O库不同,仪器驱动程序不兼容,仪器之间很难集成。VXIplug&play联盟的宗旨是通过开放

2、的、不同厂商的VXI系统使得VXI技术的最终用户可简便使用VXI仪器。联盟制定了Virtual Instrument Software Architecture,即虚拟软件结构(VISA)。VISA是一个标准的独立于硬件设备、接口、操作系统、编程语言和网络环境的I/O控制库,目的是处理计算机与仪器间物理连接的通信细节。通过VISA,由不同硬件接口(如GPIB、VXI或RS232等)连接的设备可以集成到一个系统中,由一个软件完成所有仪器设备的控制。因此,VISA是生成虚拟仪器驱动程序的软件基础。本文所介绍的仪器驱动程序是在LabWindows/CVI环境下开发的。LabWindows/CVI为基

3、于C语言的应用程序开发环境(ADE)。ADE通过驱动程序头文件,获得有关仪器驱动程序函数的必要信息。LabWindows/CVI提供了VISA库的各类函数,用户在开发驱动程序时可方便的调用其中的函数。3.1.1 VISA资源模板VISA模板为所有应用程序提供基本的资源控制服务,包括控制与资源或器件间的通话使用期和控制资源特性等。1使用期控制VISA控制器件通话、查找列表和事件的使用期。当这些控制使用完毕之后,可用viClose( )释放与之相关的系统资源。2访问控制应用程序可以同时打开多个与VISA资源的通话,也可以同时通过不同的通话句柄同时访问资源。在某些情况下,访问VISA资源的应用程序希

4、望禁止别的应用程序访问该资源。为此,VISA定义一种锁定机制来限制对资源的访问。锁定资源的操作是调用函数viLock( ),解锁的操作是调用函数viUnLock( )。访问控制服务viLock(ViSession instr,ViAccessMode lockType,ViUInt32 timeout,ViKeyId requestedKey,ViKeyId accessKey);LockType表示请求锁定的类型,它有两个值,要么是VI_EXCLUSIVE_LOCK,表示独占锁定;要么是VI_SHARED_LOCK,表示共享锁定。timeout表示超时设置,即在设定的时间未完成操作,则返回错

5、误码。否则忽略此参数,此时timeout值取VI_NULL。viUnLock(ViSession instr);该操作取消对指定资源的锁定。3.1.2 VISA资源管理函数VISA资源管理器为应用程序提供基本服务,包括查找资源和打开与资源的通话。下面简述这些服务:访问函数和操作资源管理器允许打开与资源的通话,通话由应用程序请求而建立。在应用程序关闭通话或功能失常时系统负责释放与通话相关的全部系统资源。viOpenDefaultRM(ViPSession &defaultRM);该函数必须在调用任何VISA操作之前调用。第一次调用该函数使VISA系统初始化,包括初始化默认资源,同时返回与该资源的

6、通话。对函数的再次调用返回与默认资源的另一唯一通话。许多VXIplug&play仪器驱动程序要求输入作为通话句柄的参数以便识别目标仪器。为了给开发者提供使用模型的一致性,必须定义这个参数的类型和位置,VISA要求这种函数的通话句柄定义为ViSession类型,并要求它是参数表中的第一个参数。ViPSession型数据为ViSession型数据的地址。viOpen(ViSession defaultRm,ViRsrc rsrcName,ViAccesssModeaccessMode,ViUInt32timeout,ViPSession instr)本操作打开与指定器件的通话并返回调用此器件其它操

7、作的通话标识符instr。defaultRM为由viOpenDefaultRM( )返回的与VISA默认资源通话的唯一逻辑标识符。在参数表中用到两个通话标识符defaultRM、instr,ViOpen( )是在已知的资源上操作,defaultRM为与该资源通话的标识符,相当于与此资源的通讯的通道,而实际上我们想与具体的器件通话,这就是返回的与该器件通话的标识符instr,即与该器件通讯的通道。这就象打长途,先拨区号,再拨你想要的用户,这样就可进行通讯。rsrcName为器件的唯一符号名称。该参数为一字符串,可唯一标识这一器件资源。表3-1为一些较典型器件资源的描述符。地址字符串说明VXI0:

8、1:INSTRVXI接口0槽模块上逻辑地址为1的VXI器件GPIB-VXI:9:INSTRGPIB-VXI控制系统中逻辑地址为9的VXI器件GPIB:1:0:INSTRGPIB接口0上主地址为1,副地址为0的GPIB器件ASRL1:INSTR位于端口COM1上的串行器件VXI:MEMACC对VXI接口板级寄存器的访问GPIB-VXI1:MEMACC对1号GPIB-VXI接口板级寄存器的访问表3-1 器件资源描述符VXI0槽为VXI仪器总线的运行提供所需要的硬件资源。它们为外部通信接口与VXI总线之间提供转换,并提供协议。VXI0槽模块还可以提供访问VXI仪器的功能。在一些情况下串行器件(ASR

9、L)的命名规则会混淆,在WINDOW平台上,ASRL1对应COM1,而在Macintosh平台上ASRL1对应调制解调器端口。accessMode为访问指定器件资源的模式,值为VI_EXCLUSIVE_LOCK表示通话开启后立即获取独占锁定,如果锁定未能获得,就关闭通话并返回错误码;如果值为VI_LOAD_CONFIG,表示用外部组态应用程序设定属性值,否则用VISA规定义的缺省属性值VI_NULL,可以用以上两值的“位或”表示同时使用两种访问模式。若accessMode请求锁定,timeout表示错误码返回之前这一操作等待的最长时间间隔,单位为毫秒。查找此服务用于查找器件并与之建立通讯联系。

10、VISA资源管理器查找与接口相关的所有资源,而不是对各资源分别定位和查找。执行此操作后,用户可查找到所有可利用的接口硬件资源。3.1.3 VISA存储器I/O服务在讨论存储器访问时,在速度与复杂性,软件开销与封装之间要折衷考虑。高级访问的目的与低级访问相似。两者的区别在于高级访问具有更大的软件开销,因为它要封装用于存储器访问的绝大部分代码,如窗口映射和错误检验。通常,高级访问的速度低于低级访问的速度,但封装了进行访问的所需要的操作,因此比低级访问更安全。低级访问服务通过降低软件开销提高访问速度,但它要求进行更多的编程工作。为减少存储器访问的开销量,低级访问服务在操作中不返回任何错误信息。低级访

11、问服务允许对接口上支持直接存储器访问的器件进行寄存器级访问,在应用程序使用接口总线的低级服务访问之前,应利用viMapAddress( )映射一个地址围,将寄存器映射到存中,再利用viPeek( )、viPoke( )进行读写,这样就可以用对存的操作代替对模块寄存器的操作。虽然资源可以处理对窗口的分配和操作,但在低级访问完成时,应调用viUnmapAddress( )清除窗口。只有这样,系统才能对窗口进行重新分配。由于一批数据的传输只使用了一次映射,因此大大节省了操作时间,提高了数据传输速度。高级访问服务允许对接口上支持直接存储器访问的器件进行寄存器级访问,编程人员可利用简单的操作,如viIn

12、16( )、viOut16( )访问接口总线上的存储器。这些操作封装了低级服务中的map/unmap和peek/poke。因此没必要明确的把存储器映射成一个窗口。viIn816、32(ViSession instr,ViUInt space,ViBusAddress offset,ViUInt816、32val);该操作通过使用指定的地址空间方式从指定的器件偏移地址offset(以字节为单位)读取8、16、32位无符号的整数。space表示指定的地址空间,下表列出指定的地址空间的有效入口。space取值说明VI_A16_SPACE寻址VXI/MXI总线的A16地址空间VI_A24_SPACE寻

13、址VXI/MXI总线的A24地址空间VI_A32_SPACE寻址VXI/MXI总线的A32地址空间表3-2 VXI器件的地址空间viOut816、32(ViSession instr,ViUInt space,ViBusAddress offset,ViUInt816、32 val);该操作通过使用指定的地址空间方式从指定的偏移地址写入8、16、32位无符号的整数3.2 VXI仪器驱动程序3.2.1 VXIplug&play对仪器驱动程序的要求与规在虚拟仪器系统中,仪器驱动程序是连接仪器与用户界面的桥梁,是测试系统设计的重要一环。在规定仪器驱动程序设计标准时,需遵守三个主要结构原则。第一,仪器

14、驱动程序以源代码形式提供,以便用户自己能开发和优化操作。第二,结构应是模块式的应为函数提供多层访问,以便用户可使用各个驱动函数的子集。最后,不同厂商的VXIplug&play仪器驱动程序结构是相似的,因此在读懂一个仪器驱动程序时所得到的知识可用于其它VXIplug&play仪器驱动程序中。虚拟仪器驱动程序图3-1驱动程序的外部接口模型VXI总线即插即用系统联盟规要求、仪器供应商在提供以VXI为代表的虚拟仪器硬件模块的同时,必须提供相应的仪器驱动程序、仪器软面板与相关文档。VXI总线即插既用规详细定义了仪器驱动程序的部设计模型与外部接口模型,规定了仪器驱动程序的设计要求与与系统中其它程序模块之间

15、的相互关系。虚拟仪器驱动程序的外部接口模型如图3-1所示,包括函数体、子程序接口、VISA I/O接口、交互式开发者接口与应用程序开发者接口。函数体仪器驱动程序函数体是驱动程序源代码。可采用标准的编程语言或图形化编程语言(G语言,例如LabVIEW和HP VEE)编写。I/O接口 在VXIplug&play结构中,I/O接口由标准的并能在多平台上使用用的的独立软件层提供。VISA含有一控制VXI、GPIB、RS-232、以太网和其它类型仪器的接口库。它能对所有VXI功能提供访问,包括消息基和寄存器基编程、中断和事件处理,并能直接访问VXI底板。子程序接口VXIplug&play仪器驱动程序使用

16、标准化编程技术和层次化设计,因此驱动程序可通过子程序接口访问使用其它库的函数。子程序接口是驱动程序调用其它软件模块的机构,这些模块完成驱动程序的任务。其它软件模块包括高级分析库和格式化I/O库。编程式开发者接口编程式开发者接口是更高级软件程序调用驱动程序的机构。最终用户的测试系统程序是由几个仪器驱动程序的调用组成,每个调用使用多个参数。交互式开发者接口交互式开发者接口通常是一图形接口,这种接口有利于软件开发者理解仪器驱动程序函数的作用和如何使用该接口调用驱动程序中的函数。交互式开发者接口的一个例子是Windows中使用的函数面板,函数面板文件代表仪器驱动程序中的函数、函数的参数名和数据类型与相

17、关的帮助文件。函数面板文件的树形结构VPP规要求,仪器驱动程序应包括C源代码(.h文件、.c文件)、动态库文件(.dll)、函数面板(.fp文件)与其他相关文档,例如帮助文件。在仪器驱动程序外部接口模型中定义的交互式开发者接口,实质就是函数面板文件。函数面板文件是对仪器驱动程序的结构化表达。利用函数面板文件,用户可以交互式的理解整个仪器驱动程序操作函数的组成与使用,并利用函数面板所带有的帮助文件,进一步的了解仪器的功能与仪器驱动程序的各个函数与各个参数的意义与作用,使仪器驱动程序的设计与使用都变得直观与方便。根据VPP规,函数面板文件的结构采用了树形结构,表3-3以amc2720模块的驱动函数

18、面板文件为例进行介绍。表中定义了函数面板文件的最小的树结构,包含了所有函数面板必需的部分。在表中,树结构是由几层结点构成的,最上层根结点定义了仪器结点,表示整个函数面板文件:下一层为类结点,包括了一系列相近的仪器功能函数,如实用(Utility)类,它包括了错误信息函数、错误查询函数、复位函数、自检函数与版本查询函数等子结点;再下一层为函数结点它对应着仪器驱动程序具体的函数,由相应的源代码组成。函数面板树结构可以根据仪器功能的需要进行扩展,类结点和函数结点的个数都可以进行扩展。一般由根结点直接生成的类结点还可以包括组态类结点、测量类结点、开关类结点、激励源类结点等,而测量类结点向下又可以分为组

19、态类结点和读类结点,读类结点又可分为初始化结点和取数结点,直到分解到具体的函数为止。整个函数面板树结构与仪器的驱动程序部设计的模型是完全一致的。整个树结构由仪器结点扩展为多个类结点或直接的函数结点,而类结点又扩展为多个下级类结点或函数结点,由此构成了完整的仪器驱动程序函数面板文件结构。表3-3 amc2720函数面板文件树结构仪器结点函数 InitializeLow Level Control Load Waveform DataStatus Read Status ByteUtilityError MesssageError QueryResetRevision QueryCloseamc2

20、720_init (初始化函数)amc2720_loadWaveformData(载入波形数据函数)amc2720_readStatusByte(读状态位函数)amc2720_error_message (错误信息函数)amc2720_error_query (错误查询函数)amc2720_reset (复位函数)amc2720_revision_query (版本查寻函数)amc2720_close (关闭函数)图3-2驱动程序的函数面板文件VXI仪器驱动程序主要可分为如下几类函数:初始化函数使仪器的软件连接初始化并完成一些必要的操作使仪器处于默认上电或其它特定状态。首先打开与默认资源的通话

21、,返回通话句柄,再打开与器件资源的通话,返回通话句柄。应用函数应用函数是完整的仪器驱动程序函数,当用户需要单一的高级驱动函数接口时,这些函数可通过它们自己的程序接口被调用。部件函数部件函数将仪器功能划分为控制仪器功能特定区域的若干类,这些函数为应用程序开发者提供仪器功能的直接访问的中间层,且通常将仪器的控制分解成更低级控制。功能函数类按照仪器功能(如测量、源、路径等)将仪器驱动函数分组。在使用最高级功能函数时,每个函数执行一个完整的操作。假定仪器没有优先状态,这就允许这些函数是顺序独立的。功能函数的执行可产生已完成的结果,如测量值的返回、指定的源输出或由开关控制的路径的连接。关闭函数结束与仪器

22、的通话,并释放与该通话的系统资源。与前面介绍的初始化函数相对应的是先关闭与器件资源的通话,再关闭与默认资源的通话。这样可对系统资源重新分配。图3-3驱动程序的函数窗口在函数面板文件中,对于每个函数结点,都对应着一个函数窗口,在每个窗口中,包括了表示函数中所含的各个输入参数、输出参数与返回值的图形化控件,分别与每个参数对应。每个参数控件又分别包括控件标号、控件位置号、数据类型、默认值与控件宽度等参数信息。VPP规定了函数窗口的几种控件类型,包括输入类型、游标类型、布尔类型、组合类型、数值类型、输出类型、返回值类型、全局变量类型与信息类型。其中输入类型(往往是仪器句柄值)一般放在函数窗口的左下方,

23、而返回值类型控件一般放在函数窗口的右下方。函数面板树形结构的最底层单位为函数结点,而图形窗口的最基本单位为各种控件。在函数面板中,每个层次的部件都必须包括各自的帮助文档,帮助文档可按照函数面板文件的结点层次来划分。图3-4驱动程序的函数参数信息根结点帮助文档对应于仪器结点,描述整个仪器的功能与函数面板所含的类结点与函数结点的概述;图3-5驱动程序的函数帮助文件编辑类结点帮助文档对应于类结点,用来描述类的功能与类中所含的函数结点概述;函数结点帮助文档对应于函数结点,用来描述该函数的功能与应用围;控件帮助文档对应于函数的输入、输出参数,分别描述其各自的类型、默认值与注意事项;返回值帮助文档对应于函

24、数的返回状态值,描述正确返回值与各种错误返回值代码与其所代表的含义。函数面板文件的设计根据函数面板的树形结构,函数面板文件的设计分两部分进行。首先编辑函数面板树,然后在函数结点上的函数窗口编辑器中编辑该函数的各参数的图形控件。函数面板的设计是仪器驱动程序的一部分。它的开发与源代码的开发是紧密连在一起的,也往往与仪器驱动程序源代码一起由仪器模块的设计人员来完成。仪器驱动程序的设计人员根据仪器模块的功能设计出驱动程序的函数面板文件的树结构,将仪器驱动程序的各个欲包括的函数按从上至下的模式进行结构性描述,源代码则用C语言将各个函数的功能实现。当源代码编写完成之后,再完成函数面板文件的的窗口设计,可方

25、便的为各函数在图形化平台中进行测试提供图形化接口与详尽的帮助文档。3.2.1 VXI仪器驱动程序的的设计实现函数面板文件的应用在仪器驱动程序外部接口模型的描述中,仪器驱动程序通过应用程序开发者接口与上层应用程序开发环境进行通信,如何在图形化软件开发平台对仪器进行交互式控制,是图形化软件平台开发中的一个关键问题。由于图形化软件平台是一个应用程序的开发环境,在测试系统组成之前,无法得知系统所含有的仪器类型与个数,也就无法象构造虚拟仪器软面板通过直接调用仪器驱动程序的动态库DLL函数来进行控制,而是需要一个通用性的接口。分析仪器驱动程序的头文件格式,固然可以得知所有驱动函数的函数原型与数据类型,但由

26、于头文件的编写格式并不完全唯一,对于数据类型的描述有时还会放在源代码文件中,因此头文件的信息量不大。而分析函数面板文件,一是所有符合VPP规的虚拟仪器驱动程序都含有函数面板文件,来源是确定的;二是其文件格式是统一的,分解函数面板格式是一个完整的结构化文件;三是其不仅包含所有函数原型、所有数据类型,还包括各个层次的帮助信息,有利于用户的使用。因此,图形化软件平台通过对函数面板文件的扫描,获取仪器驱动程序的信息,在调用相应的函数实体,从而完成对仪器的各种操作。运用LabWindows/CVI的函数面板编辑器将驱动程序的函数面板文件编辑好之后,可使用编辑器的功能自动生成驱动程序的头文件(.h文件)和

27、源代码文件(.c文件),若是VXI器件的驱动程序则必须确保在函数面板编辑器的菜单栏Options项的VXIplug&play Styles必需选中,头文件包括了源代码文件中函数的原型,此外在源代码中有变量需要声明或定义的与编译环境的说明都可在头文件中进行。生成的源代码文件为函数的框架,函数所要实现的功能则要程序开发人员来填写。自动生成.h文件和.c文件给程序开发人员省去了许多繁琐的函数原型的输入工作,也减少了人工输入时出错的可能性,特别是函数比较多,而函数的参数也比较多且类型复杂时更能显示出其优越性。这样开发人员只要集中精力进行函数体的编写就行了。下图就是由只有一个函数的函数面板文件由函数编辑

28、器自动生成的头文件与源代码文件的例子。图3-6自动生成驱动程序的头文件窗口图3-6自动生成驱动程序的C文件窗口驱动程序采用动态库文件DLL有助于节省计算机存和实现资源共享。如果是两个或更多的应用程序使用同一个DLL,那么该DLL的页面只要放入RAM一次,所有的应用程序都可以共享它的各个页面,这意味着存的使用更加有效。多个不同的应用程序使用同一个DLL从而达到资源共享的目的。有助于解决不同的开发平台之间的差异。采用DLL文件也有助于保护虚拟仪器生产商的利益,例如VPP联盟虽然规定了VISA库函数的接口规,但却没有规定其函数部的实现机制,各生产商可根据VISA的接口规开发自己的VISA库函数,提供

29、给最终用户的是DLL文件,相当于一黑匣子,用户可以调用其中的函数,却不能改动它。将驱动程序C程序源代码生成DLL文件首先必须创建一个头文件,它包含想要从DLL输出的函数原型、结构和符号。DLL的源代码均包括该头文件,以帮助创建DLL。如果程序发现DLL的源代码模块至少输出了一个函数或变量,那么程序生成一LIB文件,这LIB文件很小,它不包含任何函数或变量,它只是列出了所有已输出函数和变量的符号名。如果要DLL的输出符号的任何可执行模块,该LIB文件是必不可少的。采用Labwindows/CVI编制DLL文件操作也很简便,可由函数面板文件编辑器的菜单中option中的creatdll proje

30、ct 项,产生创造DLL文件的工程项目,其包含两个文件.h和.c文件与函数面板文件.fp,这与前面介绍的由函数面板文件产生的函数源代码框架文件实质是一样的,编程人员将函数代码编入各函数中去之后,经编译之后,就可由该工程文件生成DLL文件和LIB文件,在使用VXIplug&play形式的函数面板文件产生的DLL 工程文件产生的LIB文件有四种,即BORLAND C Microsoft VC SYMANTEC WATCOM 四种C的LIB文件,这样只要编程人员偏好某种虚拟仪器的开发平台,就可选用自己适合的编程语言,而不用当心驱动程序的兼容性问题,从而使得驱动程序达到开放性的目的。而由这四种C开发的

31、DLL,LIB文件的驱动程序,如虚拟仪器的应用程序开发平台采用的是Labwindows/CVI,则有一些细节需注意,因Labwindows/CVI是基于标准 C开发的,在某些细节方面和这四种C会有出入,若未注意到这些差别也会出错。函数的许多标准返回值在头文件Visatype.h和Vpptype.h中定义,类型为VISA库的ViStatus类型。一般仪器驱动程序函数模型形式为:Vistatus_VI_FUNC(参数1,参数2,);为了简约说明问题,以航空测控公司 amc2720任意波形发生器驱动程序的函数体为例进行介绍,具体的以向器件写入波形数据的函数来讲解。这些函数体只是一些基本的结构框架。实

32、际的函数要复杂丰富一些。仪器前缀为amc2720。初始化函数ViStatus _VI_FUNC amc2720_init (ViRsrcResource_name, ViBoolean id_query, ViBoolean reset_instr,ViSession *instrSession)Resource_name :器件资源的标示符。“VXI0:187:INSTR”表示受VXI零槽控制、逻辑地址为187的器件资源。任意波形发生器的逻辑地址,由器件板上的拨码开关设置,只有零槽模块的逻辑地址可设置为0,在同一机箱中,不同的器件的逻辑地址不要设置成一样,如果需要用到两块一样的器件,需要改变

33、其中一器件的逻辑地址。id_query:VISA布尔型的标示查询变量,为1表示进行查询,可确保初始化的仪器器件是该驱动程序支持的器件;为0时表示跳过查询。reset_instr:VISA布尔型的复位变量,为1表示进行复位,为0不进行复位操作。InstrSession:与器件进行通话的句柄的地址。函数返回值为VISA型,为0表示初始化成功,不为0表示有错误,具体错误类型可调用错误信息函数进行查看,也可查询VISA手册。读状态寄存器函数,状态寄存器地址为0AViStatus CVIFUNC amc2720_readStatusByte (ViSession instrHandle ) ViInt1

34、6 wrdy=0;ViStatus amc2720_status = VI_SUCCESS;while(1) /读状态寄存器 amc2720_status=viIn16 (instrHandle, VI_A16_SPACE, 0 x0a, &wrdy); if(wrdy&0 x200)=0 x200) break;return amc2720_status; 载入波形数据函数ViStatus CVIFUNC amc2720_loadWaveformData (ViSession instrHandle, float frequency, float amplitude ViInt16 data4096) int i,j, k; float a; ViInt16 x; ViStatus amc2720_status = VI_SUCCESS; ViInt32 M,temp; amc2720_readStatusByte (ViSession instrHandle ); /写数据准备好 amc2720_status = viOut16 (instrHandle, VI_A16_SPACE, 0 x02, 0 x7f11);/清静 for(i=0;i4096;i+) /态存储器 amc2720_readStatusByte (ViSession instr

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论