尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

超导磁能储存SMES仿真建模:从原理到Simulink实现

超导磁能储存SMES仿真建模:从原理到Simulink实现 超导磁能储存系统Superconducting Magnetic Energy Storage简称SMES听起来很高大上但拆开看就是“用超导线圈把电能变成磁场能量存起来需要的时候再放出来”。我最初接触这个方向是因为在做电能质量治理项目时发现传统电池储能响应速度跟不上电压暂降的补偿需求。后来把SMES搬进Simulink做建模和仿真一套完整的模型跑下来不仅搞清楚了充放电暂态过程还顺手解决了一堆仿真发散、参数不收敛的老大难问题。这篇文章就把我搭建SMES仿真模型的完整思路、数学模型推导、Simulink模块搭建细节、PI参数整定方法和常见坑位一次性讲清楚适合电气工程专业学生、做储能系统仿真的研究者以及想快速上手Simulink电力电子仿真的工程师参考。1. SMES系统工作原理与整体建模思路1.1 超导线圈凭什么能储存能量超导磁能储存系统的核心部件是一个由超导材料绕制的线圈。所谓超导是指材料在低于临界温度、临界磁场和临界电流密度的条件下电阻严格降为零。普通铜线圈通上电流能量会以焦耳热的形式慢慢损耗掉超导线圈一旦励磁电流在闭合回路里可以无损耗地持续流动能量就以磁场的形式“锁”在线圈里。线圈储存的磁场能量公式非常简单[ E \frac{1}{2} L I^2 ]假设线圈电感 ( L 3,\text{H} )额定电流 ( I 200,\text{A} )那么储存能量就是[ E \frac{1}{2} \times 3 \times 200^2 60000,\text{J} 60,\text{kJ} ]这个能量量级不算大同体积的锂离子电池可以存更多能量。但SMES真正的优势不在于能量密度而在于功率密度和响应速度。超导线圈可以在毫秒甚至亚毫秒级时间内把储存的磁场能量释放出去瞬间输出兆瓦级功率。这在电压暂降补偿、电力系统暂态稳定控制、脉冲功率电源等领域非常有用。我做一个直观的对比锂电池储能系统的功率响应时间通常在几十毫秒到百毫秒级而SMES的响应时间可以做到几毫秒甚至更快。所以它不是用来取代电池的而是和电池、飞轮储能形成互补各管一段。1.2 SMES系统总体架构与能量路径一个完整的SMES系统由四大部分组成超导线圈本体、低温恒温系统也就是杜瓦、功率变换系统PCS、监控与保护系统。从仿真的角度看超导线圈本体和低温系统可以简化为“低阻电感器初始电流设定”重点放在功率变换系统和控制策略上。功率变换系统通常采用“电压源型变流器VSC双向DC-DC斩波器”的拓扑结构。VSC负责交流母线和直流母线之间的能量交换双向DC-DC斩波器负责直流母线和超导线圈之间的能量交换。为什么中间非得加一级斩波器因为超导线圈本质是一个大电感它的端电压只由电流变化率决定不能直接挂在一个电压恒定的直流母线上。如果不加斩波器母线电压和线圈电压不一致时电流会剧烈波动甚至失控。斩波器的作用就是把直流母线电压“斩”成可调的电压加在线圈两端从而精确控制线圈电流的升降。整个系统的能量流转路径是这样的并网模式下交流电网的能量经VSC整流到直流母线再经斩波器降压给超导线圈充磁释放储能时线圈中的磁场能量经斩波器升压回馈到直流母线再由VSC逆变回电网或直接补偿负载。这个“先整流、后斩波”看似绕路实际是为了解耦控制让交流和直流侧各管各的。1.3 为什么选择Simulink做建模与仿真做SMES系统仿真其实有其他工具可选比如PSCAD、PSIM、PLECS。但我个人偏好Simulink原因有三。第一Simulink的Simscape Electrical原SimPowerSystems元件库里有现成的超导线圈近似模型、IGBT、二极管、三相电压源、变压器等电力电子元件搭主电路非常快。第二Simulink的控制系统建模能力太强了PI控制器、PWM发生器、dq变换、S函数都可以在一个环境里无缝连接不需要跨工具传递数据。第三Simulink支持自动代码生成模型验证完成后可以生成C代码部署到控制器里做硬件在环测试这对工程项目来说是实打实的加分项。当然Simulink也有它别扭的地方最大的问题就是电力电子开关器件多时仿真速度会明显下降而且非常容易遇到不收敛和数值振荡。这两个坑我在后面专门用一章来讲。2. 数学模型构建与技术原理拆解2.1 超导线圈的等效电路模型从电路角度看超导线圈就是一个电感和一个极小电阻的串联。超导态电阻率极低但不是绝对为零。在仿真模型里我不会直接把电阻设成0因为零电阻会让数值求解器在计算电流时出现奇异矩阵导致仿真直接报错。我建议把等效电阻设成一个极小值比如 ( 1\times10^{-6},\Omega ) 甚至更小这样既符合超导特性又不会让数值计算崩掉。线圈的电压方程是标准电感公式[ U_L L\frac{di}{dt} Ri ]因为R很小正常运行时 ( Ri ) 这一项基本可以忽略。但要注意在仿真中这个项恰恰是数值稳定性的关键。我实测过把R设成严格0某些求解器在长时间仿真中会出现电流缓慢漂移的异常现象保留一个极小电阻后模型数值稳定性会好很多。这个经验在论文里不会有人写但在实际建模时非常有用。2.2 双向DC-DC斩波器的平均模型与开关模型双向DC-DC斩波器有两种建模方式平均模型和开关模型。平均模型用受控电压源和受控电流源来等效斩波器的外特性不关心IGBT的具体开关过程仿真速度快适合做长时间暂态分析和控制策略验证。开关模型用真实的IGBT和二极管搭建桥臂能精确模拟开关纹波和损耗但仿真步长必须很小时才能保证精度速度慢很多。我的建模策略是“两阶段验证”第一次搭模型用平均模型快速验证控制逻辑和参数合理性确认无误后再换用开关模型做精细仿真。平均模型里斩波器的输出电压平均值和占空比的关系是Buck模式充电( U_L D \cdot U_{dc} )D是占空比( U_{dc} ) 是直流母线电压Boost模式放电( U_{dc} \frac{U_L}{1-D} )利用这个平均模型可以在不解具体开关电路的情况下把电流环控制对象吃透方便推导控制器的传函。2.3 VSC在dq坐标系下的数学模型三相VSC的数学模型如果放在abc三相静止坐标系下变量都是正弦交流量PI控制器很难做到无静差跟踪。解决方法是Park变换把abc坐标系转到dq同步旋转坐标系正弦量就变成了直流量。VSC在dq坐标系下的电压方程是一组耦合方程[ \begin{cases} u_{sd} Ri_d L_s\frac{di_d}{dt} - \omega L_s i_q u_{gd} \ u_{sq} Ri_q L_s\frac{di_q}{dt} \omega L_s i_d u_{gq} \end{cases} ]这里面 ( u_{sd} )、( u_{sq} ) 是变流器交流侧输出电压的d、q轴分量( u_{gd} )、( u_{gq} ) 是电网电压的d、q轴分量( \omega ) 是电网角频率。注意看 ( -\omega L_s i_q ) 和 ( \omega L_s i_d ) 这两项它们是d轴和q轴之间的耦合项。如果不做解耦控制单独调d轴电流会产生q轴的扰动控制效果会很差。常用的解法是前馈解耦控制把交叉耦合项和电网电压前馈补偿掉使d轴和q轴变成两个独立的一阶惯性环节。这个解耦控制思路在做仿真模型时非常重要如果不做前馈解耦你会发现PI参数怎么调都调不好两个电流环互相干扰波形乱七八糟。2.4 控制系统分层结构与参数整定方法SMES的控制系统采用经典的双闭环结构外环是功率或直流母线电压控制内环是电流控制。在并网充电模式中外环控制直流母线电压稳定内环控制VSC的d轴电流在放电模式中外环控制输出功率内环控制线圈放电电流。电流内环的PI参数我用的是典型I型系统整定方法。假设电流环的开环传递函数为[ G(s) \frac{K_p s K_i}{s} \cdot \frac{1}{L_s s R} ]为了让零点和被控对象的极点对消令[ \frac{K_i}{K_p} \frac{R}{L_s} ]此时电流环闭环传函变成了[ \frac{I(s)}{I^*(s)} \frac{K_p / L_s}{s K_p / L_s} ]等效成一阶惯性环节带宽为 ( \omega_c K_p / L_s )。如果希望电流环带宽 ( \omega_c 1000,\text{rad/s} )滤波电感 ( L_s 5,\text{mH} )那么[ K_p \omega_c \times L_s 1000 \times 0.005 5 ]再由对消条件假设电阻 ( R 0.1,\Omega )[ K_i K_p \times \frac{R}{L_s} 5 \times \frac{0.1}{0.005} 100 ]这套整定方法简单有效在Simulink里直接用阶跃响应验证效果立竿见影。我建议初学者不要靠试错碰运气先按这个流程算一遍初始参数再在模型里微调效率会高很多。3. Simulink仿真模型搭建实操3.1 模型整体结构与模块选型打开Simulink新建一个空白模型我习惯先用不同的颜色把子系统区分开。整个模型分四块主电路子系统、控制子系统、测量与显示子系统、参数初始化脚本。主电路用Simscape Electrical元件库搭建控制子系统用普通Simulink模块搭建测量结果输出到Scope或者存到工作区再统一绘图。元件库版本不同模块名称可能会有差异。在较新的MATLAB版本里相关模块分布在“Simscape - Electrical - Specialized Power Systems - Fundamental Blocks”和“Simscape - Electrical - Semiconductors Converters”这几个路径下。我用到的核心模块包括Three-Phase Source模拟交流电网Universal Bridge或Three-Level Bridge搭VSC主电路IGBT和Diode搭DC-DC斩波器也可以直接用DC-DC Converter子模块Series RLC Branch设置R1e-6欧姆L3H模拟超导线圈DC Voltage Source模拟直流母线初始电压PI Controller控制环路PWM Generator产生触发脉冲Three-Phase V-I Measurement测量电压电流3.2 超导线圈主电路搭建与参数初始化超导线圈的主电路我用一个Series RLC Branch模块串联在斩波器的输出端。参数设置如下电阻 ( R 1\times10^{-6},\Omega )电感 ( L 3,\text{H} )电容设为inf也就是无电容。重要的一点一定要勾选“Set the initial inductor current”并设置一个合理的初值。如果初始电流设成0仿真开始时会有一个从0到额定电流的充电过程这是符合物理实际的但如果后续需要做放电工况我一般会把初始电流设为额定值的80%左右这样仿真起步阶段就能快速进入稳定状态省去漫长的充电预热时间。模块里还有一个容易忽略的参数叫“Measurements”建议选“Branch voltage and current”这样可以直接在模块输出端拿到线圈电流和电压信号不用额外加电流传感器。提示超导线圈的初始电流设置是仿真成败的关键。我见过很多人仿真一开始就发散原因就是初始电流和电路实际稳态值相差太大启动瞬间的电流变化率 ( di/dt ) 过大数值求解直接崩了。3.3 VSC与斩波器的连接方式VSC和斩波器之间的连接要注意“地”的问题。VSC的直流侧负端、斩波器的负端必须共地否则Simulink会报“Ground connection missing”的错误或者出现浮地节点。正确做法是在直流母线负极加一个Ground模块确保整个系统有明确的参考电位。VSC的交流侧通过一个滤波电抗器和变压器连接到三相电源。滤波电抗器的电感值刚才算PI参数时提到了取5mH左右变压器的作用是电气隔离和电压匹配我用的是Yg-D11接法的三相变压器变比设为10kV/400V这比较接近实际工程中SMES并网的拓扑。斩波器我建议先搭平均模型验证逻辑。平均模型的做法是用受控电压源接到线圈端电压源的控制信号是占空比乘以直流母线电压用受控电流源接到直流母线端电流源的控制信号是线圈电流乘以占空比。这样搭出来的平均模型没有开关器件仿真速度非常快适合调试控制环路。确认逻辑无误后再用两组IGBT和反并联二极管搭成半桥结构驱动信号互补并加入死区时间。3.4 控制子系统搭建从坐标变换到PWM控制子系统的核心链路是测量信号 - 坐标变换 - 外环PI - 内环PI - 前馈解耦 - PWM调制。首先要做的是锁相环PLL。我用Simulink自带的PLL模块输入三相电网电压输出电网角度 ( \theta )。如果没有这个角度Park变换的d、q轴定向就无从谈起。PLL参数设置里PI控制器的带宽我习惯设在20Hz左右过高容易受谐波干扰过低则动态响应慢。然后是abc到dq的Park变换。Simulink里有现成的“abc_to_dq0 Transformation”模块但要注意它采用的是等幅值变换还是等功率变换两种变换的系数不一样。如果后面要计算功率必须保持VSC和测量环节的变换方式一致否则功率数值会差一个 ( \sqrt{3} ) 倍。这个细节很容易把人坑到——波形看着都对就是功率数值对不上最后发现是等幅值和等功率变换混用了。外环PI的输出作为内环电流的给定值。内环有两个PI控制器分别控制d轴电流和q轴电流。d轴和q轴的输出经过前馈解耦和电网电压前馈补偿后得到VSC输出电压的d、q分量参考值再经反Park变换得到三相调制波送进PWM发生器与三角载波比较产生IGBT的触发脉冲。PWM发生器的载波频率我设置为10kHz这个频率兼顾了开关损耗和波形质量。实际搭建时要注意Universal Bridge自带的PWM接口是“pulses”需要把PWM Generator模块的脉冲输出直接连到桥臂的脉冲输入端。如果信号数据类型不对或者脉冲数量不匹配仿真会直接报错。3.5 求解器设置与仿真参数求解器设置是我反复强调的一个环节。SMES系统里有电力电子开关属于典型的刚性系统我推荐的仿真步长设置如下求解器类型Variable-step变步长或Fixed-step定步长均可但固定步长更符合开关仿真的习惯求解器ode23tb或ode15s这两个适合刚性系统普通ode45很容易在开关瞬间跑不动甚至发散步长固定步长建议设为载波周期的1/100即载波10kHz时步长设为1e-6秒相对误差1e-4绝对误差1e-6在Simscape Electrical的powergui模块里我通常选择“Discrete”模式采样时间设为2e-6秒。如果在连续模式下跑开关模型数值非常容易振荡离散化之后虽然波形会有一点点量化误差但稳定性大幅提升调试效率高得多。4. 仿真实验与结果分析4.1 充电工况仿真从零磁场到额定储能第一个仿真实验是超导线圈充电。线圈初始电流设为0外环给定直流母线电压内环给定目标电流为200A。运行仿真后观察线圈电流波形正常情况下电流会以指数形式上升时间常数等于 ( L/R )。但因为超导线圈的R极小这个时间常数会非常大单纯靠R-C被动充电根本充不进去所以必须依靠斩波器主动控制端电压来强制电流上升。我用电流内环PI控制后线圈电流从0上升到200A的时间大约是0.5秒。在这个过程中斩波器的占空比接近满占空比VSC直流母线电压被钳位在设定值附近。充电初期直流母线会有一个明显的电压跌落因为VSC需要从电网抽取能量给线圈充磁母线电容来不及补充电压瞬时会下降几十伏随后由外环PI调节回来。这段波形非常能说明双闭环控制的必要性和动态调节过程。4.2 放电工况仿真毫秒级能量释放第二个实验模拟放电。线圈初始电流设为200A目标电流突降为50A相当于释放掉了87.5%的储存能量。放电瞬间线圈两端电压反极性斩波器工作在Boost模式把线圈的高压侧能量回馈给直流母线。实测波形显示母线电压在放电开始后的5毫秒内会上升约15%随后VSC逆变器把多余能量馈送回电网或负载母线电压逐渐恢复。这个过程中最值得观察的是放电功率在极短时间内达到峰值功率冲击非常剧烈。如果控制系统响应不够快直流母线电压会过冲甚至击穿电容。所以我建议在放电实验时给直流母线并联一个较大的支撑电容比如10mF防止电压尖峰损坏其他模块。这个细节在纯理论分析中很少被提及但做仿真实验时基本都要加。4.3 负载突变场景下的动态补偿效果第三个实验我觉得是最有价值的交流母线接了一个感性负载突然并上一个额外的大功率负载导致母线电压跌落。在没有任何补偿措施时母线电压跌落深度约为30%恢复时间需要几百毫秒。投入SMES系统后控制器检测到母线电压跌落立即触发功率外环响应超导线圈在10毫秒内释放能量把母线电压的跌落到压制在10%以内并且恢复时间缩短到50毫秒左右。这个实验直观展示了SMES作为电能质量设备的独特价值——它不是靠长时间输出能量维持系统而是靠极快的功率响应把暂态过程“托住”为其他慢速补偿设备争取时间。这也是为什么在微电网和高端制造供电场景中SMES始终有一席之地。4.4 参数敏感性分析控制参数对系统响应的影响我还在模型上做了控制参数的敏感性测试。把电流内环Kp从5增大到20电流响应速度明显加快但开关电流纹波也增大线圈电流波形出现了明显的高频振荡把Kp减少到1电流响应变得迟钝放电工况下母线电压跌加深。把Ki从100增大到500稳态误差消除得更快但调节过程出现了约10%的超调振荡。这个敏感性分析说明PI参数不是越大越好也不存在一组万能参数。实际工程中都是根据系统带宽需求和开关频率限制折中选取。我建议各位在做仿真时至少跑三组PI参数做对比记录下每一组的超调量、调节时间和稳态误差这样才能真正理解每个参数在系统动态过程中的角色。5. 常见问题、仿真发散原因与实用排查技巧5.1 仿真不收敛或发散高频踩坑大头做电力电子Simulink仿真最崩溃的瞬间就是点下Run之后Scope里蹦出一条直线到Inf或者满屏NaN。SMES系统仿真的发散原因我总结下来主要有四类。第一类是步长过大。开关频率10kHz的PWM脉冲宽度最短也只有50微秒如果固定步长设置成1e-4秒也就是100微秒等于一个开关周期只算了半个点IGBT通断被完全漏掉结果必然发散。解决办法就是缩小步长至少1e-6秒。第二类是代数环。控制器需要用到线圈电流的瞬时值计算输出电压而这个电压反过来又作用于电流形成了瞬时反馈回路。Simulink若不能自动解算代数环就会报“Algebraic loop”或仿真极慢。解决办法是在反馈路径上加一个Memory模块或者1/z延迟单元打破代数环代价是降低一个仿真步长的控制精度。这个精度损失在1e-6秒步长下可以忽略。第三类是初始条件不合理。刚提到过线圈初始电流和电路的稳态工作点差距太大启动瞬间 ( di/dt ) 无穷大求解器直接崩。解决办法是给线圈一个合理的初始电流或者先跑一段空载仿真热机再把工作点作为新模型的初始条件。第四类是变压器和电感的饱和效应。如果用的是非线性电感模块电感值在电流过大时会下降导致电流尖峰。SMES工作电流很大很容易触发饱和建议在早期调试阶段先用线性电感模型确保逻辑正确后再考虑用非线性模型。5.2 波形异常但仿真没报错如何快速定位有一种比发散更让人头疼的情况——仿真能跑完波形也不满屏飞但就是有高频振荡、直流偏置或者慢漂移。以下是我常用的排查顺序。先看电网电压和PLL角度。Park变换依赖角度如果PLL输出角度有波动所有d、q轴的量都会带振荡。可以在Scope里同时显示三相电网电压经过坐标变换后的d轴分量它应该是一个平滑的直流量。再看VSC调制波和载波。把调制波的幅值和载波峰值对比如果调制波幅值超过了载波幅值就会出现过调制输出电压畸变。正常的调制波幅值应该小于载波峰值给PWM留足线性调制区间。最后看直流母线电压。母线电压的纹波直接反映了电容选型和VSC控制的好坏。如果纹波过大优先检查电容容值和外环PI参数如果纹波频率是PWM频率的两倍那基本可以确定是电流纹波耦合到母线电压上了需要在母线上并一个高频吸收电容。5.3 仿真速度太慢的优化技巧迭代跑参数时开关模型一次仿真可能要跑几分钟甚至十几分钟非常痛苦。我的方法是分层优化。第一层用平均模型替代开关模型。平均模型没有IGBT导通/关断过程仿真速度至少提升一个数量级。控制逻辑验证、PI参数粗调都在平均模型上做。第二层把非关键的测量环节移除。Simulink中转储波形数据本身不慢但每个“Scope”模块在仿真过程中都会缓存大量数据尤其是仿真时间很长时内存占用和写盘时间会拖慢速度。我一般只在关键观测点放Scope其他信号通过“To Workspace”模块按需保存。第三层调整powergui的离散采样时间。从2e-6秒放宽到5e-6秒速度提升明显但如果放宽后波形有明显失真就要权衡了。提示建议把这些设置改成一个参数化脚本放在模型的InitFcn回调函数里。每次仿真前自动执行不用手动一个个去点参数对话框省时省力还不容易出错。5.4 从仿真模型到C代码生成的延伸最后聊一个实用扩展——Simulink模型生成C代码。热词里有“simulink模型c代码生成”这确实是Simulink的杀手锏之一。在SMES这个项目里控制子系统模型验证完毕后用Embedded Coder可以直接生成控制算法的C代码部署到DSP或FPGA里做硬件在环测试。需要注意能生成代码的模块必须是离散域模块所以控制子系统里要把连续PI控制器改成离散PI用Z变换实现并且用固定步长求解器。变换公式很简单[ u(k) u(k-1) K_p [e(k) - e(k-1)] K_i T_s e(k) ]把这个递推式用Simulink的标准模块搭出来代码生成就是水到渠成的事。我在这个项目里就是用离散PI替换连续PI后成功生成了C代码在仿真环境中跑了一遍硬件在环逻辑验证效果很理想。6. 实操总结与避坑指南6.1 建模全流程速查表为了方便你对照执行我把从零搭建SMES仿真模型的完整流程整理成一张速查表。每个步骤还有对应的核心要点和常见错误边做边查可以省去大量试错时间。步骤操作内容核心要点常见错误1参数初始化脚本设定线圈L/R、母线电压、目标电流、PI参数忘记设置线圈初始电流2搭建主电路VSC斩波器线圈负极共地浮地节点负端未接地3搭建测量环节电压电流测量模块、Park变换等幅值/等功率变换混用4搭建控制环路外环功率/电压-内环电流-PWM未做前馈解耦dq轴互相干扰5求解器设置固定步长1e-6ode15s或ode23tb步长过大漏掉开关过程6仿真验证充电、放电、负载突变三个场景充电未到稳态就切换工况7参数敏感性分析记录超调量、调节时间、稳态误差只跑一组参数就下结论8代码生成可选离散PI替换连续PI生成C代码连续模块导致代码生成失败6.2 我踩过的最深的坑写这篇文章时我回想了一下自己做SMES Simulink仿真时印象最深的一次事故。当时用了连续求解器ode45步长自动调节模型规模不大我以为不会出问题。结果仿真进行到0.3秒左右时线圈电流突然跳变到几千安紧接着所有波形全部变NaN。后来排查了很久才发现问题出在IGBT开关瞬间ode45为了满足误差容限自动缩小步长但在这个刚性系统里缩小步长反而让开关状态的数值切换变得极其敏感最终导致了数值爆炸。换成ode23tb并用固定步长后问题立刻消失。这次经历让我养成了一个习惯凡是带电力电子开关的仿真一律优先选ode23tb或ode15s步长宁可取小一点也不依赖变步长去“救场”。这个经验我建议所有做电力电子仿真的朋友记下来能少走两天的弯路。6.3 后续可以怎么扩展SMES仿真模型搭好之后扩展方向其实很多。可以做系统级的微电网仿真把SMES和光伏、风电模型联合起来研究新能源并网时的功率平抑效果也可以做SMES和电池的混合储能系统发挥SMES快响应和电池大容量的互补优势如果条件允许还可以把模型部署到硬件在环仿真平台接上真实的控制器验证策略。另外热词里提到了联合仿真比如“amesim与simulink联合仿真”。如果你需要研究SMES的低温恒温系统对超导线圈性能的影响可以考虑把线圈的热模型放到AMESim里建电气部分留在Simulink里通过联合仿真接口交换数据。这种跨工具协同仿真的投入成本高一些但确实能把系统的机电热多物理场行为更完整地描出来。根据我个人的习惯每次重新打开一个SMES仿真项目我不会直接去改模型文件而是先跑一遍参数初始化脚本把关键参数打印出来确认一遍。检查无误后再运行仿真查看波形。这个习惯帮我避免了很多因为参数覆盖混乱导致的“灵异问题”。希望这套建模方法、参数整定流程和排错经验能帮你更快地把SMES仿真模型跑起来。
返回列表