彭民德:《電子計算60年》(24)PC與微控制器聯合控制的水文流速儀實時檢定系統

彭民德發表於2016-09-26

計算機應用到這個階段已經包括三個大的方面,一是科學計算和資料處理;二是資訊管理與事務處理;三是實時控制。最初的計算機只能做科學計算,比如我們用計算機做彈道計算。後來計算機在做科學計算的同時也可以做文件編輯、辦公、航空及火車票票務管理,這些屬於資訊與事務管理範疇的事。實時控制是對於工業過程的控制和對於使用戰鬥武器過程的控制。不過實時控制一般都用專用機。1986年我們曾受湖南省電力局委託,給他們的技術人員培訓,講解“葛洲壩―常德―株洲50萬伏高壓輸變電工程”引進的三菱計算機監控系統,其中的作業系統是UNIX的一個變種,叫OS60/UMX,就是實時控制系統。

隨著微型機的出現和計算機的普及,計算機的各種應用繼續向深度和廣度發展。用微機而不是專用機做過程控制便有了可能。此時我們還沒有現成的計算機上用於過程控制的軟體成果可用。但是作為計算機的專業人員,不同於其他人,別人可以心安理得地享用既有成果,我們卻不能停留於此。既然你選擇了電子計算,選擇了跟計算機在一起,就得儘可能把計算機用好,開拓新的應用,以自己的知識為提高社會的生產效率和生活質量服務。開發實時控制系統也是我們份內的事。

開發計算機實時控制系統,必須設定系統中的各種事件,規定響應事件之間的優先順序,寫出對每種事件的處理程式。進行中斷程式設計,讓各個事件的處理程式,在相應中斷髮生時能夠得到執行。實時控制系統除了需要進行必要的計算,包括數值的和邏輯的計算以外,還要特別注意計算的快速性,以保證系統能夠在毫秒級時間內對事件作出快速處理。這往往涉及對程式的優化設計。這種系統還一定有對外設的控制,因此一定要熟悉外設的效能,並且能夠隨時自如控制。此外,要特別注意系統的安全性和堅定性。

1989年我們跟幾位自動控制專業的老師同事合作,開發控制水文流速儀檢定過程的一個應用例項,屬於工業過程控制範疇,同時也包含實時資料的處理。流速儀是測量水流速度的儀器,流水衝擊其前端的螺旋漿快速轉動,正常情況下,轉數與水流速度成正比,記錄轉動圈數的電子裝置將圈數傳出,用儀表可以讀出水流速度。不過流速儀也是度量衡,需要定期與不定期地對它的測量精度進行檢定。檢定方法是建一個水槽,槽上安裝導軌,讓一輛帶有流速儀的小車在導軌上跑,流速儀置於水下,隨著檢定車在靜水中運動,設定檢定車不同的速度就相當於設定了不同的水流速度,造成螺旋漿與水的相對運動,通過儀表讀出螺旋漿轉數。這樣就可以相對於不同的水流流速,分別讀出流速儀的轉數。最後用實驗資料的某種數學處理方法,並與該流速儀出廠額度值比較,可以對流速儀的精度進行判定。

水電部1985年釋出了《直線明槽轉子式流速儀的檢定》部標SD145-85。標準規定了對檢測裝置及水槽的要求和對流速儀的檢定方法,給出了7種流速儀的檢定標準和資料處理的原則。其中檢定裝置部分包括對水槽的長度、寬度、水深的要求,對檢定車和軌道的要求。比如,車速範圍0.2至6米/秒;對每臺儀器的檢測速度點不能少於22個;每個速度至少應該有多長時間的穩定測量段,資料的處理方法,等等。其中車速的穩定性以及使車速達到預定值的快速性,從而能夠儘可能快地提供有效檢定,而且有儘可能長距離的檢定段長度,是衡量水槽等級的主要指標。

