《机电控制系统仿真与软件设计》_第1页
《机电控制系统仿真与软件设计》_第2页
《机电控制系统仿真与软件设计》_第3页
《机电控制系统仿真与软件设计》_第4页
《机电控制系统仿真与软件设计》_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

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

文档简介

1、 机械与车辆学院机电控制系统仿真与软件设计报告(2014-2015学年第一学期) 课程设计题目:水塔水位机电控制系统设计与仿真一、课程设计性质和目的 机械电子工程专业是一个对实践、应用能力要求很强的专业,机电控制系统设计与仿真课程学习的目的是让学生借助MATLAB软件来研究机电控制系统的设计方法,与传统控制系统设计采用直接编写程序代码不同的是,本课程是在MATLAB/SIMULINK中设计出控制系统模型,再通过Embedded Coder将控制系统模型生成可执行的C代码,然后加载至MCU中去,采用这种新颖的方法,不用再专注于繁琐程序代码的编写工作,而可以将精力花费在控制算法的研究上。

2、通过学习本课程让学生也了解现代控制行业发展趋势及控制系统实现的先进方法。二、课程设计的内容及要求 在Proteus中建立起水位控制系统仿真模型,如图所示:B表示为下限水位传感器,C表示为上限水位传感器,D1为指示灯,电机为泵。  图1 水位控制系统仿真模型下限水位传感器B接单片机P1.0管脚,上限水位传感器接单片机P1.1管脚,指示灯D1接单片机P1.3管脚,电机由单片机P1.2经过光耦和继电器来控制。    工作过程是:(1)水位未到下限水位时,泵工作抽水,同时D1指示灯常亮,水位超过下限水位继续上升。(2)当水位上升到上限水位时,

3、泵停止工作,同时D1指示灯灭,(3)如果下限水位传感器未动作,而上限水位传感器却动作了,则泵停止工作,同时指示灯D1开始按一定时间间隔闪烁报警。(4)根据上述的控制要求在SIMULINK中,运用Stateflow工具箱建立起该控制系统的模型,并进行仿真运行分析,达到控制系统要求后,再通过SIMULINK菜单code选项,c/c+ code/build model,生成嵌入式C代码。然后在Keil中对生成的C代码进行I/O配置和适当修改,编译成HEX文件,最后将该HEX文件加载至Proteus仿真平台就可以验证代码的正确性了。三、课程设计的进度及安排序号项 目时 间1布置任务

4、,讲授MATLAB基本知识1天2水塔水位控制系统SIMULINK建模仿真1天3控制代码的自动生成和修改、编译与仿真1天4仿真控制系统调试分析、编写设计报告1天5答辩1天 表1 课程安排四、MATLAB/Stateflow学习 通过MATLAB是一种科学计算软件,专门以矩阵的形式处理数据。MATLAB将高性能的数值计算能力和强大的数字可视化功能集成在一起,提供了大量的内置函数,因而被广泛地应用于科学计算、控制系统、信息处理等领域的分析仿真和设计工作;而Stateflow是集成于Simulink中的图形化设计与开发工具,主要用于针对控制系统中的复杂控制逻辑进行建模和仿真,即适用于对事件响应系统进行

5、建模和仿真。Stateflow和Simulink结合起来,可以创建确定性监管控制系统。利用Stateflow可视化的模型和直观的仿真能力,可以清晰、简洁地反映出动态逻辑关系。它的基础是有限状态机理论,它通过状态图、流程图的创建,对事件驱动系统进行建模和仿真。 此次课程设计是基于MATLAB/Stateflow软件上的一次实践,利用Stateflow可视化的模型和直观的仿真能力,对水塔进行逻辑图的绘制,建立动态系统模型进行仿真。然后对仿真出来的代码进行修改和添加。这样就不需要花太多时间从事代码的开发 ,可以让设计者腾出更多的精力进行顶层控制策略的设计。采用Stateflow&

