ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

锂离子电池Simulink模型搭建与SOC仿真实践指南

锂离子电池Simulink模型搭建与SOC仿真实践指南 简介本资源是一套面向电池建模与仿真初学者及新能源系统工程师的锂离子电池Simulink综合模型库聚焦磷酸铁锂电池在电动汽车、储能系统等场景下的多维度建模需求覆盖电化学特性、热行为与SOC估算等核心问题。压缩包共45个文件包含11个可直接运行的Simulink模型.slx、7个MATLAB脚本.m用于参数初始化与数据处理、6个传统.mdl模型如PNGV、二阶RC、微分方程模型、6张关键仿真结果图.png及3个.mat实验数据文件整体仅567KB轻量易用。已有2462人学习下载资源结构清晰按模型类型分层组织每个子模型均配有对应说明或示例数据如LiBatt_PulseData.mat、ssc_lithium_cell_1RC_estim.mat支持快速对比不同建模方法BP神经网络、一阶/二阶RC、热耦合模块的动态响应与精度差异特别适合开展电池管理系统BMS算法验证与教学演示。 说句实在话在收到这份“锂离子电池Simulink模型.zip”之前我一直觉得网上能直接拿来用的电池模型少得可怜。倒不是说没有而是绝大多数模型要么只有个空壳要么参数和物理意义对不上跑出来的波形根本没法拿去汇报。这份zip里装的是一套基于等效电路法搭建的锂离子电池仿真模型核心用途是在Simulink环境里模拟电池在充放电工况下的端电压变化、SOC估算、温度影响乃至后续的代码生成和界面联调。它不是一个扔进去就能跑的玩具而是一套能接入BMS算法验证、整车能量管理仿真、控制器原型开发的工程模型。这套模型适合谁三类人一是刚接触电池仿真的研究生想搞清楚等效电路模型到底怎么落地二是做BMS算法开发的工程师需要一个可信的电池被控对象来验证SOC/SOH算法三是做嵌入式代码生成的硬件工程师想把电池模型直接在控制器里跑起来。如果你属于其中任何一类这篇基于这套模型展开的拆解、搭建和排错笔记应该能帮你省下不少弯路。1. 拆开这份压缩包先看锂电池模型解决了什么问题1.1 压缩包里的文件应该长什么样我拿到的这份zip解压之后不是只有孤零零一个.slx文件而是带了一套相对完整的模型工程大致包含这么几类文件battery_model.slx主模型通常是一阶或二阶RC等效电路封装成子系统或者带Mask的模块。init_params.m参数初始化脚本里面定义了电池容量、内阻、RC网络参数、OCV-SOC查表数据。这一步非常关键没有它模型打开就是一堆报错。SOC_OCV.mat或对应的Excel表格存放OCV-SOC曲线数据是查表模块的数据源。test_sim.slx或demo_sim.m配套的验证模型和自动化测试脚本用来跑标准工况验证模型行为是否合理。app_battery.mlapp如果有基于App Designer写的仿真控制界面用来调参数、跑仿真、看曲线。我在检查这类模型时有个习惯先看有没有init_params.m。Simulink模型里的很多参数都是靠工作区变量名来引用的比如R0、R1、C1如果没跑初始化脚本模型里就是一堆未定义符号一仿真必然报错。所以拿到压缩包第一步不是打开模型而是先把初始化脚本跑一遍确认工作区变量都齐了再说。1.2 这套模型能做的三件实事第一工况仿真。把电流工况数据比如NEDC工况电流序列、HPPC测试序列作为输入喂给模型模型能输出端电压、SOC、RC网络电压等关键信号。这是最基础的用法也是验证参数靠不靠谱的第一步。第二算法验证。在模型外面接入自己的SOC估算算法比如扩展卡尔曼滤波EKF、无迹卡尔曼滤波UKF把模型当“真实电池”用验证算法在不同工况下的估算误差。这个场景是电池模型价值最大的地方因为直接用真实电池迭代算法成本太高而模型可以任意设置初值、叠加噪声、改变温度把边界情况都测一遍。第三代码生成与GUI联调。模型搭好之后可以配置成生成嵌入式C代码跑到单片机或快速原型控制器里也可以用App Designer搭一个操作界面在界面上点按钮、调滑杆实时看到仿真曲线实现参数交互式调试。我自己的经验是把这三件事都跑通这套模型才算真正用起来。只拿它跑一个固定仿真价值连十分之一都没发挥出来。2. 为什么是等效电路模型选型与整体架构拆解2.1 四种电池建模路线的取舍电池建模不是一个新问题业内常见的路线有四条电化学模型如P2D模型、等效电路模型ECM、数据驱动模型神经网络、高斯过程、经验公式模型。这四类各有各的适用场景放在Simulink里做工程仿真我个人的选择很明确优先等效电路模型。原因是P2D模型精度高能模拟锂离子浓度分布、SEI膜生长这些微观机制但动辄几十上百个偏微分方程参数需要从电芯设计图纸里拿别说一般工程师很多电池厂自己都未必能凑齐。数据驱动模型拟合能力强但泛化性堪忧换个温度、换个老化状态预测值就可能漂到天上去。经验公式模型太粗糙只能算个趋势撑不起算法验证。等效电路模型的好处是物理意义清楚每个电阻电容都有明确对应欧姆内阻、极化电阻、极化电容参数可以通过HPPC实验标定不需要拆电芯模型复杂度适中既能跑实时仿真也能生成嵌入式代码。所以这套zip里采用这个路线不是随便选的是工程实践权衡后的结果。2.2 一阶RC还是二阶RC精度与算力的平衡点等效电路模型内部还有细分。最简单的是一阶RC模型一个欧姆内阻R0串联一组RC并联网络方程是这样的极化电压动态dV_RC/dt (I/C1) - V_RC/(R1*C1)端电压输出V_t OCV(SOC) - R0*I - V_RC一阶模型的好处是参数少、辨识容易、实时性好。缺点是模拟电池在动态工况下的“多时间常数”响应时不够精细。什么意思呢电池极化过程其实有快慢之分浓差极化往往很慢可能要几十秒甚至几分钟才能稳定而电化学极化只需要毫秒级。一个RC网络只能用单一时间常数tau R1*C1去拟合所有过程必然会顾此失彼。二阶RC模型就多了一个RC网络变成两个极化过程分别建模dV_RC1/dt (I/C1) - V_RC1/(R1*C1)dV_RC2/dt (I/C2) - V_RC2/(R2*C2)V_t OCV(SOC) - R0*I - V_RC1 - V_RC2对应的端电压表达式多了一项。代价是参数翻倍辨识工作量增加但换来的是动态精度明显提升。特别是在脉冲电流、急加速急减速这种剧烈工况下二阶模型的端电压响应和真实电池贴合度更好。那么这个zip里到底用一阶还是二阶我的建议是如果是做BMS算法验证、续航估算这类需要精度的场景优先二阶如果只是想搭个演示模型、做纯教学、或者控制器算力极为有限一阶就够了。实际工程里很多量产BMS项目用的就是一阶RC加温度修正的变体关键是标定数据的准确度而不是模型阶数本身。阶数越高对参数辨识误差的敏感度也越高参数标不好二阶模型可能比一阶还差。2.3 模型的输入输出接口如何设计拿到这套模型我首先看的是它的接口设计。一套好的电池模型输入输出必须清晰。我常见的接口设计是输入端I_pack负载电流约定正方向为放电为正充电为负。T_cell电芯温度作为温度修正的输入。SOC_initSOC初值通常通过参数或者外部信号注入。输出端V_t端电压单位V。SOC当前荷电状态0到1之间的小数也可以换算成百分比。V_RC1和V_RC2极化电压中间量方便示波器观察。Q_passed已通过的安时数用于积分统计。这里有一个非常容易踩的坑电流方向的定义。如果你把正方向定义成充电为正后面接整车模型时电机消耗功率对应的电流方向就会反掉端电压表现会完全错乱。我建议拿到模型后第一件事就是跑一个恒流放电测试看SOC是不是在下降、端电压是不是先跳变再缓慢下降。如果是那么方向约定没问题如果不是趁早改。3. 核心状态方程与参数辨识这些坑必须搞懂3.1 OCV-SOC曲线电池的“身份证”OCV开路电压和SOC之间的关系是电池模型里最重要的静态特性也是整个模型的“地基”。OCV-SOC曲线本质上是电池在静置足够长时间后正负极电位差与嵌锂量的关系曲线。不同化学体系的电池这条曲线长得完全不一样磷酸铁锂的曲线在中段异常平缓电压随SOC变化极小这给SOC估算带来了著名的“平台区难题”三元锂的曲线相对陡一些估算会容易一点。在Simulink里OCV-SOC曲线通常用一个Lookup Table模块实现。输入是SOC0到1输出是OCV值。查表数据一般通过小电流充放电加间断静置的方式获得。具体做法是以0.05C小电流将电池充满静置2小时记录端电压作为SOC100%的OCV然后以0.05C放电10%容量静置2小时再记录电压如此循环就能得到SOC从100%到0%的20个点中间的点用线性插值补出来。这里有一个我踩过的坑OCV-SOC曲线一定要用“小电流充放充分静置”的数据而不是直接把不同SOC下的端电压拿来用。因为带负载的端电压里面含了欧姆压降和极化电压直接拿去当OCV模型在静置状态下预测的端电压和实际能差到几十毫伏。对电压精度要求高的BMS算法来说这几十毫伏足以让SOC估算产生几个百分点的偏差。3.2 安时积分法与SOC初值校准SOC的计算最常用的是安时积分法也叫库仑计数法公式很朴素SOC(t) SOC(0) - (η / Q_nominal) * ∫ I dt其中Q_nominal是电池当前温度下的实际可用容量单位Ahη是库仑效率放电时约等于1.0充电时略小于1.0因为充电过程中有一部分能量会变成热散失掉。在Simulink里这个积分用Integrator模块实现初值就设成SOC_init参数。这里有个细节容易被忽略Q_nominal不是电池出厂标称容量而是随温度和老化状态变化的实际容量。如果模型里写死一个固定容量在低温工况下仿真SOC会明显偏大因为低温下可用容量可能只有标称容量的80%左右。常规做法是给容量建一个关于温度的一维查表Q(T) load_Table_Temperature再用一个SOH健康度标量缩放老化即Q_used Q(T) * SOH。另一个坑是积分器饱和问题。SOC在0到1之间如果电流方向混乱或者积分初值不对SOC很容易超出边界一旦SOC1查表模块就会越界报错或者输出一个毫无物理意义的值。所以我强烈建议在SOC积分环节后面加一个Saturation模块上下限设为0和1同时把查表模块的查表范围也设成0到1双保险。3.3 RC参数的HPPC辨识实操RC参数是等效电路模型的核心“动力参数”它决定了模型在动态工况下的响应能力。业界最常用的辨识实验叫HPPCHybrid Pulse Power Characterization也就是混合脉冲功率特性测试。整个流程是这样电池充满电静置1小时以上。以1C电流放电10秒模拟瞬时负载静置40秒让电池去极化。以0.75C电流充电10秒模拟回充静置到电压稳定。放电一定容量比如10%SOC后再次静置重复上述脉冲序列直到SOC降到0附近。拿到脉冲响应数据后参数辨识的步骤是这样的看放电瞬间的电压骤降这个瞬间压降除以电流就是欧姆内阻R0因为RC网络的电压不能突变瞬间能响应的只有纯电阻。然后看电流撤掉之后电压的渐进回升段对这几十秒的回升曲线做指数拟合。一阶RC模型对应单指数拟合二阶RC模型对应双指数拟合单指数形式V(t) V0 A * exp(-t / tau)双指数形式V(t) V0 A1 * exp(-t / tau1) A2 * exp(-t / tau2)拟合出来的时间常数tau就是R*C的值而幅值A对应的就是RC网络的极化电压初始值反过来就能推出R和C。用MATLAB的fit函数或者lsqcurvefit都可以做这个拟合。实测下来二阶模型的双指数拟合对初值很敏感如果初值给得不好拟合出来的时间常数会相差好几倍。我的做法是先用肉眼观察数据粗略估算一个快时间常数几秒和一个慢时间常数几十秒作为拟合初值再让优化算法做精细调整。还有一个提示HPPC数据一定要做平滑滤波但不要用移动平均把脉冲沿给抹平了那个瞬间跳变是算R0的关键。4. Simulink建模实操从零搭出可复用的电池模型4.1 模块选型基础模块、Simscape还是MATLAB Function搭电池模型Simulink里至少有三条路纯基础模块拼、Simscape Battery工具箱、MATLAB Function里写状态方程。这三条路我在不同项目里都走过各有优劣。纯基础模块Integrator、Gain、Sum、Lookup Table拼出来的模型胜在“透明”每个模块对应一个物理过程调试时可以直接看中间信号也容易确认模型逻辑对不对。缺点是模块数量多排列连线费时间。Simscape Battery工具箱的优势是省事模型库里已经帮你封装好了等效电路电池模块填参数就能用而且有专门的Battery Table编辑器能直接生成参数化电芯数据。但这东西有个问题生成代码和跨版本兼容性比较一般遇到团队协作时别人没有装Simscape Battery的授权就打不开你的模型。MATLAB Function或者叫MATLAB Function模块写状态方程是最灵活的方式。一个函数里把状态更新和输出方程全写了代码量小容易维护。缺点是函数内部如果写了不支持的语法代码生成阶段会报错且调试时不能像查模块那样直接看信号。我个人的倾向是如果是自用研究模型用MATLAB Function最舒服如果是交付给团队、要生成代码、要长期维护用基础模块拼虽然前期麻烦但后期最稳。这套zip里的模型如果是按基础模块搭的我建议你重点看它的积分、查表和饱和处理三个部分这是模型的“骨架”。4.2 搭建步骤从状态方程到仿真验证如果你打算从零搭一个二阶RC模型我给出一套可以照抄的步骤新建Simulink模型添加SOC积分通道。用一个Integrator模块输入是-I*eta/Q_nominal初值设为SOC_init输出接Saturation模块限幅0到1。添加OCV查表模块。Lookup Table (1-D)查表数据填OCV_data断点数据填SOC_breakpoints。输入接SOC输出是OCV值。搭两个RC网络。每个RC网络可以用一个积分器加一个反馈增益来实现dV_RC/dt (I/C) - V_RC/(R*C)。这个表达式的三个输入分别是电流除以电容、RC电压除以时间常数负反馈、电流的扰动项。积分器初值设0。算端电压。用Sum模块把OCV减去R0*I减去V_RC1减去V_RC2得到V_t。这里的乘法可以用Gain模块也可以用乘积模块建议把电流信号复制三路分别接R0、C1、C2相关通道。加温度修正。如果模型需要反映温度影响把温度输入T接进来用一维查表得到当前温度下的R0、R1、R2、C1、C2修正系数用乘法作用到基值参数上。封装信号。所有需要对外观察的信号比如V_t、SOC、V_RC1、V_RC2接上Outport模块设置好标签。写初始化脚本把所有参数定义到工作区。然后跑一个简单的恒流放电仿真看端电压是不是先跳降再平缓下降。搭完之后立刻做一件事把模型从一个子系统封装成带Mask的模块。右键选择Create Subsystem然后编辑Mask把SOC_init、Q_nominal、R0、R1、C1、R2、C2都设置成Mask参数。这样后面在不同项目里用这个模型只需要改Mask参数就行不用去改内部模块。这个步骤很多人偷懒不做等到参数要批量扫描时才后悔。4.3 参数化封装与批量仿真的实现封装完成之后批量仿真就方便了。比如我想扫描不同SOC初值下的放电曲线用脚本循环跑就行clear; run(init_params.m); socList 0.2:0.1:1.0; figure; hold on; for i 1:length(socList) simIn Simulink.SimulationInput(battery_model); simIn simIn.setVariable(SOC_init, socList(i)); simOut sim(simIn); plot(simOut.tout, simOut.yout{1}.Values.Data); end legend(cellstr(num2str(socList, SOC%0.1f)));这里有个必须注意的机制用setVariable设置的变量只对本次仿真生效不会污染工作区里其他变量。这是SimulationInput的推荐用法比直接改工作区变量再sim()要安全得多。我之前就吃过亏直接在回调里用assignin改工作区变量跑完一个仿真工作区里的SOC_init就变了下一个仿真如果不小心忘了重置结果全错。5. 让模型走出SimulinkC代码生成与GUI实时显示5.1 配置C代码生成别让模型卡在仿真世界里电池模型仿真做得再漂亮最后还是要落到控制器里跑才有工程价值。这块的流程是用Embedded Coder生成C代码然后集成到BMS主控或硬件在环平台里。配置步骤我总结为四步打开模型配置参数CtrlE进入Solver页面求解器类型改成“固定步长”求解器选ode4或ode3固定步长根据你的控制周期来BMS算法一般是10ms或者1ms我用得最多的是10ms。进入代码生成页面系统目标文件选ert.tlcEmbedded Coder目标语言选C点击“生成代码”。在生成之前确保模型里所有的模块都支持代码生成。重点检查Scope、Display这类可视化模块它们不需要出现在生成代码里建议在建好模型后就删掉用Outport代替。配置代码接口。如果需要把模型函数封装成可被外部调用的形式在“代码生成-接口”里设置。比如把模型包装成函数void battery_model_step(void)输入输出通过全局变量或者外部输入结构体传递。点击生成检查生成报告里的警告和错误信息。我遇到过比较典型的问题是模型里用了某些高级模块比如Signal Editor里带复杂数据文件代码生成时会直接报错。经验是要生成代码的模型建议所有数据源都从Inport进所有信号都从Outport出不要依赖工作区变量和信号加载器。这套模型如果从一开始就按这个规范搭生成代码会非常顺畅。5.2 App Designer调用Simulink模型把仿真结果搬进GUI界面最近用MATLAB App Designer的人越来越多因为MIL模型在环阶段的调试工具用它搭一个界面比每次都敲命令行看波形要直观多了。标题里那个“matlab之app designer simulink模型调用及仿真结果显示在gui界面上”的热词我在这里把流程拆开讲。核心思路其实极其简单App的回调函数里调用sim()函数仿真完之后从SimulationOutput对象里取数据然后更新到App的坐标轴组件上。一个最简示例如下% 按钮运行仿真的回调 function RunButtonPushed(app, event) % 从界面读取电流激励幅值 amp app.AmpSpinner.Value; % 构造输入电流序列先恒流放电再静置 t (0:0.1:100); I amp * [ones(50,1); zeros(501,1)]; % 前5秒放电后50秒静置 % 把电流数据注入模型工作区 simIn Simulink.SimulationInput(battery_model); simIn simIn.setExternalInput(I_pack, timeseries(I, t)); simIn simIn.setVariable(SOC_init, app.SOCInitSlider.Value/100); % 运行仿真 simOut sim(simIn); % 取数据 tout simOut.tout; Vt simOut.yout{1}.Values.Data; soc simOut.yout{2}.Values.Data; % 绘图 plot(app.UIAxesV, tout, Vt); plot(app.UIAxesSOC, tout, soc); end这里有几个关键点第一setExternalInput负责把App界面上的电流数据作为模型的输入信号灌进去。模型里必须有一个Inport叫I_pack而且外部输入模式要设置成“输入端口”而非“从工作区加载数据”。这个机制比用assignin硬塞工作区变量要干净得多也容易排查问题。第二取仿真输出时用simOut.yout{1}.Values.Data这种链式索引。如果模型里用的是信号记录方式不同路径可能变成simOut.logsout.get(V_t).Values.Data这个要看模型配置里信号记录的方式。跑一次仿真后直接在命令行打印simOut就能看到输出数据的结构和属性。第三如果仿真时间长、数据点数多直接绘图会让界面卡死。解决办法是降采样plot(app.UIAxesV, tout(1:10:end), Vt(1:10:end))。这个细节在GUI交互时特别重要否则用户拖动一个滑杆界面就要转圈三秒体验极差。实时交互的场景我建议用timer对象周期性触发仿真。每100毫秒跑一次模型取最新一个时间点的输出更新UI上的数字或曲线。这样就能做到“拨动滑杆电压表指针跟着动”的交互效果。前提是模型仿真速度要够快一个步长如果超过50ms肯定跟不上这时候就得考虑把模型降阶或者缩小仿真时域。5.3 把电池模型接入车辆运动学模型做联合仿真热词里还有“simulink车辆运动学模型”这也是电池模型非常典型的一个扩展场景。整车仿真里电池不是孤立工作的它通过电机给车辆供电车辆跑起来之后反过来又通过电机消耗电池能量。一个完整闭环的搭建思路是这样的电池模型输出端电压V_t和SOC电机模型根据驾驶员指令计算需求功率P。需求功率除以电池端电压得到电池放电电流I P / V_t喂回电池模型输入端。电机输出转矩和转速驱动车辆运动学模型计算车速v和加速度a。车辆运动学模型根据车速、坡度、行驶阻力等参数反算电机需求转矩形成闭环。这里最容易出现的问题就是代数环。原因是电流依赖电压、电压又依赖电流如果建模时直接连成回路Simulink在仿真时会报“Algebraic loop detected”或者在每个步长里做迭代求解仿真速度慢得离谱。解决代数环我常用的方案有两个一是在电流反馈路径上加一个单位延迟Unit Delay模块打破瞬时依赖二是在电流计算回路中并联一个低通滤波器允许电流信号有一点滞后。第二种方法更接近物理实际情况因为真实系统中电流传感器本身就有响应延迟。从数值稳定性角度讲推荐滤波而不是纯延迟。联合仿真跑通之后就可以做很多有意思的验证了比如用WLTC工况跑一遍看SOC曲线下降是否符合预期电机功率峰值时电池端电压有没有低于保护值。这套电池模型在整车环境下就不再是一个孤立的演示模块而是能支撑能量管理策略开发、部件匹配选型的仿真基础。6. 我踩过的坑常见问题与排查技巧6.1 仿真发散、闪算错误与代数环电池模型仿真的发散现象一般有两种一是输出曲线飞到无穷二是报“Singularity in state derivatives”之类的错误。前者最常见的原因是积分器增益的符号不对。RC网络微分方程里如果负反馈项的符号写反了时间常数就变成了正反馈系统必然发散。排查办法断开外部负载单独给RC网络注入一个脉冲电流看极化电压是不是先升后降收敛到一个稳定值。代数环的排查方法之前提过。还有一个特征如果仿真很慢每一步都卡住十有八九就是代数环。打开诊断窗口看有没有代数环提示有的话在回路里加延迟或者滤波。6.2 参数辨识结果不收敛、曲线匹配差HPPC参数辨识时我反复遇到过双指数拟合不收敛的情况。原因通常是初始的tau1和tau2里有一个太大或太小超出了优化器默认的搜索范围。解决办法是用lsqcurvefit时手动设置lb和ub上下界比如快时间常数限制在0.1到5秒慢时间常数限制在5到100秒。另外静置段的数据长度要足够长至少要覆盖慢时间常数的三到五倍否则慢指数项根本没有衰减完拟合结果就没意义。模型输出和实测曲线匹配差还要检查一个点SOC估计的准确度。如果在整个辨识过程中SOC算偏了OCV查表就会错位端电压拟合怎么调都调不好。建议在做HPPC辨识前先花一个晚上把电芯做一次完整的容量标定确保SOC参考值是可靠的。6.3 代码生成报错与GUI联调卡顿代码生成最常见的报错集中在“不支持此模块”和“数据类型转换问题”。前者一般是因为模型里用了Signal Editor或者其他交互式输入模块处理方法我之前说过统一换成Inport。后者出现在查表模块输出是double而控制器外设接口需要single的场景。解决办法是在Outport后面加Data Type Conversion模块显式转换类型。App Designer联调时的卡顿我在5.2节说了降采样。还有一个非常隐蔽的坑在App回调里直接调用sim()会阻塞UI线程如果某个模型仿真遇到问题回调异常会导致整个App无响应。我的做法是在回调里包一层try-catch仿真失败时把错误信息显示在App的Label组件上而不是让错误弹窗打断用户。这样界面不会崩排查问题也有据可循。6.4 一套实用的检查清单最后给一份我每次拿到陌生电池模型都会执行的检查清单你可以直接抄作业有没有初始化脚本运行后工作区是否出现了模型引用的全部变量电流方向约定是什么先跑一个恒流放电看SOC和端电压趋势对不对。OCV查表范围是否覆盖0到1SOC饱和有没有加温度修正有没有开启修正系数在极端温度下会不会把R0推到不合理范围模型里有没有Scope、Display等可视化模块生成代码前必须清理。仿真步长和求解器是否匹配固定步长模型不要用变步长连续求解器。这套锂离子电池Simulink模型从拆包到改造成可以生成代码、可以接App Designer、可以跑联合仿真的完整流程我前后折腾了差不多两周。最大的体会是模型能不能用关键不是公式多漂亮、模块画得多花哨而是参数和边界条件有多贴近现实。拿到任何一套模型先跑通、再质疑、再改造才是最快的上手路径。希望这份拆解笔记对正在捣鼓电池模型的朋友有帮助。本文还有配套的精品资源点击获取
返回列表