湖南省水利廳欲建一個流速儀檢測中心,檢定系統應達到上述部標一級標準。決定與我們合作,採用IBM PC控制,人的工作只要裝卸流速儀,整個測量過程通過控制室PC機鍵盤操作,由計算機自動控制進行。水利廳負責水槽的建設,我們負責電氣部分的設計與實現。

檢定明槽長90米,水深2米,寬度保證可以同時檢定3臺流速儀,引數互不干擾。我們決定讓操作員用IBM PC XT/286微機控制,檢定車用車上的電機驅動,用1片微控制器晶片8031控制檢定車的啟停和以負反饋理論控制車速的穩定。用3片8031分別負責3臺流速儀轉數的採集控制。上述4片微控制器整合在一塊電路板上,連同控制盒一起也裝在車上,開機後隨檢定車一起運動。整個系統由兩級計算機控制,IBM PC稱為一級計算機,它負責設定執行環境,建立友好的使用者介面,接受使用者的檢測命令,作了適當加工後,以通訊方式通知二級機執行檢測,並監控整個系統的工作狀態,接收二級機送來的車速訊號和流速儀訊號,實時地對資料進行處理。4個微控制器為二級計算機。

在PC一方編寫了一個實時系統。系統以事件驅動,規定了開車、開始採集、測試完成、端點停車、干預停、開慢車等若干種事件。開始採集的條件是車速已經穩定,通過“開始採集”訊號向全機發一個時間標尺,二級機開始按預定通訊格式向PC方傳送檢測資料。“測試完成”訊號是二級機完成測試時向PC發的訊號。起車時,一級機根據使用者的命令,查詢部標SD145-85,確定本次檢測的終值,以信件方式通知二級機,二級機對儀器脈衝訊號做中斷處理時,與預定測量終值比較,可判斷本次測試完成。此時二級機命令停車並報告PC機,傳遞引數,PC進行資料處理,圖表列印,為下個測點的檢測做準備。“端點停”是為了保護系統,在離軌道端點適當位置設定了一個觸點,一旦檢定車到位觸發,便產生對二級機的中斷訊號,二級機將命令停車,並向一級機報告。PC機收信後將組織新的信件,通知二級機控制檢定車向相反方向按原速度運動,繼續檢測。“干預停”是提供給操作員的一個按鍵,系統接收到這個按鍵後,將通知8031立即停車,這個訊號有最優先的處理級別。“慢車”訊號是一種特殊的開車訊號,它命令小車以一個額定速度開車,行車途中不做流速儀的檢測,只是為了開往某個指定位置,以便進行裝卸儀器等操作。對這些事件的中斷處理,構成了本系統的事件管理模組。

維繫兩級計算機之間通訊是系統得以正常工作的基本條件。鑑於當時一根100多米長的銅線要5000多元,這在當時已經是一個不小的數字了。為了節省開支,只用一根銅線,進行半雙工通訊。即一方發信時,另一方只能聽不能發而且必須在聽;而一次收發之後,又必須立即改變資訊流動方向,改變收發的角色。這顯然增加了設計的難度,保持通訊的暢通和可靠成為系統的瓶頸。我們設定了4種信件格式,約定了通訊協議。協議包括資料傳輸波特率、資料位個數、停止位個數、校驗型別,在我們的實現中,採用1200Bps,8個資料位,1個停止位,不校驗。每次從發信-收信,轉變到收信-發信,再轉變成發信-收信,把操作員的一條命令,一遍一遍地重複傳送,讓整個系統通訊週期小於1秒,以維護系統的實時性和堅定性。

