西门子PLC300系列的设计步骤与实例.docx

上传人:b****1 文档编号:17418586 上传时间:2023-04-24 格式:DOCX 页数:39 大小:39.09KB
下载 相关 举报
西门子PLC300系列的设计步骤与实例.docx_第1页
第1页 / 共39页
西门子PLC300系列的设计步骤与实例.docx_第2页
第2页 / 共39页
西门子PLC300系列的设计步骤与实例.docx_第3页
第3页 / 共39页
西门子PLC300系列的设计步骤与实例.docx_第4页
第4页 / 共39页
西门子PLC300系列的设计步骤与实例.docx_第5页
第5页 / 共39页
点击查看更多>>
下载资源
资源描述

西门子PLC300系列的设计步骤与实例.docx

《西门子PLC300系列的设计步骤与实例.docx》由会员分享,可在线阅读,更多相关《西门子PLC300系列的设计步骤与实例.docx(39页珍藏版)》请在冰豆网上搜索。

西门子PLC300系列的设计步骤与实例.docx

西门子PLC300系列的设计步骤与实例

S7-300系列PLC应用系统设计

PLC应用系统设计的内容和步骤

  PLC应用系统的硬件设计

  PLC应用系统的软件设计

   PLC应用系统设计实例

PLC应用系统设计的内容和步骤

系统设计的原则与内容

1.设计原则

(1)最大限度地满足被控设备或生产过程的控制要求;

(2)在满足控制要求的前提下,力求简单、经济,操作方便;

(3)保证控制系统工作安全可靠;

(4)考虑到今后的发展改进,应适当留有进一步扩展的余地。

 2.设计内容

(1)拟定控制系统设计的技术条件,它是整个设计的依据;

(2)选择电气传动形式和电动机、电磁阀等执行机构;

(3)选定PLC的型号;

(4)编制PLC的输入输出分配表或绘制输入输出端子接线图;

(5)根据系统要求编写软件说明书,然后再进行程序设计;

(6)重视人机界面的设计,增强人与机器之间的友善关系;

(7)设计操作台、电气柜及非标准电器元部件;

(8)编写设计说明书和使用说明书。

系统设计和调试的主要步骤

1.深入了解和分析被控对象的工艺条件和控制要求

2.确定IO设备,常用的输入设备有按钮、选择开关、行程开关、传感器等,常用的输出设备有继电器、接触器、指示灯、电磁阀等。

3.选择合适的PLC类型,根据已确定的用户IO设备,统计所需的输入信号和输出信号的点数,选择合适的PLC类型。

4.分配IO点,编制出输入输出端子的接线图。

5.设计应用系统梯形图程序,这一步是整个应用系统设计最核心的工作。

6.将程序输入PLC,当使用计算机上编程时,可将程序下载到PLC中。

7.进行软件测试,在将PLC连接到现场设备上之前,必须进行软件测试,以排除程序中的错误。

8.应用系统整体调试,在PLC软硬件设计和控制柜及现场施工完成后,就可以进行整个系统的联机调试。

调试中发现的问题要逐一排除,直至调试成功。

9.编制技术文件,系统技术文件包括功能说明书、电气原理图、电器布置图、电气元件明细表、PLC梯形图等。

PLC选型

在满足控制要求的前提下,选型时应选择最佳的性能价格比,具体应考虑以下几点。

1.性能与任务相适应

2.PLC的处理速度应满足实时控制的要求

3.PLC应用系统结构合理、机型系列应统一

4.在线编程和离线编程的选择

PLC容量估算

PLC容量包括两个方面:

一是IO的点数,二是用户存储器的容量。

1.IO点数的估算

根据功能说明书,可统计出PLC系统的开关量IO点数及模拟量IO通道数,以及开关量和模拟量的信号类型。

应在统计后得出IO总点数的基础上,增加10%~15%的裕量。

选定的PLC机型的IO能力极限值必须大于IO点数估算值,并应尽量避免使PLC能力接近饱和,一般应留有30%左右的裕量。

2.存储器容量估算

用户应用程序占用多少内存与许多因素有关,如IO点数、控制要求、运算处理量、程序结构等。

因此在程序设计之前只能粗略的估算。

根据经验,每个IO点及有关功能器件占用的内存大致如下:

所需存储器容量(KB)=(1~1.25)×(DI×10+DO×8+AIO×100+CP×300)1024

其中:

DI为数字量输入总点数;DO为数字量输出总点数;AIAO为模拟量IO通道总数;CP为通信接口总数。

IO模块的选择

1.开关量输入模块的选择

PLC的输入模块用来检测来自现场(如按钮、行程开关、温控开关、压力开关等)电平信号,并将其转换为PLC内部的低电平信号。

开关量输入模块按输入点数分,常用的有8点、12点、16点、32点等;按工作电压分,常用的有直流5V、12V、24V,交流110V、220V等选择输入模块主要应考虑以下两点:

(1)根据现场输入信号(如按钮、行程开关)与PLC输入模块距离的远近来选择电压的高低。

一般,24V以下属低电平,其传输距离不宜太远。

如12V电压模块一般不超过10m,距离较远的设备选用较高电压模块比较可靠。

(2)高密度的输入模块,如32点输入模块,允许同时接通的点数取决于输入电压和环境温度。

一般,同时接通的点数不得超过总输入点数的60%。

;按外部接线方式又可分为汇点输入、分隔输入等。

2.开关量输出模块的选择

输出模块的任务是将PLC内部低电平的控制信号转换为外部所需电平的输出信号,驱动外部负载。

输出模块有三种输出方式:

继电器输出、双向可控硅输出和晶体管输出。

1)输出方式的选择

继电器输出价格便宜,使用电压范围广,导通压降小,承受瞬间过电压和过电流的能力较强,且有隔离作用。

但继电器有触点,寿命较短,且响应速度较慢,适用于动作不频繁的交直流负载。

当驱动电感性负载时,最大开闭频率不得超过1Hz。

晶闸管输出(交流)和晶体管输出(直流)都属于无触点开关输出,适用于通断频繁的感性负载。

感性负载在断开瞬间会产生较高的反压,必须采取抑制措施

2)输出电流的选择

模块的输出电流必须大于负载电流的额定值,如果负载电流较大,输出模块不能直接驱动,则应增加中间放大环节。

对于电容性负载、热敏电阻负载,考虑到接通时有冲击电流,故要留有足够的裕量。

3)允许同时接通的输出点数

在选用输出模块时,还要看整个输出模块的满负荷能力,如OMRON公司的CQM1-OC222是16点输出模块,每个点允许通过电流2A(AC250VDC24V)。

但整个模块允许通过的最大电流仅8A。

分配输入输出点

一般输入点与输入信号、输出点与输出控制是一一对应的;在个别情况下,也有两个信号用一个输入点的,那样就应在接入输入点前,按逻辑关系接好线(如两个触点先串联或并联),然后再接到输入点。

1.明确IO通道范围

不同型号的PLC,其输入输出通道的范围是不一样的,应根据所选PLC型号,弄清相应的IO点地址的分配。

2.内部辅助继电器

内部辅助继电器不对外输出,不能直接连接外部器件,而是在控制其他继电器、定时器、计数器时作数据存储或数据处理用。

根据程序设计的需要,应合理安排PLC的内部辅助继电器,在设计说明书中应详细列出各内部辅助继电器在程序中的用途,避免重复使用。

3.分配定时器计数器

对用到定时器和计数器的控制系统,注意定时器和计数器的编号不能相同。

若扫描时间较长,则要使用高速定时器以保证计时准确

安全回路设计

安全回路起保护人身安全和设备安全的作用,它应能独立于PLC工作,并采用非半导体的机电元件以硬接线方式构成。

确保系统安全的硬接线逻辑回路,在以下几种情况下将发挥安全保护作用:

①PLC或机电元件检测到设备发生紧急异常状态时;②PLC失控时;③操作人员需要紧急干预时。

设计安全回路的任务包括以下内容:

(1)确定控制回路之间逻辑和操作上的互锁关系;

(2)设计硬回路以提供对过程中重要设备的手动安全性干预手段;

(3)为PLC定义故障形式和重新启动特性。

PLC应用系统的软件设计

PLC应用软件设计的内容

PLC应用软件的设计是一项十分复杂的工作,它要求设计人员既要有PLC、计算机程序设计的基础,又要有自动控制的技术,还要有一定的现场实践经验。

一个实用的PLC软件工程的设计通常要涉及以下几个方面的内容:

(1)PLC软件功能的分析与设计;

(2)IO信号及数据结构分析与设计(3)程序结构分析与设计;

(4)软件设计规格说明书编制;

(5)用编程语言、PLC指令进行程序设计;

(6)软件测试;

(7)程序使用说明书编制。

PLC应用系统的软件设计步骤

根据可编程序控制器系统硬件结构和生产工艺要求,在软件规格说明书的基础上,编制实际应用程序并形成程序说明书的过程就是应用系统的软件设计。

1.制定设备运行方案

制定方案就是根据生产工艺的要求,分析各输入、输出与各种操作之间的逻辑关系,确定需要检测的量和控制的方法,并设计出系统中各设备的操作内容和操作顺序。

据此便可画出流程图。

2.画控制流程图

对于较复杂的应用系统,需要绘制系统控制流程图,用以清楚地表明动作的顺序和条件。

对于简单的控制系统,可省去这一步。

3.制定系统的抗干扰措施

根据现场工作环境、干扰源的性质等因素,综合制定系统的硬件和软件抗干扰措施,如硬件上的电源隔离、信号滤波,软件上的平均值滤波等。

4.编写程序

根据被控对象的输入输出信号及所选定的PLC型号分配PLC的硬件资源,为梯形图的各种继电器或接点进行编号,再按照软件规格说明书(技术要求、编制依据、测试),用梯形图进行编程。

5.软件测试

刚编写好的程序难免有缺陷或错误。

为了及时发现和消除程序中的错误和缺陷,需要对程序进行离线测试。

经调试、排错、修改及模拟运行后,才能正式投入运行。

6.编制程序使用说明书

当一项软件工程完成后,为了便于用户和现场调试人员的使用,应对所编制的程序进行说明,说明书应包括程序设计的依据、结构、功能、流程图,各项功能单元的分析,PLC的IO信号,软件程序操作使用的步骤、注意事项等。

PLC应用系统设计实例

机械手控制系统设计

1.工艺过程及控制要求

1)工艺过程

图6.1所示为一简易物料搬运机械手的工艺流程图。

该机械手是一个水平垂直位移的机械设备,其操作是将工件从左工作台搬运到右工作台,由光耦合器VLC来检测工作台上有没有工件。

机械手通常位于原点,它的动作全部由气缸驱动,而气缸则由相应的电磁阀控制。

其中,上升下降和左移右移分别由双线圈二位电磁阀控制,放松夹紧由一个单线圈二位电磁阀(称为夹紧电磁阀)控制。

2)控制要求

机械手整个搬运过程要求都能自动控制。

在启动过程中能切换到手动控制及自动控制或半自动控制(又称单周期控制),以便对设备进行调整和检修。

图6.2是机械手控制系统的逻辑流程图。

系统启动之前,机械手处于原始位置,条件是机械手在高位﹑左位。

2.可编程序控制器选型

1)硬件配置

系统输入信号有3个启动按钮,4个限位开关,5个手动输入信号,1个有工件检测信号,共计14个数字量输入信号;输出信号有机械手上升下降驱动信号﹑左移右移驱动信号和机械手夹紧驱动信号,共有5个数字量输出信号。

不需模拟量模块,选择S7-300系列的CPU313,加上数字量输入模块SM321及输出模块SM322就可以满足要求,而且还有一定的裕量。

2)IO地址分配

将14个输入信号、5个输出信号与PLC的IO端一一对应,编排好地址,

其它地址分配

(1)夹紧定时器T1,定时5s;

(2)放松定时器T2,定时5s;

(3)自动方式标志M0.0;

(4)单动方式标志M0.1;

(5)手动方式标志M0.2;

(6)结束标志M0.5。

3.机械手程序设计

1)逻辑功能块(子程序)

逻辑功能块包括两个部分:

自动方式或单动方式控制(FC10)和手动方式控制(FC11)。

(1)自动方式或单动方式控制(FC10)的具体程序(梯形图表示)如图6.3所示。

(2)手动方式控制(FC11)的具体程序(梯形图表示)如图6.4所示。

2)组织块(主程序)

组织块OB1用于设定机械手启动方式,主要负责功能块或子程序的调用,是自动运行还是单动运行,以及系统的循环扫描、故障诊断和输出刷新。

