通用数字PID调节器设计

作者&投稿:始该 (若有异议请与网页底部的电邮联系)
急!急!急!求助:设计并实现通用数字PID控制器!~

已发送,请查收!

啊实打实

PID调节器主控部分包括以下几个部分:单片机部分、A/D转换部分、D/A转换部分、稳压部分、数字输入输出部分以及串口通信部分。
D1:内部设定点信号灯
S1:内部设定点和外部设定点转换开关
D2:手动信号灯
S2:手动自动转换开关
D3:实际值X显示信号灯
D4:设定值W显示信号灯
S3:参数修改以及实际值和设定值显示转换开关
D5:超过限定值信号灯
D6:低于限定值信号灯
S4:设定值增加按钮
S5:设定值减少按钮
S6:修改手动变量按钮
S7:修改手动变量按钮
附录[1] 主程序—MAIN.C
#include"adconver.h"
#include"delay.h"
#include"dis7281.h"
#include"STC12C5410AD.H"
#include"main.H"
#include"subkey0.h"
#include"subkey1.h"
#include"subkey2.h"
#include"subkey3.h"
#include"subkey4.h"
#include"subkey5.h"
#include"subkey6.h"
bit insertsetframe=1;//内部设定标志位
bit handframe=1;//手动设定标志位
bit improvedisframe=0;//实际值标志位
bit shineframe=0;//判断是不是第一次开机停止4LED的闪烁
bit canshuframe=0x00;//参数标志位
unsigned char circleframe=0x00;//参数循环变量
unsigned char channelframe=0x00;//通道标志位
unsigned char ledframe=0xfc;//LED灯管状态
unsigned char times=0x00;//记数位
unsigned char readkey;
unsigned int setvalue=0x00;//设定值
unsigned char outputvalue=0x00;//输出值
unsigned int limup=0x270f;//实际值上限
unsigned int limdown=0x00;//实际值下限
unsigned int a1=0x270f;//上限报警值
unsigned int a2=0x00;//下限报警值
unsigned int cp=0x00;//P参数
unsigned int ci=0x00;//I参数
unsigned int cd=0x00;//D参数
unsigned char led[6];//LED值公共
main()
{
unsigned int tmr;
unsigned char keynumber;

for (tmr=0;tmr<0xffff;tmr++);
write7281(0x12,0x80);
write7281(0x10,0xf0);
write7281(0x00,0xc8);
write7281(0x14,0x1b);
write7281(0x14,0x2e);
write7281(0x15,0x30);
write7281(0x15,0x40);
write7281(0x15,0x50);
write7281(0x06,0xfc);
while(1)
{
while(!key)
{
keynumber=read7281(0x13);
switch(keynumber)
{
case 0x00:
subkey0();break;
case 0x01:
subkey1();break;
case 0x02:
subkey2();break;
case 0x03:
subkey3();break;
case 0x04:
subkey4();break;
case 0x05:
subkey5();break;
case 0x06:
subkey6();break;
default:
break;
}
}
}
}
附录[2] S1模块的程序—SUBKEY0.C
#include"delay.h"
#include"dis7281.h"
#include"STC12C5410AD.H"
#include"main.H"
#include"subkey0.h"
void subkey0()
{
if(insertsetframe==1)
{
insertsetframe=0;
ledframe|=0x01;
write7281(0x06,ledframe);
}
else
{
insertsetframe=1;
ledframe&=0xfe;
write7281(0x06,ledframe);
}
}//更改内部设定和外部设定的状态,并将相应的状态位进行更改,并更改状态灯
附录[3] S2模块的程序—SUBKEY1.C
#include"delay.h"
#include"dis7281.h"
#include"STC12C5410AD.H"
#include"main.H"
#include"subkey1.h"
void subkey1()
{
if(handframe==1)
{
handframe=0;
ledframe|=0x02;
write7281(0x06,ledframe);
}
else
{
handframe=1;
ledframe&=0xfd;
write7281(0x06,ledframe);
}
} //更改手动自动状态,改变相应的状态位,更改相应的状态灯
附录[4] S3模块的程序—SUBKEY2.C
#include"delay.h"
#include"dis7281.h"
#include"STC12C5410AD.H"
#include"main.H"
#include"subkey2.h"
#include"adconver.h"
#include"subkey0.h"
#include"subkey1.h"
#include"hdconver.h"
#include"subkey3.h"
#include"subkey4.h"
#include"pid.h"
#include"daconver.h"
void subkey2()
{
if(shineframe==0)
{
write7281(0x10,0xff);
shineframe=1;
}
else
{
skey2();
}
}
void skey2(void)
{ // canshuframe=1;
write7281(0x18,0x17);
switch(circleframe)
{
case 0x00: ledframe|=0x0c;
write7281(0x06,ledframe);
circleframe+=1;
hdconver(limup);//4LED显示上限值
dis4led();
write7281(0x14,0x41);
write7281(0x14,0x5C); //写入2LEDHI
break;
case 0x01: circleframe+=1;
hdconver(limdown);//4LED显示下限值
dis4led();
write7281(0x14,0x40);
write7281(0x14,0x5d); //写入2LEDLO
break;
case 0x02: circleframe+=1;
hdconver(a1);//4LED显示上限报警
dis4led();
write7281(0x14,0x41);
write7281(0x15,0x5a); //写入2LEDA1
break;
case 0x03: circleframe+=1;
hdconver(a2);//4LED显示下限报警
dis4led();
write7281(0x14,0x42);
write7281(0x15,0x5a); //写入2LEDA2
break;
case 0x04: circleframe+=1;
hdconver(cp);//4LED显示P参数
dis4led();
write7281(0x14,0x4e);
write7281(0x14,0x5f); //写入2LEDP
break;
case 0x05: circleframe+=1;
hdconver(ci);//4LED显示I参数
dis4led();
write7281(0x14,0x41);
write7281(0x14,0x5f); //写入2LEDI
break;
case 0x06: circleframe+=1;
hdconver(cd);//4LED显示D参数
dis4led();
write7281(0x15,0x4d);
write7281(0x14,0x5f); //写入2LEDI
break;
case 0x07: improvedisframe=0;
ledframe=(ledframe|0x08)&0xfb;
circleframe+=1;
adconver();
write7281(0x14,0x40);
write7281(0x14,channelframe);
write7281(0x06,ledframe);
break;
case 0x08: improvedisframe=1;
ledframe=(ledframe|0x04)&0xf7;
circleframe=0;
pidcf();
daconver();
hdconver(setvalue);
dis4led();
write7281(0x06,ledframe);
break;
default:
break;
}
}//按相应的S3改变不同的参数
附录[5] S4模块的程序—SUBKEY3.C
#include"delay.h"
#include"dis7281.h"
#include"STC12C5410AD.H"
#include"main.H"
#include"subkey3.h"
#include"subkey2.h"
#include"hdconver.h"
void subkey3()
{
switch(circleframe)
{
case 0x01:limup=add1(limup);
break;
case 0x02:limdown=add1(limdown);
break;
case 0x03:a1=add1(a1);
break;
case 0x04:a2=add1(a2);
break;
case 0x05:cp=add1(cp);
break;
case 0x06:ci=add1(ci);
break;
case 0x07:cd=add1(cd);
break;
case 0x00:setvalue=add1(setvalue);
break;
default:
break;
}
}
unsigned int add1(unsigned int value)
{
ledframe|=0x20;//关掉下限报警
write7281(0x06,ledframe);
if(value==9999)
{
ledframe&=0xef;//打开上限报警灯
write7281(0x06,ledframe);
write7281(0x06,ledframe);
}
else
{
value+=1;
}
hdconver(value);
dis4led();
return(value);
}
附录[6] S5模块的程序—SUBKEY4.C
#include"delay.h"
#include"dis7281.h"
#include"STC12C5410AD.H"
#include"main.H"
#include"subkey4.h"
#include"subkey2.h"
#include"hdconver.h"
void subkey4()
{
switch(circleframe)
{
case 0x01:limup=sub1(limup);
break;
case 0x02:limdown=sub1(limdown);
break;
case 0x03:a1=sub1(a1);
break;
case 0x04:a2=sub1(a2);
break;
case 0x05:cp=sub1(cp);
break;
case 0x06:ci=sub1(ci);
break;
case 0x07:cd=sub1(cd);
break;
case 0x00:setvalue=sub1(setvalue);
break;
default:
break;
}
}
unsigned int sub1(unsigned int value)
{
ledframe|=0x10;//关掉上限报?
write7281(0x06,ledframe);
if(value==0)
{

ledframe&=0xdf;//打开上限报警灯
write7281(0x06,ledframe);
}
else
{
value-=1;
}
hdconver(value);
dis4led();
return(value);
}
附录[7] S6模块的程序—SUBKEY5.C
#include"delay.h"
#include"dis7281.h"
#include"STC12C5410AD.H"
#include"main.H"
#include"subkey5.h"
#include"hdconver.h"
void subkey5()
{
if(improvedisframe==0)
{
channelframe=0x00;
write7281(0x15,0x40);
write7281(0x15,0x50);//若现在状态为实际值,则改变通道状态并显示现在状态为00
}
else
{
if(handframe==1)
{
ledframe|=0x10;//关掉上限报警灯
write7281(0x06,ledframe);
if(outputvalue==0x00)
{
ledframe&=0xdf;//打开下限报警灯
write7281(0x06,ledframe);
}
else
{
outputvalue-=1;
hdconver2(outputvalue);
}
dis2led();
}

}
}
附录[7] S7模块的程序—SUBKEY6.C
#include"delay.h"
#include"dis7281.h"
#include"STC12C5410AD.H"
#include"main.H"
#include"subkey6.h"
#include"hdconver.h"
void subkey6()
{
if(improvedisframe==0)
{
channelframe=0x01;
write7281(0x15,0x41);
write7281(0x15,0x50);//若现状态为实际值,则2LED显示为01
}
else
{
if(handframe==1)
{
ledframe|=0x20;//关掉下限报警灯
write7281(0x06,ledframe);
if(outputvalue==99)
{
ledframe&=0xef;//打开上限报警档?
write7281(0x06,ledframe);
}
else
{
outputvalue+=1;
hdconver2(outputvalue);
}
}
dis2led();
}
}
附录[8] A/D转换模块的程序—ADCONVER.C
#include"STC12C5410AD.H"
#include"adconver.H"
#include"delay.h"
#include"main.h"
#include"dis7281.h"
#include"hdconver.h"
void adconver()
{ unsigned char adchanne=0xe0;//设置P1的0.1位为AD输入通道
ADC_CONTR=(0x80|ADC_CONTR)+channelframe;//开启AD模拟电源
delay(1000);
P1M0=0x03;
P1M1=0x03;//设置通道为开漏模式
ADC_CONTR=adchanne+channelframe;//设置AD转换通道
delay(22);
ADC_DATA=0x00;
ADC_LOW2=0x00;//清除数据口
ADC_CONTR|=0x08;//开启AD端口
while(!(ADC_CONTR&0x10)){};//等待AD转换完成
ADC_CONTR&=0xe7;//停止AD转换
P1M0&=0xfd;
P1M1&=0xfd;//设置P1口为普通IO模式
addis();
}
void addis()
{
unsigned int addata;
double liangch;
liangch=(limup-limdown)/100;
addata=ADC_DATA+(ADC_LOW2&0x03)*1024;
liangch=liangch/1023*addata;
addata=(unsigned int)liangch;
if(addata>a1)
{
ledframe&=0xef;//打开上限报警灯
write7281(0x06,ledframe);
}
if(addata<a2)
{
ledframe&=0xdf;//打开上限报警灯
write7281(0x06,ledframe);
}
hdconver(addata);
dis4led();
}
附录[8] D/A转换模块的程序—DACONVER.C
#include"delay.h"
#include"STC12C5410AD.H"
#include"main.H"
#include"daconver.h"
sbit TLV5618_SCLK=P1^7;
sbit TLV5618_DIN=P1^5;
sbit TLV5618_CS=P1^4;
void mDelay(unsigned int a)
{unsigned int f;
for(f=0;f<a;f++);
}
void TLV5618 (unsigned int da)
{
unsigned int i;
unsigned int dat;
dat= da|0xc000;
TLV5618_CS=0;
TLV5618_SCLK=0;
for(i=0;i<16;i++)
{
TLV5618_DIN=(bit)(dat&0x8000);
dat=dat<<1;
TLV5618_SCLK=1;
mDelay(50);
TLV5618_SCLK=0;
mDelay(50);
}
TLV5618_CS=1;
}
void daconver(void)
{ float i=100;
unsigned int da;
i=outputvalue/100*4096;
da=(unsigned int)i;
TLV5618 (da);
}
附录[9]显示及键盘模块的程序—DIS7281.C
#include"delay.H"
#include"STC12C5410AD.H"
#include"dis7281.H"
#include"main.h"
void write7281(unsigned char regadd,unsigned char writedata)
{
sendbyte(regadd);
sendbyte(writedata);
}
void sendbyte(unsigned char sendbyte)
{
unsigned char bitcounter;
clk=0;
clk=1;
do{
clk=0;
clk=1;
}while(dat);
clk=0;
clk=1;
while(!dat);
for(bitcounter=0;bitcounter<8;bitcounter++)
{
if ((sendbyte&0x80)==0)
{ dat=0;}
else
{dat=1;}
sendbyte=sendbyte*2;
clk=0;
clk=1;
delay(1);
}
dat=1;
delay(2);
}
unsigned char receivebyte(void)