在這裡,我們接觸並實踐了計算機內部和計算機之間資料通訊技術,這是計算機技術的一個重要組成部分。在PC機內部,以共匯流排的方式,把外設也跟記憶體統一編址,經匯流排實現CPU與外設的通訊。在計算機之間則用通訊線經通訊埠相連,實現PC與微控制器的通訊。資訊交換的基本單位是8個資料位的一個位元組。每臺外設都有一個8位的狀態暫存器和一個控制暫存器,有資料的傳送暫存器和接受暫存器,其長度都是8個位元的字元長度。得益於組合語言和高階語言提供的字位操作,可以對控制暫存器的特定數位置值,以實現對通訊裝置的控制。用out和in指令進行控制資料的傳輸。傳送位元組之前,要通過狀態暫存器檢視裝置狀態,只有狀態正常,才能向裝置傳送。雙機通訊時,首先要“握手”,保證通訊線路暢通。傳送之後要等待回應,經校驗保證剛才交換的位元組是可靠的。不然的話重發剛才那個位元組,比如可以重發3次,直到正確接收為止。位元組之上組織信件,信的內容是一串位元組序列。要設計好信件的用途和格式。一封信以什麼開頭,以什麼結尾,正文是等長格式還是可變格式。每封信收發完成後,一定要用雙方約定的協議進行校驗,通訊過程還要採取一些抗干擾措施。要管理髮送區和接收區。我們實際上搭建和維繫了一個由PC與3臺微控制器組成的以PC為伺服器的小型計算機網路。實現實時地檢測控制功能。這一實踐也給我們以後學習和使用計算機網路打下了一個紮實的基礎。這裡只有4臺計算機,到了網路的多機環境,將擴充套件至更多以地址表示的計算機,這裡的信件將擴充套件至資訊包,信件的分發和路徑確定,由閘道器和路由器負責。

在這個系統中,為了保證系統的實時性,我們還把使用頻率最高的中斷處理程式、發信程式和收信程式用匯編語言編寫,讓目標碼儘可能短一些,並且常駐記憶體,組成一個小核心。常駐記憶體的發信程式由事件管理模組的各個程式,包括開車控制程式,干預停處理程式,開慢車程式等呼叫。收信程式靠RS-232硬體,由發來的信件中斷啟用,經8250通訊卡接收資料。為了使得用解釋型BASIC寫的事件管理程式,必要時能高效地找到並呼叫核心的幾個程式,我們藉助了中斷向量表,把幾個這種程式的入口地址寫到中斷向量表的無用單元中,從而實現了高效地呼叫

通訊中的干擾訊號和當時所用某些國產元器件的質量不穩定,曾經拖延了專案進度。由於電源的波動、元器件的噪音、電磁干擾、熱輻射、機械振動等原因,往往夾雜干擾訊號於信件中。我們逐步採取了一系列對策:一是從硬體上排除干擾,比如將訊號地與電源地分開,訊號的光電隔離,遮蔽某些元器件,改進印刷電路板佈線。當時國產的一些電子元器件質量還不過關,試驗中有過幾次燒燬的事故。二是動態採集與靜態傳送兩條腿走路,提高資料傳送可靠性。微控制器動態採集的資料實時傳到PC機上只做實時監測用,微控制器把採集的資料儲存起來,待停車後再做一次集中的靜態傳送。靜態傳送的資料要可靠得多,以最後這次靜態傳送的資料作為資料處理的依據。第三,通訊軟體採取一定的容錯技術,比如嚴格檢查接收資料的合理性,捨去非法資料,以濾去干擾。第四,對於有錯誤的信,以置錯誤碼的方式通知對方要求重發。

每做一次檢測,便得到與所檢流速儀額定轉數對應的時間和距離,即速度,在(速度v,轉數n)平面上可以有一個點。對每臺流速儀不少於22個檢測點,用最小二乘法可以歸納一條直線:
n = kv + c
求出直線的斜率k和截距c。進而依據部標SD145-85,對流速儀給出精度檢測的結論:或繼續使用,或需要修理校正,或必須報廢。

