第4章PLC编程及应用(第4版)ppt课件.ppt

上传人:牧羊曲112 文档编号:1623046 上传时间:2022-12-11 格式:PPT 页数:49 大小:1.05MB
返回 下载 相关 举报
第4章PLC编程及应用(第4版)ppt课件.ppt_第1页
第1页 / 共49页
第4章PLC编程及应用(第4版)ppt课件.ppt_第2页
第2页 / 共49页
第4章PLC编程及应用(第4版)ppt课件.ppt_第3页
第3页 / 共49页
第4章PLC编程及应用(第4版)ppt课件.ppt_第4页
第4页 / 共49页
第4章PLC编程及应用(第4版)ppt课件.ppt_第5页
第5页 / 共49页
点击查看更多>>
资源描述

《第4章PLC编程及应用(第4版)ppt课件.ppt》由会员分享,可在线阅读,更多相关《第4章PLC编程及应用(第4版)ppt课件.ppt(49页珍藏版)》请在三一办公上搜索。

1、第4章 S7-200 的功能指令,4.1 功能指令概述4.1.1 怎样学习功能指令 功能指令分为较常用的指令、与数据的基本操作有关的指令、与PLC的高级应用有关的指令和用得较少的指令。 初学功能指令时,首先可以按指令的分类浏览所有的指令。初学者没有必要花大量的时间去熟悉功能指令使用中的细节,应重点了解指令的基本功能和有关的基本概念。应通过读程序、编程序和调试程序来学习功能指令。4.1.2 S7-200 的指令规约,1使能输入与使能输出 使能输入端EN有能流流入方框指令时,指令才能被执行。 EN输入端有能流且指令执行时无错误,则使能输出ENO将能流传递给下一个方框指令或线圈。 语句表用AENO指

2、令来产生与方框指令的ENO相同的效果。删除AENO指令后,方框指令将由串联变为并联。,2梯形图中的指令 条件输入指令必须通过触点电路连接到左侧母线上。不需要条件的指令必须直接连接在左侧母线上。 3能流指示器 必须解决开路问题,网络才能成功编译。ENO端的可选能流指示器表示可将其他梯形图元件附加到该位置。它不影响编译。,4.2 数据处理指令4.2.1 比较指令与数据传送指令 1字节、整数、双整数和实数比较指令 比较触点中间的B、I、D、R、S分别表示无符号字节、有符号整数、有符号双整数、有符号实数和字符串比较。满足比较关系式给出的条件时,比较指令对应的触点接通。字符串比较指令的比较条件“x”只有

3、=和。 整数和双整数比较指令比较两个有符号数。IN1在触点的上面,IN2在触点下面。,【例4-1】 用接通延时定时器和比较指令组成占空比可调的脉冲发生器。 M0.2和T33组成脉冲发生器,T33的当前值按锯齿波变化。比较指令用来产生脉冲宽度可调的方波,Q0.0为OFF的时间取决于比较指令第2个操作数的值。 2字符串比较指令 字符串比较指令比较ASCII码字符串相等或不相等。常数字符串应是比较触点上面的参数,或比较指令中的第一个参数。,3字节、字、双字和实数的传送 传送指令助记符中最后的B、W、DW(或D)和R分别表示操作数为字节、字、双字和实数。 4字节、字、双字的块传送指令 块传送指令将起始

4、地址为IN的N个连续的存储单元中的数据,传送到从地址OUT开始的N个存储单元,字节变量N = 1255。,5字节立即读写指令 字节立即读取指令MOV_BIR读取IN指定的一个字节的物理输入,但是并不更新对应的过程映像输入寄存器。 字节立即写入指令MOV_BIW将一个字节的数值写入OUT指定的物理输出,同时更新对应的过程映像输出字节。 6字节交换指令 字节交换指令SWAP用来交换输入字IN的高字节与低字节。应采用脉冲执行方式。,4.2.2 移位与循环移位指令 移位位数N的数据类型为BYTE。 1右移位和左移位指令 移位指令将输入IN中的数各位的值向右或向左移动N位后,送给输出OUT指定的地址。移

