車(chē)電制動(dòng)優(yōu)先能量回收策略實(shí)現(xiàn))
做純電動(dòng)車(chē)仿真和標(biāo)定的同行應(yīng)該都碰過(guò)同一個(gè)矛盾整車(chē)模型用CRUISE搭電機(jī)、電池、制動(dòng)器、輪胎一個(gè)個(gè)模塊往里拖就行十分鐘就能拉出一臺(tái)整車(chē)的仿真骨架但控制策略尤其是能量回收這種帶狀態(tài)判斷、帶扭矩分配、帶一堆邊界條件的邏輯塞進(jìn)CRUISE內(nèi)置的Function模塊里寫(xiě)起來(lái)難受調(diào)起來(lái)更難受。這次做“CRUISE純電動(dòng)車(chē)仿真模型基于Simulink DLL聯(lián)合仿真實(shí)現(xiàn)電制動(dòng)優(yōu)先能量回收策略”這個(gè)項(xiàng)目我的處理思路就是把策略層整體放到Simulink里整車(chē)動(dòng)力學(xué)交給CRUISE能量回收策略在Simulink里搭好編譯成DLL交給CRUISE調(diào)用。兩個(gè)工具各干各擅長(zhǎng)的活聯(lián)合仿真的關(guān)鍵就是中間那層DLL接口。這篇內(nèi)容把項(xiàng)目從思路、策略設(shè)計(jì)、DLL實(shí)現(xiàn)到參數(shù)標(biāo)定和踩坑記錄完整拆一遍適合正在做CRUISE和Simulink聯(lián)合仿真的工程師參考也適合剛接觸能量回收策略、想搞明白“電制動(dòng)優(yōu)先”怎么落地的新人。全文技術(shù)性偏強(qiáng)但我會(huì)把每個(gè)關(guān)鍵選擇的理由都寫(xiě)清楚照著做能少繞很多彎。1. 項(xiàng)目整體設(shè)計(jì)與技術(shù)選型1.1 為什么是“CRUISE跑整車(chē)、Simulink跑策略”的分工CRUISE做整車(chē)動(dòng)力學(xué)模型確實(shí)強(qiáng)部件模塊覆蓋電機(jī)、電池、制動(dòng)器、車(chē)輪、車(chē)身、差速器應(yīng)有盡有建?;究客献Ш吞顓?shù)比從零搭一套整車(chē)動(dòng)力學(xué)方程要快得多。但它的短板也很明顯內(nèi)置邏輯模塊寫(xiě)復(fù)雜策略不友好。制動(dòng)能量回收不是一條公式就完事它涉及制動(dòng)踏板解析、SOC區(qū)間判斷、電機(jī)外特性查表、電池充電功率限制、回收扭矩斜率限制、急剎退出條件……這一串邏輯用CRUISE自帶的Function模塊堆層級(jí)不清晰后續(xù)調(diào)參也費(fèi)勁。反過(guò)來(lái)Simulink在邏輯編寫(xiě)和調(diào)試上有天然優(yōu)勢(shì)Stateflow畫(huà)狀態(tài)機(jī)、查表模塊做特性曲線、Rate Limiter做斜率限制信號(hào)線往Scope上一拖就是實(shí)時(shí)曲線調(diào)參效率高一個(gè)量級(jí)。而且策略模型放在Simulink里還有一個(gè)隱性好處——后續(xù)如果要把策略往實(shí)車(chē)控制器遷移很多函數(shù)級(jí)邏輯可以直接復(fù)用不用推倒重寫(xiě)。所以這個(gè)項(xiàng)目從一開(kāi)始就定了分工CRUISE提供受模型驗(yàn)證過(guò)的整車(chē)部件模型負(fù)責(zé)車(chē)輛縱向動(dòng)力學(xué)響應(yīng)Simulink里的DLL負(fù)責(zé)控制策略包括駕駛員意圖解析、扭矩分配、回收邊界判斷。這樣兩邊都是自己最擅長(zhǎng)的工作方式聯(lián)合仿真才能把精力花在策略本身而不是花在跟工具較勁上。1.2 為什么選DLL而不是MATLAB API或FMUCRUISE和Simulink聯(lián)合仿真的路不止一條項(xiàng)目初期我把常見(jiàn)的三種方式都對(duì)比過(guò)一遍。接口方式基本原理優(yōu)點(diǎn)缺點(diǎn)MATLAB API仿真時(shí)CRUISE實(shí)時(shí)調(diào)用MATLAB引擎執(zhí)行模型部署簡(jiǎn)單模型改動(dòng)即時(shí)生效不用編譯每步都要和MATLAB進(jìn)程交互批量跑路譜速度慢機(jī)器上必須裝完整MATLAB環(huán)境DLL動(dòng)態(tài)鏈接庫(kù)Simulink模型生成C代碼編譯成獨(dú)立DLL供CRUISE加載調(diào)用獨(dú)立運(yùn)行不依賴(lài)MATLAB執(zhí)行效率高模型打包后便于交付改模型要重新編譯接口規(guī)范必須嚴(yán)格定義編譯環(huán)境和運(yùn)行環(huán)境要對(duì)齊FMU/FMI將Simulink模型導(dǎo)出為標(biāo)準(zhǔn)功能樣機(jī)單元由CRUISE導(dǎo)入跨工具鏈通用性好模型可以多次復(fù)用FMI版本兼容問(wèn)題偶發(fā)配置信息多出問(wèn)題排查鏈路長(zhǎng)DLL版本實(shí)際用下來(lái)最有工程價(jià)值。同一套模型編譯好后組里其他人拿到DLL就能跑聯(lián)合仿真根本不需要裝MATLAB和Simulink這對(duì)團(tuán)隊(duì)協(xié)作和后續(xù)批量標(biāo)定太重要了。而且DLL是加載進(jìn)CRUISE進(jìn)程內(nèi)部調(diào)用數(shù)據(jù)交換走內(nèi)存仿真心跳比MATLAB API那套方式快很多。我跑過(guò)一輪城市工況對(duì)比DLL方式整體仿真耗時(shí)大概只有MATLAB API方式的一半多一些。當(dāng)然選DLL是有代價(jià)的。最明顯的代價(jià)是每改一次策略就要重新生成DLL、重新加載迭代周期比MATLAB API多一個(gè)編譯步驟。中間如果編譯器版本、CRUISE位寬、運(yùn)行時(shí)庫(kù)哪一環(huán)沒(méi)對(duì)齊報(bào)錯(cuò)能卡你半天。所以這個(gè)項(xiàng)目從第一天起就把編譯工具鏈固定死后來(lái)少踩了很多坑。2. 電制動(dòng)優(yōu)先能量回收策略設(shè)計(jì)2.1 先弄清楚“電制動(dòng)優(yōu)先”優(yōu)先的是什么制動(dòng)能量回收的原理不用多說(shuō)電機(jī)在制動(dòng)時(shí)切換到發(fā)電工況把車(chē)的動(dòng)能轉(zhuǎn)化成電能回充到電池省下這部分能量就等于省了電、延長(zhǎng)了續(xù)航。而“電制動(dòng)優(yōu)先”指的是當(dāng)駕駛員踩下制動(dòng)踏板產(chǎn)生制動(dòng)請(qǐng)求時(shí)控制策略首先讓電機(jī)承擔(dān)制動(dòng)的責(zé)任電機(jī)制動(dòng)力不足的部分才由機(jī)械制動(dòng)系統(tǒng)補(bǔ)上。換句話說(shuō)機(jī)械制動(dòng)永遠(yuǎn)只在“電機(jī)忙不過(guò)來(lái)”的時(shí)候出手。這種策略也常被叫作“串聯(lián)制動(dòng)”或“首選再生制動(dòng)”。為什么不是簡(jiǎn)單地把電制動(dòng)和機(jī)械制動(dòng)按固定比例疊加完事因?yàn)楣潭ū壤⒙?lián)回收是省事但犧牲了回收深度比例調(diào)高了低速或大制動(dòng)請(qǐng)求時(shí)電機(jī)扛不住回收扭矩會(huì)超限比例調(diào)低了大量本可回收的動(dòng)能被摩擦片白白磨掉。電制動(dòng)優(yōu)先的思路則永遠(yuǎn)追求“先問(wèn)電機(jī)要要不到再問(wèn)剎車(chē)要”同等工況下回收能量最多。除了回收能量這個(gè)策略還有一層現(xiàn)實(shí)意義機(jī)械制動(dòng)用得少摩擦片磨損和制動(dòng)盤(pán)熱衰退問(wèn)題都減輕對(duì)整車(chē)維修成本和制動(dòng)安全都有好處。當(dāng)然這些都是建立在策略不出錯(cuò)的前提下所以邊界條件的設(shè)計(jì)比那幾條核心公式更重要。2.2 核心分配邏輯與關(guān)鍵計(jì)算整個(gè)分配邏輯可以拆成四步每一步對(duì)應(yīng)的模塊在Simulink里都是獨(dú)立的一塊方便單獨(dú)調(diào)試。第一步把制動(dòng)踏板行程換算成制動(dòng)需求扭矩。制動(dòng)踏板開(kāi)度經(jīng)過(guò)死區(qū)處理和濾波后查一張“減速度請(qǐng)求-踏板開(kāi)度-車(chē)速”的關(guān)系表得到整車(chē)目標(biāo)減速度再用近似公式換算到電機(jī)端[ T_{req} \frac{m \cdot a_{req} \cdot r}{i_0 \cdot \eta} ]其中 (m) 是整車(chē)質(zhì)量(a_{req}) 是目標(biāo)減速度(r) 是輪胎滾動(dòng)半徑(i_0) 是主減速比(\eta) 是傳動(dòng)效率。換算統(tǒng)一到電機(jī)端做的好處是后面和電機(jī)外特性、電池功率限值比較時(shí)單位都是電機(jī)軸扭矩不用來(lái)回折算。第二步計(jì)算電制動(dòng)可用上限。電機(jī)不是任何時(shí)候都能輸出全部回收扭矩的它同時(shí)受轉(zhuǎn)速特性和電池充電能力雙重約束[ T_{elec_max} \min(T_{motor_cap}(n),\ T_{bat_cap}(SOC, T_{bat})) ](T_{motor_cap}(n)) 是電機(jī)發(fā)電外特性低速區(qū)受電流限制扭矩近似恒定高速區(qū)受功率限制扭矩隨轉(zhuǎn)速升高而下降。(T_{bat_cap}) 由電池允許的充電功率換算而來(lái)[ T_{bat_cap} \frac{9550 \cdot P_{chg_max}(SOC, T_{bat})}{n} ]電池SOC越高、溫度越低允許充電功率越小這是一條查表曲線Simulink里直接用二維查表模塊實(shí)現(xiàn)。第三步做分配。這是整個(gè)策略最簡(jiǎn)明的一段[ T_{elec} \min(T_{req},\ T_{elec_max}) ][ T_{mech} T_{req} - T_{elec} ]電制動(dòng)先扛扛不住的機(jī)械制動(dòng)補(bǔ)比例關(guān)系不用查表天然就是最徹底的優(yōu)先策略。第四步也是實(shí)際標(biāo)定時(shí)最花時(shí)間的一步——邊界與平順性處理。我在這套模型里加了這么幾條硬規(guī)則車(chē)速低于5 km/h時(shí)電制動(dòng)完全退出避免低速回收效率低且容易造成車(chē)輛蠕動(dòng)感。SOC高于95%時(shí)電制動(dòng)退出防止過(guò)充損傷電池同時(shí)加滯回區(qū)間SOC降到93%以下才恢復(fù)回收防止臨界點(diǎn)反復(fù)橫跳。電池大倍率充電持續(xù)時(shí)間超過(guò)設(shè)定值后逐步限制回收功率?;厥张ぞ刈兓首鲂甭氏拗颇J(rèn)先給一個(gè)300~600 Nm/s的區(qū)間具體值靠仿真主觀評(píng)價(jià)和整車(chē)頓挫感測(cè)試來(lái)標(biāo)定。急剎工況減速度請(qǐng)求超過(guò)設(shè)定閾值時(shí)電制動(dòng)快速退出機(jī)械制動(dòng)全權(quán)接管保證安全。這幾條看著簡(jiǎn)單但少了任何一條仿真里都會(huì)出現(xiàn)可復(fù)現(xiàn)的異常要么SOC沖到100%后過(guò)充報(bào)警要么踏板微動(dòng)就引起回收扭矩劇烈波動(dòng)要么急剎過(guò)程中回收扭矩退出慢導(dǎo)致減速度出現(xiàn)臺(tái)階。2.3 和整車(chē)制動(dòng)穩(wěn)定性的耦合關(guān)系這是策略里容易被忽略、但極其重要的一點(diǎn)電制動(dòng)扭矩作用在驅(qū)動(dòng)軸上。如果電機(jī)在前軸回收扭矩就等于給前軸額外加了一份制動(dòng)力。機(jī)械制動(dòng)系統(tǒng)如果還按原方案分配前后軸力后軸制動(dòng)力相對(duì)不足車(chē)輛制動(dòng)時(shí)后軸容易失去穩(wěn)定性。所以在策略輸出不能只給一個(gè)“總機(jī)械制動(dòng)請(qǐng)求”了事。我的做法是Simulink輸出前軸機(jī)械制動(dòng)請(qǐng)求和后軸機(jī)械制動(dòng)請(qǐng)求兩個(gè)信號(hào)電制動(dòng)扭矩作為前軸附加制動(dòng)力分配時(shí)先把回收扭矩從總需求里扣掉再按原始前后軸比例分配剩余制動(dòng)力同時(shí)還要檢查前軸總制動(dòng)力不要超出路面附著極限防止前輪抱死。這一塊在CRUISE里驗(yàn)證優(yōu)勢(shì)特別明顯。整車(chē)實(shí)測(cè)極限制動(dòng)工況成本高、風(fēng)險(xiǎn)大仿真里改個(gè)附著系數(shù)、改個(gè)路面坡度就能反復(fù)試先把策略邏輯跑穩(wěn)實(shí)車(chē)標(biāo)定時(shí)就能集中精力去標(biāo)定真正的車(chē)輛差異參數(shù)而不是去排查邏輯漏洞。3. Simulink模型搭建與DLL生成3.1 接口定義必須先畫(huà)表再動(dòng)手DLL聯(lián)合仿真最忌諱的是模型還沒(méi)搭接口就隨手拉。信號(hào)順序一旦定下來(lái)編譯進(jìn)DLL后修改成本很高。我每次做這種項(xiàng)目第一步永遠(yuǎn)是先畫(huà)一張接口表跟做軟件設(shè)計(jì)文檔一樣雙方對(duì)齊了再動(dòng)Simulink。信號(hào)名單位方向說(shuō)明brake_pedal%輸入制動(dòng)踏板行程0~100acc_pedal%輸入加速踏板行程用于回收退出判斷veh_speedkm/h輸入當(dāng)前車(chē)速motor_speedrpm輸入電機(jī)轉(zhuǎn)速battery_soc%輸入電池荷電狀態(tài)battery_temp℃輸入電池溫度battery_pack_vV輸入電池總電壓t_elecNm輸出電機(jī)回收扭矩請(qǐng)求t_mech_frontNm輸出前軸機(jī)械制動(dòng)請(qǐng)求t_mech_rearNm輸出后軸機(jī)械制動(dòng)請(qǐng)求接口設(shè)計(jì)有三個(gè)原則值得寫(xiě)出來(lái)第一輸入盡量給原始量。SOC、電壓、踏板行程直接作為輸入歸一化和濾波在Simulink內(nèi)部做。這樣CRUISE側(cè)信號(hào)連接最簡(jiǎn)單也便于模型復(fù)用。第二輸出必須明確單位。CRUISE里對(duì)應(yīng)接口是什么單位DLL輸出就是什么單位不要在模型出口再做一次單位換算。換算散落在模型里是聯(lián)合仿真相位不一致的頭號(hào)來(lái)源。第三信號(hào)順序定下后不要輕易改。生成C代碼后輸入輸出是靠數(shù)組索引對(duì)應(yīng)的一旦改順序整個(gè)數(shù)據(jù)集全部要重對(duì)純屬自找麻煩。3.2 模型內(nèi)部結(jié)構(gòu)Simulink模型內(nèi)部整體分三段信號(hào)預(yù)處理、策略計(jì)算、輸出整形。預(yù)處理段做踏板信號(hào)一階低通濾波、車(chē)速單位規(guī)整、SOC限幅。這個(gè)階段不需要花哨的邏輯目的只有一個(gè)保證進(jìn)策略核心的數(shù)據(jù)干凈穩(wěn)定不讓仿真數(shù)值的小噪聲引發(fā)策略層面的大動(dòng)作。策略計(jì)算段用Stateflow搭了一個(gè)狀態(tài)機(jī)狀態(tài)包括正?;厥諔B(tài)、低車(chē)速不回收態(tài)、高SOC保護(hù)態(tài)、急剎退出回收態(tài)。每個(gè)狀態(tài)內(nèi)部單獨(dú)算自己的允許回收扭矩上限再統(tǒng)一走分配公式。用狀態(tài)機(jī)的好處是邏輯表達(dá)直觀幾個(gè)狀態(tài)之間切換條件一目了然比層層if嵌套可讀性好很多。輸出整形段做最后的限幅和斜率限制。所有扭矩請(qǐng)求輸出前都過(guò)一次Rate Limiter回收扭矩的變化率被限制在標(biāo)定值以?xún)?nèi)。這一段的參數(shù)直接決定駕駛員感受是主觀評(píng)價(jià)里反饋?zhàn)罴械沫h(huán)節(jié)。3.3 DLL編譯環(huán)境與導(dǎo)出函數(shù)封裝編譯這步第一次做的人問(wèn)題最多這里按順序?qū)懸槐?。先確保Simulink Coder配置正確系統(tǒng)目標(biāo)文件選grtGeneric Real-Time模型代碼生成接口設(shè)為可被外部調(diào)用的形式。然后準(zhǔn)備好Windows下的C/C編譯器在Simulink Coder配置里選中對(duì)應(yīng)編譯器Simulink會(huì)調(diào)用編譯器自動(dòng)完成模型C代碼生成和編譯。需要注意編譯出來(lái)的目標(biāo)格式要是DLL而不是可執(zhí)行文件。再按照CRUISE的DLL接口規(guī)范封裝一個(gè)導(dǎo)出函數(shù)。核心思路是這樣每個(gè)仿真步長(zhǎng)CRUISE調(diào)用一次該函數(shù)把采集到的輸入信號(hào)放進(jìn)去策略算完把輸出信號(hào)寫(xiě)回來(lái)。一個(gè)最小模板大概是這個(gè)意思#include stdlib.h #include math.h /* 輸入輸出結(jié)構(gòu)體 */ typedef struct { double brake_pedal; /* 0~100 */ double acc_pedal; /* 0~100 */ double veh_speed; /* km/h */ double motor_speed; /* rpm */ double battery_soc; /* % */ double battery_temp; /* ℃ */ double battery_voltage; /* V */ } StrategyInput; typedef struct { double t_elec; /* Nm */ double t_mech_front; /* Nm */ double t_mech_rear; /* Nm */ } StrategyOutput; /* DLL導(dǎo)出函數(shù)CRUISE每個(gè)仿真步調(diào)用 */ __declspec(dllexport) void EnergyRecStrategy(StrategyInput* in, StrategyOutput* out) { double t_req, t_elec_max, t_elec, t_mech; /* 1. 踏板行程 車(chē)速 - 需求扭矩 */ t_req CalcBrakeTorque(in-brake_pedal, in-veh_speed); /* 2. 電機(jī)轉(zhuǎn)速 SOC 溫度 電壓 - 電制動(dòng)上限 */ t_elec_max CalcElecMax(in-motor_speed, in-battery_soc, in-battery_temp, in-battery_voltage); /* 3. 電制動(dòng)優(yōu)先分配 */ t_elec fmin(t_req, t_elec_max); t_mech t_req - t_elec; /* 4. 前后軸分配回收扭矩作用在前軸 */ out-t_elec t_elec; out-t_mech_front t_mech * FrontRatio - t_elec; out-t_mech_rear t_mech * RearRatio; }上面的代碼是示意性的實(shí)際CRUISE的接口字段名稱(chēng)和結(jié)構(gòu)體定義按你自己的版本調(diào)整。重要的是理解這個(gè)數(shù)據(jù)流輸入來(lái)自CRUISE總線輸出回到電機(jī)和制動(dòng)器模塊中間是策略算法。封裝好后編譯成DLL用開(kāi)發(fā)工具鏈自帶的導(dǎo)出函數(shù)查看器確認(rèn)導(dǎo)出函數(shù)名和調(diào)用約定都正確再放到CRUISE能訪問(wèn)的路徑里。編譯時(shí)有三個(gè)坑我每次都要提醒人位寬必須一致。CRUISE是64位就編譯64位DLL32位對(duì)32位混著來(lái)幾乎必掛。路徑別帶中文和空格。CRUISE加載DLL時(shí)有時(shí)候?qū)β窂浇馕鲇兄v究純英文路徑最省心。目標(biāo)機(jī)器上缺運(yùn)行庫(kù)是常見(jiàn)問(wèn)題。DLL依賴(lài)的C/C運(yùn)行庫(kù)沒(méi)裝齊加載時(shí)會(huì)直接失敗報(bào)錯(cuò)信息還特別隱晦。3.4 在CRUISE側(cè)接入DLL模塊CRUISE側(cè)操作不復(fù)雜在模型里拖入一個(gè)Function/Control類(lèi)的DLL接口模塊指定DLL文件路徑然后做信號(hào)連接。輸入側(cè)將車(chē)輛總線上的車(chē)速信號(hào)、電機(jī)轉(zhuǎn)速、電池SOC、電池溫度、制動(dòng)踏板行程、加速踏板行程六個(gè)信號(hào)按接口表接好。輸出側(cè)電機(jī)回收扭矩接到電機(jī)的扭矩請(qǐng)求輸入前軸機(jī)械制動(dòng)請(qǐng)求接到前軸制動(dòng)器后軸機(jī)械制動(dòng)請(qǐng)求接到后軸制動(dòng)器。連接完成后先別急著跑完整工況做一個(gè)冒煙測(cè)試最穩(wěn)妥固定一個(gè)中等車(chē)速和中等SOC給一個(gè)恒定制動(dòng)踏板開(kāi)度檢查電機(jī)回收扭矩是否為負(fù)值、機(jī)械制動(dòng)是否按預(yù)期減少。鏈路通了再上循環(huán)工況出問(wèn)題時(shí)排查范圍會(huì)小很多。4. 參數(shù)標(biāo)定與仿真驗(yàn)證4.1 整車(chē)與關(guān)鍵部件參數(shù)仿真模型的參數(shù)我直接列一張表實(shí)際項(xiàng)目按你自己車(chē)型參數(shù)替換就行。我用的是一套典型純電家用車(chē)的配置參數(shù)數(shù)值單位整車(chē)整備質(zhì)量1600kg迎風(fēng)面積2.2m2風(fēng)阻系數(shù)0.28-滾動(dòng)阻力系數(shù)0.012-輪胎滾動(dòng)半徑0.31m主減速比8.1-電機(jī)峰值功率150kW電機(jī)峰值扭矩310Nm電池容量52kWh電池SOC運(yùn)行范圍10~100%常溫最大充電功率80kW這套參數(shù)下電機(jī)功率較大回收能力很強(qiáng)電制動(dòng)幾乎能覆蓋大多數(shù)日常制動(dòng)的需求區(qū)間。如果電機(jī)只有六七十千瓦功率策略邏輯完全一樣但電制動(dòng)覆蓋范圍會(huì)小很多機(jī)械制動(dòng)的分擔(dān)比例會(huì)明顯上升標(biāo)定時(shí)要重新平衡。標(biāo)定步驟我習(xí)慣按這樣走先標(biāo)定踏板到減速度的映射曲線再標(biāo)定回收退出邊界低車(chē)速、高SOC接著調(diào)回收扭矩斜率限制最后做整車(chē)主觀平順性相關(guān)參數(shù)微調(diào)。順序不能亂映射沒(méi)標(biāo)好之前去調(diào)斜率限制等于地基沒(méi)打好先刷墻。4.2 典型循環(huán)工況驗(yàn)證模型和DLL都跑通后進(jìn)入正式驗(yàn)證階段。我主要用城市工況卡因?yàn)槌鞘泄r制動(dòng)頻繁、平均車(chē)速低最能體現(xiàn)能量回收策略的價(jià)值。重點(diǎn)看四個(gè)指標(biāo)SOC下降曲線對(duì)比同一工況下分別跑無(wú)回收、固定比例回收、電制動(dòng)優(yōu)先回收三個(gè)版本看SOC終值差多少。這個(gè)差值直接反映回收了多少能量。電制動(dòng)承擔(dān)比例統(tǒng)計(jì)整個(gè)工況里電制動(dòng)承擔(dān)的制動(dòng)能量占總制動(dòng)能量的比例城市工況下這個(gè)比例通常能做到相當(dāng)可觀?;厥张ぞ夭▌?dòng)情況觀察回收扭矩曲線是否頻繁大幅振蕩振蕩意味著斜率限制沒(méi)標(biāo)好會(huì)引起整車(chē)頓挫。電池充電倍率看整個(gè)仿真過(guò)程中最大充電倍率有沒(méi)有超出電池限值這在低溫段尤其要盯緊。多數(shù)城市工況里電制動(dòng)優(yōu)先相比無(wú)回收的SOC終值提升都是肉眼可見(jiàn)的而相比固定比例回收優(yōu)勢(shì)在中低速跟車(chē)、緩踩減速這類(lèi)輕度制動(dòng)片段里特別明顯——固定比例策略在這類(lèi)片段往往因?yàn)楸壤投装茁┑裟芰俊?.3 邊界工況與魯棒性驗(yàn)證跑過(guò)的標(biāo)準(zhǔn)工況如果只跑一遍就收工那后面實(shí)車(chē)一定會(huì)被邊界工況打臉。我做這套模型時(shí)至少補(bǔ)了這三組工況第一組高SOC起步連續(xù)下坡。把電池SOC初始值直接設(shè)為98%跑一段帶坡度的循環(huán)確認(rèn)回收功率能及時(shí)退出、SOC不會(huì)沖破上限。這種工況實(shí)車(chē)找路很難仿真里改SOC初值就能復(fù)現(xiàn)是聯(lián)合仿真的典型優(yōu)勢(shì)場(chǎng)景。第二組制動(dòng)踏板抖動(dòng)。在制動(dòng)踏板信號(hào)上人為疊加一個(gè)高頻小幅抖動(dòng)看回收扭矩會(huì)不會(huì)跟著亂跳。正常情況下策略里的濾波和滯回應(yīng)該把抖動(dòng)吸收掉如果回收扭矩還是出現(xiàn)快速通斷說(shuō)明濾波時(shí)間常數(shù)或滯回窗口太小。第三組高速急剎。從120 km/h左右急踩制動(dòng)確認(rèn)回收扭矩快速退出時(shí)機(jī)械制動(dòng)力能無(wú)延遲補(bǔ)上整車(chē)減速度曲線不能出現(xiàn)斷崖或后退。這一組驗(yàn)證的是策略的快速響應(yīng)能力也是底盤(pán)安全性最核心的一個(gè)場(chǎng)景。這三組邊界用例跑完策略才有底氣進(jìn)入實(shí)車(chē)階段。5. 常見(jiàn)問(wèn)題與排查技巧實(shí)錄5.1 DLL加載失敗類(lèi)問(wèn)題這類(lèi)問(wèn)題在聯(lián)合仿真里出現(xiàn)頻率最高典型報(bào)錯(cuò)就是CRUISE加載DLL不成功。按下面順序排查多數(shù)情況下幾分鐘能定位先確認(rèn)位寬看CRUISE版本和DLL位數(shù)是否一致再檢查路徑把DLL放到純英文且無(wú)空格的目錄下然后驗(yàn)證導(dǎo)出函數(shù)用工具查看導(dǎo)出函數(shù)名和大小寫(xiě)是否匹配最后查運(yùn)行庫(kù)確認(rèn)運(yùn)行環(huán)境中依賴(lài)的C/C運(yùn)行庫(kù)版本齊全。有一個(gè)技巧很管用單獨(dú)寫(xiě)一個(gè)小測(cè)試程序不經(jīng)過(guò)CRUISE直接加載DLL并調(diào)用導(dǎo)出函數(shù)。如果這一步能過(guò)問(wèn)題基本鎖定在CRUISE配置側(cè)如果這一步就掛那是DLL自身或環(huán)境問(wèn)題。這個(gè)隔離方法幫我節(jié)省了大量推導(dǎo)時(shí)間。5.2 仿真數(shù)據(jù)對(duì)不上、扭矩方向反了DLL能加載但仿真結(jié)果詭異大概率是信號(hào)鏈路問(wèn)題。最常見(jiàn)的三種情況輸入輸出順序定義不一致數(shù)組里第0個(gè)信號(hào)實(shí)際是另一個(gè)量;CRUISE里信號(hào)單位沒(méi)對(duì)齊km/h和m/s、百分比和0~1之間混用;Simulink模型出口漏了系數(shù)換算比如輸出扭矩實(shí)際是半軸端值CRUISE電機(jī)端接口要的是電機(jī)端值。我常用一個(gè)“直通模式”來(lái)快速定位問(wèn)題在模型里臨時(shí)把制動(dòng)踏板輸入原樣映射到輸出即輸入什么輸出什么加一個(gè)固定偏移。先驗(yàn)證鏈路對(duì)不對(duì)再把真正的策略計(jì)算恢復(fù)回來(lái)。鏈路和算法分開(kāi)排查能省下大量對(duì)數(shù)據(jù)的時(shí)間。5.3 回收扭矩抖動(dòng)與電池過(guò)充回收扭矩抖動(dòng)有三個(gè)高概率嫌疑。第一個(gè)嫌疑是SOC信號(hào)噪聲大導(dǎo)致策略在回收和不回收之間來(lái)回切換解決辦法是給SOC判斷加滯回區(qū)間。第二個(gè)嫌疑是斜率限制參數(shù)設(shè)置不當(dāng)限制太嚴(yán)反而引起系統(tǒng)振蕩需要重新標(biāo)定。第三個(gè)嫌疑是CRUISE仿真步長(zhǎng)偏大DLL內(nèi)部濾波對(duì)這個(gè)步長(zhǎng)不匹配可以嘗試減小仿真步長(zhǎng)驗(yàn)證。過(guò)充問(wèn)題則基本是策略邊界沒(méi)覆蓋要么SOC上限判斷用了瞬時(shí)值而沒(méi)有滯回要么電池充電功率限值在低溫段沒(méi)查表。這兩個(gè)都是典型策略細(xì)節(jié)疏漏仿真里通過(guò)刻意把初始SOC拉高、把電池溫度調(diào)低就能復(fù)現(xiàn)出來(lái)。5.4 聯(lián)合仿真速度太慢DLL方式本身比MATLAB API快很多但如果太慢就要檢查是不是開(kāi)了過(guò)多日志記錄。每步寫(xiě)盤(pán)是非常拖速度的操作批量跑工況時(shí)尤其明顯。我的建議是仿真時(shí)只保存必要的標(biāo)量結(jié)果比如終點(diǎn)SOC、回收能量、電制動(dòng)參與時(shí)長(zhǎng)不要全程記錄所有信號(hào)波形。需要觀測(cè)詳細(xì)波形的工況單獨(dú)跑一遍再開(kāi)全量記錄。再分享一個(gè)批量仿真提速習(xí)慣需要掃描的參數(shù)做成腳本批量修改跑完只落一個(gè)匯總表不保留中間數(shù)據(jù)文件。這樣一輪幾十個(gè)參數(shù)的掃描能在合理時(shí)間內(nèi)完成數(shù)據(jù)也不至于堆成山。這套項(xiàng)目做下來(lái)我個(gè)人最大的體會(huì)是DLL聯(lián)合仿真的技術(shù)門(mén)檻真不高真正花時(shí)間的是把接口約定和邊界條件想清楚。CRUISE和Simulink都是工具中間那層DLL就像一個(gè)“翻譯官”翻譯得好不好取決于你對(duì)兩個(gè)工具各自的信號(hào)和單位有多了解。最后再分享一個(gè)小習(xí)慣每次重新編譯DLL之前先保存一份基準(zhǔn)仿真結(jié)果。能量回收這種閉環(huán)控制改一處可能牽動(dòng)全局沒(méi)有baseline做對(duì)照出問(wèn)題根本說(shuō)不清是這次改動(dòng)引起的還是之前就存在。這個(gè)習(xí)慣幫我省掉了大量排查時(shí)間你也值得試試。