實際專案是實打實的,硬體工作不可靠,或者任何一個程式語句抑或某個資料的一個數位有差錯,都可能導致失誤,只有百分百正確,系統才能正常運轉。其中的實時作業系統是系統的中心,它隨時與使用者互動,執行使用者的命令,又得命令二級機工作,隨時控制和監控行車,接收檢測資料。現場遇到問題往往令人束手無策,坐不住,睡不好。何以那個器件第二次又燒了,多方人員開了半天分析會,提出一些可能的原因,還得通過這樣那樣的試驗去採集一些新資料來協助判斷。許多試驗都得反映到我的實時作業系統程式上來,我得在程式中去體現與會者每一個思路。有些程式段也許後來發現沒有必要,只好註解掉甚至刪除掉,但在研究過程中卻是免不掉的重要環節。

該專案自1989年夏天起,至1994年5月25日省科委鑑定,歷時5年。當整個系統終於可以可靠地正常工作,一批批流速儀被自動檢定,意味著一座由計算機控制的流速儀國家一級檢定系統誕生,甭說有多愉快了。後來連一些小朋友課後也喜歡來這裡看測試,看檢定車聽話地自動奔跑,看螢幕上模擬的檢定車圖形動畫移動,還有程式控制內建喇叭讓計算機唱歌作為背景音樂,員工和孩子們的高興樣子,讓我們所有的煩惱和勞累都忘掉了。

這個專案的輸入值是水利部部標SD145-85關於多種流速儀的檢定標準,我們把它存入檢定程式的資料區。檢定前只要把最多三臺流速儀掛到檢定車上,從PC機上操作幾個功能鍵,就可以掌控整個流速儀檢定過程。控制行車,進行自動檢定。最後獲得流速儀的檢定資料被儲存於檔案中。我們還繪製了圖形和表格,從這個專案起,我們用到了一款帶漢字16*16點陣硬字型檔的寬行印表機。

此專案完成後,曾經請水利部專職業務部門做過技術鑑定和省級專家鑑定,進行了湖南省科技成果登記,並獲得湖南省科技進步獎。媒體也給與了一定的關注。

專案完成後,《長沙晚報》以“我國首臺兩級計算機控制的流速儀檢定系統在我市誕生”,《電子商報》以“我國首臺兩級計算機控制的流速儀檢定系統研製成功”作了報導。在這個專案的基礎上,我寫了一篇文章“一種用於兩級計算機控制環境的實時OS的設計與實現”,在《計算機研究與發展》(1995年11月)上與同行交流。

在開發水文流速儀PC實時檢測系統中,考慮到儘可能保證其實時性、可靠性要求,技術上更要追求其合理性,我們採用了一種自創的,自稱為“擬中斷呼叫”的程式開發技術,利用了記憶體中斷向量表,用了中斷程式設計技術,MS-DOS的TSR技術,用了組合語言和BASIC 混合語言程式設計技術。其技術要點大體上有以下幾點。

第一,有幾個必須頻繁使用的程式,比如IBM PC與4個微控制器8031之間的通訊程式, IBM PC以中斷方式接收4個微控制器傳送來的資料的程式,我用8086/8088組合語言編寫。因為我們要寫的是一個實時檢測和實時控制的程式,要充分利用IBM PC機可以直接硬體程式設計這樣一種權利,儘可能硬體操作以提高程式效率。
在接收部分,要用
MOV DX,03FDH
IN AL,DX
讀通訊線狀態,用
MOV DX,03F8H
IN AL,DX
從埠接收一個字元。還要維護一個先進先出的字元佇列。

中斷接收程式的基本結構是首先用幾個push指令保留現場;用指令“cti”關閉中斷,以保證接收過程不受干擾;從RS232埠接收一個字元;進行資料校驗;將接收的資料依序儲存於指定區域;最後階段,用兩條語句
MOV AL,20H
OUT 20H,AL
通知中斷控制器8259,本次中斷處理完畢;再用“sti”指令開放中斷,準備接收下一次中斷訊號;用pop指令恢復現場;返回。

在初始化部分,則要設定通訊波特率、通訊緩衝區、FIFO的字元佇列。

這組程式編寫、除錯好以後再用MS-DOS的TSR技術(int 27h),讓這些程式常駐於記憶體,處於隨時可以被呼叫和中斷啟動執行的狀態,保證有最快的執行速度。