其梯形图如图6.5所示。

5.1编程方式与程序块

5.2数据块与数据结构

5.3S7系列PLC程序设计

5.1.1S7-300编程方式简介

S7-300系列PLC的编程语言是STEP7。

STEP7继承了STEP5语言结构化程序设计的优点,用文件块的形式管理用户编写的程序及程序运行所需的数据。

如果这些文件块是子程序,则可以通过调用语句,将它们组成结构化的用户程序。

这样,PLC的程序组织明确,结构清晰,易于修改。

为支持结构化程序设计,STEP7用户程序通常由组织块(OB)、功能块(FB)或功能块(FC)等三种类型的逻辑块和数据块(DB)组成。

组织块(OB)是系统操作程序与用户应用程序在各种条件下的接口界面,用于控制程序的运行。

OB块根据操作系统调用的条件(如时间中断、报警中断等)可分成几种类型,这些类型有不同的优先级,高优先级的OB可以中断低优先级的OB。

每个S7CPU包含一套可编程的OB块(随CPU而不同),不同的OB块执行特定的功能。

OB1是主程序循环块,在任何情况下,它都是需要的。

根据过程控制的复杂程度,可将所有程序放入OB1中进行线性编程,或将程序用不同的逻辑块加以结构化,通过OB1调用这些逻辑块,并允许块间的相互调用。

块的调用指令中止当前块(调用块)的运行调用,然后执行被调用块的所有指令。

一旦被调用的块被完成,执行调用指令的块继续执行调用指令后的指令。

调用块可以是任何逻辑块,被调用块只能是功能块(除OB外的逻辑块)。

图5.1所示是一个STEP7调用实例。

除了OB1,操作系统可以调用其它的OB块以响应确定事件。

其它可用的OB块随所用的CPU性能和控制过程的要求而定。

功能块(FB、FC)实际上是用户子程序,分为带“记忆”的功能块FB和不带“记忆”的功能块FC。

前者有一个数据结构与该功能块的参数表完全相同的数据块(DB)附属于该功能块,并随功能块的调用而打开,随功能块的结束而关闭。

该附属数据块叫做背景数据块(InstanceDataBlock),存放在背景数据块中的数据在FB块结束时继续保持,即被“记忆”。

功能块FC没有背景数据块,当FC完成操作后数据不能保持。

数据块(DB)是用户定义的用于存取数据的存储区,可以被打开或关闭。

DB可以是属于某个FB的情景数据块,也可以是通用的全局数据块,用于FB或FC。

S7CPU还提供标准系统功能块(SFB、SFC),它们是预先编好的,经过测试后集成在S7CPU中的功能程序库。

用户可以直接调用它们,高效地编制自己的程序。

由于它们是操作系统的一部分,因此不需将其作为用户程序下载到PLC。

与FB块相似,SFB需要一个背景数据块,并需将此DB块作为程序的一部分安装到CPU中。

不同的CPU提供不同的SFB、SFC功能。

系统数据块(SDB)是为存放PLC参数所建立的系统数据存储区。

用STEP7的S7组态软件可以将PLC组态数据和其它操作参数存放于SDB中。

功能块编程及调用

功能块由两个主要部分组成:

一部分是每个功能块的变量声明表,变量声明表声明此块的局部数据;另一部分是逻辑指令组成的程序,程序要用到变量声明表中给出的局部数据。

当调用功能块时,需提供块执行时要用到的数据或变量,也就是将外部数据传递给功能块,这被称为参数传递。

参数传递的方式使得功能块具有通用性,它可被其它的块调用,以完成多个类似的控制任务。

1.变量声明表(局部数据)

每个逻辑块前部都有一个变量声明表,在变量声明表中定义逻辑块用到的局部数据。

局部数据分为参数和局部变量两大类,局部变量又包括静态变量和临时变量(暂态变量)两种。

参数是在调用块和被调用块间传递的数据。

静态变量和临时变量是仅供逻辑块本身使用的数据。

表5.1给出了局部数据声明类型,表中内容的排列顺序也是在变量声明

表中声明变量的顺序和变量在内存中的存储顺序。

在逻辑块中不需使用的局部数据类型,可以不必在变量声明表中声明。

表5.1局部数据类型

变量名类型说明

输入参数In由调用逻辑块的块提供数据,输入给逻辑块的指令

