夏 偉 蔣建金 傅林泰 張 磊
(卡斯柯信號有限公司,200071,上海//第一作者,工程師)
列車自動控制(ATC)系統是由列車自動保護(ATP)系統、列車自動監控(ATS)系統、列車自動運行(ATO)系統和計算機聯鎖系統組成[1],對列車運行速度、運行間隔和運行方向等進行控制,保證列車安全、高效運行。這些系統大多在設計時需要采用安全冗余編碼技術來提高系統的安全性,使系統達到SIL4安全完整性等級。
循環冗余校驗(CRC)是通信領域常用的一種校驗碼,用于檢測數據在傳輸過程中是否發生了被篡改的錯誤。一般的方法是通信雙方定義好計算多項式和CRC的計算方法(包括寬度、起始值、結果異或值、輸入輸出數據反轉等),發送方在對數據計算后將得出的CRC值附在消息幀后面一起發送;接收方收到后對數據進行同樣的計算,并將結果與原始的CRC進行比較,來校驗數據的正確性與完整性。
當冗余編碼的列車自動控制系統與其它類型冗余編碼或非冗余編碼系統通信時,需要采用CRC來保證傳輸數據的完整性,且只需傳輸高位數據,低位冗余碼不參與傳輸。當列車自動控制系統無故障時計算出的冗余碼CRC與標準CRC結果完全一致,外界系統可校驗通過;當列車自動控制系統存在故障時,計算出的冗余碼CRC需要包含故障信息且該故障能被外界檢測出而拒絕接收。現有的技術在發送消息時,僅對高位數據進行CRC計算,那么會導致外界系統無法檢測到低位數據中可能存在的隨機性失效或故障;收到外界消息時,如果只是根據高位數據直接計算出低位冗余碼,那么當CRC校驗過程失效時,故障信息將不體現在低位冗余碼中而無法被當前系統檢測。為此,提出了一種安全性高、錯誤可檢測率高、基于冗余編碼的CRC校驗方法。
冗余編碼技術雖然種類多樣,但是編碼形式、安全原理大致相同。每個變量都是由高位與低位組成,高位為數據的信息位,低位為數據的校驗位,其中低位是由高位、簽名、時間戳等信息通過預定義的公式計算得出,因此每個變量的高低位之間存在確定的對應關系。系統在運行的每個周期都會對關鍵變量的高位、低位正確性進行校驗,用于判斷是否存在內存錯誤、隨機性失效等故障。本文采用AN碼、分離碼相結合的編碼方式[2-3]。對于簡單變量x,設計其編碼后的形式為:
X=Ax+Bx+DT
式中:
A——編碼時選擇的大素數;
Bx——編碼時為變量x分配的大素數;
DT——時間戳。
在實際編碼中,將長度為k個字節(k=1,2,3,4)的變量分成了高k位和低k位,高k位為數值域,存放數據的原始值,低k位為校驗域。
按照這種編碼方法,對每個操作數分配一個固定的簽名,可以檢測操作數尋址簽名錯誤和操作符錯誤;時間戳可以檢測循環變量值沒有被更新的錯誤,或者循環變量值失效使用上周期變量值的錯誤。
CRC校驗技術是一種十分有效的錯誤檢測技術,能檢驗一位錯、雙位錯、所有的奇數錯、所有長度小于或等于所用的生成多項式長度的錯誤。如采用16位生成多項式的CRC校驗,對17位以上的檢錯率高達99.997%[4],32位生成多項式的出錯概率比16位低10-5倍[5],因此CRC 32更適用于重要數據的傳輸,在軌道交通列車自動控制系統中得到廣泛應用。文獻[6-8]中對查表法CRC校驗的原理做了詳細闡述。
針對現有技術無法實現對列車信號控制系統中冗余碼進行CRC校驗以及無法利用CRC校驗碼與外界冗余/非冗余編碼系統進行通信的問題,提出一種基于冗余編碼系統的CRC校驗方法:
1)對發送消息進行編碼。通過將冗余碼校驗信息融合到CRC校驗計算過程中,在無故障的情況下得出的CRC校驗碼與標準CRC完全一致,保證了正常的通信功能;在列車信號控制系統發生故障的情況下能夠將錯誤信息反饋到編碼CRC校驗碼中,外界冗余/非冗余系統可校驗出故障信息。
2)收到外界消息,根據消息中的CRC校驗碼和高位數據對該消息進行解碼校驗,校驗結果加入最終生成的低位冗余碼,保證了傳輸過程中任何故障可以被編碼系統及時檢測出。
該方法實現步驟包括離線數據準備模塊、編碼模塊和解碼模塊三個部分。
離線配置工具輸入的文件有msgType.xml(定義所有消息的格式,每條消息中包含的具體變量,每個變量的長度)和signature.txt(包含所有變量的簽名)。
離線配置工具需要根據輸入文件計算每條消息中每個變量簽名數據的補償值。由于在計算CRC時需要同時進行低位冗余碼的計算,因此需要根據具體CRC的多項式和計算方法,計算每個變量的簽名補償值表,用于在CRC計算時抵消低位冗余碼信息。簽名補償值的計算公式如下:
Smod=(S∧M)×Pk-1
式中:
S——原始簽名;
Smod——簽名補償值;
M——CRC 32多項式對應的掩碼;
P——多項式轉換成的32位矩陣;
k——變量長度,支持1-4 B。
簽名計算完成需要進行校驗,校驗的方法是進行反向計算,逆推原簽名。如果校驗失敗,則終止輸出;校驗成功后輸出的bin文件中應包含:每條消息的格式,每條消息中每個變量對應的簽名補償值,臨時接收簽名TempSig_rcv(跟Sig_nature保持常量差Constant_1)。離線配置工具處理如圖1所示。