第二,上述幾個常駐程式與IBM PC的實時檢測程式之間採取共用記憶體區的辦法通訊。實時檢測程式把發給微控制器的資訊寫入指定記憶體區;微控制器從指定區域讀取資訊。反之亦然,以中斷處理方式讀取來自微控制器的資訊被儲存於記憶體指定的地方,實時檢測程式以直接記憶體讀取方式去讀。實時檢測程式用BASIC語言編寫。BASIC語言程式與組合語言程式以共用記憶體區的方式通訊是一種效率最高的通訊方式。從程式設計的角度說,這也巧妙地實現了BASIC語言與組合語言之間的混合語言程式設計。

第三,專門開闢的記憶體通訊資訊傳送區和接受區的起始地址,都被安排寫入記憶體中斷向量表中預留給使用者開發運用的單元。通訊雙方通過中斷向量表找到通訊區,就可以寫入或讀取,達到通訊的目的。

第四,在主程式需要時,啟動常駐程式執行並返回,好像做了一次主動的中斷呼叫處理一樣。被呼叫的程式在自己的使用者空間內,呼叫的實質是子程式呼叫。但是每次呼叫都經由中斷向量表,又好像是發生了中斷。

實時檢測程式在需要呼叫子程式時,經中斷向量表找到通訊區,準備好必要的傳遞引數。也經中斷向量表找到駐留子程式的入口地址,轉去執行所需的子程式。子程式執行完畢,將返回主程式繼續執行。用這種方法實現的程式轉移過程示於圖(a)。

我這裡用的擬中斷呼叫轉移,既不影響系統對各種中斷的正常處理,又利用了其中斷機構加入了自己預設的“中斷”處理,不同於中斷、轉子程式和作業系統級系統呼叫。作為對比,圖(b)、(c)、(d)分別列出了它們的轉移路線。圖中,實線表示程式的執行,虛線表示程式的轉移。①至⑤或者⑥表示轉移的順序。

從圖中看出,4種程式轉移方式有其類似之處。子程式呼叫相對簡單,在程式自己的空間中便能夠解決問題。其餘3種都需要經中斷向量表進行轉移。也可以看出擬中斷呼叫與另外3種程式轉移方式的不同之處。

擬中斷呼叫區別於中斷的是:(1)它轉去執行的是一段自編的程式,而中斷轉去執行的中斷處理程式是系統中一段固有的程式。(2)它轉去執行的這段程式駐留在使用者空間,而中斷處理程式駐留在系統空間。

擬中斷呼叫與子程式呼叫不同的是:(1)它轉去執行的程式經中斷向量表定址,而轉子程式的入口地址經使用者棧即可找到。(2)擬中斷呼叫轉去執行的程式有相對獨立性,可以為多個程式同時或先後共享,而子程式則強烈地依附於主程式。

擬中斷呼叫也區別於系統呼叫,擬中斷呼叫的程式駐留在使用者空間,而系統呼叫的程式駐留在作業系統的空間。

第五,當時的BASIC因為用在單使用者單任務的個人機上,它支援用“DEF SEG” 語句設定段暫存器值,可以用POKE語句寫記憶體的指定區域,用“CALL 地址”呼叫記憶體中指定地址開始處的一個程式。還可以用“ON KEY(n)”語句關聯自己寫的中斷處理程式。在系統開發中,這些特性我們都儘量合理地利用了。

這個專案中用到的一些軟體開發技術,可以說是挖空心思,儘量利用PC機的環境,把要做的事情儘可能做好。結果表明,技術路線是成功的。但在今天的機器上無法繼續沿用了,因為在多工機器上,為了保護系統資源不受干擾,作業系統已經把機器硬體與人分隔開來,它不再允許人們直接使用硬體,我們的實踐只是在MS-DOS環境下的一段歷史而已。

enter image description here

(與本文相關的更多內容,可參看 彭民德《電子計算60年》第5章 個人計算靈活方便 電子工業出版社)

相關文章