{
unsigned char bit_counter;
unsigned char in_byte;

clk=0;
clk=1; //只发送一个单元的脉冲

while(dat);//等待BC7281响应DAT底电平

clk=0;
clk=1; //受到响应,再发一脉冲等待接受数据

for (bit_counter=0;bit_counter<8;bit_counter++ ) //接受8个BIT

{
delay(1);
in_byte=in_byte*2 ;//in_byte左移一位

if(dat) //如果DAT为1

{
in_byte=in_byte|0x01; //bit^0=1
}
clk=0;
clk=1;
}
delay(2);
clk=0;
clk=1;
return(in_byte);
}
unsigned char read7281(unsigned char reg_add)
{
sendbyte (0x80+reg_add); //发送读指令(BIT 7=1)

return (receivebyte()); //接受数据字节并返回

}
void dis4led()
{
unsigned char i;
unsigned char id=0x00;
for(i=0;i<4;i++)
{
write7281(0x14,id+led[i]);
id+=0x10;
}
}
void dis2led()
{
unsigned char i;
unsigned char id=0x40;
for(i=4;i<6;i++)
{
write7281(0x14,id+led[i]);
id+=0x10;
}
}
附录[10]PID算法模块的程序—PID.C
#include"adconver.h"
#include"STC12C5410AD.H"
#include"math.h"
#include"pid.h"
#include"hdconver.h"
#include"dis7281.h"
xdata struct _pid
{
int pv;
int sp;
float integral;
float pgain;
float igain;
float dgain;
int deadband;
int last_error;
};
xdata struct _pid warm,*pid;
xdata int process_point,set_point,dead_band;
xdata float p_gain,i_gain,d_gain,integral_val,new_integ;