6、#160;进行系统建模 ,直观、逻辑关系清晰、简便 ,RTW 生成执行代码正确 ,可以大大缩短系统开发周期。五、水位控制系统模型 首先在matlab2013asimulink下建立起水塔水位控制模型如图2所示,并保存。图2 simulink下建立控制模型 In1、In2为控制输入端(P1.0口、P1.1口的按键输入),设定信号名称为delay,该信号作为stateflow中状态之间变换的转换条件(等效按键的按下产生的脉冲)。Out1、Out2为模型的输出端。(电机和指示灯的输出端口) 在stateflow菜单view下的Model Explorer中设定

7、输入、输出。输入High_a,port为1,数据类型DataType为uit8,输入low_b,port为1,数据类型DataType为uit8,输入delay触发Trigger为Falling(因为单片机中,设置是按键按下时产生一个下降沿)。输出为M、led,port分别为1、2,数据类型DataType为uit8如图所示。图3 Model Explorer输入输出设定Chart模块为stateflow模块,定义了High_a、Low_b两个输入变量、M、led两个输出端口。图4 stateflow建模 初始状态:有4种不同的情况High_a和Low_b都为1;High_a和Low_b都为0

8、;High_a为1,Low_b为0;High_a为0,Low_b为1。这4种状态将直接进入四种不同的固定状态,执行相应的命令。四种固定状态:(1)状态A为(工作状态):水位在水位的下限Low_b下,输入信号High_a和Low_b都为1。M(抽水电机工作状态),此时led=1(指示灯亮)。(2)状态A1为(故障状态):水位在水位的下限High_a以上,未到达水位上限Low_b。,此时motor=0(电机停止),led闪烁(由子状态来实现)A4、A5状态间的转移以delay条件实现亮灭。 图5 A1模型(3) 状态A2为(中间状态):电机和指示灯都保持原来的运行状态不变。(4) 状态A3为(停机

9、状态):水位在水位的下限Low_b以上,也到达水位上限High_a。M(抽水电机停止状态),此时led=0(指示灯灭)。(5) delay 事件(delay为转移条件用fail(下降边沿触发)。(6) 状态1、状态2、状态3之间的转移条件为水位传感器 B、C 来决定。(即由输入信号High_a和Low_b决定)当输入信号High_a和Low_b都为1,进入状态A执行命令。完毕后进入中间状态A2,等待下一个输入信号(High_a和Low_b)的变化,再选择进入相应的状态执行命令。 图6 状态及状态转换设定好stateflow了以后,再设置simulink中的Conf

10、iguration Parameters,Solver options中Type选择定步长Fixed-step,其他默认;硬件Hardware Implement选项Device vendor选择Intel,Device type选择8051,其他默认;Real-time Workshop中,System target file选项选择ert.tlc,编译语言language选择C,其他默认。 然后在simulink菜单中Tools选择Real-time Workshop下的Build Model,在matlab命令窗口command window中可以看到详细的编译步骤,编译成功后,simu

11、link文件所在文件夹会出现名为test_ert_rtw的文件夹,在该文件夹下,建立 如图所示的proteus仿真模型,取名为test;并建立名为test的keil新工程,芯片选择ATMEL公司的AT89C51,接下来要将rtw编译所得到的C源文件导入keil中修改并进行编译生成单片机可执行的.hex文件。 六、嵌入式C代码 描在simulink菜单中Tools选择Real-time Workshop下的Build Model,在matlab命令窗口command window中可以看到详细的编译步骤,编译成功后,simulink文件所在文件夹会出现名为untit

12、led_ert_rtw的文件夹。在该文件夹下,建立如附录3所示的proteus仿真模型,取名为水塔电路图;并建立名为untitled的keil新工程,芯片选择ATMEL公司的AT89C51,接下来要将rtw编译所得到的C源文件导入keil中修改并进行编译生成单片机可执行的.hex文件。 在keil工程中,Source Group 1导入rtw编译所得到的C源文件,共有3个,一个为ert_main.c、一个为untitled.c还有rt_zcfcn.c,ert_main.c为主程序,里面要设定输入输出端口,untitled.c为功能程序。 图7 导入C源文

13、件(1)如果不进行修改,直接编译会报错,不能编译通过。主要是要修改ert_main.c文件,打开后在头文件处加入#include<reg51.h>,并对所到的管脚进行定义。如图所示。图8 修改头文件和加入管脚定义 (2)接下来设定模型输入输出管脚,如图所示。图9 添加模型输入输出管脚(3)其中输入输出管脚的名称,可以在test.c中查找得到,必须保持一致。接下来,要对main函数进行修改。改成(4)将如下程序段屏蔽或者删除。在while循环体中添加rt_OneStep();即变成将程序中的(void)(argc);fflush(NULL);程序段屏蔽如图所示。 (5)进行编译,会提

14、示找不到solver_zc.h文件,解决办法为:在matlab安装目录下,搜索查找solver_zc.h,将找到的这个文件,复制到test_ert_rtw的文件夹即可,然后右键点击keil工程中Target 1,选择Options for Target Target 1中Output,选择Creat HEX file,设定好了后,点击编译,成功编译后,便得到test.hex文件,再打开proteus仿真模型,双击AT89C51芯片,加载test.hex文件,运行便得到了任务要求的效果。七、调试运行及分析 修改完,经过编译正确,将编译好的hex文件导入proteus软件中进行仿真, 见

15、图4。当水位低于下限 ,B、C 未触发时 ,抽水电机运行抽水 ,指示灯点亮。当水位高于下限低于上限,B触发,C 未触发时 ,抽水电机运行抽水 ,指示灯点亮。当水位上升至上限 ,B、C 均触发时 ,抽水电机停止抽水 ,指示灯灭。出现错误时,电机停止运转,指示灯闪烁。 图10 proteus仿真模型八、心得体会(1)在第一次设计与仿真练习过程中遇到了许多的问题其中:在改写嵌入C语言编译时因为没有屏蔽原程序中的void)(argc);fflush(NULL);语句导致程序无法编译。(2)在第

