第5章任务编程.docx

上传人:b****6 文档编号:15967203 上传时间:2023-07-09 格式:DOCX 页数:26 大小:334.54KB
下载 相关 举报
第5章任务编程.docx_第1页
第1页 / 共26页
第5章任务编程.docx_第2页
第2页 / 共26页
第5章任务编程.docx_第3页
第3页 / 共26页
第5章任务编程.docx_第4页
第4页 / 共26页
第5章任务编程.docx_第5页
第5页 / 共26页
第5章任务编程.docx_第6页
第6页 / 共26页
第5章任务编程.docx_第7页
第7页 / 共26页
第5章任务编程.docx_第8页
第8页 / 共26页
第5章任务编程.docx_第9页
第9页 / 共26页
第5章任务编程.docx_第10页
第10页 / 共26页
第5章任务编程.docx_第11页
第11页 / 共26页
第5章任务编程.docx_第12页
第12页 / 共26页
第5章任务编程.docx_第13页
第13页 / 共26页
第5章任务编程.docx_第14页
第14页 / 共26页
第5章任务编程.docx_第15页
第15页 / 共26页
第5章任务编程.docx_第16页
第16页 / 共26页
第5章任务编程.docx_第17页
第17页 / 共26页
第5章任务编程.docx_第18页
第18页 / 共26页
第5章任务编程.docx_第19页
第19页 / 共26页
第5章任务编程.docx_第20页
第20页 / 共26页
亲,该文档总共26页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

第5章任务编程.docx

《第5章任务编程.docx》由会员分享,可在线阅读,更多相关《第5章任务编程.docx(26页珍藏版)》请在冰点文库上搜索。

第5章任务编程.docx

第5章任务编程

第5章任务编程

以前的PLC程序是一条一条地进行扫描执行的,在每一个循环扫描周期里,系统都要进行I/O刷新。

因此,PLC占用的扫描时间比较长。

目前OMRON公司生产的CJ1系列和CS1系列的PLC,在程序上采用模块化结构,即用标准组件创建程序,这些标准组件创建的模块程序,就是我们要说到的任务。

创建模块程序时,可用符号指定地址,以便于标准化。

PLC的程序可由多个任务组成,其中一个为控制任务。

它可以使用TASKON(即TKON(820))指令设置为“就绪”状态,也可以使用TASKOFF(即TKOF(821))指令设置为“等待”状态。

当一个控制任务处于“等待”状态时,该任务中的程序不执行,因此,它们的等待时间不计算到循环时间中去。

由于不执行任务中的程序不会增加循环扫描时间,可提高PLC的总体执行性能。

本章主要介绍任务编程的特点和类型、循环任务和中断任务的一般编程方法。

5.1任务编程概述

5.1.1任务编程的特点和类型

1.任务编程的结构

按控制功能、操作设备类型、控制过程、程序开发或其他标准把程序进行划分,每个操作可在一个被称为“任务”的独立单元内编程,称为任务编程。

在多个任务中,控制任务用于控制其他任务的执行。

由多个任务构成的任务编程,它的一般结构框图如图5-1所示。

 

(a)任务的组成框图(b)多个任务的编程框图

图5-1任务编程的结构框图

在图(b)中,进入起动时任务0处于“就绪”状态,程序从任务0开始执行操作,其他任务仍然处于“等待”状态;当a条件为ON时,任务1进入“就绪”状态,任务2和任务3仍然处于“等待”状态。

依此类推,当d为ON时,任务0将进入“等待”状态,其他任务将保持现有状态。

2.任务编程的特点

(1)PLC的程序可由几个人同时编制,每个人单独设计的程序部分可以容易地组合成一个用户程序。

(2)任何一种程序可设计成一个标准化模块。

也就是说可使用标识符编程,采用总体和局部标识符进行设计,而且对局部标识符可以自动分配地址,从而提高编程效果。

(3)提高总体响应。

因为系统被分成了一个总体控制程序以及一些单独的控制程序,所以整体响应得到改进,并可按照需要执行一些特殊的程序。

(4)易于修改和调试。

因为总体任务可由几个人独立编制,并且每个独立任务都可分开修改和调试;由于符号被设定成局部符号或全局符号,而且局部符号可自动分配地址,这就很容易判定一个地址是局部的还是全局的,从而便于修改和调试程序。

