PID控制中积分项深度解析

PID控制中积分项深度解析

引言:积分项的核心矛盾

在PID控制实践中,积分项常常让人又爱又恨。它既是我们消除稳态误差的利器,也是导致系统振荡积分饱和的元凶。理解积分项的本质,掌握其正确使用方法,是PID调参从入门到精通的关键一步。

一、积分项的数学本质与物理意义

1.1 连续域中的积分项

在连续时间PID控制器中,积分项表示为:

I(t)=Ki∫0te(τ)dτ I(t) = K_i \int_{0}^{t} e(\tau) d\tau I(t)=Ki0te(τ)dτ

其中:

  • KiK_iKi 为积分增益
  • e(t)=r(t)−y(t)e(t) = r(t) - y(t)e(t)=r(t)y(t) 为系统误差
  • τ\tauτ 为积分变量

1.2 离散化:从连续到数字

在数字控制器中,我们使用近似方法进行离散化。最常用的三种方法:

前向欧拉法
I(k)=KiTs∑i=0ke(i) I(k) = K_i T_s \sum_{i=0}^{k} e(i) I(k)=KiTsi=0ke(i)

后向欧拉法
I(k)=KiTs∑i=1ke(i) I(k) = K_i T_s \sum_{i=1}^{k} e(i) I(k)=KiTsi=1ke(i)

梯形法(Tustin变换)
I(k)=KiTs2∑i=0k[e(i)+e(i−1)] I(k) = K_i \frac{T_s}{2} \sum_{i=0}^{k} [e(i) + e(i-1)] I(k)=Ki2Tsi=0k[e(i)+e(i1)]

其中 TsT_sTs 为采样时间,kkk 为当前采样序号。

二、积分项的核心作用:为什么需要它?

2.1 消除稳态误差

稳态误差是指系统稳定后仍然存在的误差。考虑一个简单的水位控制系统:

// 模拟比例控制的水位系统
float water_level = 0.0f;      // 当前水位
float target_level = 1.0f;     // 目标水位
float leakage_rate = 0.01f;    // 泄漏率
float Kp = 1.0f;               // 比例增益

void proportional_control() {
    float error = target_level - water_level;
    float pump_power = Kp * error;      // 比例控制
    float net_inflow = pump_power - leakage_rate;
    water_level += net_inflow * 0.1f;   // 更新时间
    
    printf("Error: %.4f, Pump: %.4f\n", error, pump_power);
}

运行上述代码会发现,系统最终会稳定在某个水位,但永远达不到目标水位。这就是稳态误差。

2.2 积分项的救赎

加入积分项后:

float Ki = 0.1f;               // 积分增益
float integral = 0.0f;         // 积分累积

void pi_control() {
    float error = target_level - water_level;
    integral += error * 0.1f;  // Ts = 0.1s
    
    float pump_power = Kp * error + Ki * integral;
    float net_inflow = pump_power - leakage_rate;
    water_level += net_inflow * 0.1f;
    
    printf("Error: %.4f, Integral: %.4f\n", error, integral);
}

积分项会持续累积微小误差,逐渐增加泵的功率,直到完全抵消泄漏,消除稳态误差。

三、积分项的四大挑战与解决方案

3.1 挑战一:积分饱和(Windup)

问题描述:当执行机构饱和时,误差继续累积,积分项变得巨大。当设定值改变时,需要很长时间"消化"这些过大的积分值。

解决方案A:积分限幅

// 基础版:简单的积分限幅
typedef struct {
    float Kp, Ki, Kd;
    float Ts;
    float integral;
    float prev_error;
    float out_max, out_min;
    float integral_max;  // 积分限幅值
} PID_Basic;

float pid_update_basic(PID_Basic* pid, float setpoint, float measurement) {
    float error = setpoint - measurement;
    
    // 更新积分项
    pid->integral += error * pid->Ts;
    
    // 积分限幅(关键!)
    if (pid->integral > pid->integral_max) {
        pid->integral = pid->integral_max;
    } else if (pid->integral < -pid->integral_max) {
        pid->integral = -pid->integral_max;
    }
    
    // 计算各项
    float P_term = pid->Kp * error;
    float I_term = pid->Ki * pid->integral;
    float D_term = -pid->Kd * (measurement - pid->prev_measurement) / pid->Ts;
    
    float output = P_term + I_term + D_term;
    
    // 输出限幅
    output = fmaxf(pid->out_min, fminf(output, pid->out_max));
    
    pid->prev_error = error;
    return output;
}