16、一次的仿真控制8个LED灯时,8个LED灯全都点亮。开始时以为是程序模型的错误,经过多次的检查证实了程序模型没有错误。最后在同学的帮助下,发现了是在嵌入C语言编译中,rt_OneStep();没有放入主函数中。(3)在水塔水位机电系统设计与仿真实验中:仿真时发现了proteus仿真模型的运行状态不正确,通过多次的检查发现了在stateflow建模时有一个输入端口没有大写,导致输入端口的信号不能与模型连接。(4)通过本次水位控制系统的Matlab机电控制系统设计与仿真, 使我Matlab的应用有了一个深刻的认识,也有了一个全面的提高。这主要得益老师耐心的教诲与同学们提供资料与帮助的结果

17、。 通过这次课程设计,我学到了一个全新的软件,让自己在理论知识和软件操作能力方面都得到了很好的训练!还学会了充分利用网络资源等一切可以利用的资源九、参考文献1 王静霞.单片机应用技术,电子工业出版社.2009.    2 Mathworks Corp. Stateflow User's Guide R2013aZ.2013.     3 刘杰.基于模型的设计MCU篇,北京航空航天大学出版社.2011.4 张威. Matlab.&

18、#160;Stateflow逻辑系统建模,西安电子科技大学出版社.2007.十、致谢 在本次课程设计中许多同学给予我帮助,解决了不少在课程设计中遇到的问题。同时也帮助我自己获取了许多过去没有的学到的知识。在这里我要特别感谢唐伟杰老师的耐心教导,郑建伟同学的建议和提醒!/* * File: ert_main.c * * Code generated for Simulink model 'untitled'. * * Model version : 1.6 * Simulink Coder version : 8.5 (R2013b) 08-Aug-2013 * C/C+ sou

19、rce code generated on : Sun Oct 26 23:45:21 2014 * * Target selection: ert.tlc * Embedded hardware selection: Intel->8051 Compatible * Code generation objectives: Unspecified * Validation result: Not run */#include <stdio.h> /* This ert_main.c example uses printf/fflush */#include "unt

20、itled.h" /* Model's header file */#include "rtwtypes.h"#include <reg51.h> sbit P1_0=P10;sbit P1_1=P11;sbit P1_2=P12;sbit P1_3=P13;/* Associating rt_OneStep with a real-time clock or interrupt service routine * is what makes the generated code "real-time". The funct

21、ion rt_OneStep is * always associated with the base rate of the model. Subrates are managed * by the base rate from inside the generated code. Enabling/disabling * interrupts and floating point context switches are target specific. This * example code indicates where these should take place relative