5、位指令对移出位自动补0,有符号的字和双字的符号位也被移位。如果移位次数非0,“溢出”标志位SM1.1保存最后一次被移出的位的值。,2循环右移位和循环左移位指令 循环移位指令将输入IN中各位的值向右或向左循环移动N位后,送给输出OUT指定的地址。被移出来的位将返回到另一端空出来的位置。移出的最后一位的数值存放在溢出标志位SM1.1。 如果移动的位数N大于允许值,执行循环移位之前先对N进行求模运算。例如字循环移位时,将N除以16后取余数,得到的有效移位次数为015。如果为0则不移位。符号位也被移位。,3移位寄存器指令 下图中的14位移位寄存器由V30.0 V31.5组成,在I0.3的上升沿,I0.

6、4的值从移位寄存器的最低位V30.0移入,寄存器中的各位左移一位,最高位V31.5的值被移到溢出标志位SM1.1。 N为14时,I0.4的值从最高位V31.5移入,寄存器中的各位右移一位,从最低位V30.0移到溢出标志位SM1.1。,4.2.3 数据转换指令 1标准转换指令 除了解码、编码指令之外的10条指令属于标准转换指令。输入参数IN指定的数据转换后保存到输出参数OUT指定的地址。BCD码与整数相互转换的指令中,整数的有效范围为09999。 如果转换后的数值超出输出的允许范围,溢出标志位SM1.1被置为ON。 2段码指令 七段显示器的D0D6段分别对应于段码指令输出字节的第0位第6位,某段

7、应亮时输出字节中对应的位为1,反之为0。段码指令很少使用。,3计算程序中的数据转换下图将101英寸转换为以mm为单位的双整数值。,4解码指令与编码指令 解码指令DECO根据输入字节IN的最低4位表示的位号,将输出字OUT对应的位置为1,输出字的其他位均为0。16#0010=2#0000 0000 0001 0000。 编码指令ENCO将输入字IN中的最低有效位(为1的位)的位编号写入输出字节OUT的最低4位。16#0014=0000 0000 0001 0100。 存储器填充指令FILL用输入参数IN指定的字值填充从地址OUT开始的N个连续的字。,4.2.5 实时时钟指令 1用编程软件读取与设

8、置实时时钟的日期和时间 用菜单命令“PLC”“实时时钟”打开“CPU时钟操作对话框”。可以读取PC、PLC的时钟,修改和下载日期时间。 2读取实时时钟指令READ_RTC 从CPU的实时时钟读取当前日期和时间,8字节时间缓冲区依次存放年的低2位、月、日、时、分、秒、0和星期的代码,星期日为1。日期和时间的数据类型为字节型BCD码。 3设置实时时钟指令SET_RTC将8字节时间日期值写入CPU的实时时钟。,【例4-2】用实时时钟定时控制设备。LDSM0.0TODRVB70/小时分钟值在VW73LDW= VW73, VW78/VW78中是起始时、分值AWVW73, VW80/VW80中是结束时、分

9、值=Q0.2/在设置的时间范围内, Q0.2为1状态,4.3 数学运算指令4.3.1 整数运算指令 1四则运算指令 梯形图IN1 + IN2 = OUT,IN1IN2 = OUT,IN1 * IN2 = OUT,IN1 / IN2 = OUT 语句表IN1+OUT = OUT,OUTIN1 = OUT,IN1*OUT = OUT,OUT/IN1=OUT 指令影响SM1.0(零标志)、SM1.1(溢出标志)、SM1.2(负数标志)和SM1.3(除数为0)。MUL将两个16位整数相乘,产生一个32位乘积。DIV指令将两个16位整数相除,运算结果的高16位为余数,低16位为商。,【例4-3】设计程序

10、,用模拟电位器设置定时器T37的预设值为520s。 SMB28中电位器的位置对应的数字N为0255。时间设定值为150N/255+50。用累加器来存放操作数和运算的中间结果比较方便。,2递增与递减指令梯形图中IN + 1 = OUT,语句表中OUT+1=OUT,4.3.2 浮点数函数运算指令 1三角函数指令 输入值是以弧度为单位的浮点数,角度值乘以/180转换为弧度值。 2自然对数和自然指数指令 3平方根指令将正实数开平方,4.3.3 逻辑运算指令 1取反指令 取反指令将二进制数逐位取反,各位由0变为1,由1变为0。,2逻辑运算指令 字节、字、双字“与”运算时,如果两个操作数的同一位均为1,运