解决方案B:条件积分(更智能)

// 进阶版:条件积分(只在输出未饱和时积分)
float pid_update_conditional(PID_Basic* pid, float setpoint, float measurement) {
    float error = setpoint - measurement;
    
    // 先计算比例项
    float P_term = pid->Kp * error;
    float I_term = pid->Ki * pid->integral;
    float D_term = -pid->Kd * (measurement - pid->prev_measurement) / pid->Ts;
    
    float output_without_new_integral = P_term + I_term + D_term;
    
    // 检查如果不新增积分是否会饱和
    if (output_without_new_integral <= pid->out_max && 
        output_without_new_integral >= pid->out_min) {
        // 不会饱和,正常积分
        pid->integral += error * pid->Ts;
    }
    // 否则:不积分(或反向积分)
    
    // 重新计算
    I_term = pid->Ki * pid->integral;
    float output = P_term + I_term + D_term;
    
    output = fmaxf(pid->out_min, fminf(output, pid->out_max));
    pid->prev_error = error;
    return output;
}

解决方案C:反向计算法(工业标准)

// 专业版:反向计算抗饱和(Back Calculation)
typedef struct {
    float Kp, Ki, Kd;
    float Ts;
    float integral;
    float prev_error;
    float prev_measurement;
    float out_max, out_min;
    float Kt;  // 抗饱和反馈增益,通常 Kt = 1/Ki
} PID_AntiWindup;

float pid_update_back_calculation(PID_AntiWindup* pid, float setpoint, float measurement) {
    float error = setpoint - measurement;
    
    // 先正常更新积分
    pid->integral += error * pid->Ts;
    
    // 计算未限幅的输出
    float P_term = pid->Kp * error;
    float I_term = pid->Ki * pid->integral;
    float D_term = -pid->Kd * (measurement - pid->prev_measurement) / pid->Ts;
    
    float unsaturated_output = P_term + I_term + D_term;
    
    // 应用限幅
    float saturated_output = unsaturated_output;
    if (saturated_output > pid->out_max) saturated_output = pid->out_max;
    if (saturated_output < pid->out_min) saturated_output = pid->out_min;
    
    // 关键步骤:计算饱和误差并反馈调整积分
    float saturation_error = saturated_output - unsaturated_output;
    pid->integral += pid->Kt * saturation_error * pid->Ts;
    
    pid->prev_error = error;
    pid->prev_measurement = measurement;
    
    return saturated_output;
}

3.2 挑战二:积分引起振荡

问题描述:过大的积分增益导致系统超调和振荡。

解决方案:积分分离(最实用)

// 积分分离:只在误差较小时启用积分
typedef struct {
    float Kp, Ki, Kd;
    float Ts;
    float integral;
    float prev_error;
    float prev_measurement;
    float out_max, out_min;
    
    // 积分分离参数
    float integral_enable_threshold;  // 启用积分的误差阈值
    float integral_disable_threshold; // 禁用积分的误差阈值
    bool integral_active;             // 当前积分是否激活
} PID_IntegralSeparation;

float pid_update_integral_separation(PID_IntegralSeparation* pid, 
                                     float setpoint, float measurement) {
    float error = setpoint - measurement;
    float abs_error = fabs(error);
    
    // 积分激活逻辑
    if (abs_error > pid->integral_disable_threshold) {
        // 大误差:禁用积分,可以重置积分或保持
        pid->integral_active = false;
        // pid->integral = 0;  // 可选:重置积分
    } else if (abs_error < pid->integral_enable_threshold) {
        // 小误差:启用积分
        pid->integral_active = true;
    }
    // 中间区域:保持当前状态
    
    // 只有在激活时才积分
    if (pid->integral_active) {
        pid->integral += error * pid->Ts;
    }
    
    // 积分限幅
    float integral_max = pid->out_max / pid->Ki;  // 动态计算限幅
    pid->integral = fmaxf(-integral_max, fminf(pid->integral, integral_max));
    
    // 计算输出
    float P_term = pid->Kp * error;
    float I_term = pid->integral_active ? pid->Ki * pid->integral : 0;
    float D_term = -pid->Kd * (measurement - pid->prev_measurement) / pid->Ts;
    
    float output = P_term + I_term + D_term;
    output = fmaxf(pid->out_min, fminf(output, pid->out_max));
    
    pid->prev_error = error;
    pid->prev_measurement = measurement;
    
    return output;
}