输出参数Out向调用逻辑块的块返回参数,即从逻辑块输出结果数据

IO参数In_Out参数的值由调用块的块提供,由逻辑块处理修改,然后返回

静态变量Stat静态变量存储在背景数据块中,块调用结束后,其内容被保留

临时变量Temp临时变量存储在L堆栈中,块执行结束变量的值因被其它内容覆盖而丢掉

对于功能块FB,操作系统为参数及静态变量分配的存储空间是背景数据块。

这样参数变量在背景数据块中留有运行结果备份。

在调用FB时,若没有提供实参,则功能块使用背景数据块中的数值。

操作系统在L堆栈中给FB的临时变量分配存储空间。

对于功能块FC,操作系统在L堆栈中给FC的临时变量分配存储空间。

由于没有背景数据块,因而FC不能使用静态变量。

输入、输出、IO参数以指向实参的指针形式存储在操作系统为参数传递而保留的额外空间中。

对于组织块OB来说,其调用是由操作系统管理的,用户不能参与。

因此,OB只有定义在L堆栈中的临时变量。

1)形参

为保证功能块对同一类设备控制的通用性,用户在编程时就不能使用具体设备对应的存储区地址参数(如不能使用I1.0等),而是使用这类设备的抽象地址参数。

这些抽象参数称为形式参数,简称形参。

将该设备的相应实际存储区地址参数(简称实参)传递给功能块,功能块在运行时以实参替代形参,从而可通过调用功能块实现对具体设备的控制。

当对另一设备控制时,同样也可通过调用实参将其传递给功能块。

形参需在功能块的变量声明表中定义,实参在调用功能块时给出。

在功能块的不同调用处,可为形参提供不同的实参,但实参的数据类型必须与形参一致。

用户程序可定义功能块的输入值参数或输出值参数,也可定义一参数作为输入输出值。

参数传递可将调用块的信息传递给被调用块,也能把被调用块的运行结果返回给调用块。

2)静态变量

静态变量在PLC运行期间始终被存储。

S7将静态变量定义在背景数据块中,当被调用块运行时,能读出或修改静态变量;被调用块运行结束后,静态变量保留在数据块中。

由于只有功能块FB有关联的背景数据块,因此只能为FB定义静态变量。

功能块FC不能有静态变量。

3)临时变量

临时变量仅在逻辑块运行时有效,逻辑块结束时存储临时变量的内存被操作系统另行分配。

S7将临时变量定义在L堆栈中,L堆栈是为存储逻辑块的临时变量而专设的。

当块程序运行时,在L堆栈中建立该块的临时变量,一旦块执行结束,堆栈重新分配,因而信息丢失。

逻辑块局部数据的数据类型

在变量声明表中,要明确局部数据的数据类型,这样操作系统才能给变量分配确定的存储空间。

局部数据可以是基本数据类型或复式数据类型,也可以是专门用于参数传递的所谓的“参数类型”。

参数类型包括定时器、计数器、块的地址或指针等,见表5.2。

表5.2参数类型变量

参数类型大小说明

定时器(Timer)2B在功能块中定义一个定时器形参,调用时赋予定时器实参

计数器(Counter)2B在功能块中定义一个计数器形参,调用时赋予计数器实参

块:

Block_FB

Block_FC

Block_DB

Block_SDB2B在功能块中定义一个功能块或数据块形参变量,调用时给功能块类或数据块类形参赋予实际的功能块或数据块编号,如

FC101、DB42

指针(Pointer)6B在功能块中定义一个形参,该形参说明的是内存的地址指针。

例如,调用时可给形参赋予实参P#M50.0,以访问内存M50.0

ANY10B当实参的数据类型未知时,可以使用该类型

1)定时器或计数器参数类型

在功能块中定义一个定时器或计数器类型的形参,功能块就能使用一个定时器或计数器,而不需明确具体的定时器或计数器,等到调用该功能块时再确定定时器或计数器号。

这使用户程序能灵活性地分配和使用定时器或计数器。

当给定时器或计数器参数类型形参分配实参时,在“T”或“C”后跟一个有效整数,如T100。

2)块参数类型

当定义一个作为输入输出的块时,参数声明决定了块的类型(FB、FC、DB等)。

当为块参数类型形参分配实参时,可以使用物理地址,如FC101,也可使用符号地址,如“valve