11、算结果的对应位为1,否则为0。“或”运算时如果两个操作数的同一位均为0,运算结果的对应位为0,否则为1。“异或”(Exclusive Or)运算时如果两个操作数的同一位不同,运算结果的对应位为1,否则为0。,3逻辑运算指令应用举例 用字节逻辑“或”运算将QB0的第24位置为1,其余各位保持不变。 QB0的某一位与1作“或”运算,运算结果为1,与0作“或”运算,运算结果不变。16#1C的第24位为1。 IW2的低12位用来读取3位拨码开关的BCD码,IW2的高4位另作他用。 16#0FFF的最高4位二进制数为0,低12位为1。与IW2作“与”运算后, VW2的低12位与IW2的低12位的值相同,

12、VW2的高4位为0。,4.4 程序控制指令4.4.1 跳转指令 1跳转与标号指令 JMP线圈通电时,跳转条件满足,跳转指令使程序流程跳转到对应的标号处。JMP与LBL指令的操作数n为常数0255,只能在同一个程序块中跳转。 I0.4的常开触点断开时,跳转条件不满足,顺序执行下面的网络。 I0.4的常开触点接通时,跳转到标号LBL 0处,不执行第二个网络。,2跳转指令对定时器的影响 在各定时器正在定时时跳转,100ms定时器停止定时,当前值保持不变。10ms和1ms定时器继续定时,定时时间到时跳转区外的触点也会动作。停止跳转时100ms定时器继续定时。 3跳转对功能指令的影响 未跳转时INC_B

13、指令使VB0每秒加1。跳转条件满足时VB0的值保持不变。,图4-27 跳转与定时器,【例4-6】 用跳转指令实现图4-28中的流程图的要求。,4.4.2 循环指令 1单重循环 驱动FOR指令的逻辑条件满足时,反复执行FOR与NEXT之间的指令。执行到NEXT指令时,INDX的值加1,如果INDX的值小于等于结束值FINAL,返回去执行FOR与NEXT之间的指令。如果INDX的值大于结束值,循环终止。 【例4-7】在I0.5的上升沿,求VB10 VB13这4个字节的异或值,用VB14保存。首先将VB14清0,并设置地址指针AC1的初始值。 第一次循环将指针AC1所指的VB10与VB14异或,然后

14、将指针值加1,指针指向VB11,为下一次循环的异或运算做好准备。 VB10VB13同一位中1的个数为奇数时,VB14对应位的值为1,反之为0。,2多重循环 循环最多可以嵌套8层。 在I0.1的上升沿,执行10次外层循环,如果I0.2为ON,每执行一次外层循环,将执行8次内层循环。执行完后,VW6的值增加80。,4.4.3 其他指令 1条件结束指令与条件停止指令 条件结束指令END的逻辑条件满足时终止当前的扫描周期。条件停止指令STOP使CPU从RUN模式切换到STOP模式。 2监控定时器复位指令 T32等组成一个脉冲发生器,从I0.3的上升沿开始,M0.2输出一个宽度等于T32预设值的脉冲。在

15、脉冲期间反复执行JMP指令,因此扫描时间略大于T32的预设值。扫描周期超过 500ms时,CPU自动切换到STOP模式。 可用WDR指令重新触发监控定时器,以扩展允许使用的扫描时间。 3诊断LED指令很少使用。,4.5 局部变量与子程序4.5.1 局部变量 1局部变量与全局变量 每个程序组织单元(POU)均有由64字节局部(L)存储器组成的局部变量。局部变量只在它被创建的POU中有效,全局符号在各POU中均有效。局部变量有以下优点: 1) 尽量使用局部变量的子程序易于移植到别的项目。 2) 同一级POU的局部变量使用公用的存储区。 3)局部变量用来在子程序和调用它的程序之间传递输入参数和输出参

16、数。 2查看局部变量表 可上下拖动分裂条,打开和关闭局部变量表。 3局部变量的类型 临时变量(TEMP)是暂时保存在局部数据区中的变量。主程序或中断程序只有TEMP变量。 IN (输入参数) 用来将调用它的POU提供的数据值传入子程序。 OUT(输出参数)用来将子程序的执行结果返回给调用它的POU。,IN_OUT(输入_输出参数)的初始值由调用它的POU传送给子程序,并用同一参数将子程序的执行结果返回给调用它的POU。 每个子程序最多可以使用16个输入/输出参数。 4在局部变量表中增加和删除变量 子程序中变量名称前面的“#”表示局部变量,是软件自动添加的。 5局部变量的地址分配 由编程软件自动

