计算机毕业设计----烟叶烤房温湿度监控系统.doc_第1页
计算机毕业设计----烟叶烤房温湿度监控系统.doc_第2页
计算机毕业设计----烟叶烤房温湿度监控系统.doc_第3页
计算机毕业设计----烟叶烤房温湿度监控系统.doc_第4页
计算机毕业设计----烟叶烤房温湿度监控系统.doc_第5页
已阅读5页,还剩32页未读 继续免费阅读

下载本文档

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

文档简介

计算机毕业设计-烟叶烤房温湿度监控系统摘要 . I Abstract .II 1 引言. - 1 - 2 系统概述 . - 2 - 3 系统的需求分析 . - 3 - 3.1 系统开发环境及工具 . - 3 - 3.2 系统需求分析. - 3 - 3.2.1模块分析 . - 3 - 3.2.2系统模块结构图 . - 3 - 3.2.3功能流程图 . - 4 - 3.3 数据库需求分析 . - 4 - 4 系统的设计 . - 15 - 4.1总体功能设计. - 15 - 4.2系统的功能模块说明 . - 15 - 4.3系统的模块结构 . - 15 - 4.4 数据库设计 . - 16 - 5系统的实现 . - 21 - 5.1 系统界面 . - 21 - 5.2 通信 . - 22 - 5.3 设备管理 . - 26 - 5.4 数据显示记录. - 27 - 5.5 数据报表显示. - 28 - 1 6 结束语 . - 31 - 参考文献 . - 32 - 致谢. - 33 - 附录. - 34 - 2 本文介绍了烟叶烤房温湿度监控系统的设计。本系统采用通讯手段将不同地点的烤房现场温湿度控制仪的信息传送到监控中心,并自动显示、存储、报警;同时将监控中心发出的控制信息实时传送到不同地点的烤房现场温湿度控制仪上,实现对集群烤房监测与控制;实现烟叶烘烤的专业化,标准化。 关键词:温湿度;监控;通讯 I Abstract In this paper, tobacco barn temperature and humidity monitoring system design. Means of communication of the system will be used in different locations at the scene of the barn temperature and humidity controller of the information sent to the monitoring center and automatically display, storage, alarm; issued at the same time, the control center to monitor real-time transmission of information to different locations at the scene of the barn temperature and humidity controller, the realization of the barn cluster monitoring and control; to achieve professional baking tobacco leaves, standardization. Key words: Temperature and humidity; monitoring; communicationsII 烟叶生产是农业经济的重要组成部分之一,烘烤是烟叶生产的重要环节。烟叶烘烤时间要求集中,技术含量要求高,烟叶质量直接决定着烟农收益。传统的烟叶烘烤工艺过程中,由于几十个小时的烘烤过程完全要由人工监控,所以烟农的劳动强度很大,且烤房的温度控制不精确,使成烟中优质率不够高。因此,实行专业化烘烤对于提高烟叶烘烤水平、促进烟叶生产持续健康发展具有重要作用。 专业化烘烤能够减少烟农生产环节,降低烘烤设施资金投入,提高烟叶烘烤质量,是实现传统烟叶生产向现代烟草农业转变的必然趋势。专业化烘烤主要有以下优势: 首先,实行专业化烘烤有利于降低烟农生产成本。实行专业化烘烤,一方面可以减少烟农烤房建设投资费用,降低烟农建造烤房的生产投入;另一方面可以大大减少烘烤人员,降低烘烤成本,提高烘烤效率。 其次,实行专业化烘烤有利于提高烘烤技术水平。实行专业化烘烤,烘烤人员和场所相对固定,从而为烘烤技术指导提供了方便,为先进烘烤方式的推广和应用创造了条件。此外,实行专业化烘烤可以提高烘烤安全性,优化烘烤资源配置,从而大幅度提高烘烤质量。 再次,实行专业化烘烤有利于推广机械化和自动化作业。专业化烘烤工作量大,机械化和自动化水平要求较高,从而便于机械化和自动化烘烤设备的研发、推广和应用。因此,专业化烘烤对于提高烟叶生产机械化和自动化生产水平,促进烟叶生产标准化具有重要作用。 为解决上述问题,根据烟叶烘烤工业中温度要求,利用模糊控制技术,开发出基于单片机的烟叶烤房温湿度控制仪,使烤房内的温、湿度按照烟叶最佳生化控制曲线变化,从而提高了烤房内温湿度控制精度及烤烟质量。 基于上述情况,开发了烟叶烤房温湿度监控系统。 - 1 - 烟叶烤房温湿度监控系统是为了解决传统烟叶烘烤工艺过程中的若干重要问题而设计的。烟叶烘烤是烟叶生产的重要环节。烟叶烘烤时间要求集中,技术含量要求高,烟叶质量直接决定着烟农收益。传统的烟叶烘烤工艺过程中,由于几十个小时的烘烤过程完全要由人工监控,所以烟农的劳动强度很大,且烤房的温度控制不精确,使成烟中优质率不够高。因此,实行专业化烘烤对于提高烟叶烘烤水平、促进烟叶生产持续健康发展具有重要作用。 系统采用通讯手段将不同地点的烤房现场温湿度控制仪的信息传送到监控中心,并自动显示、存储、报警;同时将监控中心发出的控制信息实时传送到不同地点的烤房现场温湿度控制仪上,实现对集群烤房监测与控制;实现烟叶烘烤的专业化,标准化。 - 2 - 开发环境:Windows 运行环境:Windows 数据库:SQL Server 2000 开发工具:Eclips、JDK 1.6、Visio 2003 编程语言:Java 烟叶烤房温湿度监控系统,可分为四个功能模块。 (1)通信模块 (2)设备管理模块 (3)数据显示记录模块 (4)数据报表显示模块 图3-1 系统模块结构图 - 3 - 图3-2 功能流程图 根据系统的功能需求,数据库设计时需要设计四张表:1. 主控仪表2. 主控仪状态表3. 设定表 4. 状态设定表。 主控仪表:烤房号、设备号、设定干球温度、设定湿球温度、实际干球温度、实际湿球温度、中间目标干球温度、中间目标湿球温度、设定阶段号、设定阶段时间、当前阶段时间、总烘烤时间、排湿门角度、当前系统时间。 - 4 - 主控仪状态表:设备号、运行模式、鼓风状态、循环风机状态、升降、电源状态、阶段状态、当前系统时间。 设定表:烤房号、设备号、设定干球温度、设定湿球温度、设定阶段号、设定阶段时间、当前系统时间。 状态设定表:设备号、运行模式、鼓风状态、循环风机状态、阶段模式、当前系统时间。 - 5 - 4 系统采用通讯手段将不同地点的烤房现场温湿度控制仪的信息传送到监控中心,并自动显示、存储;同时将监控中心发出的控制信息实时传送到不同地点的烤房现场温湿度控制仪上,实现对集群烤房监测与控制;实现烟叶烘烤的专业化,标准化。 系统总体包含以下功能: (1) 通信 (2) 设备管理 (3) 数据显示记录 (4) 数据报表显示 (1) 通信:在温湿度控制仪和PC机间采用串口方式进行通讯,实现数据信息的发送和接收。 (2) 设备管理:系统对处于不同时间段烤房进行分组, (3) 数据显示记录:系统采用通讯手段将不同地点的烤房现场温湿度控制仪的信息传送到监控中心,并自动显示,且将传送到监控中心的不同地点的烤房现场温湿度控制仪的信息存储到数据库。 (4) 数据报表显示:系统根据数据库中记录的温湿度数据,进行数据分析和总结,通过图形报表显示给查看者,使查看者对烟叶烘烤整个过程直观的了解,方便总结和归纳烘烤的经验。 根据实际情况,我们使用原型法(Rapid Prototyping)即以少量代价快速地构造一个可执行的软件系统模型。使用户和开发人员可以较快地确定需求,然后采用循环进化的开发方式,对系统模型作连续的精化,将系统需具备的性质逐渐增加上去,直到所有的性质全部满足。此时模块也发展成为最终产品了。 通过对用户需求的分析,我们可以分析出该系统大致可以分为几个模块:通信模块、设备管理模块、数据显示记录模块、数据报表显示模块。 - 15 - 图4-1系统功能模块图通过需求分析,可以确定本系统的ER图: 主控仪 烤房号 设备号 设定干球温度 设定湿球温度 实际干球温度 实际湿球温度 中间目标湿球温度 中间目标干球温度 设定阶段号 设定阶段时间 当前阶段时间 总烘烤时间 排湿门角度 当前系统时间 图4-2主控仪状态信息 - 16 - 主控仪运行状态 设备号 运行模式 鼓风状态 循环风机状态 升降 电源状态 当前系统时间 阶段状态 图4-3 主控仪运行状态 设定表 烤房号 设备号 设定干球湿度 设定湿球温度 设定阶段时间 设定阶段号 当前系统时间 图4-4 设定表 设定状态表 设备号 运行模式 鼓风状态 循环风机状态 当前系统时间 阶段模式 图4-5 状态设定表 - 17 - 系统数据库中包含四张表:1. 主控仪表2. 主控仪状态表3. 设定表 4. 状态设定表。 1设定表 图4-6 设定表 图4-7 设定表 2状态设定表 图4-8 状态设定表 - 18 - 图4-9 状态设定表 3.主控仪表 图4-10主控仪表 图4-11主控仪表 - 19 - 4.主控仪状态表 图4-12主控仪状态表 图4-13主控仪状态表 - 20 - 只需选择组 双击显示 大图 显示图表区 域,暂未实现 图5-1 系统界面图 - 21 - 系统的通讯协议 1、协议模式: 本协议采用主从式的通讯方式;上位机是主机,下位机时从机;每一次读写操作都包括:上位机发出读写命令,控制仪做出接收正确的响应。 另外,当主控仪出现掉电时,会主动给上位机发送掉电报警信号。 2、物理层参数: 数据波特率:9600 字节长度:8bits 停止位:1bits 校验:偶校验 3、通讯格式: 1)读写的数据格式如下: 格式1: SD LE LER SD DA SA FC DU FCS ED SD:(Start Delimiter)起始符,为68H(1byte) LE:(Length) 数据长度(1byte) LER:(Repeated Length)重复数据长度(1byte) SD:(Start Delimiter)起始位(1byte) SA:(Source Address)源地址,指该地址的指针,(4byte) DA:(Destination Address)目标地址,指该地址的指针,(4byte) FC:(Function)功能码(1byte) DU:(Data Unit)数据单元 FCU:(Frame Check Sequence)校验码(1byte) ED:(End Delimiter)结束分界符(16H) LE数据长度和重复数据长度为自SA至DU的数据长度, - 22 - FCS校验码为SA至DU数据的累加和校验,只取其中的末字节值。 2)主控仪接收到写命令,校验正确后,返回确认数据: 格式2: SD SA DA FC FCS ED 其中SD为起始符,为10H(1byte) SA为数据源地址(4byte) DA为目的地址(4byte) FC为功能码,与上位机写命令的功能码相同(1byte) FCS为SA+DA+FC的累加和的末字节(1byte) ED为结束符,取16H 主控仪接收到的校验码如果不对则不返回确认数据,上位机等待300ms后重发,三次不成功上位机报错。 上位机接收到得确认功能码如果不对,则重发,三次不对则报错。 3)如果主控仪收到上位机的读命令,则按照格式1返回状态信息 4)开始码(SD)分类: SD1:取值68H,上位机给主控仪发读写命令,或者查询主控仪版本号;主控仪返回状态信息,适用于格式1。 SD2:取值10H,主控仪确认写命令,或主控仪发送掉电报警,适用于格式2。 4、上位机发给主控仪的数据单元内容包括: - 23 - 序号 内容 字节数 备注 表5-1上位机发送内容0 设定干球温度的整数部分 1 1 设定干球温度的小数部分 1 2 设定湿球温度的整数部分 1 3 设定湿球温度的小数部分 1 4 设定阶段号 1 5 设定阶段时间小时 1 6 设定阶段时间分钟 1 7 运行状态 1 7.0 自动/手动 1:手动,0:自动 7.1 鼓风开/关 1:开,0:关 7.2 循环风机开/关 1:开,0:关 7.3 自设/专家 选择自设时,阶段号只能为16 1:专家,0:自设 5、功能码(FC)列表: 表5-2功能码例表 功能码 功能说明 备注 1AH 版本号查询 用于上位机查询版本号或主控仪返回版本号 2BH 参数读 用于上位机发送写命令 3CH 参数写 用于上位机发送读命令 4DH 掉电报警 用于主控仪发出掉电报警信息 5EH 数据返回 用于主控仪返回状态信息 6、主控仪发给上位机的数据单元内容包括 表5-3主控仪状态信息 - 24 - 序号 内容 字节数 备注 0 设定干球温度的整数部分 1 1 设定干球温度的小数部分 1 2 设定湿球温度的整数部分 1 3 设定湿球温度的小数部分 1 4 设定阶段号 1 5 设定阶段时间小时 1 6 设定阶段时间分钟 1 7 实际干球温度的整数部分 1 8 实际干球温度的小数部分 1 9 实际湿球温度的整数部分 1 10 实际湿球温度的小数部分 1 11 中间目标干球温度的整数部分 1 12 中间目标干球温度的小数部分 1 13 中间目标湿球温度的整数部分 1 14 中间目标湿球温度的小数部分 1 15 当前阶段小时 1 16 当前阶段分钟 1 17 总烘烤时间天数部分 1 18 总烘烤时间小时部分 1 19 总烘烤时间分钟部分 1 20 排湿门角度 1 21 运行状态 1 21.0 自动/手动 1:手动,0:自动 21.1 鼓风开/关 1:开,0:关 21.2 循环风机开/关 1:开,0:关 21.3 升温/保温 1:升温,0:保温 21.4 有电/掉电 1:有电,0:掉电 21.5 自设/专家 1:专家,0:自设 注:每台主控仪在出厂时就已经确定了一个ID号码,仪器开机时LCD上会显示本机的ID号;上位机ID号为FF FF FF FF主控仪的程序版本号在发送时拆分为5位ASC码,例如:主控仪的程序版本号为100.15,拆分后为:31 30 30 31 35 7、通讯实例: 1)上位机查询主控仪(ID号为00 00 00 01)版本号: 68 09 09 68 FF FF FF FF 00 00 00 01 1A 17 16 主控仪返回本机程序版本号(100.15): 68 0E 0E 68 00 00 00 01 FF FF FF FF 1A 31 30 30 31 35 0E 16 2)上位机给主控仪发送写命令:设置温度为35.5度,湿度为39.0度,阶段号为5,- 25 - 阶段时间为10:30,手动,鼓风机开,循环风机关 68 11 11 68 FF FF FF FF 00 00 00 01 2B 23 05 27 00 05 0A 1E 0B AF 16 主控仪返回确认信息: 10 00 00 00 01 FF FF FF FF 2B 28 16 3)上位机发读取数据命令 68 09 09 68 FF FF FF FF 00 00 00 01 3C 39 16 主控仪返回当前状态的各种参数(参数如参考表5.1) 68 1F 1F 68 00 00 00 01 FF FF FF FF 5E 1F 00 1E 00 01 04 00 1D 06 1C 05 1D 0F 1C 03 38 00 00 04 00 2E 81 16 4)下位机发送掉电报警 10 00 00 00 01 FF FF FF FF 4D 28 16 图5-2 设备管理图 - 26 - 图5-3 数据显示图 图5-4 数据显示图 - 27 - 通过对记录的温湿度数据进行分析,生成具体的图表,提供给查看者直观的总体的整个烘烤过程中温湿度的走向图,更容易总结烘烤经验。 图5-5 报表曲线图 - 28 - 通过这几个月的学习和实践,在老师的细心指导和严格要求下,加上自己的努力,基本完成了的系统设计和论文。这次实践,不仅使我的学习、实践能力得到提高,而且对我的解决问题的思维方式也有了很大的帮助。本次毕业设计基本完成系统的需求分析和功能设计,一部分功能的实现还有待继续完善,一些未接触的领域和技术,还需要继续深入了解和学习。对于通讯协议这方面的知识相对较薄弱,需要进一步学习。通过这次毕业设计,为我未来的学习和工作的提供了宝贵的经验。 - 31 - 1张峻颖,唐新南.烟叶烤房温湿度模糊控制系统的设计.农机化研究2008年08期1-6 2王胜雷,陈顺辉,吴祖仁等. 烤烟烘烤测控系统的设计与实现.农机化研究.2007年第04期:1-5 3宁正元,林晓宇,赖贤伟 编著Java程序设计南京:东南大学出版社,2007:218-252 4邵丽萍,邵光亚,张后扬 编著Java语言程序设计北京:清华大学出版社,2004:161-205 5(美)埃克尔 著,陈昊鹏 译.Java编程思想.北京:机械工业出版社.2007:256-312 6孙卫琴 编著.Java面向对象编程.北京:电子工业出版社.2006:37-56,173-239 7刘亚宾等 编著.精通EclipseJava技术大系.北京:电子工业出版社.2005:35-68 8周竞涛 主编.Eclipse完全手册.北京:电子工业出版社.2006:84-151 9虞益诚 主编.SQL Server 2000数据库应用技术.北京:中国铁道出版社.2006:84-103 10朱如龙 主编.SQL Server数据库应用系统开发技术.北京机械工业出版社.2006:90-114 - 32 - 在完成本设计说明书的过程中,我得到了张秀萍导师的细心指导,她对设计说明书的书写提供了许多的宝贵的意见,对于我在说明书中出现的种种疑问,始终耐心的给予解答,她深厚的理论功底以及务实的工作态度给我提供了极好的榜样,在此表示衷心的感谢。另外,还要感谢惠州德赛信息技术有限公司的朱志浩经理,他在我书写设计说明书的过程中,给予了很多指点和帮助。由于我们的条件有限,农林大学给我们提供了用于软件设计的专用软件,在此也对学校表示衷心的感谢。 - 33 - 以下简略列举一些系统功能代码以供参考。 1、设备管理功能的代码: import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.DefaultTreeModel; import javax.swing.tree.TreeNode; import javax.swing.tree.TreePath; import javax.swing.border.*; import javax.swing.event.*; public class DeviceManage extends JFrame implements ActionListener,TreeModelListener JTextPane textPane_top; JScrollPane scrollPane; JTree tree; DefaultMutableTreeNode root,node1,node2; JPanel panel_bottom; JButton buttonAdd,buttonDetermine,buttonCancel; DefaultTreeModel treeModel=null; String nodeName=null;/原有节点名称 Point p; int i=1; public DeviceManage() super(设备分组管理); setPreferredSize(new Dimension(290,480); - 34 - setResizable(false); this.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); textPane_top=new JTextPane(); textPane_top.setText(选择节点后,按F2修改名称,DEL移除,使用鼠标拖动设备进行分组); textPane_top.setEditable(false); textPane_top.setBackground(Color.lightGray); textPane_top.setOpaque(true); textPane_top.setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED);/突起效果 root=new DefaultMutableTreeNode(Root); node1=new DefaultMutableTreeNode(未分组); node2=new DefaultMutableTreeNode(设备+i); root.add(node1); node1.add(node2); tree=new JTree(root); tree.setRootVisible(false); tree.setEditable(true); tree.setShowsRootHandles(true); tree.setSelectionRow(0); tree.addKeyListener(new Key1(); tree.addMouseMotionListener(new MouseMotion(); treeModel=(DefaultTreeModel)tree.getModel(); treeModel.addTreeModelListener(this); tree.setDragEnabled(true); scrollPane=new JScrollPane(); scrollPane.add(tree); scrollPane.setViewportView(tree); scrollPane.setOpaque(true); - 35 - scrollPane.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED);/凹陷效果 buttonAdd=new JButton(新增(N); buttonAdd.setActionCommand(New); buttonAdd.addActionListener(this); buttonDetermine=new JButton(确定(O); buttonDetermine.setActionCommand(Determine); buttonDetermine.addActionListener(this); buttonCancel=new JButton(取消(C); buttonCancel.setActionCommand(Cancel); buttonCancel.addActionListener(this); panel_bottom=new JPanel(); panel_bottom.setBackground(Color.lightGray); panel_bottom.setOpaque(true); panel_bottom.setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED);/突起效果 panel_bottom.add(buttonAdd); panel_bottom.add(buttonDetermine); panel_bottom.add(buttonCancel); getContentPane().add(textPane_top,BorderLayout.NORTH); getContentPane().add(scrollPane,BorderLayout.CENTER); getContentPane().add(panel_bottom,BorderLayout.SOUTH); /addKeyListener(new Key(); pack(); - 36 - setVisible(true); public void actionPerformed(ActionEvent ae) DefaultMutableTreeNode selectedNode=node1; DefaultMutableTreeNode newNode =new DefaultMutableTreeNode(新烤炉群); if(ae.getActionCommand().equals(New) DefaultMutableTreeNode parent =(DefaultMutableTreeNode)selectedNode.getParent(); if(parent!=null) int selectedIndex = parent.getIndex(selectedNode); treeModel.insertNodeInto(newNode, parent, selectedIndex + 1); if(ae.getActionCommand().equals(Determine) TreeNode nodes = treeModel.getPathToRoot(newNode); TreePath path = new TreePath(nodes); treeModel.reload(); tree.scrollPathToVisible(path); this.dispose(); return; if(ae.getActionCommand().equals(Cancel) this.dispose(); return; - 37 - public void treeNodesChanged(TreeModelEvent e) DefaultMutableTreeNode node=(DefaultMutableTreeNode)(e.getTreePath().getLastPathComponent(); try int index=e.getChildIndices(); node=(DefaultMutableTreeNode)(node.getChildAt(index0); catch(NullPointerException exc) public void treeNodesInserted(TreeModelEvent e) System.out.println(new node insered); public void treeNodesRemoved(TreeModelEvent e) System.out.println(node deleted); public void treeStructureChanged(TreeModelEvent e) System.out.println(Structrue changed); class Key1 extends KeyAdapter public void keyPressed(KeyEvent e) int code=e.getKeyCode(); if(code=46) TreePath treepath=tree.getSelectionPath(); if (treepath!=null) /下面两行取得选取节点的父节点. DefaultMutableTreeNode selectionNode=(DefaultMutableTreeNode)treepath.getLastPathComponent(); TreeNode parent=(TreeNode)selectionNode.getParent(); if (parent!=null) /由DefaultTreeModel的removeNodeFromParent()方法删除节点,包含它的子节点。 - 38 - treeModel.removeNodeFromParent(selectionNode); treeModel.reload(); public void keyReleased(KeyEvent e) treeModel.reload(); public void keyTyped(KeyEvent e) treeModel.reload(); class MouseMotion extends MouseMotionAdapter public void mouseDragged(MouseEvent e) Point newP=SwingUtilities.convertPoint(e.getComponent(),e.getPoint(),e.getComponent(); e.getComponent().setLocation(e.getComponent().getX()+(newP.x-p.x),e.getComponent().getY()+(newP.y-p.y); p=newP; public void mousePressed(MouseEvent e) p=SwingUtilities.convertPoint(e.getComponent(),e.getPoint(),e.getComponent(); setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR); public void mouseReleased(MouseEvent e) setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR); - 39 - public void mouseDropped() /* * param args */ public static void main(String args) / TODO Auto-generated method stub javax.swing.SwingUtilities.invokeLater(new Runnable() public void run() new DeviceManage(); ); 2、报表曲线功能代码: import org.jfree.c

温馨提示

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

评论

0/150

提交评论