3.3 挑战三:系统到达目标后的处理

问题描述:系统已经到达目标,但积分项仍有值,导致超调。

解决方案:到达目标后的智能管理

// 到达目标后的积分管理
typedef struct {
    // ... 基础PID参数 ...
    
    // 目标到达管理
    float arrival_threshold;      // 到达目标的误差阈值
    float integral_decay_factor;  // 积分衰减因子
    uint32_t arrival_time;        // 到达目标的时间
    bool has_arrived;             // 是否已到达目标
} PID_ArrivalManagement;

float pid_update_arrival_management(PID_ArrivalManagement* pid,
                                    float setpoint, float measurement) {
    float error = setpoint - measurement;
    float abs_error = fabs(error);
    
    // 检测是否到达目标
    bool now_arrived = (abs_error < pid->arrival_threshold);
    
    if (now_arrived && !pid->has_arrived) {
        // 刚刚到达目标
        pid->has_arrived = true;
        pid->arrival_time = get_current_time_ms();
        
        // 到达时可选操作:
        // 1. 记录当前积分值
        // 2. 轻微衰减积分
        pid->integral *= pid->integral_decay_factor;
    } else if (!now_arrived) {
        // 离开目标区域
        pid->has_arrived = false;
    }
    
    // 到达目标后的特殊处理
    if (pid->has_arrived) {
        uint32_t time_at_target = get_current_time_ms() - pid->arrival_time;
        
        // 策略1:随时间逐渐衰减积分
        if (time_at_target > 1000) {  // 到达1秒后开始衰减
            float decay = expf(-(time_at_target - 1000) / 5000.0f);  // 5秒时间常数
            pid->integral *= decay;
        }
        
        // 策略2:冻结积分(只允许微小调整)
        // 只对非常小的误差进行积分
        if (abs_error > pid->arrival_threshold * 0.1f) {
            pid->integral += error * pid->Ts * 0.1f;  // 10%的积分速度
        }
        // 否则不积分
    } else {
        // 正常积分
        pid->integral += error * pid->Ts;
    }
    
    // ... 计算输出 ...
}

3.4 挑战四:噪声放大

问题描述:积分项累积测量噪声,导致输出波动。

解决方案:滤波积分

// 带滤波的积分项
typedef struct {
    // ... 基础PID参数 ...
    
    // 积分滤波
    float filtered_integral;      // 滤波后的积分值
    float integral_filter_alpha;  // 滤波器系数 (0~1)
} PID_FilteredIntegral;

float pid_update_filtered_integral(PID_FilteredIntegral* pid,
                                   float setpoint, float measurement) {
    float error = setpoint - measurement;
    
    // 原始积分更新
    float raw_integral = pid->filtered_integral + error * pid->Ts;
    
    // 应用一阶低通滤波
    // filtered_integral = alpha * prev + (1-alpha) * new
    pid->filtered_integral = pid->integral_filter_alpha * pid->filtered_integral
                           + (1.0f - pid->integral_filter_alpha) * raw_integral;
    
    // 或者使用移动平均
    static float error_history[10];
    static int history_index = 0;
    
    error_history[history_index] = error;
    history_index = (history_index + 1) % 10;
    
    // 计算平均误差进行积分(抗噪声)
    float avg_error = 0;
    for (int i = 0; i < 10; i++) {
        avg_error += error_history[i];
    }
    avg_error /= 10.0f;
    
    pid->filtered_integral += avg_error * pid->Ts;
    
    // ... 计算输出 ...
}

四、工业级积分项最佳实践

4.1 完整的工业级PID实现

