文/王先鵬 王開明
(貴州航天凱山石油儀器有限公司 貴州省貴陽市 550009)
井場(chǎng)RTU 是油氣井生產(chǎn)物聯(lián)網(wǎng)系統(tǒng)的控制核心,對(duì)整個(gè)數(shù)據(jù)采集系統(tǒng)進(jìn)行協(xié)調(diào)和管理,把各智能傳感器采集到的數(shù)據(jù)傳輸?shù)秸尽S,并根據(jù)站、廠的要求對(duì)各個(gè)智能傳感器以無線通訊方式發(fā)送控制命令,從而實(shí)現(xiàn)抽油機(jī)井?dāng)?shù)據(jù)采集和控制管理功能。
井場(chǎng)RTU 以ATMEL 公司8 位AVR 單片機(jī)ATmega128L 為核心設(shè)計(jì)的嵌入式系統(tǒng),移植有μC/OS-II 實(shí)時(shí)操作系統(tǒng),預(yù)留有豐富的接口,可通過通信接口擴(kuò)展連接其它測(cè)試設(shè)備,具備較強(qiáng)的可擴(kuò)展性。
在油氣井生產(chǎn)物聯(lián)網(wǎng)系統(tǒng)中,遵循一套井場(chǎng)RTU 管理一個(gè)叢式井場(chǎng)(長(zhǎng)慶油田井場(chǎng)有抽油機(jī)井1 至10 幾口井?dāng)?shù)量不等)的設(shè)計(jì)原則:即每個(gè)井場(chǎng)安裝井場(chǎng)RTU 一套,單井各安裝示功圖傳感器、電機(jī)智能參數(shù)傳感器一套,還可以擴(kuò)展注水閥組單元、溫度和壓力采集傳感器等。
井場(chǎng)RTU 與各類傳感器在系統(tǒng)設(shè)計(jì)上遵循“分散采集、集中控制”設(shè)計(jì)理念,示功圖傳感器、電機(jī)智能參數(shù)傳感器、無線壓力變送器和無線溫度變送器等智能數(shù)據(jù)采集監(jiān)控設(shè)備傳感節(jié)點(diǎn)為系統(tǒng)設(shè)計(jì)的“分散采集”部分,采集油水井各種物理參數(shù);井場(chǎng)RTU為系統(tǒng)設(shè)計(jì)的“集中控制”部分,集中管理各種分散采集部分的傳感器節(jié)點(diǎn)。
井場(chǎng)RTU 以8 位AVR 單片機(jī)為核心設(shè)計(jì)的最小嵌入式系統(tǒng),移植有μC/OS-II 實(shí)時(shí)操作系統(tǒng),預(yù)留了豐富的接口,具備較強(qiáng)的可擴(kuò)展性。
井場(chǎng)RTU 通過AD 轉(zhuǎn)換器完成模擬量的數(shù)據(jù)采集,通過IO 接口判斷開關(guān)量的輸入輸出。井場(chǎng)RTU 與各類傳感器之間通過無線通信模塊(或采集接口)實(shí)現(xiàn)點(diǎn)對(duì)點(diǎn)或一點(diǎn)對(duì)多點(diǎn)的無線方式通訊;與服務(wù)器通過RJ45 接口,實(shí)現(xiàn)數(shù)據(jù)的交互。在工作過程中,井場(chǎng)RTU 起到橋梁紐帶的作用,它實(shí)時(shí)將各類傳感器采集到的數(shù)據(jù)傳輸?shù)秸究豍C 機(jī)或服務(wù)器端;井場(chǎng)RTU 與各類傳感器通訊時(shí),RTU 相當(dāng)于RS485 總線的主站,各類傳感器是RS485 總線的從站,RTU 與各類傳感器之間采用主從通信方式,通訊協(xié)議采用Modbus RTU 傳輸協(xié)議。
在井場(chǎng)RTU 的嵌入式系統(tǒng)設(shè)計(jì)過程中硬件的驅(qū)動(dòng)程序使井場(chǎng)RTU 的硬件的發(fā)揮了最優(yōu)的狀態(tài),應(yīng)用程序通過調(diào)用驅(qū)動(dòng)程序完成與硬件相關(guān)的所有操作。驅(qū)動(dòng)程序的編制與所使用的CPU 類型、外圍的硬件相關(guān),在這里不是本論文討論的重點(diǎn)。
2.1.1 功圖測(cè)試
定時(shí)測(cè)試井場(chǎng)中每口油井的示功圖。定時(shí)向示功圖傳感器發(fā)送功圖測(cè)試命令,然后與功圖傳感器通信,獲取測(cè)試后的實(shí)測(cè)功圖數(shù)據(jù)保存于RTU 中,同時(shí)將測(cè)試結(jié)果發(fā)給服務(wù)器。
2.1.2 電參數(shù)測(cè)試
定時(shí)測(cè)試井場(chǎng)中每口油井的電機(jī)運(yùn)行參數(shù)。定時(shí)向電機(jī)智能參數(shù)傳感器發(fā)送電參數(shù)測(cè)試命令,然后與電機(jī)智能參數(shù)傳感器通信,獲取測(cè)試后的實(shí)測(cè)電機(jī)運(yùn)行參數(shù)數(shù)據(jù)保存于RTU 中,同時(shí)將測(cè)試結(jié)果發(fā)給服務(wù)器。
2.1.3 注水井?dāng)?shù)測(cè)試定時(shí)測(cè)試井場(chǎng)中注水井的注水壓力、流量、配注等參數(shù),并將測(cè)試結(jié)果保存在RTU 中,并同時(shí)將結(jié)果上傳至服務(wù)器。
2.1.4 井場(chǎng)匯管壓力測(cè)試實(shí)時(shí)采集井場(chǎng)匯管壓力參數(shù),并將測(cè)試結(jié)果保存在RTU 中,并同時(shí)將結(jié)果上傳至服務(wù)器。
2.1.5 實(shí)時(shí)命令功能實(shí)時(shí)接收上位機(jī)發(fā)來的采集、控制等命令,進(jìn)行相應(yīng)的參數(shù)測(cè)試及設(shè)備控制等功能。
以往的程序編制方式是采用前后臺(tái)面向過程的編程方式,采用μC/OS-Ⅱ嵌入式實(shí)時(shí)操作系統(tǒng)后,編程方式變成了基于事件驅(qū)動(dòng)的編程方式。怎樣將RTU 復(fù)雜的功能一一簡(jiǎn)化成簡(jiǎn)單的事件就是井場(chǎng)RTU 儀器軟件的設(shè)計(jì)思想。
何為事件驅(qū)動(dòng),顧名思義,當(dāng)一個(gè)事件發(fā)生了,任務(wù)再作相應(yīng)處理,處理結(jié)束后又開始等待下一個(gè)事件的發(fā)生。如此周而復(fù)始的任務(wù)處理模型就是“事件驅(qū)動(dòng)的編程模型”。μC/OS-Ⅱ嵌入式應(yīng)用程序是由任務(wù)組成的,任務(wù)都必須符合事件驅(qū)動(dòng)的編程模型,即μC/OS-Ⅱ的應(yīng)用程序都必須是“事件驅(qū)動(dòng)的編程模型”。一個(gè)任務(wù)首先等待一個(gè)事件的發(fā)生,事件可以是系統(tǒng)中斷發(fā)出的,也可以是其它任務(wù)發(fā)出的,又可以是任務(wù)自身等待的時(shí)間片結(jié)束。事件驅(qū)動(dòng)模型也涵蓋了中斷驅(qū)動(dòng)模型,μC/OS-Ⅱ事件歸根結(jié)底來自三個(gè)方面:
(1)中斷服務(wù)函數(shù)發(fā)送的事件;
(2)系統(tǒng)延時(shí)時(shí)間到所引起的;
(3)其它任務(wù)發(fā)送的事件。
其中“中斷服務(wù)函數(shù)發(fā)送的事件”就是指每當(dāng)有硬件中斷發(fā)生,那么中斷服務(wù)程序就會(huì)以事件的形式告訴任務(wù),而等待該事件的最高優(yōu)先級(jí)任務(wù)就會(huì)馬上得以運(yùn)行;“系統(tǒng)延時(shí)時(shí)間到所引起的”事件其實(shí)也是硬件中斷導(dǎo)致的,那就是系統(tǒng)定時(shí)器中斷。而“其它任務(wù)發(fā)送的事件”則是由任務(wù)代碼自身決定的,這是完全的“軟事件”。不管“軟事件”還是“硬事件”,引起μC/OS-Ⅱ任務(wù)切換的原因就是“事件”,所以編寫應(yīng)用程序的時(shí)候一定要體現(xiàn)出“事件驅(qū)動(dòng)的編程模型”。
如果想了解多任務(wù)操作系統(tǒng),首先必須了解任務(wù)概念。所謂任務(wù),也稱作線程,是一個(gè)簡(jiǎn)單的、無限循環(huán)的程序,該程序可以認(rèn)為CPU 完全只屬該程序自己。實(shí)時(shí)應(yīng)用程序的設(shè)計(jì)過程,也就是如何把問題分割成多個(gè)任務(wù)的過程,每個(gè)任務(wù)都是整個(gè)應(yīng)用程序的某一部分,每個(gè)任務(wù)被賦予一定的優(yōu)先級(jí),有它自己的一套CPU寄存器和自己的??臻g。
任務(wù)劃分存在這樣一對(duì)矛盾:如果任務(wù)太多,必然增加系統(tǒng)任務(wù)切換的開銷;如果任務(wù)太少,系統(tǒng)的并行度就降低了,實(shí)時(shí)性就比較差。在任務(wù)劃分時(shí)要遵循H.Gomma 原則:
(1)I/O 原則:不同的外設(shè)任務(wù)不同。CPU 的操作快于I/O 操作,如果將I/O 操作歸為一個(gè)任務(wù)順序執(zhí)行則會(huì)很浪費(fèi)時(shí)間。
(2)優(yōu)先級(jí)原則:對(duì)于突發(fā)事件的優(yōu)先級(jí)等價(jià)于事件的時(shí)間耗盡線,不同優(yōu)先級(jí)處理不同任務(wù)。
(3)大量運(yùn)算:歸為一個(gè)任務(wù)。
(4)功能耦合:歸為一個(gè)任務(wù),舉例:f(),g(f()),h(g(f()))。
(5)偶然耦合:歸為一個(gè)任務(wù),舉例:f1(),f2(),f3()。即事件之間并沒有必然的先后順序,但由于習(xí)慣一直是按這個(gè)順序做的。
井場(chǎng)RTU 在油氣井生產(chǎn)物聯(lián)網(wǎng)系統(tǒng)中所實(shí)現(xiàn)的功能,將井場(chǎng)RTU 儀器軟件劃分成7 個(gè)任務(wù),分別詳述如下:
(1)命令解析任務(wù)(CMD_Explain_Task):負(fù)責(zé)解析串口0 發(fā)送來的數(shù)據(jù),將解析出的完整一幀命令放入命令緩沖隊(duì)列,并向命令執(zhí)行任務(wù)發(fā)送命令事件觸發(fā)信號(hào)量COMMAND_COM0_SEM,通知命令執(zhí)行任務(wù)有事件需要處理。
(2)命令執(zhí)行任務(wù)(CMD_Execute_Task):上位機(jī)(服務(wù)器端軟件)通過RJ45 網(wǎng)絡(luò)接口,發(fā)送給RTU 的所有控制命令(手動(dòng)功圖測(cè)試命令除外),都是通過此任務(wù)來完成的。此任務(wù)平時(shí)處于掛起態(tài)即等待命令事件觸發(fā)信號(hào)量COMMAND_COM0_SEM 事件發(fā)生,當(dāng)?shù)玫矫钍录|發(fā)信號(hào)量時(shí)命令執(zhí)行任務(wù)處于就緒態(tài)準(zhǔn)備開始執(zhí)行。
(3)手動(dòng)功圖測(cè)試任務(wù)(Manual_GT_Test):功圖測(cè)試所需要的時(shí)間較長(zhǎng)而且與抽油機(jī)的運(yùn)行快慢有關(guān),沖次較快的抽油機(jī)井測(cè)試時(shí)間較短,沖次慢的所需時(shí)間較長(zhǎng)。如果將此功能放入命令執(zhí)行任務(wù)中來完成,會(huì)因此功能長(zhǎng)時(shí)間的占用CPU 的使用權(quán)而其它功能得不到實(shí)時(shí)的執(zhí)行而影響整個(gè)RTU 工作的實(shí)時(shí)性。將手動(dòng)功圖測(cè)試功能獨(dú)立劃分成任務(wù)后賦予較低的優(yōu)先級(jí),這樣優(yōu)先級(jí)較高的任務(wù)可以剝奪優(yōu)先級(jí)較低的任務(wù)對(duì)CPU 的使用權(quán),可以立即執(zhí)行,因此不會(huì)由于功圖測(cè)試時(shí)間較長(zhǎng)而影響整個(gè)系統(tǒng)的實(shí)時(shí)性。
(4)功圖巡檢任務(wù)(GT_Test_Task):即定時(shí)測(cè)試功圖任務(wù)。井場(chǎng)RTU 的時(shí)鐘節(jié)拍中斷(OSTickISR)每10ms 產(chǎn)生一次,時(shí)鐘節(jié)拍是特定的周期性中斷。這個(gè)中斷是μC/OS-Ⅱ系統(tǒng)心臟的脈動(dòng)。功圖巡檢任務(wù)利用時(shí)鐘節(jié)拍的10ms 時(shí)間基,根據(jù)EEPROM 定時(shí)測(cè)試時(shí)間常數(shù),每隔一定時(shí)間產(chǎn)生一次功圖測(cè)試事件即功圖測(cè)試信號(hào)量(GTTEST_SEM)。功圖巡檢任務(wù)由于得到功圖測(cè)試事件(功圖測(cè)試信號(hào)量GTTEST_SEM)發(fā)生進(jìn)入就緒態(tài)準(zhǔn)備開始執(zhí)行。此任務(wù)不同于手動(dòng)功圖測(cè)試任務(wù)中進(jìn)行的功圖測(cè)試,它是針對(duì)一個(gè)井場(chǎng)所有抽油機(jī)井的功圖測(cè)試,而手動(dòng)功圖測(cè)試任務(wù)是針對(duì)某一口抽油機(jī)井的。
(5)電參巡檢任務(wù)(DC_Test_Task):和功圖巡檢任務(wù)一樣電參巡檢任務(wù)也是利用時(shí)鐘節(jié)拍中斷(OSTickISR)產(chǎn)生的10ms時(shí)間基,根據(jù)EEPROM 定時(shí)測(cè)試時(shí)間常數(shù),每隔一定時(shí)間產(chǎn)生一次電參測(cè)試事件即電參測(cè)試信號(hào)量(DCTEST_SEM)來完成一次井場(chǎng)中所有的抽油機(jī)井的電參數(shù)測(cè)試。
圖1:井場(chǎng)RTU 儀器軟件的工作框圖
(6)數(shù)據(jù)發(fā)送任務(wù)(SendDataToPC_Task):井場(chǎng)RTU 通過串口轉(zhuǎn)以太網(wǎng)向上位機(jī)發(fā)送數(shù)據(jù),如果有任務(wù)需要向上位機(jī)發(fā)送數(shù)據(jù),必須先向數(shù)據(jù)發(fā)送任務(wù)申請(qǐng)對(duì)串口0 的使用權(quán)。數(shù)據(jù)發(fā)送任務(wù)(SendDataToPC_Task)負(fù)責(zé)將系統(tǒng)中各任務(wù)打好的數(shù)據(jù)包發(fā)送給上位機(jī)。因串口0 為共享資源,且屬于外設(shè),與CPU 的處理速度相比串口0 的通訊速度較慢。
(7)主從通訊服務(wù)任務(wù)(OSTaskModbusServe):該任務(wù)負(fù)責(zé)處理主從通訊方面的主站與從站之間事務(wù)處理。主從通訊服務(wù)任務(wù)(OSTaskModbusServe)是RS485 通訊主站的核心組成部分,它負(fù)責(zé)Modbus RTU 協(xié)議中的ADU 報(bào)文幀的調(diào)度和Modbus 主從通訊方面的事務(wù)處理。該任務(wù)主要處理的事件:發(fā)送請(qǐng)求幀、等待應(yīng)答幀、處理應(yīng)答、處理差錯(cuò)和等待轉(zhuǎn)換延時(shí)。該任務(wù)通過API 函數(shù)ModbusPoll 為μC/OS-Ⅱ系統(tǒng)中各任務(wù)的Modubs 請(qǐng)求提供服務(wù)。
井場(chǎng)RTU 儀器軟件中的7 個(gè)任務(wù)分別由7 種不同的事件驅(qū)動(dòng)的,如圖1 所示。正是由于這些不同的事件組成了事件驅(qū)動(dòng)模型的編程方式。此種編程方式結(jié)構(gòu)清晰、層次分明,非常適合復(fù)雜的嵌入式系統(tǒng)開發(fā)。
8 位CPU 系統(tǒng)的井場(chǎng)RTU 引入了μC/OS-Ⅱ?qū)崟r(shí)嵌入式操作系統(tǒng)開發(fā)嵌入式軟件,并在任務(wù)劃分上采用了事件驅(qū)動(dòng)的編程思想,它以多任務(wù)模塊化編程,設(shè)計(jì)出了滿足嵌入式實(shí)時(shí)操作系統(tǒng)性能要求的事件驅(qū)動(dòng)機(jī)制。通過對(duì)這種機(jī)制的分析,讓我們可以更深入地理解實(shí)時(shí)操作系統(tǒng)設(shè)計(jì)的獨(dú)到之處。在油氣井生產(chǎn)物聯(lián)網(wǎng)系統(tǒng)中,井場(chǎng)RTU 引入了實(shí)時(shí)操作系統(tǒng)μC/OS-Ⅱ的設(shè)計(jì)理念使其嵌入式軟件可靠性、穩(wěn)定性和可擴(kuò)展性得到了很大的提升,并且在長(zhǎng)慶油田的數(shù)字化項(xiàng)目應(yīng)用中得到了較好的驗(yàn)證。