void pid_init(struct _pid *warm,int process_point,int set_point)
{
struct _pid *pid;
pid=warm;
pid->pv=process_point;
pid->sp=set_point;
}
void pid_tune(struct _pid *pid,float p_gain,float i_gain,float d_gain,int dead_band)
{
pid->pgain=p_gain;
pid->igain=i_gain;
pid->dgain=d_gain;
pid->deadband=dead_band;
pid->integral=integral_val;
pid->last_error=0;
}
void pid_setinteg(struct _pid *pid,float new_integ)
{
pid->integral=new_integ;
pid->last_error=0;
}
void pid_bumpless(struct _pid *pid)
{
pid->last_error=(pid->sp)-(pid->pv);
}
float pid_calc(struct _pid *pid)
{
int err;
float pterm,dterm,result,ferror;
err=(pid->sp)-(pid->pv);
if(abs(err)>pid->deadband)
{
ferror=(float)err;
pterm=pid->pgain*ferror;
if(pterm>100||pterm<-100)
{
pid->integral=0.0;
}
else
{
pid->integral+=pid->igain*ferror;
if(pid->integral>100.0)
{
pid->integral=100.0;
}
else
{
if(pid->integral<0.0)
{
pid->integral=0.0;
}
}
}
dterm=((float)(err-pid->last_error))*pid->dgain;
result=pterm+pid->integral+dterm;
}
else
{
result=pid->integral;
}
pid->last_error=err;
return(result);
}
void pidcf(void)
{
int count=0;
float val=100;
float p_gain=cp/val;
float i_gain=ci/val;
float d_gain=cd/val;
// unsigned int dadata;
pid=&warm;
dead_band=2;
integral_val=(float)(0.01);
while(count<=20)
{
process_point=(unsigned int)addata/val;
set_point=(unsigned int)setvalue/val;
pid_init(&warm,process_point,set_point);
pid_tune(&warm,p_gain,i_gain,d_gain,dead_band);
pid_setinteg(&warm,0.0);
pid_bumpless(&warm);
count++;
}
outputvalue=(unsigned char)pid_calc(&warm);
hdconver2(outputvalue);
dis4led();
}


