【文章內(nèi)容簡(jiǎn)介】
CAN通信、以太網(wǎng)通信、控制算法。控制卡軟件涉及的主要模塊如圖1013所示。 圖 1013 控制卡軟件涉及的主要模塊 ? 嵌入式操作系統(tǒng) 181。C/OSII中程序的執(zhí)行順序與程序代碼的位置無(wú)關(guān),只與程序代碼所在任務(wù)的優(yōu)先級(jí)有關(guān)。所以,在嵌入式操作系統(tǒng) 181。C/OSII環(huán)境下的軟件框架設(shè)計(jì),實(shí)際上就是確定各個(gè)任務(wù)的優(yōu)先級(jí)安排。優(yōu)先級(jí)的安排會(huì)根據(jù)任務(wù)的重要程度以及任務(wù)間的前后銜接關(guān)系來(lái)確定。以CAN通信任務(wù)與控制算法運(yùn)行任務(wù)為例,控制算法運(yùn)行所需要的輸入信是由 CAN通信任務(wù)向測(cè)控板卡索要的,所以CAN通信任務(wù)要優(yōu)先于控制算法任務(wù)執(zhí)行,所以 CAN通信任務(wù)擁有更高的優(yōu)先級(jí)??刂瓶ㄜ浖械娜蝿?wù)及優(yōu)先級(jí)如表 103所示。 表 103 控制卡軟件中的任務(wù)及優(yōu)先級(jí) 任務(wù) 優(yōu)先級(jí) 任務(wù)說(shuō)明T a s kS t a r t 4 啟動(dòng)任務(wù),創(chuàng)建其他用戶任務(wù)T a s kS t a t e M on i t or 5 主從控制卡間的狀態(tài)監(jiān)測(cè)T a s kC A N R e c e i ve 6 接收 C A N 命令并對(duì)其處理T a s kP I C l e a r 7 計(jì)數(shù)通道值清零T a s kA O D O O ut 8 模擬量 / 數(shù)字量輸出控制T a s kC a r dC on f i g 9 板卡及通道配置T a s kC a r dU pl oa d 10 測(cè)控板卡采樣數(shù)據(jù)輪詢T a s kL oo pR un 11 控制算法運(yùn)行T a s kL oo pA na l yz e 12 控制算法解析T a s kN e t P ol l 13 網(wǎng)絡(luò)事件輪詢T a s kD a t a S yn 14 故障卡重啟后進(jìn)行數(shù)據(jù)同步O S _T a s kI dl e 63 系統(tǒng)空閑任務(wù) ? 確定了各個(gè)任務(wù)的優(yōu)先級(jí)就確定了系統(tǒng)軟件的整體框架。但是使用嵌入操作系統(tǒng) 181。C/OSII,并不表示所有的事情都要以任務(wù)的形式完成。為了增加對(duì)事件響應(yīng)的實(shí)時(shí)性,部分功能必須通過(guò)中斷實(shí)現(xiàn),如 CAN接收中斷和以太網(wǎng)接收中斷。而且, 181。C/OSII也提供對(duì)中斷的支持,允許在中斷函數(shù)中調(diào)用部分系統(tǒng)服務(wù),如用于釋放信號(hào)量的OSSemPost( )等。 ? 2.雙機(jī)熱備程序的設(shè)計(jì) ? 雙機(jī)熱備可有效提高系統(tǒng)的可靠性,保證系統(tǒng)的連續(xù)穩(wěn)定工作。雙機(jī)熱備的可靠實(shí)現(xiàn)需要兩個(gè)控制卡協(xié)同工作,共同實(shí)現(xiàn)。本系統(tǒng)中的兩個(gè)控制卡工作于主從模式的雙機(jī)熱備狀態(tài)中,實(shí)現(xiàn)過(guò)程涉及控制卡的主從身份識(shí)別,工作中兩個(gè)控制卡間的狀態(tài)監(jiān)測(cè)、數(shù)據(jù)同步,故障情況下的故障處理,以及故障修復(fù)后的數(shù)據(jù)恢復(fù)等方面。 ? ⑴ 控制卡主從身份識(shí)別 ? 主從配置的兩個(gè)控制卡必須保證在任一時(shí)刻、任何情況下都只有一個(gè)主控制卡與一個(gè)從控制卡,所以必須在所有可能的情況下對(duì)控制卡的主從身份做出識(shí)別或限定。這些情況包括,單控制卡上電運(yùn)行時(shí)如何判定為主控制卡,兩個(gè)控制卡同時(shí)上電運(yùn)行時(shí)主從身份的競(jìng)爭(zhēng)與識(shí)別,死機(jī)控制卡重啟后判定為從控制卡??刂瓶ǖ闹鲝纳矸菀?RS觸發(fā)器輸出端的 0/1狀態(tài)為判定依據(jù),檢測(cè)到 RS觸發(fā)器輸出端為 1的控制卡為主控制卡,檢測(cè)到 RS觸發(fā)器輸出端為 0的控制卡為從控制卡。 ? ⑵ 狀態(tài)監(jiān)測(cè)與故障切換 ? 處于熱備狀態(tài)的兩個(gè)控制卡必須不斷地監(jiān)測(cè)對(duì)方控制卡的工作狀態(tài),以便在對(duì)方控制卡故障時(shí)能夠及時(shí)發(fā)現(xiàn)并做出故障處理。 ? 狀態(tài)監(jiān)測(cè)所采用的檢測(cè)方法已經(jīng)在雙機(jī)冗余電路的設(shè)計(jì)中介紹過(guò),控制卡通過(guò)將自身的 D觸發(fā)器輸出端清 0,然后等待對(duì)方控制卡發(fā)來(lái)信號(hào)使該 D觸發(fā)器輸出端置 1來(lái)判斷對(duì)方控制卡的正常工作。同時(shí),通過(guò)發(fā)送信號(hào)使對(duì)方控制卡上的 D觸發(fā)器輸出端置 1來(lái)向?qū)Ψ娇刂瓶ū砻髯约赫9ぷ鳌? ? 控制卡間的狀態(tài)監(jiān)測(cè)采用類似心跳檢測(cè)的一種周期檢測(cè)的方式實(shí)現(xiàn)。同時(shí),為保證檢測(cè)結(jié)果的準(zhǔn)確性,只有在兩個(gè)連續(xù)周期的檢測(cè)結(jié)果相同時(shí)才會(huì)采納該檢測(cè)結(jié)果。為避免誤檢測(cè)情況的發(fā)生,又將一個(gè)檢測(cè)周期分為前半周期與后半周期,如果前半周期檢測(cè)到對(duì)方控制卡工作正常則不進(jìn)行后半周期的檢測(cè),如果前半周期檢測(cè)到對(duì)方控制卡出現(xiàn)故障,則在后半周期繼續(xù)執(zhí)行檢測(cè),并以后半周期的檢測(cè)結(jié)果為準(zhǔn)。周期內(nèi)檢測(cè)結(jié)果判定如表 104所示??刂瓶üぷ鳡顟B(tài)判定如表 105所示。 表 104 周期內(nèi)檢測(cè)結(jié)果判定 前半周期檢測(cè)結(jié)果后半周期檢測(cè)結(jié)果本周期檢測(cè)結(jié)果正常 X 正常故障 正常 正常故障 故障 故障第一周期檢測(cè)結(jié)果第二周期檢測(cè)結(jié)果綜合檢測(cè)結(jié)果正常 正常 正常正常 故障 維持原狀態(tài)故障 正常 維持原狀態(tài)故障 故障 故障表 105 控制卡工作狀態(tài)判定 注: X表示無(wú)需進(jìn)行后半周期的檢測(cè) ? 在檢測(cè)過(guò)程中,對(duì)自身 D觸發(fā)器執(zhí)行先檢測(cè),再清 0的操作順序,如果對(duì)方控制卡發(fā)送的置 1信號(hào)出現(xiàn)在檢測(cè)與清 0操作之間,將導(dǎo)致無(wú)法檢測(cè)到此置 1操作,也就是說(shuō)本次檢測(cè)結(jié)果為故障,誤檢測(cè)情況由此產(chǎn)生。如果兩個(gè)控制卡的檢測(cè)周期相同,這種誤檢測(cè)情況將持續(xù)出現(xiàn),最后必然會(huì)錯(cuò)誤地認(rèn)為對(duì)方控制卡出現(xiàn)故障。相同周期下連續(xù)誤檢測(cè)情況分析如圖 1014所示。 圖 1014 相同周期下連續(xù)誤檢測(cè)情況分析 ? 為了避免連續(xù)誤檢測(cè)情況的發(fā)生,必須使兩個(gè)控制卡的檢測(cè)周期不同。并且,基于如下考慮:盡可能不增加主控制卡的負(fù)擔(dān),并且在主控制卡故障時(shí),希望從控制卡可以較快發(fā)現(xiàn)主控制卡的故障并接管主控制卡的工作,所以決定縮短從控制卡的檢測(cè)周期,加速其對(duì)主控制卡的檢測(cè)。在本系統(tǒng)的設(shè)計(jì)中,從控制卡的檢測(cè)周期為 380ms,主控制卡的檢測(cè)周期 T為 400ms。 ? 由于故障的隨機(jī)性,故障出現(xiàn)的時(shí)刻與檢測(cè)點(diǎn)間的時(shí)間也是隨機(jī)的,導(dǎo)致從故障出現(xiàn)到檢測(cè)到故障的時(shí)間是一個(gè)有確定上下限的范圍,該范圍為 。以從控制卡出現(xiàn)故障到主控制卡檢測(cè)到此故障為例,需要的時(shí)間是600ms至 1000ms。 ? 兩個(gè)控制卡工作于主從方式的熱備模式下,內(nèi)置完全相同的程序,但只有主控制卡可以向測(cè)控板卡發(fā)送命令,進(jìn)行控制輸出。在程序中,主從控制卡通過(guò)一個(gè)標(biāo)志變量MasterFlag來(lái)標(biāo)示主從身份,從而控制程序的執(zhí)行。當(dāng)從控制卡檢測(cè)到主控制出現(xiàn)故障時(shí),只需將 MasterFlag置 1就可實(shí)現(xiàn)由從控制卡到主控制卡的身份切換,就可以在程序中執(zhí)行主控制卡的功能。 ? 在從控制卡檢測(cè)到主控制卡故障后,不但要進(jìn)行身份切換,接管主控制卡的工作,還要向上位機(jī)進(jìn)行故障報(bào)告。當(dāng)主控制卡檢測(cè)到從控制卡故障時(shí),僅需要向上位機(jī)進(jìn)行故障報(bào)告。故障報(bào)告通過(guò)以太網(wǎng)通信模塊實(shí)現(xiàn)。 ? ⑶ 控制卡間的數(shù)據(jù)同步 ? 處于熱備狀態(tài)的兩個(gè)控制卡不但要不斷地監(jiān)測(cè)對(duì)方的工作狀態(tài),還要保證兩個(gè)數(shù)據(jù)卡間數(shù)據(jù)的一致性,以保證在主控制卡故障時(shí),從控制卡可以準(zhǔn)確無(wú)誤地接管主控制卡的工作并保證整個(gè)系統(tǒng)的連續(xù)運(yùn)行。 ? 要保證兩個(gè)控制卡間數(shù)據(jù)的一致性,要求兩個(gè)控制卡間必須進(jìn)行數(shù)據(jù)同步操作。數(shù)據(jù)的一致性包括測(cè)控板卡采樣數(shù)據(jù)的一致、控制算法的一致、以及運(yùn)算結(jié)果的一致。下載到兩個(gè)控制卡的控制算法信息是一致的,在保證測(cè)控板卡采樣數(shù)據(jù)一致且同步運(yùn)算的情況下,就可以做到運(yùn)算結(jié)果一致。所以兩個(gè)控制卡間需要就測(cè)控板卡的采樣信息和運(yùn)算周期做一定的同步處理。 ? 關(guān)于測(cè)控板卡采樣信息的同步,由于只有主控制卡可以向測(cè)控板卡發(fā)送數(shù)據(jù)索要命令,從控制卡不可以主動(dòng)向測(cè)控板卡索要采樣信息。但是在與測(cè)控板卡進(jìn)行通信時(shí),可以利用 CAN通信的組播功能實(shí)現(xiàn)主從控制卡同步接收來(lái)自測(cè)控板卡的采樣數(shù)據(jù),這樣就可以做到采樣數(shù)據(jù)的同步。 ? 兩個(gè)控制卡的晶振雖然差別不大,但不可能完全一致,在經(jīng)過(guò)一段較長(zhǎng)時(shí)間的運(yùn)行后,系統(tǒng)內(nèi)部的時(shí)間計(jì)數(shù)可能有很大的差別,所以通過(guò)單純的設(shè)定相同的運(yùn)算周期,并不能保證兩個(gè)控制卡間運(yùn)算的同步。在本設(shè)計(jì)中從控制卡的控制算法運(yùn)算不再由自身的時(shí)間管理模塊觸發(fā),而是主控制卡觸發(fā),以保證主從控制卡間控制算法運(yùn)算的同步。主控制卡在完成測(cè)控板卡采樣數(shù)據(jù)索要工作后,會(huì)通過(guò) CAN通信告知從控制卡進(jìn)行控制算法的運(yùn)算操作。 ? 除了正常工作過(guò)程中要進(jìn)行數(shù)據(jù)同步外,死機(jī)控制卡重啟后,正常運(yùn)行的主控制卡必須要及時(shí)幫助重啟的從控制卡進(jìn)行數(shù)據(jù)恢復(fù)和同步,以保證兩者間數(shù)據(jù)的一致性。此情況下需要同步的信息主要是控制算法中與時(shí)間或運(yùn)算次數(shù)密切相關(guān)的信息,以及一些時(shí)序控制回路中的時(shí)間信息。如 PID模塊的運(yùn)算結(jié)果, PID的運(yùn)算結(jié)果是前面多次運(yùn)算的一個(gè)累積結(jié)果,并不是單次運(yùn)算就可得出的;如時(shí)序控制回路中的延時(shí)開(kāi)關(guān),其開(kāi)關(guān)動(dòng)作的觸發(fā)由控制算法的時(shí)間決定。 ? 在正常運(yùn)行的主控制卡監(jiān)測(cè)到死機(jī)的從控制卡重啟后,主控制卡會(huì)主動(dòng)要求與從控制卡進(jìn)行信息同步,并且同步操作在主控制卡執(zhí)行完控制算法的運(yùn)算操作后執(zhí)行。部分信息的同步操作要求在一個(gè)周期內(nèi)完成,否則同步操作就是去了意義,同步的信息甚至是錯(cuò)誤的。部分信息允許分多個(gè)周期完成同步操作。部分信息要求在一個(gè)周期內(nèi)完成同步操作,但并不要求在開(kāi)始的第一個(gè)周期完成同步。如信息 A和 B關(guān)系緊密,需要在一個(gè)周期內(nèi)完成同步操作,信息 C和 D關(guān)系密切,也需要在一個(gè)周期內(nèi)完成同步操作。此時(shí)卻并不一定要在一個(gè)周期內(nèi)共同完成 A、 B、 C、 D的同步,可以將 A和 B的同步操作放在這個(gè)周期,將 C和 D的同步操作放到下個(gè)周期執(zhí)行,只要保證具有捆綁關(guān)系的信息能夠在一個(gè)周期內(nèi)完成同步即可。 ? 主控制卡肩負(fù)著系統(tǒng)的控制任務(wù),主從控制卡間的數(shù)據(jù)恢復(fù)與同步操作會(huì)占用主控制卡的時(shí)間,增加主控制卡上微控制器的負(fù)擔(dān)。為了保證主控制卡的正常運(yùn)行,不過(guò)多的增加主控制卡的負(fù)擔(dān),需要將待同步的數(shù)據(jù)合理分組并提前將數(shù)據(jù)準(zhǔn)備好,以便主從控制卡間的同步操作可以快速完成。 ? 3. CAN通信程序的設(shè)計(jì) ? 控制卡與測(cè)控板卡間的通信通過(guò) CAN總線進(jìn)行,通信內(nèi)容包括將上位機(jī)發(fā)送的板卡及通道配置信息下發(fā)到測(cè)控板卡、將上位機(jī)發(fā)送的輸出命令或控制算法運(yùn)算后需執(zhí)行的輸出命令下發(fā)到測(cè)控板卡、將上位機(jī)發(fā)送的累積型通道的計(jì)數(shù)值清零命令下發(fā)到測(cè)控板卡、周期性向測(cè)控板卡索要采樣數(shù)據(jù)等等。此外, CAN通信網(wǎng)絡(luò)還肩負(fù)著主從控制卡間控制算法同步信號(hào)的傳輸任務(wù)。 ? CAN通信程序的設(shè)計(jì)需要充分利用雙 CAN構(gòu)建的環(huán)形通信網(wǎng)絡(luò),實(shí)現(xiàn)正常情況下的高效、快速的數(shù)據(jù)通信,實(shí)現(xiàn)故障情況下的及時(shí)、準(zhǔn)確的故障性質(zhì)確定和故障定位。 ? STM32F407ZG中的 CAN模塊具有一個(gè) ,既支持 11位標(biāo)識(shí)符的標(biāo)準(zhǔn)格式幀,也支持 29位標(biāo)志符的擴(kuò)展格式幀??刂瓶ǖ脑O(shè)計(jì)中采用的是 11位的標(biāo)準(zhǔn)格式幀。 ? ⑴ CAN數(shù)據(jù)幀的過(guò)濾機(jī)制 ? 主控制卡向測(cè)控板卡發(fā)送索要采樣數(shù)據(jù)的命令,主控制卡會(huì)依次向各個(gè)測(cè)控板卡發(fā)送該命令,不存在主控制卡同時(shí)向多個(gè)測(cè)控板卡發(fā)送索要采樣數(shù)據(jù)命令的情況。測(cè)控板卡向主控制卡回送數(shù)據(jù)時(shí),只希望主控制卡和從控制卡可以接收該數(shù)據(jù),不希望其他的測(cè)控板卡接收該數(shù)據(jù),或者說(shuō)目前的系統(tǒng)功能下其他的測(cè)控板卡不需要該數(shù)據(jù)。主控制卡向從控制卡發(fā)送控制算法同步運(yùn)算命令時(shí),也只希望從控制卡接收該命令,不希望測(cè)控板卡接收該命令。 ? 由于 CAN通信網(wǎng)絡(luò)共用通信線,所以從硬件層次上講,任何一個(gè)板卡發(fā)送的數(shù)據(jù),連接在 CAN總線上的其他板卡都可以接收到。如果讓非目標(biāo)板卡在接收到該數(shù)據(jù)包后,通過(guò)對(duì)數(shù)據(jù)包中的目標(biāo) ID或數(shù)據(jù)信息進(jìn)行分析來(lái)判斷是否是發(fā)送給自己的數(shù)據(jù)包,這種方式雖然可行,但是卻會(huì)讓板卡接收到大量無(wú)關(guān)數(shù)據(jù),而且還會(huì)浪費(fèi)程序的數(shù)據(jù)處理時(shí)間。通過(guò)使用 STM32F407ZG中的 CAN接收過(guò)濾器可有效解決這一問(wèn)題,過(guò)濾器可在數(shù)據(jù)鏈路層有效攔截?zé)o關(guān)數(shù)據(jù)包,使無(wú)關(guān)數(shù)據(jù)包無(wú)法到達(dá)應(yīng)用層。 ? STM32F407ZG中的 CAN標(biāo)識(shí)符過(guò)濾機(jī)制支持兩種模式的標(biāo)識(shí)符過(guò)濾:列表模式和屏蔽位模式。在列表模式下,只有 CAN報(bào)文中的標(biāo)識(shí)符與過(guò)濾器設(shè)定的標(biāo)識(shí)符完全匹配時(shí)報(bào)文才會(huì)被接收。在屏蔽位模式下,可以設(shè)置必須匹配位與不關(guān)心位,只要 CAN報(bào)文中的標(biāo)識(shí)符與過(guò)濾器設(shè)定的標(biāo)識(shí)符中的必須匹配位是一致的,該報(bào)文就會(huì)被接收。因此,列表模式適用于特定某一報(bào)文的接收,而屏蔽位模式適用于標(biāo)識(shí)符在一段范圍內(nèi)的一組報(bào)文的接收。當(dāng)然,通過(guò)設(shè)置所有的標(biāo)識(shí)符位為必須匹配位后,屏蔽位模式就變成了列表模式。 ? ⑵ CAN數(shù)據(jù)的打包與解包 ? 每個(gè) CAN數(shù)據(jù)幀中的數(shù)據(jù)場(chǎng)最多容納 8個(gè)字節(jié)的數(shù)據(jù),而在控制卡的 CAN通信過(guò)程中,有些命令的長(zhǎng)度遠(yuǎn)不止 8個(gè)字節(jié)。所以,當(dāng)要發(fā)送的數(shù)據(jù)字節(jié)數(shù)超出單個(gè) CAN數(shù)據(jù)幀所能容納的 8個(gè)字節(jié)時(shí),就需要將數(shù)據(jù)打包,拆解為多個(gè)數(shù)據(jù)包,并使用多個(gè) CAN數(shù)據(jù)幀將數(shù)據(jù)發(fā)送出去。在接收端也要對(duì)接收到的數(shù)據(jù)進(jìn)行解包,將多個(gè) CAN數(shù)據(jù)幀中的有效數(shù)據(jù)提取出來(lái)并重新組合為一個(gè)完整的數(shù)據(jù)包,以恢復(fù)數(shù)據(jù)包的原有形式。 ? 為了實(shí)現(xiàn)程序的模塊化、層次化設(shè)計(jì),控制卡與測(cè)控板卡間傳輸?shù)拿罨驍?shù)據(jù)具有統(tǒng)一的格式,只是命令碼或攜帶的數(shù)據(jù)多少不同??刂瓶?CAN通信數(shù)據(jù)包格式如表 106所示。 表 106 控制卡 CAN通信數(shù)據(jù)包的格式 位置 內(nèi)容 說(shuō)明[ 0] 目的節(jié)點(diǎn) ID 接收命令的板卡的地址[ 1] 源節(jié)點(diǎn) ID 發(fā)送命令的板卡的地址[ 2] 保留字節(jié) 預(yù)留字節(jié),默認(rèn) 0[ 3] 數(shù)據(jù)區(qū)字節(jié)數(shù) N ,數(shù)據(jù)區(qū)字節(jié)數(shù),可為 0[