3)指针参数类型

一个指针给出的是变量的地址,而不是变量的数值大小。

在有些功能块中,可能使用指针编程更为方便。

用定义指针类型的形参,就能在功能块中先使用一个虚设的指针,待调用功能块时再为其赋予确定的地址。

当为指针参数类型形参分配实参时,需要指明内存地址,例如P#M50.0。

3.块调用过程及内存分配

CPU提供块堆栈(B堆栈)来存储与处理被中断块的有关信息。

当发生块调用或有来自更高优先级的中断时,就有相关的块信息存储在B堆栈里,并影响部分内存和寄存器。

图5.2显示了调用块时B堆栈与L堆栈的变化。

图5.3提供了关于STEP7的块调用情况。

1)B堆栈与L堆栈

B堆栈是CPU系统内存中的一部分,它存储以下被中断块的数据:

(1)块号、块类型、优先级、被中断块的返回地址;

(2)块寄存器DB、DI被中断前的内容;

(3)临时变量的指针(被中断块的L堆栈地址)。

STEP7中可使用的B堆栈大小是有限制的,对于S7-300CPU,则可在B堆栈中存储8个块的信息。

因此,块调用嵌套深度也是有限制的,最多可同时激活8个块。

L堆栈是CPU内存中的一部分,它在块调用时被重新分配。

L堆栈用来存储逻辑块中定义的临时变量,也分配给临时本地数据使用。

梯形图的方块指令与标准功能块也可能使用L堆栈存储运算的中间结果。

2)调用功能块FB

当调用功能块FB时,会有以下事件发生:

(1)调用块的地址和返回位置存储在块堆栈中,调用块的临时变量压入L堆栈;

(2)数据块DB寄存器内容与DI寄存器内容交换;

(3)新的数据块地址装入DI寄存器;

(4)被调用块的实参装入DB和L堆栈上部;

(5)当功能块FB结束时,先前块的现场信息从块堆栈中弹出,临时变量弹出L堆栈;

(6)DB和DI寄存器内容交换。

当调用功能块FB时,STEP7并不一定要求给FB形参赋予实参,除非参数是复式数据类型的IO形参或参数类型形参。

如果没有给FB形参赋予实参,则功能块FB就调用背景数据块内的数值。

该数值是在功能块的变量声明表内或背景数据块内设置的形参初始数值。

3)调用功能块FC

当调用功能块FC时会有以下事件发生:

(1)功能块FC实参的指针存到调用块的L堆栈;

(2)调用块的地址和返回位置存储在块堆栈,调用块的局部数据压入L堆栈;

(3)功能块存储临时变量的L堆栈区被推入L堆栈上部;

(4)当被调用功能块FC结束时,先前块的信息存储在块堆栈中,临时变量弹出L堆栈。

因为功能块FC不用背景数据块,不能分配初始数值给功能块FC的局部数据,所以必须给功能块FC提供实参。

STEP7为功能块FC提供了一个特殊的返回值输出参数(关键字:

RET_VAL)。

当在文本文件中创建功能块FC时,你可以在定义功能块FC命令后输入数据类型(如BOOL或INT)。

对文本文件进行编译时,STEP7会自动生成RET_VAL输出参数。

当用STEP7的程序编辑器(ProgramEditor)以增量模式创建功能块FC时,可在FC的变量声明表中声明一个输出参数RET_VAL,并指明其数据类型。

功能块编程与调用举例

对功能块编程分两步进行:

第一步是定义局部变量(填写局部变量表);第二步是编写要执行的程序,可以用梯形图或语句表两种形式编程,并在编程过程中使用定义了的局部变量(数据)。

定义局部变量的工作内容包括:

(1)分别定义形参、静态变量和临时变量(FC块中不包括静态变量);

(2)确定各变量的声明类型(Decl.)、变量名(Name)和数据类型(DataType),还要为变量设置初始值(InitialValue)(尽管对有些变量初始值不一定有意义)。

如果需要还可为变量注释(Comment)。

在增量编程模式下,STEP7将自动产生局部变量地址(Address)。

写功能块程序时,可以用以下两种方式使用局部变量:

(1)使用变量名,此时变量名前加前缀“#”,以区别于在符号表中定

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 农林牧渔 > 林学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1