1、氣體泄漏測試儀的開發
在以往的儀器控制中,復雜的指令結構,繁瑣的編寫語言使儀表的可編程性很差,久而久之,人們渴望得到一個統一的編程標準,美國HP公司為了迎接這個挑戰,首先在公司的內部實現了統一的標準化編程語言TMSL(Test and Measuremens System Language),經過一段時間的試驗和改進,它被工業界所接受,定義為儀表界的標準,并將它重新命名為 SCPI(Standard Commands for Programmable Instruments)。
SCPI應用的很普遍,但是在中國,可程控儀器和自動測試系統正處于發展階段,所以個人認為,我們應盡量跳過程控命令非標準化階段。大力推廣SCPI,以跟上程控命令標準化的世界潮流。
在本文中,主要通過構建一個子系統來說明SCPI是如何實現的,上位機通過RS232串口發送指令,下位機接受后進行循環解析,得出命令所希望實現的功能,執行相應的函數后返回數據。下位機通過返回相應的數據來驗證上位機的指令是否得到了解析,如果是正確的,則返回相應的數據,如果是錯誤的,則返回錯誤信息。
2、設計概述
2.1 氣體泄漏測試儀的開發
對SCPI命令采用樹狀結構的,可向下三級,在這里***稱為子系統命令。只有選擇了子系統命令,該其下級命令才有效,SCPI使用冒號(:)來分隔**命令和低級命令。
2.2串口通信
通常PC機和單片機之間的通信都是通過串行總線RS-232實現的。因此采用一種以RS232為核心的通信接口電路。該接口電路適用于由一臺PC機與多個單片機串行通信的設計,其原理框圖見圖1:
該框圖中,起著重要作用的是RS-232C通信接口電路。它是上位機和下位機之間信息傳遞的樞紐,一切數據的傳輸必需由它完成,上位機通過直接利用它的RS-232串行口來發送指令和接受返回值。
3、SCPI在直流低阻表中的實現
3.1直流低阻表的功能
直流低電阻主要用于計算機等**機器,由于是直流電阻,所以電阻發熱是不可避免的,而采用低阻值的電阻則可以減少發熱量,不但可以節省電能,而且還大大提高儀器的使用壽命。直流低阻表的功能就是在流水線上檢測電阻的質量,確保電阻阻值在允許的誤差范圍內。這樣不但可以全天實時監控,更可以記錄下阻值變化曲線圖,給工程師檢測儀器是否正常工作帶來方便。
3.2直流低阻表的模塊
可程控儀器的標準指令集同樣可以在直流低阻表里實現,一般的直流低阻表都包含: FUNCtion子系統和COMParator子系統。
3.3命令解析
3.3.1 庫函數介紹
在構建模塊化的時候,調用庫函數完成相應的功能是很方便的,在這個SCPI解析協議中提供了以下的庫函數:
CheckFloat.c 它的作用是檢查是否為浮點數;
CheckInteger.c 它的作用是檢查是否為整數;
CommandEntry.c 這個庫函數很重要,它是程序的入口,計算機通過RS232串口發送數據到單片機,就是通過這個入口程序來接受指令的;
解析函數是整個SCPI協議的靈魂,SCPI協議的解析正是通過這樣的一個循環調用函數來實現對命令的解析,然后再對解析出來的命令再加以解析,直到*后一層,*后調用其他的函數。
在循環解析中,它起了一個分割命令的作用,并對分割出來的命令再加以解析和分割直到*后一層,在這個函數中首先用到了NewToken()這個函數,這個函數的作用是對當前指針m_pInBuffer所指的對象進行判斷,并返回相應的類型,若指向“:”,則返回“:”;如若指向“set”,則返回 “TOKEN_FLAG_COMMAND”;若指向“;”,則返回“ ;”,若指向“50”,則返回“TOKEN_FLAG_NUMMBER”,解析具體過程如下:
1.若是“TOKEN_FLAG_COMMAND”,則和自己所定義的命令進行比較,若不相同,則返回錯誤信息“BAD COMMAND”,若比較結果相同的話,賦bFound為true,并跳出while()循環,執行if操作,這里將出現兩種情況:
(1) 如果沒有下級執行函數,則比較m_pInBuffer是否為“:”,若是,則執行“++”操作,取出下一個符號,這里執行if操作,如果沒有下級命令,則返回錯誤信息“BAD COMMAND”,如果有下級命令,就把這個命令賦給pToken,并置bNeedCommand為true;如果 m_pInBuffer不是“:”,則返回錯誤信息“INVALID SEPARATOR”,返回主函數。執行完這段程序后跳出循環,等待下次循環的到來。
為了便于理解,下面我來舉個例子:
在計算機里輸入“set:red 50;:set:yel?”這個指令,這個指令的作用是設置紅燈的時間為“50”,并查詢當前黃燈的時間。首先主程序的指針指向“set”,并通過“NewToken()”這個函數來返回一個標識符,把它賦給“cToken”,此時對“cToken”進行判斷,因為 “set”是命令標識符,所以“NewToken()”返回的是“TOKEN_FLAG_COMMAND”,執行里面的操作,比較自定義的命令,結果在命令縮寫形式里找到相同的命令,跳出“if”操作,程序指針“++”,由于我們定義“set”有下級指令“M_tSetup”,所以執行“else”操作,判斷主程序的指針為“:”,后面有下級命令“red”,把它賦給“pToken”后跳出,此時的指針指向的是“red”,通過判斷標識符的類型為 “TOKEN_FLAG_COMMAND”,繼續執行里面的操作,比較自定義命令,結果找到相同的命令,程序指針“++”,我們定義的“red”指令沒有下級命令而有下級執行函數,所以這里執行“if”操作,這里調用“SetRed()”這個函數,向里面寫入時間“50”,此時程序指針執行“++”指向 “;:”,它是一個“TOKEN_FLAG_RESTART”類型的數據,執行命令樹的重起操作,等待主函數的下次調用 “CommandEntry()”,調用后繼續執行命令,同樣指針指向“set”,由于返回的類型是“TOKEN_FLAG_COMMAND”,所以執行里面的操作,比較自定義的命令,結果在命令縮寫形式里找到相同的命令,跳出“if”操作,程序指針“++”,由于我們定義“set”有下級指令 “M_tSetup”,所以執行“else”操作,判斷主程序的指針為“:”,后面有下級命令“yel?”,把它賦給“pToken”后跳出,此時的指針指向的是“yel?”,通過判斷標識符的類型為“TOKEN_FLAG_COMMAND”,繼續執行里面的操作,比較自定義命令,結果找到相同的命令,程序指針“++”,我們定義的“yel?”指令沒有下級命令而有下級執行函數,所以這里執行“if”操作,這里調用“SetYellowQuery()”這個函數,執行查詢操作。指令到此結束。
3.4氣體泄漏測試儀的開發
設計中,我遇到了這樣的一個問題:一開始我用一片單片機做實驗,成功后,換仿真器做實驗,結果數碼管的速度變慢了,原來的一秒變長了,經過思考,我認為是單片機的時鐘頻率和仿真器不同造成的,比較一看,單片機的時鐘頻率是20M,而我的仿真器的頻率是12M,發現了問題的所在,我就開始改寫時種定義函數。
3.5測試結果
在設計里,你可以通過兩種方法來設置紅綠等亮的時間,一種是通過按鍵,直接在模板上進行操作,是通過“KeyEntry()”來完成的;一種是通過計算機串口和模板進行通信,在計算機里輸入命令來設置紅綠燈的時間,是通過“CommandEntry()”來完成的,這兩種方法在模板上都得到了實現,通過按鍵來來設置的功能要少一點,只能對時間進行設置和實現暫停功能,通過串口通信來設置的功能包括了查詢,設置時間,重新啟動。在電腦里通過上位機所編的界面,來與模板通信,輸入“set:red 50”,返回“50”,同時紅燈的設置時間變為“50”,輸入“set:gree?”,氣體泄漏測試儀的開發”,輸入“rst”,返回“waiting for 3s……”,3s后重新啟動,通過測試,說明我所用的SCPI的思想在里面得到了實現。
4、結束語
控制中出現的功能不足,可以通過增加指令來滿足,這是SCPI的優點。標準的指令格式實現了助記符的一致性、參數格式的統一性以及執行方式和功能擴展戰略的一致性,減少了測試軟件開發時間,使儀器的互換更容易。用SCPI編寫的程序不僅更可讀,而且更加直觀人們可以花費較少的時間來學習所使用的儀器,從而可花費較多的時間來解決實際應用問題。而且SCPI還是可擴展的,這就使它能隨著儀器能力的增加而擴大,這樣在將來人們可以購買一臺比目前所用儀器功能更多的多用表,其基本功能完全可像目前使用的舊儀器一樣程控。
因而,在本次設計中,我們就是以SCPI協議為指導思想,采用SCPI的指令助記符,分層結構及多重命令結構,來實現控制儀器模板的目的。在計算機通過RS232串口發送控制指令到模板時,模板接受了指令,并且做出了相應的回應,返回的數據與實際的數據相符,成功地把SCPI的思想應用于下位機的編程中,收到了很好的效果。