PID调节器数字实现是什么
基于PLC的数字PID调节器设计 编程是用梯形图 PID是由比例、微分、积分三个部分组成的,在实际应用中经常只使用其中的一项或者两项,如P、PI、PD、PID等。就可以达到控制要求...PLC编程指令里都会有PID这个功能指令...至于P,I,D 数值的确定要在现场的多次调试确定...比例控制(P):比例控制是最...

控制器参数整定方法有两大类
工程整定法:它主要依赖工程经验,直接在控制系统的试验中进行,且方法简单、易于掌握,在工程实际中被广泛采用。PID控制器参数的工程整定方法,主要有临界比例法、反应曲线法和衰减法、动态特性参数法、稳定边界法、阻尼振荡法、现场经验整定法、极限环自整定法等。控制器参数整定介绍:1、数字PID调节器...

什么是pid调节器
比如压力控制系统要采用压力传感器。电加热控制系统的传感器是温度传感器。目前,PID控制及其控制器或智能PID控制器(仪表)已经很多,产品已在工程实际中得到了广泛的应用,有各种各样的PID控制器产品,各大公司均开发了具有PID参数自整定功能的智能调节器(intelligent regulator),其中PID控制器参数的自动...

PID调节器各部分的作用分别是什么?
反之Ti大则积分作用弱,加入积分调节可使系统稳定性下降,动态响应变慢。积分作用常与另两种调节规律结合,组成PI调节器或PID调节器。3 微分调节作用:微分作用反映系统偏差信号的变化率,具有预见性,能预见偏差变化的趋势,因此能产生超前的控制作用,在偏差还没有形成之前,已被微分调节作用消除。因此,...