圖1 離線配置工具處理流程圖
冗余編碼系統中所有待發送消息的變量均采用編碼技術,包含高位和低位數據。由于冗余碼無法直接轉換為CRC,在編碼時(即計算CRC的過程),會同時對每個變量的高位、低位進行校驗,如果發現冗余碼故障或在編碼過程中發生隨機性失效,那么該錯誤信息將會被融合于CRC計算過程,得到錯誤的CRC校驗碼,外部系統可以檢測出該故障信息。處理流程如圖2所示。

圖2 發送消息編碼處理流程圖
具體步驟為:
1) 從配置bin文件中獲取當前變量的長度。
2) 查表法依次計算當前變量的每個字節的CRC值。
3) 查找簽名補償值表,計算當前變量當前字節簽名對應的補償值。
4) 根據當前變量的長度判斷當前變量CRC計算是否結束,如未結束則執行步驟2),如結束則根據當前變量的整體簽名補償值、高位數據、低位冗余碼、時間戳(TimeStamp)進行校驗。當數據正確時校驗結果應為0;如果校驗結果非0,則表示存在故障。將每個變量的校驗結果信息異或到編碼CRC值。
5) 判斷當前消息所有變量是否都已計算結束,如未結束執行步驟1),如已結束則返回編碼CRC值作為最終結果。
其中步驟3)中一個變量的某個字節CRC補償值的計算公式為:
Scmp[x]=(T[xk]-1×2k1×8)MOD(A)
式中:
xk——該字節的數值,范圍為[0, 255];
T——查表法CRC32計算表;
k1——變量的第幾個字節,范圍為[0, 3]。
由于接收到的消息只有高位數據和CRC,需要根據高位數據和CRC生成有效的冗余碼。如果數據在傳輸過程被篡改或解碼過程發生隨機性失效,將導致校驗結果異常,生成的冗余碼包含錯誤信息,該錯誤會被系統檢出。在解碼時,先對消息進行臨時編碼,將臨時編碼 CRC與接收CRC進行比較,并將校驗結果融合到最終冗余碼的計算過程。具體為:
1) 根據配置信息中的TempSig_rcv和收到消息中的高位數據計算出每個變量的臨時冗余碼Temp_Redcode,且不包含TimeStamp信息。
2) 根據Temp_Redcode對收到的消息進行臨時編碼, 得到臨時編碼CRC。
3) 將步驟2)中的臨時編碼CRC與接收CRC進行校驗比較,并去除步驟1)中常量差Constant_1。如果兩者相等,則校驗通過,校驗結果為0;如果兩者不等,則校驗不通過,校驗結果非0。
4) 如果步驟3)校驗通過,修改步驟1)中每個變量的Temp_Redcode,異或3.2中步驟3)校驗結果,并加上TimeStamp,作為最終冗余碼結果輸出。
5) 如果步驟3)校驗不通過,返回錯誤,不輸出冗余碼;如果發生隨機性失效,進入步驟4),輸出的冗余碼會攜帶步驟3)中的錯誤校驗結果,當前系統會檢測出該故障,處理流程如圖3所示。

圖3 接收消息解碼處理流程圖
采用基于冗余編碼系統的CRC校驗方法,可實現冗余編碼系統與非冗余編碼系統的正常通信,提高系統的通信兼容性,并且有效保證了對傳輸過程中的錯誤信息和系統的隨機性失效的檢出率。目前該方法已成功應用于ATP、ATS等多個安全產品中。