22、 to executing * the generated code step function. Overrun behavior should be tailored to * your application needs. This example simply sets an error status in the * real-time model and returns from rt_OneStep.*/void rt_OneStep(void)static boolean_T OverrunFlag = 0; /* Disable interrupts here */ /* C

23、heck for overrun */ if (OverrunFlag) rtmSetErrorStatus(untitled_M, "Overrun"); return; OverrunFlag = TRUE; /* Save FPU context here (if necessary) */ /* Re-enable timer or interrupt here */ /* Set model inputs here */untitled_U.In2=P1_0;untitled_U.In1=P1_1; /* Step the model */ untitled_st

24、ep(); /* Get model outputs here */P1_2=untitled_Y.Out2;P1_3=untitled_Y.Out1; /* Indicate task complete */ OverrunFlag = FALSE; /* Disable interrupts here */ /* Restore FPU context here (if necessary) */ /* Enable interrupts here */* The example "main" function illustrates what is required

25、by your * application code to initialize, execute, and terminate the generated code. * Attaching rt_OneStep to a real-time clock is target specific. This example * illustates how you do this relative to initializing the model.*/int_T main()/* Unused arguments */ /(void)(argc); /(void)(argv); /* Init

26、ialize model */ untitled_initialize(); /* Attach rt_OneStep to a timer or interrupt service routine with * period 0.5 seconds (the model's base sample time) here. /* Disable rt_OneStep() here */ /* Terminate model */ untitled_terminate(); return 0;/* * File trailer for generated code. * * EOF */

27、附录/* * File: rt_zcfcn.c * * Code generated for Simulink model 'untitled'. * * Model version : 1.6 * Simulink Coder version : 8.5 (R2013b) 08-Aug-2013 * C/C+ source code generated on : Sun Oct 26 23:45:21 2014 * * Target selection: ert.tlc * Embedded hardware selection: Intel->8051 Compati

28、ble * Code generation objectives: Unspecified * Validation result: Not run */#include "rt_zcfcn.h"/* Detect zero crossings events. */ZCEventType rt_ZCFcn(ZCDirection zcDir, ZCSigState* prevZc, real_T currValue) slZcEventType zcsDir; slZcEventType tempEv; ZCEventType zcEvent = NO_ZCEVENT; /

29、* assume */ /* zcEvent matrix */ static const slZcEventType eventMatrix44 = /* ZER POS NEG UNK */ SL_ZCS_EVENT_NUL, SL_ZCS_EVENT_Z2P, SL_ZCS_EVENT_Z2N, SL_ZCS_EVENT_NUL ,/* ZER */ SL_ZCS_EVENT_P2Z, SL_ZCS_EVENT_NUL, SL_ZCS_EVENT_P2N, SL_ZCS_EVENT_NUL ,/* POS */ SL_ZCS_EVENT_N2Z, SL_ZCS_EVENT_N2P, SL

30、_ZCS_EVENT_NUL, SL_ZCS_EVENT_NUL ,/* NEG */ SL_ZCS_EVENT_NUL, SL_ZCS_EVENT_NUL, SL_ZCS_EVENT_NUL, SL_ZCS_EVENT_NUL /* UNK*/; The * call syntax for rt_OneStep is * * rt_OneStep(); */ /fflush(NULL); while (rtmGetErrorStatus(untitled_M) = (NULL) /* Perform other application tasks here */rt_OneStep(); /

31、* Disable rt_OneStep() here */ /* Terminate model */ untitled_terminate(); return 0;/* * File trailer for generated code. * * EOF */ else currEv = SL_ZCS_EVENT_NUL; /* Update prevZc */ tempEv = (slZcEventType)(currEv << 2);/* shift left by 2 bits */ *prevZc = (ZCSigState)(currSign) | (tempEv);

32、 if (currEv & SL_ZCS_EVENT_ALL_DN) zcEvent = FALLING_ZCEVENT; else if (currEv & SL_ZCS_EVENT_ALL_UP) zcEvent = RISING_ZCEVENT; else zcEvent = NO_ZCEVENT; return zcEvent; /* rt_ZCFcn */* * File trailer for generated code. * * EOF */* get prevZcEvent and prevZcSign from prevZc */ slZcEventType

33、 prevEv = (slZcEventType)(uint8_T)(*prevZc) >> 2); slZcSignalSignType prevSign = (slZcSignalSignType)(uint8_T)(*prevZc) & 0x03); /* get current zcSignal sign from current zcSignal value */ slZcSignalSignType currSign = (slZcSignalSignType)(currValue) > 0.0 ? SL_ZCS_SIGN_POS : (currValue

34、) < 0.0 ? SL_ZCS_SIGN_NEG : SL_ZCS_SIGN_ZERO); /* get current zcEvent based on prev and current zcSignal value */ slZcEventType currEv = eventMatrixprevSigncurrSign; /* get slZcEventType from ZCDirection */ switch (zcDir) case ANY_ZERO_CROSSING: zcsDir = SL_ZCS_EVENT_ALL; break; case FALLING_ZERO