17、分配局部变量的地址。 6局部变量数据类型检查 局部变量表中指定的数据类型应与调用它的POU的变量的数据类型匹配。4.5.2 子程序的编写与调用 1子程序的作用 子程序将程序分成容易管理的小块,使程序结构简单清晰,易于查错和维护。可以多次调用同一个子程序,使用子程序可以减少扫描时间。 2子程序的创建 执行“编辑”菜单中的命令“插入”“子程序”。,3子程序举例 子程序的重命名,生成局部变量,编写程序。 4子程序的调用:将指令树中的子程序“拖”到程序编辑器中需要的位置。,如果用语句表编程,子程序调用指令的格式为 CALL 子程序名称,参数1,参数2,参数nn = 116。 在语句表中调用带参数的子程

18、序时,输入参数在最前面,其次是输入/输出参数,最后是输出参数。梯形图中从上到下的同类参数,在语句表中按从左到右的顺序排列。 在调用子程序时,CPU保存当前的逻辑堆栈,将栈顶值置为1,堆栈中的其他值清零,控制转移至被调用的子程序。该子程序执行完后,CPU将堆栈恢复为调用时保存的数值,并将控制权交还给调用子程序的POU。 子程序在同一个周期内被多次调用时,子程序内部不能使用上升沿、下降沿、定时器和计数器指令。 如果在使用子程序调用指令后修改了该子程序中的局部变量表,调用指令将变为无效。必须删除无效调用,重新调用修改后的子程序。,子程序调用最多可以嵌套8级,中断程序中调用的子程序不能再调用别的子程序

19、。 5用地址指针作输入参数的子程序 【例4-8】 对VB10开始的4B数据作异或运算。,6子程序中的定时器 停止调用子程序时,如果子程序中的定时器正在定时,100ms定时器将停止定时,当前值保持不变,重新调用时继续定时;1ms、10ms定时器继续定时,定时时间到时,其常开触点可以在子程序之外起作用。 7子程序的有条件返回 子程序中的RET线圈通电时,子程序被终止执行,返回调用它的程序。,8有保持功能的电路的处理 如果参数“电机”的数据类型为输出(OUT),两次调用子程序SBR_0,因为保存参数“电机”(L0.2)的存储器是共用的,接通I0.0外接的小开关,Q0.0和Q0.1同时变为ON。 将输

20、出参数“电机”的变量类型改为IN_OUT,参数“电机”返回的运算结果分别用Q0.0和Q0.1保存,解决了上述问题。,4.6 中断程序与中断指令4.6.1 中断的基本概念与中断事件 在中断事件发生时由操作系统立即调用中断程序。中断程序是用户编写的。中断程序不能再被中断,中断程序越短越好。 中断事件号见表4-12。4.6.2 中断指令 1中断允许指令与中断禁止指令 中断允许指令ENI允许处理所有被连接的中断事件。 禁止中断指令DISI禁止处理所有中断事件。进入RUN模式时自动禁止中断。,2中断连接指令与中断分离指令 中断连接指令ATCH建立中断事件EVNT与对应的中断程序INT的联系。中断事件由中

21、断事件号指定,中断程序由中断程序号指定。 中断分离指令DTCH断开中断事件与中断程序之间的联系。 3中断程序的执行 CPU自动调用中断程序需要满足下列条件: 1)执行了全局中断允许指令ENI。 2)执行了中断事件对应的ATCH指令。 3)出现对应的中断事件。 4中断优先级与中断队列溢出 中断优先级分组:通信(最高优先级)、I/O中断和定时中断。在优先级范围内,CPU按照先来先服务的原则处理中断。4.6.3 中断程序举例 1通信端口中断 在自由端口模式,接收消息完成、发送消息完成和接收一个字符均可以产生中断事件。 2I/O中断 I/O中断包括I0.0I0.3的上升沿、下降沿中断;高速计数器的当前