// 工业级PID控制器(含完整积分管理)
typedef struct {
    // PID参数
    float Kp, Ki, Kd;
    float Ts;
    
    // 状态变量
    float integral;
    float prev_error;
    float prev_measurement;
    float prev_output;
    
    // 限幅参数
    float out_max, out_min;
    float integral_max, integral_min;
    
    // 抗饱和参数
    float Kt;  // 抗饱和增益,Kt = 1/Ki 或 Kt = Kp/Ki
    
    // 积分分离参数
    struct {
        float enable_threshold;   // 0.05f  (5%误差内启用积分)
        float disable_threshold;  // 0.10f  (10%误差外禁用积分)
        bool active;
    } integral_separation;
    
    // 目标到达管理
    struct {
        float threshold;          // 0.01f  (1%误差视为到达)
        uint32_t arrival_time;
        bool has_arrived;
        float decay_time_constant; // 5.0f  (5秒衰减时间常数)
    } arrival_management;
    
    // 积分滤波
    float integral_filter_alpha;  // 0.9f
    
    // 调试信息
    struct {
        float max_integral_value;
        float integral_saturation_count;
    } debug;
} PID_Industrial;

void pid_industrial_init(PID_Industrial* pid, 
                        float Kp, float Ki, float Kd, 
                        float Ts, float out_min, float out_max) {
    memset(pid, 0, sizeof(PID_Industrial));
    
    pid->Kp = Kp;
    pid->Ki = Ki;
    pid->Kd = Kd;
    pid->Ts = Ts;
    pid->out_min = out_min;
    pid->out_max = out_max;
    
    // 自动计算合理的积分限幅
    pid->integral_max = out_max / (Ki + 1e-6f);  // 防止除零
    pid->integral_min = out_min / (Ki + 1e-6f);
    
    // 设置抗饱和增益
    pid->Kt = 1.0f / (Ki + 1e-6f);  // 标准设置
    
    // 默认参数
    pid->integral_separation.enable_threshold = 0.05f;
    pid->integral_separation.disable_threshold = 0.10f;
    pid->arrival_management.threshold = 0.01f;
    pid->arrival_management.decay_time_constant = 5.0f;
    pid->integral_filter_alpha = 0.9f;
}

float pid_industrial_update(PID_Industrial* pid, 
                           float setpoint, float measurement) {
    float error = setpoint - measurement;
    float abs_error = fabs(error);
    
    // ========== 1. 积分分离逻辑 ==========
    if (abs_error > pid->integral_separation.disable_threshold) {
        pid->integral_separation.active = false;
    } else if (abs_error < pid->integral_separation.enable_threshold) {
        pid->integral_separation.active = true;
    }
    
    // ========== 2. 目标到达检测 ==========
    bool now_arrived = (abs_error < pid->arrival_management.threshold);
    
    if (now_arrived && !pid->arrival_management.has_arrived) {
        pid->arrival_management.has_arrived = true;
        pid->arrival_management.arrival_time = get_current_time_ms();
        
        // 到达目标:轻微衰减积分,防止超调
        pid->integral *= 0.95f;
    } else if (!now_arrived) {
        pid->arrival_management.has_arrived = false;
    }
    
    // ========== 3. 智能积分更新 ==========
    if (pid->integral_separation.active) {
        // 只在激活时更新积分
        float new_integral = pid->integral + error * pid->Ts;
        
        // 积分滤波
        pid->integral = pid->integral_filter_alpha * pid->integral
                      + (1.0f - pid->integral_filter_alpha) * new_integral;
        
        // 到达目标后的特殊处理
        if (pid->arrival_management.has_arrived) {
            uint32_t time_at_target = get_current_time_ms() - 
                                      pid->arrival_management.arrival_time;
            
            if (time_at_target > 1000) {  // 到达1秒后
                // 指数衰减
                float decay = expf(-(time_at_target - 1000) / 
                                  (pid->arrival_management.decay_time_constant * 1000));
                pid->integral *= decay;
            }
        }
    }
    
    // ========== 4. 积分限幅 ==========
    if (pid->integral > pid->integral_max) {
        pid->integral = pid->integral_max;
        pid->debug.integral_saturation_count++;
    } else if (pid->integral < pid->integral_min) {
        pid->integral = pid->integral_min;
        pid->debug.integral_saturation_count++;
    }
    
    // 记录最大积分值(调试用)
    if (fabs(pid->integral) > pid->debug.max_integral_value) {
        pid->debug.max_integral_value = fabs(pid->integral);
    }
    
    // ========== 5. 计算各项 ==========
    float P_term = pid->Kp * error;
    float I_term = pid->Ki * pid->integral;
    
    // 对测量值微分,避免设定值突变冲击
    float derivative = (measurement - pid->prev_measurement) / pid->Ts;
    float D_term = -pid->Kd * derivative;
    
    float unsaturated_output = P_term + I_term + D_term;
    
    // ========== 6. 抗饱和处理 ==========
    float saturated_output = unsaturated_output;
    if (saturated_output > pid->out_max) {
        saturated_output = pid->out_max;
    } else if (saturated_output < pid->out_min) {
        saturated_output = pid->out_min;
    }
    
    // 反向计算法抗饱和
    float saturation_error = saturated_output - unsaturated_output;
    pid->integral += pid->Kt * saturation_error * pid->Ts;
    
    // ========== 7. 更新状态 ==========
    pid->prev_error = error;
    pid->prev_measurement = measurement;
    pid->prev_output = saturated_output;
    
    return saturated_output;
}