(5)易于切换程序。

如果有必要改变操作时,可以使用程序中的一个任务控制指令使特定的任务(程序)有效运行。

(6)易于理解用户程序。

程序以模块化为结构使得程序简单易懂,程序段的处理就像用传统的跳转指令一样,很容易理解。

3.任务的类型

任务通常划分为循环任务和中断任务两大类。

中断任务可进一步划分为断电中断、定时中断、I/O中断和外部中断任务,最后两种中断仅限于CS1系列的CPU单元使用。

在使用CS1-H、CJ1-H、CJ1M或CS1D的CPU单元时,中断任务可在循环任务中通过TKON指令的启动去执行,这种任务被称为“附加循环任务”。

此时,中断任务亦可作为循环任务来执行。

(1)循环任务

顺序执行的任务称作周期任务,也叫做循环任务。

一个处于就绪状态的循环任务都是从最低编号开始,按顺序在每个周期循环执行一次(即都从程序的顶端开始直到END(001)指令结束)。

循环任务的最大数量为32个,故循环任务号的编号为00~31。

在使用CS1-H、CJ1-H、CJ1M或CS1D的CPU单元时,中断任务(即总量为256个)能像常规的循环任务一样被执行。

如果使用附加循环任务,那么循环任务的数量可达到288个。

(2)中断任务

依靠中断条件执行的任务称为中断任务。

中断任务的数量有256个,则中断任务号的编号为00~255。

如果中断发生,即使当前循环任务(包括附加循环任务)正在执行,也将转去执行中断任务。

在循环周期中,只要中断条件成立,中断任务可在任何时候执行,包括在用户程序执行阶段、I/O口刷新或外设处理时,中断任务都具有高的优先处理级别。

在使用CS1-H、CJ1-H、CJ1M或CS1DCPU单元时,中断任务能被当作循环任务执行。

CS1D的CPU不支持中断,使用CS1D的CPU时,中断任务仅能作为附加循环任务执行。

在CJ1M的CPU单元中,是通过内置的中断输入和高速计数器输入来运行中断任务的,详情见有关CJ1系列PLC的操作手册。

5.1.2CPU单元的基本操作

图5-2所示为一个具有n个编号的任务程序段,CPU单元将从最低号的任务(即任务0)开始依次执行循环任务。

如果中断发生,它将终止执行循环任务而去执行中断任务(如中断任务5)。

图5-2(a)的中断是作为一般中断任务使用的,只有在中断允许时才执行中断任务;而图5-2(b)的中断是作为附加循环任务使用的,附加循环任务号也从0递增,且顺序执行。

在图5-2中,每一个任务都有一个结束指令END。

END*1指令表示为任务1的任务结束指令;它将清除该任务的ER(错误)、EQ(等于)以及N(负)标志。

END*2是最后任务的结束指令,它将清除最后一个任务的ER、EQ和N标志,并刷新I/O。

*1,*2在这里只是标示符,仅为了区别对应于不同任务来加注的,在程序中都是用END指令。

注意:

所有条件标志(ER、CY、EQ、AER(指访问错误标志CF011)等)和指令条件(内部锁存为ON等)在任务开始时都被复位,故这些条件标志不可读;而联锁/联锁解除指令(IL/ILC)指令、跳转/跳转结束(JMP/JME)指令和子程序调用/子程序进入(SBS/SBN)指令,不能分开在两个任务间使用;在小型机(如CPM2*)的PLC程序中只能有一个结束指令END,而在中型机(如CS1系列)的PLC,每一个任务都必须有一个END指令,每一个END指令作为该任务的结束标志。

可见,任务号和END个数应当匹配。

 

 

(a)

图5-2任务编程的基本操作

5.1.3循环任务的状态与转换

1.循环任务的状态

循环任务具有下列四种状态:

禁止,就绪,运行和等待状态。

(1)“禁止”状态(INI)

处于“禁止”状态下的任务不能执行,在编程(PROGRAM)模式下,所有循环任务都为“禁止”状态。

但任何循环任务一旦从“禁止”状态转换到其他状态时,如果不返回到编程(PROGRAM)模式下,都不能重新返回为“禁止”状态。

(2)“就绪”状态

当任务处于“就绪”状态时,任务属性可控。

