李煦侃
(1.中國(guó)自動(dòng)化學(xué)會(huì)發(fā)電自動(dòng)化專業(yè)委員會(huì),北京 100000;2.浙江浙能興源節(jié)能科技有限公司,浙江 杭州 310013)
隨著信息化技術(shù)的不斷發(fā)展和普及,許多核心業(yè)務(wù)系統(tǒng)構(gòu)建在信息系統(tǒng)上,對(duì)信息系統(tǒng)的安全及穩(wěn)定性提出了更高的要求。這些業(yè)務(wù)系統(tǒng)包括一系列互相聯(lián)絡(luò)的應(yīng)用,催生了大量的應(yīng)用間相互交流的技術(shù)需求。許多應(yīng)用需要通過發(fā)送消息,將目前狀態(tài)或需要完成的工作告知另一個(gè)應(yīng)用。
應(yīng)用間互相發(fā)送消息的方式有許多種,一般可以分為兩大類別:采用時(shí)間同步方式發(fā)送消息的稱為同步消息傳遞方式,采用時(shí)間不同步方式發(fā)送消息的稱為異步消息傳遞方式[1]。其中,同步消息傳遞方式要求收發(fā)雙方的運(yùn)行步調(diào)嚴(yán)格匹配,一般情況下較難達(dá)到。因此,異步消息傳遞方式的應(yīng)用范圍更為廣泛[2]。
心跳監(jiān)聽是一種非常重要的異步消息傳遞方式,是在實(shí)現(xiàn)高可用性和高可靠性的同時(shí),保證系統(tǒng)應(yīng)用正常運(yùn)行和服務(wù)不中斷的關(guān)鍵技術(shù)[3]。為及時(shí)掌握應(yīng)用的實(shí)時(shí)運(yùn)行狀態(tài)、及時(shí)發(fā)現(xiàn)偶發(fā)異常情況、在發(fā)生故障時(shí)及時(shí)處理,心跳監(jiān)聽技術(shù)在消除局部故障、提高全系統(tǒng)可靠性上發(fā)揮越來越重要的作用。因此,研究如何實(shí)現(xiàn)心跳監(jiān)聽具有非常重要的意義。
QNX操作系統(tǒng)是一種十分重要的分布式實(shí)時(shí)操作系統(tǒng)。本文主要基于該系統(tǒng)進(jìn)行研究。
心跳監(jiān)聽,通常指的是在任意兩個(gè)有聯(lián)系的系統(tǒng)(互相稱為主系統(tǒng)和備用系統(tǒng))之間,相互按照約定的時(shí)間間隔發(fā)送心跳信號(hào),通過能否收到心跳信號(hào)、收到心跳信號(hào)情況,判斷對(duì)方系統(tǒng)健康狀況。在主備系統(tǒng)環(huán)境中,當(dāng)處于備用角色的系統(tǒng)接收到心跳信號(hào)并核對(duì)正確,表示處于主角色的系統(tǒng)運(yùn)行正常;當(dāng)處于備用角色的系統(tǒng)連續(xù)若干次(可根據(jù)需求自定義)未收到心跳信號(hào),或者收到的心跳信號(hào)錯(cuò)誤,則備用系統(tǒng)判斷主系統(tǒng)異常,并切換為主系統(tǒng),避免失效的主系統(tǒng)所執(zhí)行的任務(wù)中斷,以提高整體系統(tǒng)的可靠性[4]。
為研究并實(shí)現(xiàn)心跳監(jiān)聽的功能,考慮到系統(tǒng)的通用性,可通過串口等標(biāo)準(zhǔn)通信接口來傳遞心跳信號(hào)。此外,還可以在傳遞心跳信號(hào)的同時(shí)傳遞其他相關(guān)信息,既提高了硬件使用的效率,又降低了心跳監(jiān)聽技術(shù)的實(shí)現(xiàn)成本。
串口即串行通信接口,一般包括RS-232-C、RS-422、RS-485、USB等。不同的電氣標(biāo)準(zhǔn),所采用的通信協(xié)議也有所區(qū)別。其中RS-232-C標(biāo)準(zhǔn)提出時(shí)間較早,應(yīng)用較為廣泛,是目前常用的一種串行通信接口。其全名為“數(shù)據(jù)終端設(shè)備(data terminal eqipment,DTE)和數(shù)據(jù)通信設(shè)備(data communication eqipment,DCE)之間串行二進(jìn)制數(shù)據(jù)交換接口技術(shù)標(biāo)準(zhǔn)”[5],又稱標(biāo)準(zhǔn)串口。RS-232-C接口標(biāo)準(zhǔn)初期一般使用22線制,采用25芯D型插頭座;后進(jìn)行了簡(jiǎn)化,可使用3線制(包括TX、RX、COM),采用9芯D型插座,使用較為簡(jiǎn)便。
本文以RS-232-C接口為應(yīng)用間通信接口,在此基礎(chǔ)上介紹心跳監(jiān)聽的設(shè)計(jì)方法,并給出其在QNX操作系統(tǒng)中的實(shí)現(xiàn)實(shí)例。
一般來說,可在主系統(tǒng)和備用系統(tǒng)或任意兩個(gè)有聯(lián)系的系統(tǒng)的應(yīng)用之間,通過串口,對(duì)獨(dú)立心跳信號(hào)的周期性收發(fā)及處理,實(shí)現(xiàn)基本的心跳監(jiān)聽。因此,心跳監(jiān)聽的實(shí)現(xiàn)過程主要包括心跳信號(hào)發(fā)送、心跳信號(hào)接收與處理兩部分。負(fù)責(zé)心跳信號(hào)發(fā)送的為發(fā)送方,負(fù)責(zé)心跳信號(hào)接收與處理的為接收方。為實(shí)現(xiàn)心跳監(jiān)聽的功能,一般發(fā)送方同時(shí)也是接收方。
心跳信號(hào)的發(fā)送由發(fā)送方完成。發(fā)送方如何發(fā)送心跳信號(hào),需要根據(jù)整體系統(tǒng)的需求進(jìn)行設(shè)計(jì),主要包括心跳消息、心跳周期、異常處理等。
心跳消息是系統(tǒng)約定的文本、數(shù)字或其他可為系統(tǒng)識(shí)別的數(shù)據(jù)類型。根據(jù)需要,也可定義多組心跳消息,以實(shí)現(xiàn)不同的功能。
心跳周期又稱心跳頻率,用于控制心跳信號(hào)的發(fā)送頻率,需要根據(jù)系統(tǒng)所執(zhí)行的工作和系統(tǒng)處理速度確定。若系統(tǒng)所執(zhí)行的工作時(shí)間要求高,則心跳頻率要提高;若系統(tǒng)處理速度相對(duì)較慢,則心跳頻率要相應(yīng)降低,不得影響系統(tǒng)正常運(yùn)行。心跳頻率可采用定時(shí)器控制[6]。
異常處理即心跳信號(hào)發(fā)送錯(cuò)誤時(shí)的處理措施,可按照系統(tǒng)需求定義。
心跳信號(hào)的接收與處理由接收方完成。接收方如何發(fā)送心跳信號(hào),同樣需要根據(jù)整體系統(tǒng)的需求進(jìn)行設(shè)計(jì),主要包括心跳消息、心跳周期、異常處理等。
接收方的心跳消息、心跳周期需要和發(fā)送方一致。
異常處理是指在接收不到心跳信號(hào)、接收到異常心跳信號(hào)或接收到特定心跳信號(hào)時(shí)的處理措施。一般在接收不到心跳信號(hào)或接收到異常心跳信號(hào)時(shí),可按照對(duì)方系統(tǒng)故障處理;在接收到特定心跳信號(hào)時(shí),可按照約定方式處理,以實(shí)現(xiàn)系統(tǒng)特殊功能。在接收心跳信息時(shí),應(yīng)設(shè)置心跳狀態(tài),并記錄有關(guān)數(shù)據(jù)。
QNX操作系統(tǒng)是使用十分廣泛的實(shí)時(shí)操作系統(tǒng)(real-time operation system,RTOS)[7],已有39年的歷史。QNX是一個(gè)微內(nèi)核實(shí)時(shí)平臺(tái),可使用QNX Momentics對(duì)目標(biāo)系統(tǒng)在Windows等平臺(tái)下進(jìn)行圖形可視化開發(fā),廣泛應(yīng)用于X86、PowerPC、MIPS等眾多硬件環(huán)境。遵循POSIX基本標(biāo)準(zhǔn),不論是從其他平臺(tái)移植到QNX平臺(tái)、在不同硬件環(huán)境的QNX平臺(tái)之間移植,還是從QNX平臺(tái)移植到其他平臺(tái),都十分方便[8],且性能強(qiáng)大、具有良好的實(shí)時(shí)性。
操作系統(tǒng)的實(shí)時(shí)性,是指確保時(shí)鐘信號(hào)能夠準(zhǔn)確地定時(shí),各處的時(shí)鐘能夠達(dá)到一致,QNX操作系統(tǒng)在不同的場(chǎng)合可達(dá)到微秒級(jí)。QNX操作系統(tǒng)基于優(yōu)先級(jí)搶占式調(diào)度策略[9],區(qū)別于Windows等分時(shí)操作系統(tǒng)采用的時(shí)間片管理方式。QNX操作系統(tǒng)中高優(yōu)先級(jí)的任務(wù)一旦就緒,即可立即占用CPU資源。同優(yōu)先級(jí)的任務(wù)按照時(shí)間片方式管理(時(shí)間片可自定義),可在限定時(shí)間內(nèi)對(duì)外來事件作出反應(yīng)。
QNX操作系統(tǒng)在實(shí)現(xiàn)串口通信時(shí),與Windows等分時(shí)操作系統(tǒng)不同。QNX操作系統(tǒng)在啟動(dòng)時(shí),需要加載一個(gè)包含操作系統(tǒng)、可執(zhí)行程序以及任何與有關(guān)數(shù)據(jù)的文件[10]在內(nèi)的系統(tǒng)映像文件。QNX的系統(tǒng)映像文件需要通過編寫包括啟動(dòng)腳本、啟動(dòng)引導(dǎo)腳本和文件列表三個(gè)部分的Build file文本后,由內(nèi)置的mkifs工具編譯生成。通過加載系統(tǒng)映像文件,QNX操作系統(tǒng)用啟動(dòng)腳本中的參數(shù)注冊(cè)硬件資源、配置硬件參數(shù)[11],QNX的串口就在此時(shí)進(jìn)行配置。
QNX對(duì)硬件的訪問非常簡(jiǎn)便。對(duì)用戶而言,對(duì)硬件的操作即對(duì)文件的操作。硬件文件存儲(chǔ)在QNX操作系統(tǒng)的“/dev”目錄。QNX通過對(duì)硬件資源的虛擬,極大地方便了用戶,簡(jiǎn)化了應(yīng)用開發(fā)。QNX對(duì)設(shè)備文件的訪問可通過內(nèi)置標(biāo)準(zhǔn)化函數(shù)實(shí)現(xiàn)。
串口通信要求雙方的速度、消息格式一致,速度參數(shù)主要是波特率,消息格式主要包括數(shù)據(jù)位、停止位及校驗(yàn)位等。在QNX操作系統(tǒng)中,這些參數(shù)包含在“termios.h”頭文件中,可通過位運(yùn)算(置位、清零等)設(shè)置這些參數(shù)。
QNX通過對(duì)串口文件的訪問實(shí)現(xiàn)對(duì)串口的操作,串口文件命名規(guī)則為“ser+編號(hào)”,例如“/dev/ser0”。操作串口0的函數(shù)及示例如下。
①打開串口0。
int fd=open (“/dev/ser0”,O_RDWR);
②設(shè)置串口。
//設(shè)置串口波特率
speed_t ispeed=19800;
speed_t ospeed=19800;
cfsetispeed (&termios_p,ispeed);
cfsetospeed (&termios_p,ospeed);
//設(shè)置串口變量參數(shù)
Termios_p·c_iflag&= (IXOFF|IXON);
Termios_p·c_oflag&= (OPOST);
Termios_p·c_lflag&=(ECHONL|ICANON|IEXTEN);
③接收數(shù)據(jù)。
intsizeofReadbyte=read (fd,buffer,sizeof (buffer));
④發(fā)送數(shù)據(jù)。
int sizeofWritebyte=write (fd,buffer,sizeof (buffer));
⑤關(guān)閉串口。
close (fd);
QNX操作系統(tǒng)的串口通信流程如圖1所示。
圖1 串口通信流程圖Fig.1 Serial communication flowchart
在基于QNX操作系統(tǒng)串口通信的心跳監(jiān)聽系統(tǒng)中,包含心跳發(fā)送模塊、心跳接收與處理模塊。兩個(gè)模塊協(xié)同工作,組成一個(gè)有機(jī)的整體。
4.1.1 心跳發(fā)送模塊
心跳發(fā)送模塊按照心跳頻率持續(xù)向串口寫預(yù)定義的心跳消息。在發(fā)送數(shù)據(jù)的同時(shí),必須保證每次發(fā)送成功,并做好異常處理,記錄日志。相應(yīng)地,發(fā)送異常時(shí)需要具備一定的故障診斷能力。
心跳發(fā)送模塊工作流程如圖2所示。
圖2 心跳發(fā)送模塊工作流程圖Fig.2 Working flowchart of heartbeat sending module
4.1.2 心跳接收與處理模塊
心跳接收與處理模塊持續(xù)嘗試接收數(shù)據(jù),一旦接收到數(shù)據(jù),就和預(yù)定義的數(shù)據(jù)比較。若結(jié)果一致,就判定接收到心跳信號(hào);若超過規(guī)定的時(shí)間未接收到任何數(shù)據(jù),則執(zhí)行一個(gè)預(yù)定的任務(wù),比如將備站切為主站。
同樣地,心跳接收與處理模塊需要具備一定的故障診斷能力,及時(shí)做好異常處理,記錄日志。
心跳接收與處理模塊工作流程如圖3所示。
圖3 心跳接收與處理模塊工作流程圖Fig.3 Working flowchart of heartbeat receiving and processing module
在QNX操作系統(tǒng)串口通信的心跳監(jiān)聽系統(tǒng)中,心跳信息的發(fā)送、接收與處理都需要定時(shí)器來協(xié)調(diào)[12],可采用QNX操作系統(tǒng)提供的定時(shí)器實(shí)現(xiàn)。以下給出一個(gè)實(shí)例。
main()
{
……
event.sigev_code = MY_PULSE_CODE;
timer_settime(timer_id,0,&itime,NULL);
//每隔3.5 s收到一個(gè)脈沖(itime.it_value)
//每隔3.5 s收到另一個(gè)脈沖(itime.it_interval)
for (;;)
{
rcvid = MsgReceive(chid,&msg,sizeof(msg),NULL);
if (rcvid == 0)
{
//we got a pulse
if (msg.pulse.code == MY_PULSE_CODE)
{
printf("從計(jì)時(shí)器得到一個(gè)脈沖信號(hào) ");
……
}
//else other pulses ...
}
//else other messages ...
}
……
}
每收到一次脈沖,心跳協(xié)調(diào)定時(shí)器就完成一次計(jì)時(shí),以實(shí)現(xiàn)心跳信號(hào)發(fā)送、接收和處理的調(diào)度。
為驗(yàn)證心跳監(jiān)聽的實(shí)現(xiàn),搭建了試驗(yàn)平臺(tái)。該平臺(tái)包括2套系統(tǒng)。每套系統(tǒng)均包含一顆獨(dú)立的CPU,可運(yùn)行QNX操作系統(tǒng)。系統(tǒng)間用一根RS-232-C連接線互相連接。心跳監(jiān)聽試驗(yàn)平臺(tái)流程如圖4所示。
圖4 心跳監(jiān)聽試驗(yàn)平臺(tái)流程圖Fig.4 Flowchart of heartbeat monitoring
通過將心跳監(jiān)聽程序編譯入兩套系統(tǒng)的QNX系統(tǒng)映像文件,使心跳監(jiān)聽程序隨QNX操作系統(tǒng)啟動(dòng)。心跳監(jiān)聽程序啟動(dòng)后,系統(tǒng)開始從RS-232-C接口接收心跳信號(hào)。若未收到信號(hào),置為主系統(tǒng);反之,則置為從系統(tǒng)。主從系統(tǒng)確定后,主系統(tǒng)不斷發(fā)送心跳信號(hào),從系統(tǒng)不斷接收心跳信號(hào)。當(dāng)從系統(tǒng)連續(xù)若干次接收不到心跳系統(tǒng)時(shí),則自動(dòng)切換為主系統(tǒng),并向主系統(tǒng)發(fā)送重置信號(hào)。
當(dāng)前條件下,各種業(yè)務(wù)系統(tǒng)對(duì)信息系統(tǒng)的依賴與日俱增,信息系統(tǒng)能否實(shí)現(xiàn)全時(shí)段無故障工作已經(jīng)受到廣泛關(guān)注。心跳監(jiān)聽技術(shù)實(shí)現(xiàn)的成本較低,在提高整體的系統(tǒng)安全、可靠性方面效果較好。
本文主要討論了基于串口通信的心跳監(jiān)聽方法,并在QNX操作系統(tǒng)中,通過串口實(shí)現(xiàn)了基本的心跳監(jiān)聽,給出了部分實(shí)例。相關(guān)工程技術(shù)人員在實(shí)際應(yīng)用中,可以在此基礎(chǔ)上結(jié)合具體情況,設(shè)計(jì)應(yīng)急措施和恢復(fù)處理程序,從而盡可能提高整體系統(tǒng)的應(yīng)急處理能力和可靠性,或利用心跳監(jiān)聽系統(tǒng)實(shí)現(xiàn)所需的特定功能。