4.2 应用示例:温度控制系统

// 温度控制系统的PID应用
typedef struct {
    PID_Industrial pid;
    float current_temperature;
    float target_temperature;
    float heater_power;      // 0~100%
    
    // 温度系统特性
    float thermal_mass;      // 热容
    float heat_loss_coeff;   // 热损失系数
    float ambient_temp;      // 环境温度
} TemperatureController;

void temperature_controller_init(TemperatureController* tc) {
    // 初始化PID参数(需要根据具体系统调整)
    pid_industrial_init(&tc->pid, 
                       2.5f,   // Kp: 根据系统响应调整
                       0.1f,   // Ki: 较小的积分,防止振荡
                       5.0f,   // Kd: 温度系统惯性大,需要微分
                       1.0f,   // Ts: 1秒采样
                       0.0f,   // 最小输出
                       100.0f);// 最大输出(100%功率)
    
    tc->current_temperature = 25.0f;  // 室温
    tc->target_temperature = 80.0f;   // 目标温度
    tc->ambient_temp = 25.0f;
    tc->thermal_mass = 100.0f;        // 示例值
    tc->heat_loss_coeff = 0.1f;       // 示例值
}

void temperature_controller_update(TemperatureController* tc) {
    // 1. 使用PID计算加热器功率
    tc->heater_power = pid_industrial_update(&tc->pid,
                                           tc->target_temperature,
                                           tc->current_temperature);
    
    // 2. 模拟物理系统(简化的热力学模型)
    float heat_input = tc->heater_power * 10.0f;  // 假设10W每百分比
    float heat_loss = tc->heat_loss_coeff * 
                     (tc->current_temperature - tc->ambient_temp);
    
    float net_heat = heat_input - heat_loss;
    float temp_change = net_heat / tc->thermal_mass;
    
    tc->current_temperature += temp_change * tc->pid.Ts;
    
    // 3. 打印调试信息
    static int counter = 0;
    if (counter++ % 10 == 0) {
        printf("Temp: %.1f°C, Target: %.1f°C, Power: %.1f%%, ",
               tc->current_temperature, tc->target_temperature, tc->heater_power);
        printf("Integral: %.2f\n", tc->pid.integral);
    }
}

// 测试函数
void test_temperature_control() {
    TemperatureController tc;
    temperature_controller_init(&tc);
    
    // 模拟控制过程
    for (int i = 0; i < 300; i++) {  // 模拟5分钟(每秒一次)
        temperature_controller_update(&tc);
        
        // 第100秒时改变目标温度
        if (i == 100) {
            tc.target_temperature = 100.0f;
        }
        
        // 第200秒时再次改变
        if (i == 200) {
            tc.target_temperature = 60.0f;
        }
        
        // 简单延时模拟
        delay_ms(1000);
    }
}

五、积分项调参指南