任务属性可由TASKON指令运行任务或在运行操作启动时运行任务。

使用TASKON(TKON(820))指令来运行任务时,循环任务将从“禁止”或“等待”状态切换为“就绪”状态;使用操作启动来运行任务,即在操作模式从编程(PROGRAM)模式变为运行(RUN)模式或监控(MONITOR)模式时,一个操作运行循环任务可从“禁止”或“等待”状态切换为“就绪”状态。

后一种运行任务的方法仅对常规的循环任务有效。

在任务0到任务31开始操作时,可用编程工具设定一个或多个任务为"就绪"状态,但对附加循环任务无效。

(3)“运行”状态

当处于“就绪”状态的循环任务获取执行权时(例如初始任务执行标志变为ON时),该任务将从“就绪”状态切换为“运行”状态并开始执行任务。

(4)“等待”状态

一条TASKOFF(TKOF(821))指令能把循环任务从“就绪”状态变为“等待”状态。

“等待”状态的效果相当于一个跳转(JMP/JME)指令,处于“等待”状态的任务的输出将保持不变。

在“等待”状态下不执行指令,因此PLC系统的执行时间不增加。

不需要执行的程序在任何时候都可以被生成为任务并设为“等待”状态,以缩短PLC的循环扫描周期。

简而言之,就是处于“等待”状态的任务在执行时将被跳过,而且在改变任务为“等待”状态时,不需要终止程序。

2.任务状态的转换

综上所述,任务状态的转换可以用如图5-3表示。

 

图5-3任务状态的转换

5.2使用任务

5.2.1开关任务与任务限制

1.任务的开启与关闭

对于循环任务来说,任务控制指令是指TASKON和TASKOFF指令。

在程序中,TASKON(TKON(820))和TASKOFF(TKOF(821))指令是用来在“就绪”状态与“等待”状态间切换循环任务的(包括附加循环任务),其命令的梯形图如图5-4所示。

 

图5-4任务控制指令的梯形图

在任何时候,都可使用开启任务TASKON(即TKON(820))指令和任务关闭TASKOFF(即TKOF(821))指令,来改变任何循环任务的读“READY”或写“WAIT”状态。

一个处于READY状态的循环任务,将在随后的周期中将保持它的状态;同样,一个处于WAIT状态的循环任务,也将在随后的周期中保持那个状态不变。

在每个周期内至少要有一个循环任务处于“就绪”状态,否则,任务出错标志位(A29512)将变为ON,使CPU将停止运行。

TASKON和TASKOFF指令仅适用于循环任务,不可用于中断任务。

2.任务的限制指令

(1)必须放在同一个任务中的指令

在跳转/跳转结束(JMP/JME)、条件跳转/跳转结束(CJP/JM)E、条件不满足跳转/条件跳转结束(CJPN/JME)、多重跳转/跳转结束(JMP0/JME0)、循环(FOR/NEXT)、联锁/联锁解除(IL/ILC)、子程序调用/子程序进入/子程序返回(BS/SBN/RET)、宏指令/子程序进入/返回(MCRO/SBN/RET)、程序块开始/程序块结束(BPRG/BEND)、定义步进程序(STEPS/STEP)等指令,必须放在同一任务中,任何企图在两个任务间分割这些指令,都将导致ER标志位为ON,且指令停止执行。

(2)不允许在中断任务出现的指令

任务开启(TKON(820))、任务关闭(TKOF(821))、定义步进(STEP)、定义下一步(SNXT)、更改串口设置(STUP)、使中断禁止(DI)、使中断有效(EI)等指令,不允许在中断任务中出现。

任何企图在中断任务中使用这些指令,都将导致ER标志位变为ON,且指令停止执行。

但如果中断任务作为附加循环任务使用时,则可以使用上述指令。

(3)在中断任务中操作结果不确定的指令

定时器(TIM和TIMX(550)),高速定时器(TIMH(01))和(TIMHX(551)),1mS定时器(TMHH(540))和(TMHHX(542)),累计定时器(TTIM(087)和TTIMX(555)),多输出定时器(MTIM(543))和(MTIMX(544)),长时间定时器(TIML(542))和(TIMLX(553)),定时器等待(TIMW(813))和(TIMWX(816)),高速定时器等待(TMHW(815))和(TMHWX(817)),PID控制(PID(190)),错误点检测(FPD(269)),更改串行口设置(STUP(237))等指令,在中断任务中,它们的操作结果是不确定的。

