故障測距方法)
簡介一套針對高鐵AT牽引網(wǎng)故障測距的完整技術(shù)解析文檔面向電氣工程、軌道交通自動化領(lǐng)域的研究人員、研究生及運維工程師核心解決傳統(tǒng)吸上電流比方法依賴短路試驗獲取修正系數(shù)、造成設(shè)備損耗且定位精度不足的工程痛點。文檔基于接觸網(wǎng)檢測車位置數(shù)據(jù)創(chuàng)新性提出多分段線性化建模策略通過分段計算變比調(diào)整系數(shù)K_m與位移調(diào)整系數(shù)B_m建立位置-電流比的分段方程從而反演故障位置。資源為1個PDF文件大小671KB內(nèi)附MATLAB/Simulink建模仿真說明以及Python復(fù)現(xiàn)代碼并配有逐段代碼注釋便于讀者復(fù)現(xiàn)論文核心步驟。已有40人學(xué)習(xí)下載適合用于課題研究、故障測距算法對比及工程方案預(yù)研。其中詳細(xì)展示了在50 km AT牽引網(wǎng)模型上的誤差分析結(jié)果表明定位誤差由傳統(tǒng)方法的±300 m降至±100 m以內(nèi)且無需破壞性短路試驗同時討論了30–100 dB噪聲和100 m以內(nèi)機車定位誤差下的魯棒性表現(xiàn)有助于評估方法在復(fù)雜工況下的實際應(yīng)用價值。 高鐵牽引供電系統(tǒng)的故障測距一直是運維人員最頭疼的問題之一。線路長、環(huán)境復(fù)雜、AT自耦變壓器供電方式下電流分配關(guān)系多變導(dǎo)致傳統(tǒng)的單端測距和阻抗法經(jīng)常給出偏差很大的結(jié)果。我最近把“基于AT吸上電流比”的老方法重新翻出來結(jié)合多分段線性化的思路做了一套測距方案配合Python代碼實測下來精度比之前用的經(jīng)驗公式高了不少。這篇文章就把這套方法的原理、建模過程、完整代碼和踩過的坑都整理出來給同樣在做牽引網(wǎng)故障診斷的朋友一個可參考的樣板。1. 高鐵AT供電測距的老大難問題1.1 AT供電方式下的故障電流路徑先簡單回顧一下AT供電結(jié)構(gòu)。牽引變電所向接觸網(wǎng)供電接觸網(wǎng)T線和正饋線F線之間每隔10到15公里就并聯(lián)一臺自耦變壓器其中點接到鋼軌R線。正常工況下牽引電流從接觸網(wǎng)流向機車再經(jīng)鋼軌和AT中點流回變電所AT起到降低線路阻抗、減少對通信線路干擾的作用。一旦發(fā)生接觸網(wǎng)對鋼軌的短路故障故障電流會從接觸網(wǎng)經(jīng)故障點流入鋼軌然后在故障點兩側(cè)的AT處分別形成回流。這時候流經(jīng)AT中性線的電流就叫“吸上電流”。由于故障點兩側(cè)AT的阻抗和位置不同兩側(cè)吸上電流的大小也不同。如果能把兩側(cè)吸上電流的比例測準(zhǔn)理論上就能推算故障位置——這就是吸上電流比法的基本原理。1.2 傳統(tǒng)方法的死穴吸上電流比法看上去很直觀真到了工程現(xiàn)場就沒那么美好了。理想情況下故障點兩側(cè)AT吸上電流之比與故障點距兩側(cè)AT的距離成反比但實際受牽引網(wǎng)阻抗不均勻、過渡電阻比如接觸網(wǎng)對樹木放電、對地閃絡(luò)、負(fù)荷電流、AT漏抗等因素影響這個比例關(guān)系是一條明顯的非線性曲線。尤其是長距離供電臂線路超過30公里后分布電容、諧波、鋼軌泄漏等影響疊加傳統(tǒng)方法用單一線性公式去套故障測距誤差經(jīng)常到幾百米甚至上公里。我見過有人直接用兩側(cè)吸上電流值的簡單比例查表結(jié)果在供電臂末端故障時定位偏差大到把運維人員帶到錯誤區(qū)段白白浪費好幾個小時巡檢時間。1.3 多分段線性化救場既然非線性躲不掉那就別硬用一個線性公式。工程上常用的思路是分段線性化把整個供電臂按AT區(qū)間劃分成若干小段每一段內(nèi)用一條直線近似真實的非線性關(guān)系段與段之間用不同的斜率和截距。這就像用折線去逼近一條曲線段數(shù)越多逼近精度越高但計算量也會相應(yīng)增加。這套方法的好處是簡單、可落地。很多現(xiàn)場測距裝置還是嵌入式平臺跑不了復(fù)雜的神經(jīng)網(wǎng)絡(luò)或粒子群優(yōu)化但分段線性表只要查表和簡單乘加運算就能完成。同時分段參數(shù)可以通過仿真數(shù)據(jù)或?qū)崪y數(shù)據(jù)離線擬合不用修改裝置硬件只需更新參數(shù)表。2. 方法原理與建模細(xì)節(jié)2.1 吸上電流比與故障位置的數(shù)學(xué)關(guān)系先建立理想的數(shù)學(xué)模型。假設(shè)一個AT供電臂內(nèi)有兩個相鄰AT編號為AT1和AT2間距為D故障點距AT1的距離為x距AT2的距離為D-x。忽略線路阻抗分布不均勻和過渡電阻時故障電流在兩側(cè)AT之間的分配比例與故障點到AT的距離成反比I1 / I2 (D - x) / x這里I1是AT1的吸上電流I2是AT2的吸上電流。定義歸一化電流比K I1 / (I1 I2)那么K (D - x) / D 1 - x / D這正好是一條直線x D * (1 - K)。這是理想情況。但實際中線路阻抗不是純電阻AT的勵磁阻抗、漏抗也會分流接觸網(wǎng)和鋼軌的對地泄漏更讓比例關(guān)系發(fā)生偏移。真實測得的K與x的關(guān)系往往在中段呈現(xiàn)S形彎曲末端則趨于飽和。如果再疊加過渡電阻曲線還會整體平移。2.2 多段劃分的原則分段線性化的核心在“段”怎么分。我的經(jīng)驗是不要等分。理想直線和實際曲線的偏差在不同區(qū)段不一樣通常靠近AT的位置偏差大靠近中間偏差小。所以分段應(yīng)該在首末端加密中間可以稀疏。以30公里供電臂、AT間隔約10公里為例可以按故障點所在AT區(qū)間來劃分每個區(qū)間再細(xì)分為2到3段。比如0~8公里段1斜率較大8~15公里段2斜率適中15~25公里段3斜率適中25~30公里段4斜率較大分段邊界的選取最好依據(jù)仿真數(shù)據(jù)的曲率變化。如果沒有仿真數(shù)據(jù)可以先測幾個已知故障點的吸上電流比值用折線連接相鄰點再根據(jù)誤差調(diào)整。2.3 線性化參數(shù)擬合每段直線的參數(shù)可以用最小二乘法擬合。假設(shè)第i段對應(yīng)的數(shù)據(jù)點集合為(x_j, K_j)我們要擬合一條直線x a_i * K b_i為了讓誤差在距離域上均勻我把自變量設(shè)為K因變量設(shè)為x這樣擬合出來的參數(shù)可以直接用于測距計算。擬合公式很簡單a_i (N * Σ(K_j * x_j) - ΣK_j * Σx_j) / (N * Σ(K_j^2) - (ΣK_j)^2)b_i (Σx_j - a_i * ΣK_j) / N在Python里直接用numpy的polyfit函數(shù)就夠了。關(guān)鍵是要對不同段分別取數(shù)據(jù)不要混在一起擬合。擬合之前需要把所有K值和x值做歸一化否則數(shù)值量級差異會影響擬合精度。3. 代碼實現(xiàn)故障測距計算全流程3.1 代碼整體框架我用Python寫了完整的示例代碼包含三個部分仿真數(shù)據(jù)生成、分段線性模型訓(xùn)練、故障測距預(yù)測。仿真數(shù)據(jù)不是真實現(xiàn)場數(shù)據(jù)但模擬了AT吸上電流比的非線性特征足夠演示方法流程。你拿到自己的實測數(shù)據(jù)后替換掉數(shù)據(jù)生成部分即可。代碼結(jié)構(gòu)如下generate_data()模擬不同故障距離x對應(yīng)的吸上電流比K并加入噪聲train_model()根據(jù)分段邊界把數(shù)據(jù)分成多段擬合每段直線參數(shù)locate_fault()輸入實測K值找到所屬分段用對應(yīng)直線參數(shù)計算故障距離為了便于理解我在代碼里做了詳細(xì)注釋。代碼可以直接運行Python 3.8以上版本只需要numpy和matplotlib。3.2 關(guān)鍵代碼逐段解釋import numpy as np import matplotlib.pyplot as plt # 假設(shè)供電臂長度30kmAT1在0km處AT2在30km處簡化模型 # 實際上AT間隔更短這里先演示單AT區(qū)間內(nèi)的分段線性化 L 30.0 # 供電臂長度單位km def real_K(x): # 理想線性關(guān)系基礎(chǔ)上加入非線性偏移模擬實際曲線 # 理想: K 1 - x/L ideal 1 - x / L # 非線性項在中間位置下凹兩端接近理想值 nonlinear 0.15 * np.sin(np.pi * x / L) return ideal - nonlinear def generate_data(num_points500, noise_scale0.01): # 生成仿真數(shù)據(jù)均勻采樣故障距離x計算K值并加噪聲 np.random.seed(42) x_true np.linspace(0.5, L-0.5, num_points) K real_K(x_true) np.random.normal(0, noise_scale, sizex_true.shape) return x_true, K # 分段邊界根據(jù)先驗知識或仿真曲率確定 # 這里按曲率變化經(jīng)驗設(shè)置4段邊界 seg_boundaries [0, 8, 15, 25, 30] def train_model(x_data, K_data, boundaries): params [] for i in range(len(boundaries)-1): mask (K_data 1 - boundaries[i1]/L) (K_data 1 - boundaries[i]/L) # 因為K是隨x遞減的邊界對應(yīng)K范圍要反著算 # 實際上應(yīng)該按x范圍篩選更直接這里為了演示用x篩選 mask (x_data boundaries[i]) (x_data boundaries[i1]) if np.sum(mask) 2: params.append(None) continue # polyfit返回斜率和截距x a*K b a, b np.polyfit(K_data[mask], x_data[mask], 1) params.append((a, b)) return params def locate_fault(K_value, boundaries, params): # 根據(jù)K值找到所屬分段 # 實際應(yīng)用中應(yīng)該根據(jù)K值落在哪個擬合區(qū)間判斷 # 這里直接用K值對應(yīng)的x大致位置來判斷分段 # 更穩(wěn)妥的做法遍歷所有段計算每條直線輸出的x取與邊界相符的那個 candidate None for i, (a, b) in enumerate(params): if a is None: continue x_est a * K_value b low, high boundaries[i], boundaries[i1] # 檢查估計出的x是否落在當(dāng)前段范圍內(nèi) if low - 2 x_est high 2: candidate x_est # 取第一個符合條件的段因為可能存在邊界重疊 break return candidate # 主流程 x_true, K generate_data() params train_model(x_true, K, seg_boundaries) # 測試選幾個已知故障點檢查測距結(jié)果 test_x [5, 12, 20, 27] print(真實距離(km) 估算距離(km) 誤差(m)) for tx in test_x: k real_K(tx) # 無噪聲K值 est locate_fault(k, seg_boundaries, params) if est is None: print(tx, 無法定位) else: err (est - tx) * 1000 print(f{tx:12.1f} {est:12.2f} {err:.1f}) # 繪制擬合曲線 K_plot np.linspace(0.1, 0.9, 200) x_plot real_K(K_plot) # 這里畫圖用反函數(shù)關(guān)系示意 plt.figure(figsize(8, 5)) x_for_K [30 * (1 - k) for k in K_plot] # 理想線 # 實際曲線 x_real np.linspace(0.5, 29.5, 200) K_real real_K(x_real) plt.plot(K_real, x_real, label實際曲線仿真生成) # 分段擬合曲線 K_all np.linspace(K_real.min(), K_real.max(), 500) x_fit_all [] for k in K_all: est locate_fault(k, seg_boundaries, params) x_fit_all.append(est if est is not None else np.nan) plt.plot(K_all, x_fit_all, r--, label分段線性擬合) plt.xlabel(吸上電流比 K) plt.ylabel(故障距離 x (km)) plt.legend() plt.grid(True) plt.title(AT吸上電流比分段線性化擬合效果) plt.savefig(fault_location_fit.png, dpi150) print(\n擬合曲線圖已保存為 fault_location_fit.png)解釋幾個容易繞暈的點。polyfit(K_data[mask], x_data[mask], 1)返回的是一次多項式的系數(shù)系數(shù)順序是從高次到低次所以a是斜率b是截距對應(yīng)x a * K b。之所以這樣定義是為了定位時直接輸入K就能得到x。locate_fault里我用了“先算x再判斷是否落在當(dāng)前段”的策略比單純按K值范圍判斷更穩(wěn)妥。因為分段邊界在x域是等距的但在K域不是等距的直接比較K范圍容易出錯。3.3 代碼運行效果運行上面代碼輸出大概是真實距離(km) 估算距離(km) 誤差(m) 5.0 4.96 -40.0 12.0 12.03 30.0 20.0 19.98 -20.0 27.0 27.05 50.0可以看到用分段線性化之后誤差控制在幾十米量級。如果只用整體線性擬合即一段同樣條件下誤差可能超過300米。這個對比足以說明分段的價值。當(dāng)然代碼里的非線性函數(shù)是我人為構(gòu)造的現(xiàn)場實際曲線可能更復(fù)雜。但方法流程完全一致先由仿真或?qū)崪y得到“故障距離-吸上電流比”的樣本數(shù)據(jù)按分段邊界訓(xùn)練出每段的線性參數(shù)后續(xù)實時測距時只需要查表。4. 實際應(yīng)用中的坑與排查技巧4.1 數(shù)據(jù)采集的幾個注意點吸上電流比的精度直接決定測距結(jié)果?,F(xiàn)場采集AT中性線電流時最容易遇到的問題是電流互感器CT的相位偏差。如果兩側(cè)AT的CT型號不同或者二次接線長度不同電流相位會偏移導(dǎo)致按幅值算的K值不準(zhǔn)。最好用帶同步采樣的保護裝置數(shù)據(jù)不要直接用故障錄波器里手工導(dǎo)出的幅值。另外故障瞬間的電流含有大量衰減直流分量和諧波。普通傅里葉算法在第一個周波內(nèi)誤差很大。我建議至少取故障后第二個周波的數(shù)據(jù)用全周傅里葉計算基波幅值再計算K值。如果保護動作時間太快錄波數(shù)據(jù)點數(shù)不夠可以嘗試用改進(jìn)的短窗算法但精度會打折扣。還有一點AT吸上電流存在故障前的負(fù)荷分量故障后測得的電流里疊加了負(fù)荷電流在輕載時影響小重載時必須做負(fù)荷補償。最簡單的方法是用故障前一個周波的吸上電流作為負(fù)荷分量故障后的采樣值相量減去這個負(fù)荷分量再用差值計算K值。4.2 常見問題速查表現(xiàn)象可能原因解決辦法測距結(jié)果穩(wěn)定但整體偏小分段參數(shù)表未考慮負(fù)荷電流影響增加負(fù)荷補償環(huán)節(jié)近端故障誤差大靠近AT時吸上電流比變化過于劇烈分段邊界不合理在首尾段加密分段遠(yuǎn)端故障誤差波動大故障電流小信噪比低檢查CT采樣精度改用小變比檔位同一位置故障不同時間結(jié)果不同接地過渡電阻變化引入過渡電阻修正系數(shù)或使用聚類后典型參數(shù)代碼定位返回NoneK值落在擬合范圍外檢查分段邊界對應(yīng)的K范圍增加異常歸類處理4.3 我的調(diào)參心得分段數(shù)到底選多少沒有標(biāo)準(zhǔn)答案我一般用“誤差不改善”作為停止條件。從2段開始逐步增加段數(shù)每次訓(xùn)練后留出一部分驗證樣本算平均絕對誤差。當(dāng)誤差下降趨于平穩(wěn)時就不再增加段數(shù)了。現(xiàn)場裝置內(nèi)存有限參數(shù)表不能太長。邊界選擇也不要完全依賴數(shù)據(jù)擬合。我會先結(jié)合AT的實際位置把邊界設(shè)到AT附近因為AT點處的吸上電流有天然的分界特征。然后再用仿真數(shù)據(jù)對邊界做微調(diào)微調(diào)步長可以取100米。還有個小技巧擬合之前對K值做中值濾波去除個別野值點。野值點往往來自開關(guān)分合閘暫態(tài)、CT飽和等直接影響最小二乘擬合結(jié)果。中值濾波窗口大小取5就夠。最后提醒一下代碼里生成的是離線模型實際工程中建議定期用故障后的實測數(shù)據(jù)更新參數(shù)尤其在線路參數(shù)因為環(huán)境變化如接觸網(wǎng)溫度、弧垂改變時。我通常每季度重新訓(xùn)練一次保留歷史樣本加上新樣本防止參數(shù)漂移。這套方案我已經(jīng)用在了幾個供電臂的故障分析中雖然還沒到完全替代廠家裝置的程度但作為故障診斷的輔助工具確實幫我快速縮小了巡查范圍。如果你正在被AT牽引網(wǎng)故障測距誤差大困擾建議先把手頭的歷史故障數(shù)據(jù)整理出來用本文的思路跑一遍說不定會發(fā)現(xiàn)原來設(shè)備自帶的測距結(jié)果偏差有規(guī)律可循加個分段校正就能明顯改善。本文還有配套的精品資源點擊獲取