22、值等于设定值、计数方向改变和计数器外部复位中断。,【例4-9】在I0.0的上升沿通过中断使Q0.0立即置位。在I0.1的下降沿通过中断使Q0.0立即复位。/主程序 OB1LD SM0.1 / 第一次扫描时ATCH INT_0, 0 / I0.0上升沿时执行0号中断程序ATCH INT_1, 3 / I0.1下降沿时执行1号中断程序ENI / 允许全局中断LD SM5.0/如果检测到 I/O 错误DTCH0/禁用I0.0的上升沿中断DTCH3/禁用I0.1的下降沿中断 /中断程序0(INT_0)LD SM0.0 / 该位总是为ONSIQ0.0, 1/ 使Q0.0立即置位TODRVB10/读实时时

23、钟/中断程序1(INT_1)LD SM0.0 / 该位总是为ONRIQ0.0, 1/ 使Q0.0立即复位TODRVB20/读实时时钟,3定时中断 定时中断0、1的周期为1255ms,分别写入SMB34和SMB35。每当定时时间到时,执行相应的定时中断程序。 【例4-10】用定时中断0实现周期为2s的高精度定时。/ 主程序 OB1LD SM0.1 / 第一次扫描时MOVB 0, VB10 / 将中断次数计数器清0MOVB 250, SMB34 / 设置定时中断0的中断时间间隔为250msATCH INT_0, 10 / 指定产生定时中断0时执行0号中断程序ENI / 允许全局中断/ 中断程序IN

24、T_0, 每隔250ms中断一次LD SM0.0 / 该位总是为ONINCBVB10/ 中断次数计数器加1LDB=8, VB10 / 如果中断了8次(2s)MOVB 0, VB10 / 将中断次数计数器清0INCB QB0 / 每2s将QB0加1,4. 定时器T32/T96中断 【例4-11】使用T32中断控制8位节日彩灯,每2.5s左移一位。1ms定时器T32定时时间的中断事件号为21,最长定时时间为32.767s。/主程序 OB1LD SM0.1 /第一次扫描时MOVB 16#F, QB0/设置彩灯的初始状态,最低4位的灯被点亮ATCH INT_0, 21 /指定T32定时时间到时执行中断

25、程序INT_0ENI /允许全局中断LDNM0.0/T32和M0.0组成脉冲发生器TONT32, 2500/T32 的预设值为2500msLD T32=M0.0/中断程序INT_0LD SM0.0 RLB QB0, 1/彩灯左移1位,4.7 高速计数器与高速脉冲输出指令4.7.1 高速计数器的工作模式与外部输入信号 1增量式编码器 高速计数器一般与增量式编码器配合使用,单通道增量式编码器只产生一个脉冲序列。双通道A、B相型编码器提供转速和转轴旋转方向的信息。三通道增量式编码器的Z相零位脉冲用作系统清零信号,或作为坐标的原点。 2绝对式编码器 绝对式编码器输出多位二进制数,反映了运动物体所处的绝

26、对位置。 3高速计数器的工作模式 高速计数器HSC0HSC5有13种工作模式: 1) 无外部方向控制信号的单相加/减计数器(模式02)。 2) 带外部方向控制信号的单相加/减计数器(模式35)。 3) 有加、减计数时钟脉冲输入的双相计数器(模式68)。 4) A/B相正交计数器(模式911),两路计数脉冲的相位互差90。 根据有无复位输入和启动输入,上述4类工作模式又可以各分为3种。 模式12用HSC0、HSC3计Q0.0、Q0.1输出的高速脉冲。,图4-42 1倍速A/B相正交计数器 A/B相正交计数器可以选择1倍速模式和4倍速模式,1倍速模式在时钟脉冲的每一个周期计1次数,4倍速模式在两个

27、时钟脉冲的上升沿和下降沿都要计数。,4高速计数器的外部输入信号见表4-16。4.7.2 高速计数器的程序设计 1高速计数器指令 HDEF指令定义高速计数器的工作模式,HSC指令用来激活高速计数器。 【例4-12】要求高速计数器HSC0用模式0的计数来周期性地控制Q0.1和Q0.2,计数脉冲的周期为1ms。,第1页选中配置“HC0”,计数模式为默认的模式0。 第2页采用默认的计数器初始化子程序的符号名HSC_INIT。设置计数器的预设值PV为3000,当前值CV为默认的0,初始计数方向为加计数。 第3页(中断)设置当前值等于预设值时产生中断,使用默认的中断程序符号名COUNT_EQ。本例设置为3

