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