資源描述:
《串口通信在雙機(jī)冗余系統(tǒng)中應(yīng)用》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在工程資料-天天文庫(kù)。
1、串口通信在雙機(jī)冗余系統(tǒng)中應(yīng)用摘要:本文扼要分析了當(dāng)今帶專(zhuān)用檢測(cè)轉(zhuǎn)換電路的雙機(jī)冗余系統(tǒng)存在的可靠性問(wèn)題,提出了利用雙機(jī)的串行口代替專(zhuān)用檢測(cè)轉(zhuǎn)換電路,通過(guò)串行通信相互檢測(cè)主備機(jī)工作狀態(tài),由軟件完成備機(jī)切換成主機(jī)的新型設(shè)計(jì)思想,為計(jì)算機(jī)在工業(yè)實(shí)時(shí)監(jiān)控系統(tǒng)應(yīng)用中的可靠性開(kāi)辟新思路。關(guān)鍵詞:雙機(jī)冗余軟件切換 1、引言冗余技術(shù)是計(jì)算機(jī)系統(tǒng)可靠性設(shè)計(jì)中常用的一種技術(shù),是提高計(jì)算機(jī)系統(tǒng)可靠性的最有效方法,同時(shí)也是鑒別各類(lèi)計(jì)算機(jī)控制系統(tǒng)好壞的標(biāo)志之一。故世界各地廠商推出的新產(chǎn)品都或多或少帶有冗余技術(shù)。如美國(guó)的Honey.4、軟件模板下面的軟件模板給出了筆者已實(shí)現(xiàn)的雙機(jī)冗余系統(tǒng)的軟件框架,和應(yīng)用系統(tǒng)實(shí)現(xiàn)密切相
2、關(guān)的部分用自然語(yǔ)言簡(jiǎn)單描述,其余部分為VisualC++源代碼,因此,這一軟件模板很容易移植到相似結(jié)構(gòu)的冗余系統(tǒng)中。該軟件模板以VisualC++進(jìn)行程序設(shè)計(jì),常量OK,REQ,ACK和NACK分別表示主備機(jī)工作狀態(tài)正常,備份數(shù)據(jù)發(fā)送請(qǐng)求,肯定應(yīng)答和否定應(yīng)答信息的字符常量,MAIN,STANDBY分別是表示工作單元為主機(jī)或備機(jī)的常量標(biāo)志。全局變量timeout用于設(shè)定以毫秒為單位的超時(shí)間隔,而Update,CpuStatus和Failure分別是表示備份數(shù)據(jù)是否更新,主備機(jī)狀態(tài)和主備機(jī)是否發(fā)生故障的標(biāo)志位變量。定時(shí)器0產(chǎn)生每隔1ms的定時(shí)中斷(采用QueryPerformanceCount
3、er((LARGE_INTEGER*)endtime)計(jì)數(shù)方式),每次中斷將全局變量timeout的值減1,減到0時(shí)即關(guān)閉定時(shí)器0。所有需要軟件超時(shí)機(jī)制或延時(shí)功能的程序模塊都可在設(shè)定timeout的值后開(kāi)啟定時(shí)器0,并通過(guò)判斷該變量的值是否為0而實(shí)現(xiàn)定時(shí)功能。定時(shí)器1產(chǎn)生每隔55ms的定時(shí)中斷(采用SetTime(55)函數(shù))。每次中斷,主備單元的中斷服務(wù)程序都向?qū)Ψ絾卧l(fā)送表示自身工作狀態(tài)正常的OK字符,同時(shí)也接收對(duì)方單元發(fā)送的OK字符,若連續(xù)三次都未能成功接收,則本單元認(rèn)為對(duì)方單元出了故障,并將表示對(duì)方單元工作狀態(tài)的全局變量Failure置為常量Yes,否則,置為No;若為備機(jī),還將表
4、示主備身份的標(biāo)志變量CpuStatus的值置為Main,從而為備機(jī)程序切換和給出原主機(jī)故障提示設(shè)置判斷標(biāo)志。若備機(jī)在中斷服務(wù)程序中接收到字符REQ,則置表示備份數(shù)據(jù)是否更新的標(biāo)志變量Update為Yes,并立即退出中斷服務(wù)程序,以便主程序及時(shí)接收備份數(shù)據(jù)幀。主函數(shù)在完成應(yīng)用系統(tǒng)的公共初使化,主備單元的定時(shí)器1在后臺(tái)產(chǎn)生定時(shí)中斷并通過(guò)串行通信進(jìn)行相互檢測(cè),由于規(guī)定兩個(gè)單元的上電時(shí)間間隔大于500ms,因此,利用中斷服務(wù)程序的檢測(cè)結(jié)果必能自動(dòng)確定初使的主備身份。主函數(shù)延時(shí)500ms后,即根據(jù)當(dāng)前的主備身份自動(dòng)進(jìn)入主(備)機(jī)的前臺(tái)監(jiān)控例程,主機(jī)的前臺(tái)監(jiān)控例程除完成應(yīng)用功能外,當(dāng)應(yīng)用功能改變了需要
5、備份的數(shù)據(jù)時(shí),則調(diào)用send_frame函數(shù)關(guān)閉定時(shí)器1的中斷并發(fā)送備份數(shù)據(jù)幀。當(dāng)備機(jī)的前臺(tái)監(jiān)控例程判斷出需要接收備份數(shù)據(jù)時(shí),調(diào)用recEive_frame函數(shù)關(guān)閉定時(shí)器1的中斷并接收備份數(shù)據(jù)幀。當(dāng)備機(jī)的前臺(tái)監(jiān)控例程監(jiān)視到主機(jī)故障時(shí),備機(jī)的前臺(tái)監(jiān)控循環(huán)自動(dòng)切換進(jìn)入主機(jī)的前臺(tái)監(jiān)控循環(huán)。主函數(shù)中的監(jiān)控切換代碼較難理解,應(yīng)結(jié)合并發(fā)執(zhí)行的定時(shí)器1的中斷服務(wù)程序一起分析。函數(shù)send_char和recEIve_char通過(guò)串行口直接發(fā)送和接收單個(gè)字符。函數(shù)send_frame和receive_frame分別發(fā)送和接收備份數(shù)據(jù)幀。VC++中用通訊控件開(kāi)發(fā)串行通信程序,通訊控件的工作原理類(lèi)似與中斷方式,
6、當(dāng)有通訊事件發(fā)生時(shí)(如發(fā)送數(shù)據(jù)、接收數(shù)據(jù)等),就會(huì)觸發(fā)Onm事件,在該事件的處理函數(shù)中調(diào)用GetmEvent()函數(shù),通過(guò)返回值即可確定是那類(lèi)事件,再作出相應(yīng)的處理。通信成功時(shí)返回1,否則返回0。Delay為以毫秒數(shù)為調(diào)用參數(shù)的延時(shí)函數(shù)。限于篇幅,本文僅給出完成檢測(cè)切換功能的主函數(shù)和定時(shí)器1的中斷服務(wù)函數(shù),以及相關(guān)數(shù)據(jù)的代碼,其它函數(shù)僅給出函數(shù)原型。代碼如下:#include"stdafx.h"#include"Try.h"#include"TryDoc.h"#include"TryVieeout;boolUpdate,Failure;charCpuStatus[12],voiddelay
7、(unsignedinttime);voidCTryDlg::Send_char(unsignedcharch){if(!m_m.GetPortOpen()){m_m.SetPortOpen(TRUE);//打開(kāi)串口m_m.SetOutput(COleVariant(ch));//發(fā)送數(shù)據(jù)}}voidCTryDlg::receive_char(unsignedchar*ch){VARIANTm_input1;if(m_m