5.1 调参步骤

  1. 第一步:关闭积分 (Ki=0K_i = 0Ki=0)

    • 先调好 KpK_pKpKdK_dKd
    • 确保系统响应快速但不过分振荡
  2. 第二步:从小 KiK_iKi 开始

    • Ki=0.1×Kp/TiK_i = 0.1 \times K_p / T_iKi=0.1×Kp/Ti 开始
    • TiT_iTi 为积分时间常数,可以从系统时间常数估计
  3. 第三步:观察稳态误差

    • 增加 KiK_iKi 直到稳态误差在可接受范围内
    • 注意:每次增加幅度要小(如增加20%)
  4. 第四步:检查超调和振荡

    • 如果出现超调或振荡,减小 KiK_iKi
    • 或实施积分分离

5.2 经验公式

对于大多数系统,可以尝试:

Ki=KpTiTi≈0.5×Tsystem(系统时间常数) \begin{aligned} K_i &= \frac{K_p}{T_i} \\ T_i &\approx 0.5 \times T_{system} \quad \text{(系统时间常数)} \end{aligned} KiTi=TiKp0.5×Tsystem(系统时间常数)

5.3 调试技巧

// 调试辅助函数
void pid_debug_print(PID_Industrial* pid, float error, float output) {
    printf("=== PID Debug Info ===\n");
    printf("Error: %.4f\n", error);
    printf("Integral: %.4f (Max: %.4f)\n", 
           pid->integral, pid->debug.max_integral_value);
    printf("Integral Active: %s\n", 
           pid->integral_separation.active ? "Yes" : "No");
    printf("Has Arrived: %s\n", 
           pid->arrival_management.has_arrived ? "Yes" : "No");
    printf("Saturation Count: %.0f\n", 
           pid->debug.integral_saturation_count);
    printf("Output: %.4f\n", output);
    printf("====================\n");
}

六、总结:积分项使用黄金法则

  1. 永远设置积分限幅:防止无限累积
  2. 实施积分分离:大误差时禁用积分
  3. 到达目标后衰减积分:防止超调
  4. 使用抗饱和机制:反向计算法最有效
  5. 考虑积分滤波:减少噪声影响
  6. 从小的 KiK_iKi 开始:逐渐增加,观察效果
  7. 监控积分值:了解系统行为,辅助调试

积分项是PID控制器的"记忆"和"耐心"。正确使用时,它能消除稳态误差,提高控制精度;错误使用时,它会导致振荡、超调和系统不稳定。通过本文介绍的技术和代码示例,您应该能够更好地理解和应用PID控制中的积分项。

记住:好的控制不是消除所有误差,而是在快速响应和稳定精度之间找到最佳平衡。积分项的管理正是这种平衡艺术的关键部分。

基于径向基函数神经网络RBFNN的自适应滑模控制学习(Matlab代码实现)内容概要:本文介绍了基于径向基函数神经网络(RBFNN)的自适应滑模控制方法,并提供了相应的Matlab代码实现。该方法结合了RBF神经网络的非线性逼近能力和滑模控制的强鲁棒性,用于解决复杂系统的控制问题,尤其适用于存在不确定性和外部干扰的动态系统。文中详细阐述了控制算法的设计思路、RBFNN的结构与权重更新机制、滑模面的构建以及自适应律的推导过程,并通过Matlab仿真验证了所提方法的有效性和稳定性。此外,文档还列举了大量相关的科研方向和技术应用,涵盖智能优化算法、机器学习、电力系统、路径规划等多个领域,展示了该技术的广泛应用前景。; 适合人群:具备一定自动控制理论基础和Matlab编程能力的研究生、科研人员及工程技术人员,特别是从事智能控制、非线性系统控制及相关领域的研究人员; 使用场景及目标:①学习和掌握RBF神经网络与滑模控制相结合的自适应控制策略设计方法;②应用于电机控制、机器人轨迹跟踪、电力电子系统等存在模型不确定性或外界扰动的实际控制系统中,提升控制精度与鲁棒性; 阅读建议:建议读者结合提供的Matlab代码进行仿真实践,深入理解算法实现细节,同时可参考文中提及的相关技术方向拓展研究思路,注重理论分析与仿真验证相结合。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ScilogyHunter

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值