李煦侃
(1.中國自動化學會發電自動化專業委員會,北京 100000;2.浙江浙能興源節能科技有限公司,浙江 杭州 310013)
隨著信息化技術的不斷發展和普及,許多核心業務系統構建在信息系統上,對信息系統的安全及穩定性提出了更高的要求。這些業務系統包括一系列互相聯絡的應用,催生了大量的應用間相互交流的技術需求。許多應用需要通過發送消息,將目前狀態或需要完成的工作告知另一個應用。
應用間互相發送消息的方式有許多種,一般可以分為兩大類別:采用時間同步方式發送消息的稱為同步消息傳遞方式,采用時間不同步方式發送消息的稱為異步消息傳遞方式[1]。其中,同步消息傳遞方式要求收發雙方的運行步調嚴格匹配,一般情況下較難達到。因此,異步消息傳遞方式的應用范圍更為廣泛[2]。
心跳監聽是一種非常重要的異步消息傳遞方式,是在實現高可用性和高可靠性的同時,保證系統應用正常運行和服務不中斷的關鍵技術[3]。為及時掌握應用的實時運行狀態、及時發現偶發異常情況、在發生故障時及時處理,心跳監聽技術在消除局部故障、提高全系統可靠性上發揮越來越重要的作用。因此,研究如何實現心跳監聽具有非常重要的意義。
QNX操作系統是一種十分重要的分布式實時操作系統。本文主要基于該系統進行研究。
心跳監聽,通常指的是在任意兩個有聯系的系統(互相稱為主系統和備用系統)之間,相互按照約定的時間間隔發送心跳信號,通過能否收到心跳信號、收到心跳信號情況,判斷對方系統健康狀況。在主備系統環境中,當處于備用角色的系統接收到心跳信號并核對正確,表示處于主角色的系統運行正常;當處于備用角色的系統連續若干次(可根據需求自定義)未收到心跳信號,或者收到的心跳信號錯誤,則備用系統判斷主系統異常,并切換為主系統,避免失效的主系統所執行的任務中斷,以提高整體系統的可靠性[4]。
為研究并實現心跳監聽的功能,考慮到系統的通用性,可通過串口等標準通信接口來傳遞心跳信號。此外,還可以在傳遞心跳信號的同時傳遞其他相關信息,既提高了硬件使用的效率,又降低了心跳監聽技術的實現成本。
串口即串行通信接口,一般包括RS-232-C、RS-422、RS-485、USB等。不同的電氣標準,所采用的通信協議也有所區別。其中RS-232-C標準提出時間較早,應用較為廣泛,是目前常用的一種串行通信接口。其全名為“數據終端設備(data terminal eqipment,DTE)和數據通信設備(data communication eqipment,DCE)之間串行二進制數據交換接口技術標準”[5],又稱標準串口。RS-232-C接口標準初期一般使用22線制,采用25芯D型插頭座;后進行了簡化,可使用3線制(包括TX、RX、COM),采用9芯D型插座,使用較為簡便。
本文以RS-232-C接口為應用間通信接口,在此基礎上介紹心跳監聽的設計方法,并給出其在QNX操作系統中的實現實例。
一般來說,可在主系統和備用系統或任意兩個有聯系的系統的應用之間,通過串口,對獨立心跳信號的周期性收發及處理,實現基本的心跳監聽。因此,心跳監聽的實現過程主要包括心跳信號發送、心跳信號接收與處理兩部分。負責心跳信號發送的為發送方,負責心跳信號接收與處理的為接收方。為實現心跳監聽的功能,一般發送方同時也是接收方。
心跳信號的發送由發送方完成。發送方如何發送心跳信號,需要根據整體系統的需求進行設計,主要包括心跳消息、心跳周期、異常處理等。
心跳消息是系統約定的文本、數字或其他可為系統識別的數據類型。根據需要,也可定義多組心跳消息,以實現不同的功能。
心跳周期又稱心跳頻率,用于控制心跳信號的發送頻率,需要根據系統所執行的工作和系統處理速度確定。若系統所執行的工作時間要求高,則心跳頻率要提高;若系統處理速度相對較慢,則心跳頻率要相應降低,不得影響系統正常運行。心跳頻率可采用定時器控制[6]。
異常處理即心跳信號發送錯誤時的處理措施,可按照系統需求定義。
心跳信號的接收與處理由接收方完成。接收方如何發送心跳信號,同樣需要根據整體系統的需求進行設計,主要包括心跳消息、心跳周期、異常處理等。
接收方的心跳消息、心跳周期需要和發送方一致。
異常處理是指在接收不到心跳信號、接收到異常心跳信號或接收到特定心跳信號時的處理措施。一般在接收不到心跳信號或接收到異常心跳信號時,可按照對方系統故障處理;在接收到特定心跳信號時,可按照約定方式處理,以實現系統特殊功能。在接收心跳信息時,應設置心跳狀態,并記錄有關數據。
QNX操作系統是使用十分廣泛的實時操作系統(real-time operation system,RTOS)[7],已有39年的歷史。QNX是一個微內核實時平臺,可使用QNX Momentics對目標系統在Windows等平臺下進行圖形可視化開發,廣泛應用于X86、PowerPC、MIPS等眾多硬件環境。遵循POSIX基本標準,不論是從其他平臺移植到QNX平臺、在不同硬件環境的QNX平臺之間移植,還是從QNX平臺移植到其他平臺,都十分方便[8],且性能強大、具有良好的實時性。
操作系統的實時性,是指確保時鐘信號能夠準確地定時,各處的時鐘能夠達到一致,QNX操作系統在不同的場合可達到微秒級。QNX操作系統基于優先級搶占式調度策略[9],區別于Windows等分時操作系統采用的時間片管理方式。QNX操作系統中高優先級的任務一旦就緒,即可立即占用CPU資源。同優先級的任務按照時間片方式管理(時間片可自定義),可在限定時間內對外來事件作出反應。
QNX操作系統在實現串口通信時,與Windows等分時操作系統不同。QNX操作系統在啟動時,需要加載一個包含操作系統、可執行程序以及任何與有關數據的文件[10]在內的系統映像文件。QNX的系統映像文件需要通過編寫包括啟動腳本、啟動引導腳本和文件列表三個部分的Build file文本后,由內置的mkifs工具編譯生成。通過加載系統映像文件,QNX操作系統用啟動腳本中的參數注冊硬件資源、配置硬件參數[11],QNX的串口就在此時進行配置。
QNX對硬件的訪問非常簡便。對用戶而言,對硬件的操作即對文件的操作。硬件文件存儲在QNX操作系統的“/dev”目錄。QNX通過對硬件資源的虛擬,極大地方便了用戶,簡化了應用開發。QNX對設備文件的訪問可通過內置標準化函數實現。
串口通信要求雙方的速度、消息格式一致,速度參數主要是波特率,消息格式主要包括數據位、停止位及校驗位等。在QNX操作系統中,這些參數包含在“termios.h”頭文件中,可通過位運算(置位、清零等)設置這些參數。
QNX通過對串口文件的訪問實現對串口的操作,串口文件命名規則為“ser+編號”,例如“/dev/ser0”。操作串口0的函數及示例如下。
①打開串口0。
int fd=open (“/dev/ser0”,O_RDWR);
②設置串口。
//設置串口波特率
speed_t ispeed=19800;
speed_t ospeed=19800;
cfsetispeed (&termios_p,ispeed);
cfsetospeed (&termios_p,ospeed);
//設置串口變量參數
Termios_p·c_iflag&= (IXOFF|IXON);
Termios_p·c_oflag&= (OPOST);
Termios_p·c_lflag&=(ECHONL|ICANON|IEXTEN);
③接收數據。
intsizeofReadbyte=read (fd,buffer,sizeof (buffer));
④發送數據。
int sizeofWritebyte=write (fd,buffer,sizeof (buffer));
⑤關閉串口。
close (fd);
QNX操作系統的串口通信流程如圖1所示。

