VPP 优化调度这个方向,这几年的热度一直没降过。尤其是把碳交易机制加进来之后,很多传统只做“经济调度”的模型立刻就不够用了——因为碳成本不再是固定的外部参数,而是会随着排放区间变化、直接影响机组启停决策的变量。我这次做的项目,就是把阶梯碳交易、P2G-CCS 耦合和燃气掺氢三件事揉进同一个虚拟电厂优化调度框架里,用 Matlab 完整实现并跑通仿真。这篇文章不绕弯子,直接讲清楚模型怎么搭、代码怎么落、坑在哪里。
很多人一看到“P2G-CCS”“掺氢”“阶梯碳”这几个词堆在一起,第一反应是复杂度爆炸。实际拆开来看,这本质是一个混合整数线性规划问题:燃气机组、电解槽、甲烷化反应器、碳捕集装置、储氢罐、掺氢燃烧这几大块,通过能量流、物料流、碳排放流耦合在一起,目标函数在考虑运行成本和碳交易成本之间做权衡。用 Matlab 的 YALMIP 工具箱建模,调 Gurobi 或 Cplex 求解,整个过程最耗时间的不是写代码,而是把物理约束转换成数学表达式的过程。这篇文章会把我实测过的公式、参数配置、报错排查全部放出来,给后面做相关方向的朋友省点时间。
1. 项目背景与核心思路
1.1 为什么虚拟电厂必须考虑碳交易
虚拟电厂本身不发电,它靠的是聚合分布式光伏、风电、储能、燃气机组、柔性负荷这些资源,通过协调控制对外呈现一个可控电源的特性。传统调度模型里,目标函数通常是“系统总运行成本最小”或者“新能源消纳最大”,碳排放只是事后统计的一个指标,不参与决策。但碳排放权交易市场逐步成熟之后,碳成本开始变成真金白银,直接影响度电成本。一个燃气机组如果碳排放配额不够,就得去市场买碳配额,这部分成本高的时候甚至能超过燃料成本。
这就引出了一个新问题:调度模型必须把碳交易成本纳入目标函数,而不是把它当后处理指标。用户给的标题里专门强调“阶梯碳交易”,这个进阶点在下面会详细讲。总的来说,碳交易机制的引入,让虚拟电厂在排碳和减排之间形成了一套经济博弈:多排碳要多付钱,少排碳可以卖配额赚钱,而 P2G-CCS 这套装置刚好是减少碳排放的物理手段。所以整个优化模型的核心矛盾就是,如何在满足负荷需求的前提下,让“运行成本 + 碳交易成本”最小化。
1.2 阶梯碳交易和普通碳交易的差别
国内碳市场目前最主流的分配方式还是免费配额为主,超出部分需要购买。市面上很多论文做碳交易时用的是“单一碳价”模型——排放量超过配额,直接按固定碳价乘以超额量计算成本。这种方式简单,但和真实市场有偏差。实际碳市场中,超额量越大,边际成本往往越高,这种非线性正是阶梯碳交易要模拟的。
阶梯碳交易的核心思想是:把碳排放量划分成若干区间,每个区间设定不同的碳价,超额越多、碳价越高。用公式表达就是:
[ C_{CO2} = \begin{cases} \lambda_1 (E - Q), & 0 \le E - Q \le d_1 \ \lambda_1 d_1 + \lambda_2 (E - Q - d_1), & d_1 \le E - Q \le d_2 \ \lambda_1 d_1 + \lambda_2 d_2 + \lambda_3 (E - Q - d_1 - d_2), & E - Q > d_2 \end{cases} ]
其中,(E) 是实际碳排放量,(Q) 是无偿分配的碳排放配额,(d_1)、(d_2) 是区间长度,(\lambda_1)、(\lambda_2)、(\lambda_3) 是各区间碳价,且 (\lambda_1 < \lambda_2 < \lambda_3)。
这个结构简单,但引入优化模型后有个麻烦事——它是一个分段线性函数,带有非凸性。好在可以引入辅助变量,把分段函数等价转换成一组线性约束,既保留阶梯递增的特征,又不破坏 MILP 的可求解性。这部分的代码实现细节我会在第三章专门展开。
1.3 P2G-CCS 耦合和燃气掺氢为什么放在一起
先解释两个缩写。P2G 是 Power-to-Gas,也就是电转气,用可再生能源发电驱动电解水制氢,再把氢气和二氧化碳通过甲烷化反应合成天然气(主要成分是甲烷)。CCS 是 Carbon Capture and Storage,碳捕集与封存,这里特指从燃气机组排气中捕集二氧化碳,捕集下来的 CO₂ 一部分可以送去甲烷化反应器作为原料,这样就形成了一个循环。
燃气掺氢则是在天然气中混入一定比例的氢气,直接送入燃气轮机燃烧。掺氢的好处有两个:一是氢气燃烧不产生二氧化碳,直接降低碳排放;二是提供了一种氢气的消纳途径——P2G 产出的氢气如果来不及合成天然气,或者储氢罐满了,可以按一定比例掺入燃气管道直接烧掉。
这三个技术放在一起,恰好形成了一个闭环:
- 燃气机组发电 → 产生 CO₂;
- CCS 捕集 CO₂ → 一部分送去甲烷化,一部分封存;
- 可再生能源发电 → P2G 制氢 → 氢气直接掺烧,或者和 CO₂ 合成天然气;
- 合成天然气和掺氢天然气再送回燃气机组燃烧。
整个耦合结构让虚拟电厂从单一的电力供应商,变成一个同时在电、气、碳三个市场上互动的综合能源主体。建模的复杂度上来了,但优化空间也大了很多。
2. 数学模型构建
2.1 目标函数设计
整个优化调度的目标函数由四块组成:机组运行成本、P2G-CCS 耦合单元运行成本、碳交易成本、弃风和弃光惩罚成本。表达式为:
[ \min F = \sum_{t=1}^{T} \left( C_{GT,t} + C_{P2G,t} + C_{CCS,t} + C_{CO2,t} + C_{curt,t} \right) ]
其中 (C_{GT,t}) 是燃气机组燃料成本,这里要注意掺氢比例会改变燃料成本的计算方式,因为氢气热值和质量都和天然气不同,需要按热值折算;(C_{P2G,t}) 是电解槽和甲烷化装置的运行维护成本,通常按产氢量和产甲烷量线性折算;(C_{CCS,t}) 是碳捕集装置运行成本,捕集的 CO₂ 越多,能耗越大,这部分能耗会降低机组净出力,需要在功率平衡约束里体现;(C_{CO2,t}) 是阶梯碳交易成本,按上一节的分段函数计算;(C_{curt,t}) 是弃风弃光惩罚项,为了保证新能源消纳,赋予一个较高的惩罚系数。
这个目标函数设计的核心思想是:碳交易成本不是独立存在的一项,它通过 CCS 捕集量、掺氢比例、P2G 制氢量这几个变量和系统的物理运行状态强耦合。举个最简单的例子,如果碳价很高,优化器会倾向于多开 CCS、多掺氢、少让机组出力,哪怕这会增加运行成本——减排在经济上变划算时,调度策略就会自动往低碳倾斜。
2.2 P2G-CCS 耦合单元建模
P2G-CCS 耦合单元是整个系统里变量最多的部分,我把它拆成三个子模块建模。
第一个是电解槽。输入是电功率 (P_{el,t}),输出是氢气流率 (F_{H2,t})。二者通过电解效率 (\eta_{el}) 关联:
[ F_{H2,t} = \eta_{el} \cdot P_{el,t} / H_{H2} ]
其中 (H_{H2}) 是氢气的高热值。电解槽的功率有上下限约束,同时还要考虑爬坡约束——很多论文忽略爬坡,实际电解槽在快速升降负荷时效率下降明显,所以我还是加了线性爬坡限制。
第二个是甲烷化反应器。它把氢气和二氧化碳合成甲烷,反应式为 (CO_2 + 4H_2 \rightarrow CH_4 + 2H_2O)。从建模的角度,更关心的是物料平衡:
[ F_{CH4,t} = k_{meth} \cdot F_{H2, meth,t} ]
这里 (F_{H2, meth,t}) 是进入甲烷化反应器的氢气量,(k_{meth}) 是反应比例系数。进入反应器的二氧化碳量由化学计量比决定,需要从 CCS 捕集的 CO₂ 里分配。
第三个是 CCS 装置。捕集到的 CO₂ 总流量 (F_{CO2,cap,t}) 与机组出力相关,捕集能耗 (P_{CCS,t}) 通常被建模为捕集量的线性函数。我在模型里把捕集到的 CO₂ 分为两路:一路进入甲烷化反应器,一路送去封存。这样处理的好处是,模型可以自由决策“合成天然气”和“直接封存”的比例,在碳价高的时候多捕集多利用,在碳价低的时候少捕集少耗能。
2.3 燃气掺氢建模
燃气掺氢环节的建模关键点在于燃料热值变化和碳排放因子变化。
设掺氢比例为 (\alpha_t)(体积分数),天然气和氢气的低位热值分别为 (LHV_{NG}) 和 (LHV_{H2})。混合燃料的总热值输入为:
[ F_{fuel,t} \cdot LHV_{mix,t} = P_{GT,t} / \eta_{GT} ]
其中:
[ LHV_{mix,t} = (1-\alpha_t) \cdot LHV_{NG} + \alpha_t \cdot LHV_{H2} ]
掺氢之后,燃气机组的碳排放量需要按混合燃料中的碳含量重新计算。天然气的碳排放因子是 (e_{NG}),氢气是零碳,所以实际碳排放变为:
[ E_{GT,t} = (1-\alpha_t) \cdot F_{fuel,t} \cdot e_{NG} ]
也就是说,掺氢比例每提高一个百分点,碳排放就近似降低一个百分点(实际上因为热值变化,燃料流量也会变化,但整体趋势线性)。不过要注意,掺氢比例不是想调多高就调多高,受制于燃气轮机的燃烧稳定性。实际工程中,低热值燃气轮机对氢气的容忍度在 5% 到 30% 不等,老旧机组可能 10% 就到上限了。我在模型里设了一个可调约束 (0 \le \alpha_t \le \alpha_{max}),(\alpha_{max}) 一般是 0.2,也就是说氢气的体积占比不超过 20%。
2.4 电功率平衡和储氢罐约束
这部分约束看起来基础,但恰恰是最容易写错的地方。电功率平衡要考虑燃气机组净出力、可再生能源出力、电解槽耗电、CCS 耗电、储能充放电、负荷需求:
[ P_{GT,t} + P_{res,t} + P_{dis,t} + P_{buy,t} = P_{load,t} + P_{el,t} + P_{CCS,t} + P_{ch,t} ]
关键点在于:CCS 的耗电不能漏掉,P2G 的耗电不能漏掉,否则功率平衡就对不上。我一开始调试的时候,算出来的总成本偏低很多,查到最后就是 CCS 耗电没有纳入平衡方程。
储氢罐约束要注意时序耦合。设 (S_t) 为储氢罐在时段 (t) 结束时的储氢量,则:
[ S_t = S_{t-1} + F_{H2,t} - F_{H2,meth,t} - F_{H2,blend,t} ]
还有容量上下限 (S_{min} \le S_t \le S_{max}),以及周期约束 (S_T = S_0),保证调度周期前后储氢量一致。这个周期约束写不写对结果差异很大,不写的话,优化器会把最后一个时段的储氢量清空来降成本,表现出来的结果就是前几个时段疯狂储氢、末尾时段大量放氢,完全不符合实际运行逻辑。
3. Matlab 代码实现与关键点解析
3.1 程序整体框架
我这套 Matlab 代码的结构大致分五块:参数初始化模块、数据输入模块、模型构建模块、求解配置模块、结果输出模块。
参数初始化模块负责设置所有的物理参数和经济参数。数据输入模块读入风机和光伏的预测出力曲线、负荷曲线、碳交易参数。模型构建模块用 YALMIP 定义决策变量、目标函数和约束条件。求解配置模块设置求解器参数和终止条件。结果输出模块把优化结果整理成表格和曲线图,方便分析。
我实测下来,用 YALMIP 建模是效率最高的方式。它可以把线性约束用类似自然语言的方式写出来,比如Constraints = [Constraints, P_GT >= P_GT_min];,不用手动转成标准矩阵形式。底层求解器用的 Gurobi,针对 MILP 问题的求解速度比单纯用 Matlab 内置的intlinprog快不少,特别是变量数量上千的时候,差距非常明显。
3.2 关键参数设置
参数设置的准确度很大程度上决定了仿真结果是否可信。下面是我实测用的一组基础参数,可以直接用来跑通代码再按需调整:
| 参数 | 数值 | 说明 |
|---|---|---|
| 调度周期 T | 24 h | 一天 24 个时段,单位 1h |
| 燃气机组功率上下限 | 50 MW / 200 MW | 对应一台中型燃气轮机 |
| 电解槽功率上限 | 40 MW | 额定电解功率 |
| 电解效率 (\eta_{el}) | 0.7 | 碱性电解槽典型值 |
| 掺氢比例上限 (\alpha_{max}) | 0.2 | 体积分数上限 |
| 碳配额 Q | 300 t | 24h 内免费配额总量 |
| 阶梯碳价 (\lambda_1, \lambda_2, \lambda_3) | 50 / 100 / 150 元/t | 阶梯递增 |
| 阶梯区间长度 d1, d2 | 100 t / 100 t | 每个阶梯覆盖的排碳量 |
| CCS 捕集效率 | 0.9 | 捕集 CO₂ 占总排放比例 |
| CCS 单位能耗 | 0.2 MWh/t | 捕集每吨 CO₂ 的耗电量 |
这组参数不是凭空拍的,基本参考了典型燃气-蒸汽联合循环机组和商业化电解槽的数据。CCS 能耗我用的是 0.2 MWh/t,比文献里常见的 0.1-0.3 MWh/t 取中间偏上,偏保守一些,这样仿真结果更接近工程实际操作中“有损耗”的状态。
3.3 约束条件的代码表达
这里挑几个容易出错的约束代码讲。第一个是燃气机组的最小启停时间约束,用 YALMIP 表达需要引入二进制变量 (u_t) 表示机组启停状态,然后连续启动约束写成:
for t = 2:T Constraints = [Constraints, u(:,t) - u(:,t-1) <= u(:, t-1)]; end这段代码看起来简单,但它的含义是“如果机组在 t 时段是开机状态且上一个时段是停机状态,那么这个启动动作在之前时段已经完成”,实际需要配合最小启停时间约束一起用,我贴的只是核心片段。完整的表达一般涉及两个辅助变量 (start_t) 和 (stop_t),以及连续 N 个时段的逻辑约束,写起来比较啰嗦,建议直接用 YALMIP 的implies函数封装成自定义函数,不用每次重复写。
第二个是阶梯碳交易的线性化转化。前面提到的分段函数,我这里用一组连续变量 (E_{1,t}, E_{2,t}, E_{3,t}) 来表示落在不同阶梯的碳排放量,约束为:
E_total = Q + E_1 + E_2 + E_3; Constraints = [Constraints, 0 <= E_1 <= d1]; Constraints = [Constraints, 0 <= E_2 <= d2]; Constraints = [Constraints, E_3 >= 0];注意这里的诀窍在于,目标函数里碳交易成本写成 (\lambda_1 E_1 + \lambda_2 E_2 + \lambda_3 E_3),由于碳价递增,优化器会优先填满低价区间,自然满足阶梯逻辑,不需要额外加二进制变量。这个技巧非常实用,能让模型保持纯线性,避免引入额外整数变量拖慢求解速度。
第三个是掺氢比例和燃料热值的非线性关系。如果直接把 (LHV_{mix}) 写成 ((1-\alpha)\cdot LHV_{NG} + \alpha\cdot LHV_{H2}),再乘燃料流量 (F_{fuel,t}),就会出现两个连续变量相乘的非线性项。解决办法是把 (\alpha \cdot F_{fuel,t}) 当作一个新的连续变量 (F_{H2,fuel,t}),表示掺入的氢气流量,然后单独约束它小于等于 (\alpha_{max} \cdot F_{fuel,t})。这样化整为零,全部线性化。
3.4 求解配置与运行效率
我用的求解器组合是 YALMIP + Gurobi。YALMIP 负责建模,Gurobi 负责求解。求解器配置这块有几个经验值得分享。
MILP 问题的求解时间对整数变量数量极其敏感。我的模型里整数变量主要是机组启停状态 (u_t),储能充放电状态(如果建模了禁止同时充放),一共 24 个时段乘以若干个设备,整数变量在 50~100 个左右,Gurobi 跑下来通常是几秒到几十秒。如果发现求解时间异常长,优先检查是不是约束条件里引入了不必要的二进制变量——尤其是阶梯碳交易那块,不要为了分段函数暴力引入一堆整数变量。
停机准则我设置成 MIPGap 小于 0.1% 就停止。从工程角度看,0.1% 的优化差距对调度结果影响很小,但能大幅缩短求解时间。追求 0.01% 的 GAP 在实际工程里没有必要,尤其是虚拟电厂调度本身就有预测误差,模型只是给一个参考基准。
YALMIP 的调用方式很简单:
ops = sdpsettings('solver', 'gurobi', 'gurobi.MIPGap', 0.001); optimize(Constraints, Objective, ops);如果想换 Cplex,把 solver 改成cplex即可,约束和目标函数完全不用改。这也是我为啥推荐 YALMIP 的原因——求解器解耦做得干净,以后换求解器成本极低。
4. 仿真结果分析与敏感性分析
4.1 基准场景调度结果
我用的测试场景是典型夏季日,风电和光伏都有一定出力,负荷晚高峰明显。基准参数下求解得到 24 小时调度方案,这里说几个最有代表性的结果。
掺氢比例在负荷高峰时段接近 20% 上限,低负荷时段掺氢比例回落。原因很好理解:负荷高峰时燃气机组出力大,碳排放高,对应碳成本也高,此时掺氢的减排价值最大;低谷时段机组出力小,碳排放少,掺氢带来的减排收益不如氢气的其他用途。储氢罐的变化趋势也印证了这一点——白天光伏大发时段电解槽满负荷制氢,储氢罐慢慢蓄满;傍晚高峰前,一部分氢气进入甲烷化反应器、一部分掺入燃气,储氢量下降。
CCS 捕集量的分配策略很有参考价值。碳价处于中等水平时,捕集到的 CO₂ 大部分送去甲烷化反应器合成天然气,少部分封存。因为合成的天然气可以直接替代外购燃气,节省燃料成本,收益比纯封存高。只有当碳排放超额量逼近第二阶梯时,封存比例才上升。这说明优化器在做 CCS 运行策略时,优先考虑的是“资源化利用”而不是单纯封存——这个结论和很多只考虑碳减排的论文不同,更贴近实际经济运行逻辑。
4.2 阶梯碳价对调度策略的影响
我做了三组对照实验,分别是统一碳价 50 元/t、阶梯碳价基础档 50 元/t 递增至 100、以及递增至 150 元/t。结果差异很明显。
统一碳价下,燃气机组出力基本不受碳排放约束影响,系统的 CO₂ 总排放量最高。阶梯碳价下,一旦碳排放进入第二阶梯(碳价翻倍),优化器会明显加大 CCS 捕集率、提高电解槽出力,同时降低燃气机组出力、多从电网购电来填补功率缺口。碳价越高,新能源消纳率也越高,因为多余的可再生能源被用来驱动 P2G 制氢,把本来可能的弃电转化成了可存储的氢气。
这个结果揭示了一个关键规律:阶梯碳交易的价值不在于单纯提高碳价,而在于通过价格递增制造“减排拐点”。运营者会算账,当边际碳成本超过边际减排成本时,减排技术方案自动获得竞争力,调度策略随之改变。
4.3 掺氢比例上限的敏感性分析
我又扫了一遍 (\alpha_{max}) 从 5% 到 30% 的变化。5% 时,掺氢基本只是象征性的,系统减排主要靠 CCS;20% 时,减排贡献里掺氢占的比例显著上升,同时燃气机组的燃料成本下降(因为氢气部分替代了天然气);到 30% 时,总运行成本继续下降,但下降幅度趋缓——原因是受限于电解槽制氢能力和储氢罐容量,氢气供应跟不上掺氢需求了。
这告诉我们一个制氢侧和用氢侧需要匹配的道理。单纯提高掺氢上限,但制氢和储氢的设备容量不匹配,高掺氢比例也只能是纸上谈兵。实际项目如果要追求高掺氢比例,不只燃气轮机要改造,制氢端规模、储氢罐容积、管网的氢脆风险都要一起评估。这个属于工程项目的整体设计问题,调度模型只能告诉你经济上的最优解在什么位置。
5. 常见问题与调试经验
5.1 典型报错排查速查表
写 Matlab 代码跑优化模型,最常见的坑无非三类:维度不匹配、约束过约束/欠约束、求解器数值问题。我整理一张速查表:
| 报错或现象 | 可能原因 | 解决办法 |
|---|---|---|
YALMIP 报Index exceeds array bounds | 变量索引维度写错 | 检查sdpvar定义时的维度,repmat或reshape统一变量形状 |
Gurobi 报Infeasible model | 约束条件过强,无可行解 | 逐步注释约束,二分法定位过约束条件,优先检查功率平衡和储氢罐容量约束 |
求解结果里有NaN | 目标函数存在未定义表达式 | 检查是否有变量乘以变量的非线性项残留,用yalmiptest检测非凸项 |
| 求解时间异常长 | 整数变量过多 | 检查是否有冗余的binvar变量,优化阶梯函数线性化方法 |
| 结果不合理(如储氢罐最后时段被清空) | 缺少周期约束 | 加上 (S_T = S_0) 约束 |
这里重点说一个我踩过几次的坑:功率平衡约束漏项。在虚拟电厂模型里,CCS 耗电和电解槽耗电都是负荷侧的一部分,漏掉任何一项,目标函数就会偏低,而且这个错误不报错、不退出,只是结果悄悄偏离实际。排查方法是用能量守恒做一次全局校验——所有发电出力加上购电,减去所有负荷和耗电设备,是否等于储能净充电量。如果对不上,优先检查有没有设备耗电漏写在平衡方程里。
5.2 参数调优的注意事项
参数调优的核心原则是:先保证可行性,再追求最优性。我的习惯是先用一个宽松的场景把模型跑通,比如把储氢罐容量上限调到很大、CCS 捕集率调到很低、阶梯碳价设成同一档,这样模型退化成接近普通经济调度问题,容易得到可行解。然后逐步收紧参数,每调整一组就验证一次结果合理性,定位是哪个约束在起作用。
碳配额 (Q) 的设置对结果影响特别大。如果 (Q) 给得非常大,系统几乎不需要因为碳约束改变调度策略,碳交易机制形同虚设;如果 (Q) 给得太小,系统碳排放始终处于最高阶梯,减排压力过大,运行成本飙升。合理做法是先跑一次不加碳交易约束的基准场景,统计总排放量,然后以基准排放量的 80%~90% 作为配额参考值。这样模型就能体现出减排空间,又不至于完全脱离实际。
电解槽的爬坡约束往往会被新手忽略,但它对结果影响不小。没有爬坡约束时,优化器会利用光伏骤增的瞬间让电解槽功率从 0 跳到满负荷,现实里这是不可能的。设置爬坡约束后,电解槽出力曲线明显平滑,储氢罐的充放节奏也更合理,整体调度方案的可执行性显著提升。
5.3 代码扩展方向建议
这套代码的框架可扩展性很强,我给了自己几个后续可做的方向,也分享给同方向的朋友参考。
第一个扩展方向是引入需求响应。目前负荷是固定曲线,如果加入价格型或激励型需求响应资源,目标函数里会多出一块可调负荷的补偿成本,约束里增加负荷调节幅度和持续时间限制。模型规模不会增加太多,但结果会更丰富,也能更真实反映虚拟电厂聚合柔性负荷的能力。
第二个扩展方向是加入不确定性优化。风电和光伏出力的预测误差在真实运行中不可忽略,可以在现有确定性模型基础上改成鲁棒优化或者随机优化。最常见做法是把新能源出力处理成盒式不确定集,改造成两阶段鲁棒模型,用 C&CG 算法求解。代码改动量不小,但这是学术前沿比较认可的方向。
第三个方向是把阶梯碳交易扩展成更复杂的碳市场机制,比如碳-电耦合市场联合出清、碳配额拍卖机制等。不过这些方向对模型推导能力要求更高,建议先把现在的 MILP 模型吃透,再逐步加复杂度。
最后
我实际做这个项目的感受是:最难的不是 Matlab 代码本身,而是把“阶梯碳交易”“P2G-CCS 耦合”“燃气掺氢”这些物理概念和经济机制转换成数学约束的那一步。这一步想清楚,代码只是翻译过程;这一步偷懒,后面改模型会改到怀疑人生。建议后来者拿到代码先别急着跑结果,把论文里的公式和约束和自己代码里的Constraints逐条对照一遍,出了错才能快速定位。后期如果想换数据、改参数、换场景,这个底子扎实了,基本就是改参数表的事。