1.根据PI、PD、PID三种控制器的优缺点,说明各适用于什么场合?
一、PI,PD,PID系统的适用范围,不同的控制策略适用于不同的控制系统,对于PID策略,用户也可仅使用其中一部分功能或所有参数来控制不同的系统,例如可以使用PD调节器来调节大滞后环节。 二、PI、PD、PID优缺点: 1、PI调节器,兼顾快速性,减小或消除静差(I调节器无调节静差) 2、PD调节器,调节偏差快速变化时使调解量...

PID控制器是什么意思?
位置式=增量式的积分。位置式PID与过去输出状态量都有关;增量式PID只与现在和过去两个状态(即一共三个状态量)有关。执行器自带积分是指执行器输入为0时,执行器控制量输出是否能回到原位置(即是否有记忆性)。如当步进电机不输入脉冲时,位置不处于原位置,那么就说步进电机旋转位移自带积分,步进...

为什么要用PID控制?
在工程实际中,应用最为广泛的调节器控制规律为比例、积分、微分控制,简称PID控制,又称PID调节。即当我们不完全了解一个系统和被控对象,或不能通过有效的测量手段来获得系统参数时,最适合用PID控制技术。PID控制,实际中也有PI和PD控制。PID控制器就是根据系统的误差,利用比例、积分、微分计算出控制...

如何调节PID控制仪
2衰减曲线法:温度PID以4比1衰减作为整定要求,先切除调节器的积分和微分作用 ,用凑试法整定纯比例控制作用的比例带PB,使之符合4比1衰减比例的要求,记下此时的比例带PBs和振荡周期Ts即可改变参数。3、选择外给定控制功能:PID外给定控制仪可自动跟随外部给定值进行控制输出。可实现自动\/手动无扰动...

恒压供水系统为什么要用PID调节器?直接用变频器不可以吗?
PID是控制变频器的,是一种算法。变频器是控制电动机的,是一个电机驱动器。如果变频器里有自带PID ,那不用专用的PID调节器也是可以的,