圖1 串口通信流程圖Fig.1 Serial communication flowchart
在基于QNX操作系統串口通信的心跳監聽系統中,包含心跳發送模塊、心跳接收與處理模塊。兩個模塊協同工作,組成一個有機的整體。
4.1.1 心跳發送模塊
心跳發送模塊按照心跳頻率持續向串口寫預定義的心跳消息。在發送數據的同時,必須保證每次發送成功,并做好異常處理,記錄日志。相應地,發送異常時需要具備一定的故障診斷能力。
心跳發送模塊工作流程如圖2所示。

圖2 心跳發送模塊工作流程圖Fig.2 Working flowchart of heartbeat sending module
4.1.2 心跳接收與處理模塊
心跳接收與處理模塊持續嘗試接收數據,一旦接收到數據,就和預定義的數據比較。若結果一致,就判定接收到心跳信號;若超過規定的時間未接收到任何數據,則執行一個預定的任務,比如將備站切為主站。
同樣地,心跳接收與處理模塊需要具備一定的故障診斷能力,及時做好異常處理,記錄日志。
心跳接收與處理模塊工作流程如圖3所示。

圖3 心跳接收與處理模塊工作流程圖Fig.3 Working flowchart of heartbeat receiving and processing module
在QNX操作系統串口通信的心跳監聽系統中,心跳信息的發送、接收與處理都需要定時器來協調[12],可采用QNX操作系統提供的定時器實現。以下給出一個實例。
main()
{
……
event.sigev_code = MY_PULSE_CODE;
timer_settime(timer_id,0,&itime,NULL);
//每隔3.5 s收到一個脈沖(itime.it_value)
//每隔3.5 s收到另一個脈沖(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("從計時器得到一個脈沖信號 ");
……
}
//else other pulses ...
}
//else other messages ...
}
……
}
每收到一次脈沖,心跳協調定時器就完成一次計時,以實現心跳信號發送、接收和處理的調度。
為驗證心跳監聽的實現,搭建了試驗平臺。該平臺包括2套系統。每套系統均包含一顆獨立的CPU,可運行QNX操作系統。系統間用一根RS-232-C連接線互相連接。心跳監聽試驗平臺流程如圖4所示。

圖4 心跳監聽試驗平臺流程圖Fig.4 Flowchart of heartbeat monitoring
通過將心跳監聽程序編譯入兩套系統的QNX系統映像文件,使心跳監聽程序隨QNX操作系統啟動。心跳監聽程序啟動后,系統開始從RS-232-C接口接收心跳信號。若未收到信號,置為主系統;反之,則置為從系統。主從系統確定后,主系統不斷發送心跳信號,從系統不斷接收心跳信號。當從系統連續若干次接收不到心跳系統時,則自動切換為主系統,并向主系統發送重置信號。
當前條件下,各種業務系統對信息系統的依賴與日俱增,信息系統能否實現全時段無故障工作已經受到廣泛關注。心跳監聽技術實現的成本較低,在提高整體的系統安全、可靠性方面效果較好。
本文主要討論了基于串口通信的心跳監聽方法,并在QNX操作系統中,通過串口實現了基本的心跳監聽,給出了部分實例。相關工程技術人員在實際應用中,可以在此基礎上結合具體情況,設計應急措施和恢復處理程序,從而盡可能提高整體系統的應急處理能力和可靠性,或利用心跳監聽系統實現所需的特定功能。