除对上述指令限制之外,还有读数据文件(FREAD(700)),写数据文件(FWRIT(701)),网络发送(SEND(090)),网络接收(RECV(098)),发送命令(CMND(490)),协议宏指令(PMCR(260))等指令,不能在断电中断任务中使用。

若使用这些指令也将不执行,而出错标志位不会置为ON。

5.2.2任务的执行条件与关联因素

1.任务的执行条件

循环任务的执行条件比较简单,根据TASKON和TASKOFF指令的执行条件,当获得执行权利(即TKONN执行条件为ON)时,任务进入就绪状态,每个周期执行一次,不需要设置。

循环任务编号为0~31。

对于循环任务编号和执行周期要注意以下问题。

如果任务m打开任务n,且m>n,那么任务n将在下个周期进入“就绪”状态。

例如由任务5将任务2变为ON,那么任务2将在下个周期进入“就绪”状态。

如果任务m将任务n变为ON,且m

例如由任务2将任务5变为ON,那么任务5将在与任务2在同一周期内进入“就绪”状态。

如果任务m将任务n为置为“等待”状态,且m>n,那么任务n将在下个周期进入“等待”状态。

例如由任务将5任务2置为“等待”状态,那么任务2将在下个周期进入“等待”状态。

如果任务m将任务n置为“等待”状态,且m

例如由任务2将任务5置为“等待”状态,那么任务5将在本周期内进入“等待”状态。

2.与任务相关联的因素

(1)任务与I/O内存区的关联

每个任务所使用的变址寄存器(IR)以及数据寄存器(DR)都是不相同(即独立)的,例如循环任务1所用的IR0与所用的循环任务2所用的IR0是不同的。

I/O存储区中其他字和位由所有的任务共享。

例如对循环任务1和循环任务2来说,如果都使用CIO001000,那么这两个循环任务使用的I/O存储区是同一位。

因此,在编程时要格外小心,以免在使用IR以及DR区域之外的I/O存储区时,由于某一个I/O存储区被第一个任务更改数值后,而其他任务再次使用时受到影响。

(2)任务与计时器操作的关系

含有计时器的任务被切换至“等待”状态(或返回“就绪”状态)时,使用TIM、TIMH、TIMW、TIMHW指令的计时器号为0000~2047所对应的计时器的当前值将被更新。

如果含有TIM任务进入“等待”状态并且又回到就绪状态,如果在当前值为0时TIM指令被执行了,这时完成标志变为ON;如果在当前值不为0时被执行,TIM指令的当前值将继续被更新,如同任务处于“就绪”状态时一样。

由计时器号2048~4098编程的计时器的当前值,将在任务处于“等待”状态时一直被保持。

(3)任务与条件标志位的关系

在每个任务执行前都要清除所有的条件标志位。

因此,任务1末尾的条件标志状态不会在任务2中读出来。

当通过手持编程器监视条件标志位的状态时,手持编程器将在循环的末尾显示标志位的状态,即显示在整个循环的最后一个任务的末尾标志位的状态。

5.2.3有关任务的编程设备操作

1.使用多个循环任务

使用CX-Programmer可生成多个循环的任务(包括附加循环任务)。

手持编程器不可用来生成新的循环任务。

必须保证用CX-Programmer为已经生成的程序分配任务类型和任务号。

(1)由CX-Programmer生成并向CPU单元传送的多个循环任务可通过手持编程器进行监控和编辑。

(2)手持编程器可通过使用其中的全部清空功能和指定中断任务生成一个循环任务以及一个或多个中断任务。

手持式编程器仅能生成中断任务1(断电中断),2和3(定时中断),以及100~131(I/O中断)。

然而对于CJ1M的CPU来说,中断任务140~143(为内置输入分配的)也能通过手持式编程器生成。

(3)当PLC切换至MONITOR或RUN模式时,才能启动循环任务。

2.手持编程器的操作

在手持编程器上一个任务是作为一个完整的程序进行操作的。

使用手持编程器通过指定给循环任务的CT00~CT31或给中断任务的IT001~IT255编号来存取和编辑程序。