什么是PLC 调节器
PLC调节器应该是利用PLC的功能完成一些复杂的自动控制,如PID调节器,以前PID调节器均由运算放大器组成,使用PLC实际上是数字PID调节器了。

桥西区13530523327: 怎样设计PID控制器 -
许元磺胺: 设计PID控制器是个综合性很强的工作.一般采用凑是法来设计.首先设计纯比例系统,即确定Kp的值,即将系统Kp不断增大,直到发生震荡,此时讲Kpm*0.6,即为比较理想的Kp.这时我们还应该测的震荡周期w,Ki=Kp*w/π;Kd=Kp*π/4*w,这只是经验的方法,绝对不是什么真理.所以参数的整定会需要长期的实验和经验才可以做出一个漂亮的系统.

桥西区13530523327: 模拟PID调节器的设计 -
许元磺胺: 其它相关电路的设计或方案(电源、通信等).四、软件设计 1. 分配系统资源,编写系统初始化和主程序模块; 2. 编写数字PID调节器软件模块; 3. 编写数字

桥西区13530523327: 计算机控制复习资料 -
许元磺胺: 一、 填空 1、 计算机控制系统按控制方式分类,可以分为开环控制和闭环控制. 2、 执行器按动力方式分类,可以分为电动执行器、气动执行器和液动执行器三大类. 3、 线性离散系统差分方程的求解方法通常有迭代法、古典法和变换法三...

桥西区13530523327: 如何根据系统的特性设计一个合理的pid控制器 -
许元磺胺: 1.一般情况下,仪表是输出一个4-20mA的PID控制电流到变频器,通过电流的大小改变变频器的转速,从而使被控设备达到工艺要求2.该仪表首先有一个检测对象,如料速,控制对象的压力,流量,高度等等.仪表通过测量对象的实时值与设定值进行比较,再通过对偏差进行PID补偿计算,从而改变控制电流大小,改变变频器频率输出,改变电机等转速,从而达到了被测量值向设定值接近,满足工艺.3.这是一个闭环控制系统,某一环节出现故障会导致系统失控,而P,I,D的参数能否设置合理,反应在系统能否即时,稳定的达到设定目标.

桥西区13530523327: 几种PID控制器设计方法的比较 -
许元磺胺: 文章针对被控对象模型未知的情况,给系统加入白噪声,测得输出数据,通过输入输出数据估计模型阶次与延迟时间,从而得到被控对象模型.仿真结果表明,辨识模型能较好地反映原过程的动态特性.在此基础上,利用内模法、直接综合法及频域法这三种方法进行了PID控制器的设计,同时用随机性能指标和确定性指标对系统性能进行了评价. (共4页)

桥西区13530523327: 如何用matlab做PID控制器设计 -
许元磺胺: 用matlab的simulink(控制系统仿真),直接建立模型就可以了,我现在也没装matlab,你自己试试不难的

桥西区13530523327: PID调节设计电路,整定的参数要达到什么效果?
许元磺胺: 自整定AT:按 键并保持2秒,将出现At参数,按 键将下显示窗的OFF修改on,再按 ... 仪表经过2个振荡周期的ON-OFF控制后可自动计算出PID参数. 如果要提前放弃自整...

桥西区13530523327: 如何进行pid参数整定 -
许元磺胺: 确定控制器参数 数字PID控制器控制参数的选择,可按连续-时间PID参数整定方法进行.在选择数字PID参数之前,首先应该确定控制器结构.对允许有静差(或稳态误差)的系统,可以适当选择P或PD控制器,使稳态误差在允许的范围内.对...

桥西区13530523327: PID控制小车的数学模型 -
许元磺胺: 4 轿车行驶系统分析设计4.1 轿车行驶系统控制要求简介 假定轿车沿直线路面行驶,轿车参数如下: 设轿车的质量m,本设计中取轿车的质量为100质量单位.Fe为轿车的引擎力,设最大驱动力为1000.设计要求如下:1.设计一个简单的PID调...

桥西区13530523327: PID算法温控C语言 -
许元磺胺: 1. PID调试步骤 没有一种控制算法比PID调节规律更有效、更方便的了.现在一些时髦点的调节器基本源自PID.甚至可以这样说:PID调节器是其它控制调节算法的妈. 为什么PID应用如此广泛、又长久不衰? 因为PID解决了自动控制理论所要...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网