35、_CROSSING: zcsDir = SL_ZCS_EVENT_ALL_DN; break; case RISING_ZERO_CROSSING: zcsDir = SL_ZCS_EVENT_ALL_UP; break; default: zcsDir = SL_ZCS_EVENT_NUL; break; /*had event, check if double zc happend remove double detection. */ if (slZcHadEvent(currEv, zcsDir) currEv = (slZcEventType)(slZcUnAliasEvents(p

36、revEv, currEv); /* Model step function */void untitled_step(void) real_T rtb_PulseGenerator; ZCEventType zcEvent; /* DiscretePulseGenerator: '<Root>/Pulse Generator' */ rtb_PulseGenerator = (untitled_DW.clockTickCounter < untitled_P.PulseGenerator_Duty) && (untitled_DW.clock

37、TickCounter >= 0L) ? untitled_P.PulseGenerator_Amp : 0.0; if (untitled_DW.clockTickCounter >= untitled_P.PulseGenerator_Period - 1.0) untitled_DW.clockTickCounter = 0L; else untitled_DW.clockTickCounter+; /* End of DiscretePulseGenerator: '<Root>/Pulse Generator' */ /* Chart: 

38、9;<Root>/Chart1' incorporates: * TriggerPort: '<S1>/delay' */ zcEvent = rt_ZCFcn(FALLING_ZERO_CROSSING,&untitled_PrevZCX.Chart1_Trig_ZCE, (rtb_PulseGenerator); if (zcEvent != NO_ZCEVENT) /* Gateway: Chart1 */ /* Event: '<S1>:29' */ /* During: Chart1 */ if (u

39、ntitled_DW.is_active_c2_untitled = 0U) /* Entry: Chart1 */ untitled_DW.is_active_c2_untitled = 1U; /* Inport: '<Root>/In2' incorporates: * Inport: '<Root>/In1'*/ /* Entry Internal: Chart1 */ if (untitled_U.In2 = 1) && (untitled_U.In1 = 1) /* Transition: '<S

40、1>:20' */ untitled_DW.is_c2_untitled = untitled_IN_A; /* Outport: '<Root>/Out1' */ /* Entry 'A': '<S1>:2' */ untitled_Y.Out1 = 1U; /* Outport: '<Root>/Out2' */* * File: untitled.c * * Code generated for Simulink model 'untitled'. * * M

41、odel version : 1.6 * Simulink Coder version : 8.5 (R2013b) 08-Aug-2013 * C/C+ source code generated on : Sun Oct 26 23:45:21 2014 * * Target selection: ert.tlc * Embedded hardware selection: Intel->8051 Compatible * Code generation objectives: Unspecified * Validation result: Not run */#include &

42、quot;untitled.h"#include "untitled_private.h"/* Named constants for Chart: '<Root>/Chart1' */#define untitled_IN_A (uint8_T)1U)#define untitled_IN_A1 (uint8_T)2U)#define untitled_IN_A2 (uint8_T)3U)#define untitled_IN_A3 (uint8_T)4U)#define untitled_IN_A4 (uint8_T)1U)#def

43、ine untitled_IN_A5 (uint8_T)2U)#define untitled_IN_NO_ACTIVE_CHILD (uint8_T)0U)/* Block states (auto storage) */DW_untitled_T untitled_DW;/* Previous zero-crossings (trigger) states */PrevZCX_untitled_T untitled_PrevZCX;/* External inputs (root inport signals with auto storage) */ExtU_untitled_T unt

44、itled_U;/* External outputs (root outports fed by signals with auto storage) */ExtY_untitled_T untitled_Y;/* Real-time model */RT_MODEL_untitled_T untitled_M_;RT_MODEL_untitled_T *const untitled_M = &untitled_M_; untitled_Y.Out2 = 1U; else if (untitled_U.In2 = 1) && (untitled_U.In1 = 0)

45、/* Transition: '<S1>:21' */ untitled_DW.is_c2_untitled = untitled_IN_A2; /* Outport: '<Root>/Out2' */ /* Entry 'A2': '<S1>:4' */ untitled_Y.Out2 = 0U; else if (untitled_U.In2 = 0) && (untitled_U.In1 = 0) /* Transition: '<S1>:22'

46、 */ untitled_DW.is_c2_untitled = untitled_IN_A3; /* Outport: '<Root>/Out1' */ /* Entry 'A3': '<S1>:5' */ untitled_Y.Out1 = 0U; /* Outport: '<Root>/Out2' */ untitled_Y.Out2 = 0U; else if (untitled_U.In2 = 0) && (untitled_U.In1 = 1) /* Transiti

47、on: '<S1>:23' */ untitled_DW.is_c2_untitled = untitled_IN_A1; /* Outport: '<Root>/Out1' */ /* Entry 'A1': '<S1>:3' */ untitled_Y.Out1 = 0U; /* Entry Internal 'A1': '<S1>:3' */ /* Transition: '<S1>:18' */ untitled_D

48、W.is_A1 = untitled_IN_A4; /* Outport: '<Root>/Out2' */ /* Entry 'A4': '<S1>:13' */ untitled_Y.Out2 = 0U; else switch (untitled_DW.is_c2_untitled) case untitled_IN_A: /* Inport: '<Root>/In2' incorporates: * Inport: '<Root>/In1' */ /* Dur

49、ing 'A': '<S1>:2' */ if (untitled_U.In2 = 1) && (untitled_U.In1 = 0) /* Transition: '<S1>:8' */ untitled_DW.is_c2_untitled = untitled_IN_A2; /* Outport: '<Root>/Out2' */ /* Entry 'A2': '<S1>:4' */ untitled_Y.Out2 = 0U; b

50、reak; case untitled_IN_A1: /* Inport: '<Root>/In2' incorporates: * Inport: '<Root>/In1' */ /* During 'A1': '<S1>:3' */ if (untitled_U.In2 = 0) && (untitled_U.In1 = 0) /* Transition: '<S1>:11' */ /* Exit Internal 'A1': &#

51、39;<S1>:3' */ untitled_DW.is_A1 = untitled_IN_NO_ACTIVE_CHILD; untitled_DW.is_c2_untitled = untitled_IN_A3; /* Outport: '<Root>/Out1' */ /* Entry 'A3': '<S1>:5' */ untitled_Y.Out1 = 0U; /* Outport: '<Root>/Out2' */ untitled_Y.Out2 = 0U; els

52、e if (untitled_DW.is_A1 = untitled_IN_A4) /* During 'A4': '<S1>:13' */ /* Transition: '<S1>:16' */ untitled_DW.is_A1 = untitled_IN_A5; /* Outport: '<Root>/Out2' */ /* Entry 'A5': '<S1>:14' */ untitled_Y.Out2 = 1U; else /* During

53、 'A5': '<S1>:14' */ /* Transition: '<S1>:17' */ untitled_DW.is_A1 = untitled_IN_A4; /* Outport: '<Root>/Out2' */ /* Entry 'A4': '<S1>:13' */ untitled_Y.Out2 = 0U; break; case untitled_IN_A2: /* Inport: '<Root>/In2' incorporates: * Inport: '<Root>/In1' */ /* During 'A2': '<S1>:4' */ if (untitled_U.In2 = 0) && (untitled_U.In1 = 1) /* Transition: '<S1>:12' */ untitled_DW.is_c2_untitled = untitled_IN_A1; /*

温馨提示

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

评论

0/150

提交评论