28、步。 第4页(第1步)自动选中“连接此事件到一个新的中断程序”,采用默认的新的中断程序的名称HSC0_STEP1。设置“新PV”为6000,不更新计数当前值和计数方向。单击上面的“下一步”按钮。 第5页(第2步)自动选中“连接此事件到一个新的中断程序”,采用默认的新的INT的名称HSC0_STEP2。设置新的计数方向为减计数,更新计数当前值为3500,新的预设值为0。单击上面的“下一步”按钮。 第6页(第3步)选中“连接此事件到一个新的中断程序”,设置新INT的名称为COUNT_EQ。预设值更新为3000,不更新计数当前值,新的计数方向为加计数。实际上是开始下一周期的计数操作。单击下面的“下一

29、步”按钮。 第7页(组件)显示将要自动生成的初始化计数器子程序HSC_INIT和3个中断程序。 程序中对Q0.1和Q0.2置位和复位的指令是人工添加的。 主程序在I0.1的上升沿时调用HSC_INIT。,4.7.3 高速脉冲输出与开环位置控制 1PWM发生器 占空比是脉冲宽度与脉冲周期之比。 脉冲列(PTO)功能提供周期与脉冲数目可以由用户控制的占空比为50%的方波脉冲输出。脉冲宽度调制 (PWM) 功能提供连续的、周期与脉冲宽度可以由用户控制的输出。 CPU用Q0.0和Q0.1输出脉冲,CPU 224XP的最高脉冲频率为100kHz。 用脉冲输出向导生成PWM指令PWMx_RUN,时间基准为

30、s。输入参数RUN为ON时输出脉冲。,4.8 数据块应用与字符串指令4.8.1 数据块概述 1在数据块中对地址和数据赋值 数据块用来给V存储器的字节、字和双字地址赋初始值。 数据块的第一行必须包含明确的地址(包括符号地址),以后的行可以不包含明确的地址。在单地址值后面键入多个数据或键入只包含数据的行时,由编辑器进行地址赋值。,2错误处理 输入错误的地址和数据、地址在数据值之后、数值超出允许范围、使用非法语法或无效值、使用了符号地址或中文的标点符号时,错误行的左边出现红色的叉 ,出错的地址或数据的下面用波浪线标示。用输出窗口显示编译错误。,4.8.2 字符、字符串与数据的转换指令 1字符和字符串

31、的表示方法 字符串常量的第一个字节是字符串的长度(即字符个数)。在符号表和程序编辑器中,字节、字和双字的ASCII字符用英语的单引号表示,例如A、AB和AB12。ASCII常量字符串用英语的双引号表示,例如”ABCDE”。 数据块用英语的单引号定义字符常量,可以将VB地址分配给任意个字符的常量,将VW和VD地址分别分配给2个和4个字符的常量。用英语的双引号定义最多254个字符的字符串,只能将V或VB地址用于字符串分配。 程序编辑器中用英语的单引号表示1个、2个、4个ASCII字符常量。用英语的双引号定义最多126个字符的字符串。有效的地址为VB。,4.8.3 字符串指令 1复制、连接字符串和求

32、字符串长度指令 求字符串长度指令SLEN返回输入参数IN指定的字符串的长度值。 字符串复制指令SCPY将参数IN指定的字符串复制到OUT指定的字符串。 字符串连接指令SCAT将参数IN指定的字符串附加到OUT指定的字符串后面。 【例4-14】字符串指令应用举例。LD I0.3SCPY HELLO , VB70 /将字符串HELLO 复制到VB70开始的存储区SCAT WORLD, VB70 /将字符串WORLD附到VB70开始的字符串的后面SLEN VB70, VB82 /求VB70开始的字符串的长度,2从字符串中复制子字符串指令 执行完例4-14中的程序后,SSTR_CPY指令将IN指定的字符串“HELLO WORLD”中的第7个字符开始的5个字符WORLD复制到VB83开始的新字符串中。 3字符串搜索指令 STR_FIND指令在IN1指定的字符串“HELLO WORLD”中,搜索字符串“WORLD”,用地址VB89保存字符WORLD的首个字符W在字符串IN1中的位置。VB89的初始值为1表示从第一个字符开始搜索。如果没有找到,OUT被清零。,

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

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号