其操作如图5-5所示。

 

3.CX-P的操作

使用CX-P的操作如图5-6所示,它由CX-P为每一个程序指定任务类型以及任务号作为任务的属性。

(1)选择View/Properties,或者单击右键并在弹出菜单上选择Properties,显示将要分配给任务的程序。

(2)选择General标签,并选择其中的TaskType和TaskNO项。

对循环任务而言,单击Operationstart检查框把它置ON。

 

5.3循环任务的编程

5.3.1设计任务的一般要求

1.分割任务的方法

(1)从总体上来考虑执行与不执行的特定条件。

(2)归纳出有无外部I/O情况。

(3)集中考虑所有功能,使顺序控制、模拟量控制、人机交互、错误处理和其他过程的任务间处理,能够保持绝对最小量的数据交换,以保证各任务之间具有高度的独立性。

任务可按照功能和过程等进行分类组合,如图5-7所示。

其中,图(a)为按功能分类的任务,图(b)为按控制部分来分类的任务,图(c)为按产品分类的任务,图(d)为按开发者分类的任务,图(e)为按处理分类的任务。

 

(a)按功能分类的任务(b)按控制部分分类的任务

 

 

(c)按产品分类的任务(d)按开发者分类的任务

 

(e)按处理分类的任务

图5-7任务编程的分类

(4)归纳出执行任务的优先级顺序,对循环任务和中断任务进行分别处理,如图5-8所示。

 

2.设计任务程序的基本原则

(1)确保以一种独立方式分解和设计程序,尽量减小任务间(程序)的数据交换量。

(2)一般情况下,用一个总控制任务去控制其他任务为“就绪”或“等待”状态。

(3)给优先级最高的任务分配最低的任务编号;也给高优先级的中断任务分配较低的任务编号。

例如给控制任务分配的编号比处理任务的编号低。

(4)一个处于“就绪”状态的任务将在下一个周期中执行,只要它本身或其他任务没有把它转换为“等待”状态。

因此,如果处理过程需要在任务之间分支,一定要在其他任务中插入一条任务停止指令(TKOF(821))。

(5)在任务执行条件中,应使用初始任务执行标志(A20015)或任务开始标志(A20014)来初始化任务。

在每一个任务的第一次执行过程中,初始任务执行标志(A20015)将为ON。

(6)把I/O存储单元划分成被所有任务共享的存储单元和仅供各任务独立使用的存储单元,然后再通过任务将各个任务独立使用的存储区组合起来。

3.提高任务编程效果的方法

对所有任务而言,在任务中最多可生成128个块程序。

每个完整的块程序由梯形图控制,但块程序中的指令只能用助记符表示。

换句话说,一个任务程序是用梯形图和助记符相结合形式来表示的。

使用块程序将使任务的逻辑流程变得更简单。

例如条件分支以及过程分步执行,都很难用梯形图来编写,而用块程序的处理都变得很容易了,如图5-9所示。

块程序放置在程序结构的最底部,并且代表任务的较大块程序可分割成几个像块程序那样的程序单元,这些单元可用相同的执行条件来操作。

任务编程通过块程序来编写,可提高编程效率。

 

 

图5-9任务编程的块程序示例

5.3.2循环任务的标志位

1.任务标志(TK00~TK31)

任务标志位在循环任务处于“就绪”状态时置为ON,在任务处于“禁止”状态(INI)或“等待”状态时置为OFF。

任务号00~31对应的任务标志为TK00~TK31。

这些标志位只在常规循环任务中使用,不能在附加循环任务或中断任务中使用。

如果在运行开始后执行一个中断任务,则处理时间最大的中断任务标志A44115将变为ON,并且将需要最大处理时间的那个中断任务号以两位十六进制数保存在A44100~A44107中。

2.初始任务执行标志(A20015)

当循环任务从“禁止”状态切换到“就绪”状态时,初始任务执行标志变为ON,任务才有权获取执行权,并第一次执行。

在任务第一次执行完毕后该标志位变为OFF。

尽管使用TKON(820)指令可使处于“等待”状态下的循环任务切换回“就绪”状态,但这不能被视为初始执行,初始任务执行标志位(A20015)不会变为ON。

