TO自动测试分选机软件研发与人机界面设计_第1页
TO自动测试分选机软件研发与人机界面设计_第2页
TO自动测试分选机软件研发与人机界面设计_第3页
TO自动测试分选机软件研发与人机界面设计_第4页
TO自动测试分选机软件研发与人机界面设计_第5页
已阅读5页,还剩73页未读 继续免费阅读

下载本文档

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

文档简介

分类号密级UDC学位论文TO220自动测试分选机软件研发与人机界面设计(题名和副题名)易华波(作者姓名)指导教师姓名康波副教授电子科技大学成都 胡泽高级工程师深圳深爱半导体有限公司深圳(职务、职称、学位、单位名称及地址)申请专业学位级别硕士专业学位类别工程硕士工程领域名称软件工程提交论文日期2010.08论文答辩日期2010.12学位授予单位和日期电子科技大学答辩委员会主席评阅人2010年8月日注1:注明《国际十进分类法UDC》的类号摘要全文总结TO220自动测试分选机测试模块设计与实现设计思路三极管经过导轨,由气缸和传感器配合动作,检测落入测试工位,分选机对测试系统发出测试请求信号,等待测试系统测试,测试结束反馈分类信号,气缸再动作,三极管落入下一工位测试。Clear:对站板缓冲器清零Enable:使能Start:测试请求信号设计原理图测试模块函数定义#pragmaonceclassCActTester{public: CActTester(unsignedshortadd_np,unsignedshortadd_control, unsignedshortadd_result); ~CActTester(void); structCONTROL{ //测试工位控制信号定义 boolStart:1; //开始测试 boolEnable:1; //使能 boolClear:1; //清零 char_null1:1; boolEnd:1; //测试结束 char_null2:3; }control,incontrol; //联机测试控制信号 structNP{ //信号电平结构体 boolReq:1; //开始测试信号 boolBin:1; //分选信号 boolEnd:1; //测试结束信号 char_null:5; }np; inttime; //时间 intrun; //运动状态 interr; //错误状态 unsignedcharresult; //测试结果 CStringerrstr; //错误信息protected: unsignedshort_control; //控制字地址 unsignedshort_np; //电平定义字地址 unsignedshort_result; //测试结果地址 bool_InputControl(void); //读入控制信号 bool_InputResult(void); //读入测试结果 bool_OutputControl(void); //输出控制信号 bool_OutputNP(void); //输出电平定义public: boolDisable(void); //禁用测试系统 boolReset(void); //复位 boolInitialize(void); //初始化 boolStartUp(void); //开始测试 boolReadResult(void); //读取结果 boolEnd(void); //结束 voidErrCheck(void); //错误检测 intRun(void); //运行控制};externboolinput(unsignedshort,PDWORD,BYTE); //端口输入函数externbooloutput(unsignedshort,PDWORD,BYTE);//端口输出函数测试模块程序设计 测试模块读入控制信号程序设计boolCActTester::_InputControl(void){ if(input(_control,(PDWORD)&incontrol,1)){ //正常读入控制字 returntrue; } err=0xee; //异常 returnfalse;}测试模块读入测试结果程序设计boolCActTester::_InputResult(void){ if(input(_result,(PDWORD)&result,1)){ //正常读入测试结果 returntrue; } err=0xee; //异常 returnfalse;}测试模块输出控制信号程序设计boolCActTester::_OutputControl(void){ if(output(_control,(PDWORD)&control,1)){ //正常输出控制字 returntrue; } err=0xee; //异常 returnfalse;}测试模块输出电平定义程序设计boolCActTester::_OutputNP(void){ if(output(_np,(PDWORD)&np,1)){ //正常输出电平定义 returntrue; } err=0xee; //异常 returnfalse;}测试模块禁用测试系统程序设计boolCActTester::Disable(void){ if(CActTester::Reset()){ //测试系统正常复位 time=0; //计时清0 run=0; //停止 returntrue; //正常禁用 } returnfalse; //有异常}测试模块复位程序设计boolCActTester::Reset(void){ control.Clear=0; //关闭清0 control.Enable=0; //不使能 control.Start=0; //未开始 if(CActTester::_OutputControl()){ //正常输出控制字 returntrue; } returnfalse; //异常}测试模块初始化程序设计boolCActTester::Initialize(void){ if(CActTester::_OutputNP()){ //输出电平定义 control.Clear=1; //清0,上升延 control.Enable=1; //使能 if(CActTester::_OutputControl()){ //输出控制字 returntrue; //操作正常 } } returnfalse; //异常}测试模块开始测试程序设计boolCActTester::StartUp(void){ control.Clear=0; //清0,下降延 control.Start=1; //开始,上升延 if(CActTester::_OutputControl()){ //输出控制字 returntrue; //操作正常 } returnfalse; //异常}测试模块读取结果程序设计boolCActTester::ReadResult(void){ if(CActTester::_InputControl()){ //读入控制字 if(incontrol.End){ //测试结束 if(CActTester::_InputResult()){ //读入测试结果 returntrue; //操作正常 } } } returnfalse; //异常}测试模块结束程序设计boolCActTester::End(void){ if(CActTester::Reset()){ //复位测试系统 returntrue; //操作正常 } returnfalse; //异常}测试模块错误检测程序设计voidCActTester::ErrCheck(void){ switch(run) { case0: errstr=_T(""); break; case0xe1: errstr=_T("联机超时"); break; case0xee: errstr=_T("联机信号出错"); break; case0xef: default: errstr=_T("未知错误"); break; }}测试模块运行控制程序设计intCActTester::Run(void){ if(run!=0xff){ //非测试结束 time+=DELAY_LOOP; } if(time>=DELAY_TESTERROR){ //超时 CActTester::Disable(); err=0xe1; } switch(run) //根据当前状态进行指定操作 { case0: break; case1: //第1步,复位 time=0; if(CActTester::Reset()){ //正常复位 run=2; //进行初始化 } else{ err=0xee; } break; case2: //第2步,初始化 if(CActTester::Initialize()){ //正常初始化 run=3; //开始测试 } else{ err=0xee; } break; case3: //第3步,开始测试 if(CActTester::StartUp()){ //测试速开始 run=4; //读取结果 } else{ err=0xee; } break; case4: //第4步,读取结果 if(CActTester::ReadResult()){ //正常读取测试结果 run=5; //结束测试 return0xdd; //显示信息 } else{ err=0xee; } break; case5: //第5步,测试结束 if(CActTester::End()){ //正常结束测试 run=0xff; } else{ err=0xee; } break; case0xff: break; default: err=0xef; //未定义错误 break; } returnrun;}本章小结本章主要实现了自动测试分选机的测试功能程序设计,该模块主要要与测试系统配合,设计了读入控制信号,读入测试结果,输出控制信号,输出电平定义,禁用测试,测试模块复位、初始化、开始测试、读取结果,结束,错误检测、运行控制这一系列程序。TO220自动测试分选机分选模块设计与实现分选模块设计原理与思路分选模块设计思路分选电机转一圈1000步,总共25个料桶,每个料桶对应转40步。根据TS测试系统和JUNO测试系统读取的测试结果,根据分选程序得出目标料桶号,根据当前料桶号和目标料桶号计算出分选电机转距和转动方向。电机转动算法电机转动算法:1正转料桶数=(目标料桶号+25-当前料桶号)%25.2.若当前料桶号=目标料桶号,则电机保持不动.3.正转料桶数>12,则反转.电机正转步数=正转料桶数×40-缓冲步数电机反转步数=(25-正转料桶数)×40-缓冲步数电机步距数高字节=转动脉冲数/256电机步距数低字节=转动脉冲数%256注:缓冲步数=10,由于数据总线只有8位,电机步距数可能超过256,所以对电机步距数分高、低字节传输。分选模块设计原理图分选模块函数定义 structCODER{ // 写入 │ 读取 unsignedcharCode:5; //电机目标编码 │电机当前编码 boolPlace:1; //定位点 │定位点 boolRes:1; //复位(置为1) │是否已停止 boolStart:1; //置数(高电平脉冲) │落管状态 }incoder,outcoder; structCONTROL{ // 0 │1 boolEnable:1; //使能端 禁用│使能 boolDir:1; //正反转 正转│反转 boolLock:1; //锁定 松开│锁定 boolClearDown:1; //清除落管状态(高电平脉冲) boolEnableDown:1; //落管感应使能 禁用│使能 char_null:3; }control;分选模块程序设计分选模块读取电机当前位置程序设计boolCActMotor::LoadCurrent(void){ if(CActMotor::_InputCoder()){ //读入编码盘状态 if(incoder.Place){ //在一个位置 motocur=incoder.Code; //读入当前位置 returntrue; //状态正常 } } else{ motocur=0; //读取当前位置出错 err=0xe1; //有错误 } returnfalse;}分选模块电机控制相关计算程序设计boolCActMotor::Calculate(void){ intt; t=(motodes+_boxnum-motocur)%_boxnum; //正转所需步数 if(t==0){ //目标与当前位置一致,无需转动 control.Dir=0; pulse=0; } elseif(2*t>_boxnum){ //正转超过半圈,反转 control.Dir=1; //反转 pulse=int((_boxnum-t)*_step)-_buffer; //脉冲数计算 } else{ control.Dir=0; //正转 pulse=int(t*_step)-_buffer; //脉冲数计算 } pulh=pulse>>8; //脉冲数高8位 pull=pulse&0x00ff; //脉冲数低8位 returntrue;}分选模块禁用电机(松开电机)程序设计boolCActMotor::Disable(void){ control.Enable=0; //电机使能关闭 control.Dir=0; //正转 control.Lock=0; //电机松开 control.ClearDown=0; //清0信号低电平 control.EnableDown=0; //落管使能关闭 downen=false; //禁止落管 if(CActMotor::_OutputControl()){ returntrue; //正常关闭电机 } returnfalse; //异常}分选模块锁定电机程序设计boolCActMotor::LockUp(void){ control.Enable=0; //关闭电机转动使能 control.Lock=1; //电机锁定 if(CActMotor::_OutputControl()){ returntrue; //正常锁定电机 } returnfalse; //异常}分选模块设置目标位置程序设计boolCActMotor::SetDestination(void){ outcoder.Code=motodes; //电机目标位置 outcoder.Place=0; //电机定位点 outcoder.Res=0; //电机非复位状态 outcoder.Start=0; //电机未启动 if(CActMotor::_OutputCoder()){ Sleep(1); outcoder.Start=1; //电机启动,Start信号上升沿 if(CActMotor::_OutputCoder()){ returntrue; } } returnfalse; //异常}分选模块电机初始化程序设计boolCActMotor::Initialize(void){ if(run!=MOTO_INIT){ //状态异常 err=0xe1; returnfalse; //异常 } control.EnableDown=0; //关闭落管使能 if(!CActMotor::LockUp()){ //锁住电机 returnfalse; //异常 } downen=false; // 禁止落管 if(!CActMotor::LoadCurrent()){ //读取当前位置 returnfalse; //异常 } if(!CActMotor::Calculate()){ //计算相关数据 returnfalse; //异常 } if((pulse==0)&&(incoder.Place==0)){ //当前位置与目标位相同,电机转动完成 run=MOTO_END; } elseif(incoder.Place==0){ //当前位置与目标位置不同,且已正常读取位置 if(!CActMotor::SetDestination()){ //设置电机目标位置 returnfalse; //异常 } else{ run=MOTO_START; //进入下一步动作 } } else{ //电机不在一个位置 run=MOTO_REINIT; //重初始化 } returntrue; //正常}分选模块启动电机程序设计boolCActMotor::StartUp(void){ if(run!=MOTO_START){ //状态异常 err=0xe1; returnfalse; } if(!CActMotor::_OutputPulse()){ //输出脉冲数 returnfalse; } outcoder.Start=0; if(!CActMotor::_OutputCoder()){ //输出编码盘 returnfalse; } control.Enable=1; //电机转动使能 if(CActMotor::_OutputControl()){ //启动电机 run=MOTO_ENDCHECK; //进入下一步 returntrue; } returnfalse; //异常}分选模块检测电机是否已转到位程序设计boolCActMotor::EndCheck(void){ if(run!=MOTO_ENDCHECK){ //状态异常 err=0xe1; returnfalse; } if(CActMotor::_InputCoder()){ if(incoder.Res==0&&incoder.Code==motodes){ //已转到位 run=MOTO_END; motoretry=0; //电机重试计数清0 CActMotor::DownClear(); //锁住电机,并清除落管 } returntrue; } returnfalse; //异常}分选模块电机重新初始化程序设计boolCActMotor::ReInit(void){ if(run!=MOTO_REINIT){ //状态异常 err=0xe1; returnfalse; } outcoder.Res=1; //置RES位为1 outcoder.Start=0; if(CActMotor::_OutputCoder()){ Sleep(1); outcoder.Start=1; if(CActMotor::_OutputCoder()){ //Start信号上升沿,电机启动 control.EnableDown=0; //落管使能关闭 downen=false; //禁止落管 if(CActMotor::LockUp()){ //锁定电机 run=MOTO_RESTART; //进入下一步 returntrue; } } } returnfalse; //异常}分选模块电机重启动程序设计boolCActMotor::ReStart(void){ if(run!=MOTO_RESTART){ //状态异常 err=0xe1; returnfalse; //异常 } pulh=0; //设置脉冲数为0 pull=0; run=MOTO_START; //启动电机 if(CActMotor::StartUp()){ run=MOTO_FINDPLACE; //进入下一步 returntrue; } returnfalse;}分选模块寻找定位点程序设计boolCActMotor::FindPlace(void){ if(run!=MOTO_FINDPLACE){ //状态异常 err=0xe1; returnfalse; } if(CActMotor::_InputCoder()){ //读入编码盘状态 if(incoder.Place==0){ //在一个定位点 run=MOTO_INIT; //电机初始化 returntrue; } } returnfalse; //异常或未找到定位点}分选模块清除落管并锁定电机程序设计boolCActMotor::DownClear(void){ if(run!=MOTO_END){ err=0xe1; returnfalse; } control.ClearDown=1; //清0,Clear信号上升沿 control.EnableDown=0; //关闭落管使能 if(CActMotor::LockUp()){ Sleep(1); control.ClearDown=0; //清0,Clear信号下降沿 control.EnableDown=1; //打开落管使能 if(CActMotor::LockUp()){ //锁定电机 downok=false; //未落管 downen=true; //允许落管 time_down=0; //落管计时清0 returntrue; } } returnfalse; //异常}分选模块落管检测程序设计boolCActMotor::DownCheck(void){ if(downen&&!downok){ //允许落管且管子未落下 time_down+=DELAY_LOOP; //计时增加一个周期 if(CActMotor::_InputCoder()){ //读入编码盘状态 if(incoder.Start){ //已落管 downok=true; //正常落管 returntrue; //已完成落管 } } } if(time_down>=3000){ //落管超时 err=0xed; } returnfalse; //异常}分选模块错误检测程序设计voidCActMotor::ErrorCheck(void){ switch(err) { case0: errstr=_T(""); break; case0xe1: errstr=_T("电机控制信号出错."); break; case0xe2: errstr=_T("电机控制超时."); break; case0xed: errstr.Format(_T("三极管未落入第%d档."),motodes); break; default: errstr=_T(""); break; }}分选模块运行控制程序设计intCActMotor::Run(void){ //MOTO_INIT:电机初始化 MOTO_START:启动电机 MOTO_ENDCHECK:检测电机是否已转到位 //MOTO_REINIT:重新初始化 MOTO_RESTART:重启动 MOTO_FINDPLACE:寻找定位点 //MOTO_END:电机转动结束 //0xe1:电机控制异常 0xe2:电机动作超时 0xed:落管超时错误 if(run!=MOTO_END){ //电机转动未完成,计时增加 time+=DELAY_LOOP; } if(err==0xe1){ //电机控制异常 CActMotor::Disable(); //禁用电机 } elseif(time>=DELAY_MOTOERROR){ //电机动作超时 CActMotor::Disable(); //禁用电机 err=0xe2; } elseif(time>=DELAY_MOTOANCHORERROR){ //电机动作超过单次时间 ++motoretry; //重试计数增加 if(motoretry<4){ //重试次数未达到3次 run=MOTO_REINIT; //重试 CActMotor::ReInit(); //重新初始化电机 } } if(err!=0){ CActMotor::Disable(); run=0; } switch(run) { case0: break; caseMOTO_INIT: time=0; CActMotor::Initialize(); break; caseMOTO_START: CActMotor::StartUp(); caseMOTO_ENDCHECK: CActMotor::EndCheck(); break; caseMOTO_REINIT: CActMotor::ReInit(); break; caseMOTO_RESTART: CActMotor::ReStart(); break; caseMOTO_FINDPLACE: CActMotor::FindPlace(); break; caseMOTO_END: if(CActMotor::DownCheck()){ return0xdd; } break; case0xed: break; default: err=0xe1; break; } returnrun;}本章小结本章主要实现了三极管分选功能。该模块主要控制分选电机转向和步距,以及检测落管。设计了读取电机当前位置,电机控制相关计算,禁用电机(松开电机),锁定电机,设置目标位置,电机初始化,启动电机,检测电机是否已转到位,电机重新初始化,电机重启动,寻找定位点,清除落管并锁定电机,落管检测,错误检测,运行控制这一系列程序。TO220自动测试分选机人机界面模块设计与实现人机界面模块设计原理与思路人机界面模块包括三大部分:系统测试运行界面、系统分选程序界面和系统功能设置界面。系统测试运行界面系统测试运行主界面实现功能,如图7-1所示:图7-1,系统测试运行主界面界面功能介绍:显示24个料桶的当前数量和显示当前总数。显示各主要传感器状态和气缸状态。显示当前调用分选程序信息。显示A、B、C三个工位测试结果、当前系统信息和报警出错信息提示。按钮设置:运行、停止、复位、装料启动、整形夹启动、退出、记数清零。系统分选程序界面系统分选程序界面实现功能分析,如图7-2所示:图7-2,分选程序编辑界面测试工位数量选择:单工位、双工位、三工位,分别A对应常规工位,B对应开关时间工位,C对应热阻工位。一般选择A和B双工位,因为JUNO测试系统常规测试中可以带热阻测试功能。分选程序的新建、打开、保存、另存为。根据常规和开关时间的搭配组合,对应箱号即为所选常规分类和开关时间分类的组合。总共25个箱,可以有25个分类选择。其中,默认箱是排料复测箱。根据逻辑关系编辑分选程序并可实现加密/解密功能,防止意外更改。图7-3,分选程序解锁功能介绍:权限定义:操作员调用权限;工艺员修改权限;设备维护员修改权限。为了防止操作员意外修改,操作员在打开已编写好的分选程序时,分选程序编辑处于锁定状态,只能调用分选程序而不能修改程序。此时点击“加密/解密”,则是分选程序解锁,如图7-3所示,需要输入旧密码,才能进入分选程序修改的界面。工艺员和设备维护员编写和修改分选程序时,输入旧密码,即可进入分选程序编辑状态,如图7-4所示,此时点击“加密/解密”,默认则是更改密码。输入旧密码和新密码实现更改密码功能。图7-4,分选程序更改密码4)在更改密码对话框中,如图7-5所示,此时点击“删除密码”,则是输入旧密码即可删除密码。图7-5,分选程序删除密码5)删除密码后,分选程序处于解密状态。此时点击“加密/解密”,则是设置新密码,如图7-6所示,输入新密码即可加密。图7-6,分选程序加密系统功能设置程序界面系统功能设置界面中箱满数量设置,如图7-7所示:图7-7,箱满数量设置功能介绍:24个料桶的箱满数量设定,根据三极管的大小,箱满数量相应变化。一般TO220箱满设定数为500个,TO126箱满设定数为1000个,TO92箱满设定数为3000个。系统功能设置界面中联机信号设置,如图7-8所示:图7-8,联机信号设置功能介绍:联机信号设置测试请求信号、测试结束信号、测试分类信号。根据测试系统和自动分选机的信号,联机信号需要匹配,才能使自动分选机得到对应的测试系统反馈信号结果。系统功能设置界面中数量清零设置,如图7-9所示:图7-9数量清零设置功能介绍:点击每个箱号后的“清零”按钮可以分别针对当前24个料桶数量单独清零,点击总数后的“清零”按钮对当前总数单独清零,点击“所有箱清零”可以一次性对当前24个料桶数量全部清零。部分程序设计: //TODO:在此添加额外的初始化 if((file.encrypt&0x03)==0x01){ //已加密,已解锁,默认为要更改密码 file.encrypt=0x05; } CDlgEditerPassword::InitDisplay(); returnTRUE;//returnTRUEunlessyousetthefocustoacontrol //异常:OCX属性页应返回FALSE}voidCDlgEditerPassword::InitDisplay(void){ m_oldpw=""; m_newpw=""; m_checkpw=""; switch(file.encrypt&0x0D) { case0: //未加密,要加密 m_Edit_Old.EnableWindow(false); m_Edit_New.EnableWindow(true); m_Edit_Check.EnableWindow(true); m_delpw.ShowWindow(SW_HIDE); m_delpw.SetCheck(BST_UNCHECKED); m_changepw.ShowWindow(SW_HIDE); m_changepw.SetCheck(BST_UNCHECKED); SetDlgItemText(IDOK,_T("加密")); SetWindowText(_T("加密")); break; case1: //已加密,要解锁 m_Edit_Old.EnableWindow(true); m_Edit_New.EnableWindow(false); m_Edit_Check.EnableWindow(false); m_delpw.ShowWindow(SW_SHOW); m_delpw.SetCheck(BST_UNCHECKED); m_changepw.ShowWindow(SW_SHOW); m_changepw.SetCheck(BST_UNCHECKED); SetDlgItemText(IDOK,_T("解锁")); SetWindowText(_T("解锁")); break; case5: //已加密,已解锁,要更改密码 m_Edit_Old.EnableWindow(true); m_Edit_New.EnableWindow(true); m_Edit_Check.EnableWindow(true); m_delpw.ShowWindow(SW_SHOW); m_delpw.SetCheck(BST_UNCHECKED); m_changepw.ShowWindow(SW_SHOW); m_changepw.SetCheck(BST_CHECKED); SetDlgItemText(IDOK,_T("更改密码")); SetWindowText(_T("更改密码")); break; case9: //已加密,已解锁,要删除密码 m_Edit_Old.EnableWindow(true); m_Edit_New.EnableWindow(false); m_Edit_Check.EnableWindow(false); m_delpw.ShowWindow(SW_SHOW); m_delpw.SetCheck(BST_CHECKED); m_changepw.ShowWindow(SW_SHOW); m_changepw.SetCheck(BST_UNCHECKED); SetDlgItemText(IDOK,_T("删除密码")); SetWindowText(_T("删除密码")); break; default: m_Edit_Old.EnableWindow(false); m_Edit_New.EnableWindow(false); m_Edit_Check.EnableWindow(false); m_delpw.EnableWindow(false); m_changepw.EnableWindow(false); GetDlgItem(IDOK)->EnableWindow(false); SetWindowText(_T("密码状态未知,请联系相关人员")); }}本章小结本章主要介绍了TO220自动测试分选机的人机界面设计,通过系统测试运行界面、系统分选程序界面和系统功能设置界面三个界面设定,实现对分选机操作与运行。全文总结对本系统已完成部分的说明该系统平台的设计主要采用了提出问题、分析问题、解决问题的理论基础、解决问题的方法,具体问题的设计开发和软件实现部分进行功能设计的模式。本系统主要从系统软件控制方面运用VISUALC++6.0软件自行研发设计了自动测试分选机的送料模块、测试模块、分选模块以及人机界面模块这四大模块。通过实时控制,对每个模块的传感器、气缸以及电机的状态进行检测,判断各个模块现在所处的状态,进而系统控制各个模块的下一个运行状态。存在问题的说明与发展方向和展望由于时间有限,原本计划在人机界面模块中设计出自动测试分选机的自检模块,可对设备的各个模块的传感器感应是否正常、气缸动作是否正常,测试电机和分选电机转动是否正常,以及配合编码盘进行电机寻位是否转到位,与测试系统的联机状态,振盘和信号灯是否正常一一都可以进行自检,方便

温馨提示

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

评论

0/150

提交评论