如果循环任务被从“运行”状态切换到“禁止”状态或在获取执行权前被其他任务用TKOF(821)指令设为“等待”状态时,初始任务执行标志(A20015)也不会变为ON。

根据初始任务执行标志位,可知到循环任务是否是第一次执行。

因此,该标志位在任务中可用来执行初始化处理,其梯形图如图5-10(a)所示。

3.任务开始标志(A20014)

在每次任务周期开始时,任务开始标志位(A20014)可用来执行初始化处理,如图5-10(b)所示。

无论何时,只要循环任务从“禁止”状态(INI)或“等待”状态切换为“就绪”状态时,该任务开始标志位都将变为ON。

它与初始任务标志位(A20015)的变ON情况不同,而且这条指令仅限于CS1-H、CJ1-H、CJ1M或CS1D的CPU单元使用。

无论何时,只要任务从“等待”状态变为“运行”状态,任务开始标志(A20014)都可用来执行初始化处理,也就是当任务处于“等待”状态时,可使用TKON(820)指令来运行任务。

 

4.与任务相关的其他标志

(1)任务出错标志(A29512)

在一个周期内没有处于“就绪”状态的循环任务(包括附加循环任务)或分配给一个循环任务(包括附加循环任务)的程序不存在以及处于运行状态的中断任务无指派程序时,都会使任务出错标志位(A29512)变为ON。

(2)所有任务停止标志(A294)

当任务由于程序错误而停止执行时,任务的类型和当前任务号将存储在停止标志(A294)中。

对于循环任务来说,A294的0000H~001FH对应于任务号的00~31;对于中断任务来说,A294的8000H~80FFH对应于中断任务号的0~255。

A294中的信息使得用户很容易判断出在何处发生了致命错误,当致命错误消除后,该信息也被清除。

任务运行终止处的程序地址保存在A298和A299(即存储程序的高位地址)中。

5.4中断任务的编程

5.4.1中断任务的类型与标志

1.中断任务的类型

中断任务的类型有断电中断任务、定时中断任务、I/O中断任务和外部中断任务。

(1)断电中断任务

当电源被切断时执行的中断任务,称为断电中断任务,在编程时只能使用一个断电中断任务(中断任务号为1)。

这种中断方式主要用于当电源断电时,执行紧急处理。

在PLC的缺省设置中,循环任务执行一开始,断电中断任务是不运行的;而当断电中断任务被执行时,断电中断任务将在10ms以后停止,因此,断电中断任务的执行时间必须小于10ms。

如果在PLC设置中设定断电检测延迟时间,则在10ms减去断电检测延迟时间之后停止断电中断任务的执行。

由此可见,断电中断任务必须在10ms减去断电检测延迟时间之内执行完成。

否则,断电中断任务将被强制退出执行。

例如,如果断电检测延迟时间在PLC设置中设定为4ms,那么断电中断任务的执行时间必须小于6ms。

当电源低于额定电压的85%(相当于断电)时,PLC系统将识别到断电条件,并且在断电中断任务实际执行前所花的时间等于PLC设置中的缺省的断电检测时间(10~25ms)加上断电检测延迟时间(0~10ms)的这段时间内,循环任务还将执行,其示意关系如图5-11所示。

 

图5-11执行断电中断任务的示意图

(2)定时中断任务

以固定的时间间隔执行的中断任务,称为定时中断任务。

它最多有两个定时中断任务(中断任务号为2和3),用固定时间间隔来监控操作状态。

在循环任务执行中,通过MSKS(690)设置中断限定符(N),并且对指定的定时中断设定时间。

中断时间可在PLC设置时设为10ms或1.0ms为单位进行递增,缺省设置为10ms,定时中断时间的设置范围为0~9999。

在循环任务开始执行时,定时中断任务在PLC设置中的缺省状态为“禁止”状态。

执行下面步骤可运行定时中断任务。

①在循环任务中执行MSKS(设定中断)指令并预置定时中断时间。

其中,MSKS指令中的N为中断类型限定符,对于定时中断类型(CS1系列为2和3,CJ1系列为4和5),对应的定时中断任务号为2和3。

②在PLC设置中设定预定中断时间单位。

中断时间的设置值对循环任务有影响,因为中断时间越短,任务执行就越频繁,循环时间就越

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

当前位置:首页 > IT计算机 > 电脑基础知识

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2