技術頻道

娓娓工業(yè)
您現(xiàn)在的位置: 中國傳動網 > 技術頻道 > 技術百科 > 基于SCPI的直流低阻表底層協(xié)議的開發(fā)

基于SCPI的直流低阻表底層協(xié)議的開發(fā)

時間:2008-12-23 15:46:18來源:ronggang

導語:?隨著自動測試的發(fā)展,對儀器的可編程性提出了挑戰(zhàn),在這個前提下,SCPI(Standard Commands for Programmable Instruments)協(xié)議的出現(xiàn),帶動了標準編程語言的發(fā)展,最后被工業(yè)界所接受
摘 要:隨著自動測試的發(fā)展,對儀器的可編程性提出了挑戰(zhàn),在這個前提下,SCPI(Standard Commands for Programmable Instruments)協(xié)議的出現(xiàn),帶動了標準編程語言的發(fā)展,最后被工業(yè)界所接受。本文就是以SCPI為基準完成的下位機的編程。 關鍵詞:自動 SCPI 標準編程語言 [b][align=center]The Development of the Bottom Machine in the Direct Current Electric Resistance Instrument Teng Da-zhu ,Cheng Ming[/align][/b] Abstract: Along with the development of the automatic test, put forward the challenge to the programmable of the instrument, under this premise, the appear of the negotiate SCPI(Standard Commands for Programmable Instruments), arousing the development of the standard programable language, and finally were accept by the industry field. This thesis is design for the bottom machine base on the SCPI. Keywords: automation SCPI programmable language 1、引言   在以往的儀器控制中,復雜的指令結構,繁瑣的編寫語言使儀表的可編程性很差,久而久之,人們渴望得到一個統(tǒng)一的編程標準,美國HP公司為了迎接這個挑戰(zhàn),首先在公司的內部實現(xiàn)了統(tǒng)一的標準化編程語言TMSL(Test and Measuremens System Language),經過一段時間的試驗和改進,它被工業(yè)界所接受,定義為儀表界的標準,并將它重新命名為SCPI(Standard Commands for Programmable Instruments)。   SCPI應用的很普遍,但是在中國,可程控儀器和自動測試系統(tǒng)正處于發(fā)展階段,所以個人認為,我們應盡量跳過程控命令非標準化階段。大力推廣SCPI,以跟上程控命令標準化的世界潮流。   在本文中,主要通過構建一個子系統(tǒng)來說明SCPI是如何實現(xiàn)的,上位機通過RS232串口發(fā)送指令,下位機接受后進行循環(huán)解析,得出命令所希望實現(xiàn)的功能,執(zhí)行相應的函數后返回數據。下位機通過返回相應的數據來驗證上位機的指令是否得到了解析,如果是正確的,則返回相應的數據,如果是錯誤的,則返回錯誤信息。 2、設計概述   2.1 SCPI命令樹結構   對SCPI命令采用樹狀結構的,可向下三級,在這里最高級稱為子系統(tǒng)命令。只有選擇了子系統(tǒng)命令,該其下級命令才有效,SCPI使用冒號(:)來分隔高級命令和低級命令。   2.2串口通信   通常PC機和單片機之間的通信都是通過串行總線RS-232實現(xiàn)的。因此采用一種以RS232為核心的通信接口電路。該接口電路適用于由一臺PC機與多個單片機串行通信的設計,其原理框圖見圖1:   該框圖中,起著重要作用的是RS-232C通信接口電路。它是上位機和下位機之間信息傳遞的樞紐,一切數據的傳輸必需由它完成,上位機通過直接利用它的RS-232串行口來發(fā)送指令和接受返回值。 [align=center] 圖1單片機與PC機通信原理框圖[/align] 3、SCPI在直流低阻表中的實現(xiàn)   3.1直流低阻表的功能   直流低電阻主要用于計算機等高端機器,由于是直流電阻,所以電阻發(fā)熱是不可避免的,而采用低阻值的電阻則可以減少發(fā)熱量,不但可以節(jié)省電能,而且還大大提高儀器的使用壽命。直流低阻表的功能就是在流水線上檢測電阻的質量,確保電阻阻值在允許的誤差范圍內。這樣不但可以全天實時監(jiān)控,更可以記錄下阻值變化曲線圖,給工程師檢測儀器是否正常工作帶來方便。   3.2直流低阻表的模塊   可程控儀器的標準指令集同樣可以在直流低阻表里實現(xiàn),一般的直流低阻表都包含: FUNCtion子系統(tǒng)和COMParator子系統(tǒng)。   3.3命令解析   3.3.1 庫函數介紹   在構建模塊化的時候,調用庫函數完成相應的功能是很方便的,在這個SCPI解析協(xié)議中提供了以下的庫函數:   CheckFloat.c 它的作用是檢查是否為浮點數;   CheckInteger.c 它的作用是檢查是否為整數;   CommandEntry.c 這個庫函數很重要,它是程序的入口,計算機通過RS232串口發(fā)送數據到單片機,就是通過這個入口程序來接受指令的;   NewToken.c 它的作用是對指針指向的字符或符號或數字轉換成標識符,如將“set”轉換“TOKEN_FLAG_COMMAND”,將“50”轉換成“TOKEN_FLAG_NUMMBER”;   RS232_Close.c 它的作用是關閉RS232串口;   RS232ErrChr.c 它的作用是顯示字符錯誤;   RS232ErrStr.c 它的作用是顯示字符串錯誤;   RS232_Open.c 它的作用是打開RS232串口;   RS232Print.c 它的作用是輸出;   RS232PrintChar.c 它的作用是輸出單個字符;   RS232PrintError.c 它的作用是輸出錯誤;   RS232PrintLine.c 它的作用是輸出字符串;   RS232Send.c 它是RS232發(fā)送指令;   SeekParameter.c 它的作用是尋找參數;   SubsystemError.c 這里面包括了ERR子系統(tǒng)的函數;   Translate.c 這個庫函數是下面要講到的循環(huán)調用解析函數。   3.3.2命令解析函數   解析函數是整個SCPI協(xié)議的靈魂,SCPI協(xié)議的解析正是通過這樣的一個循環(huán)調用函數來實現(xiàn)對命令的解析,然后再對解析出來的命令再加以解析,直到最后一層,最后調用其他的函數。   在循環(huán)解析中,它起了一個分割命令的作用,并對分割出來的命令再加以解析和分割直到最后一層,在這個函數中首先用到了NewToken()這個函數,這個函數的作用是對當前指針m_pInBuffer所指的對象進行判斷,并返回相應的類型,若指向“:”,則返回“:”;如若指向“set”,則返回“TOKEN_FLAG_COMMAND”;若指向“;”,則返回“ ;”,若指向“50”,則返回“TOKEN_FLAG_NUMMBER”,解析具體過程如下:   1.若是“TOKEN_FLAG_COMMAND”,則和自己所定義的命令進行比較,若不相同,則返回錯誤信息“BAD COMMAND”,若比較結果相同的話,賦bFound為true,并跳出while()循環(huán),執(zhí)行if操作,這里將出現(xiàn)兩種情況:  ?。?) 如果沒有下級執(zhí)行函數,則比較m_pInBuffer是否為“:”,若是,則執(zhí)行“++”操作,取出下一個符號,這里執(zhí)行if操作,如果沒有下級命令,則返回錯誤信息“BAD COMMAND”,如果有下級命令,就把這個命令賦給pToken,并置bNeedCommand為true;如果m_pInBuffer不是“:”,則返回錯誤信息“INVALID SEPARATOR”,返回主函數。執(zhí)行完這段程序后跳出循環(huán),等待下次循環(huán)的到來。  ?。?) 如果有下級執(zhí)行函數,則將下級命令賦給pToken,并執(zhí)行下級執(zhí)行函數,函數執(zhí)行完后會返回一個標識符,在這里又一次對標識符進行一次判斷:  ?、?如果是“:”,這時再看命令是否有下級,如果沒有,則返回錯誤信息“INVALID AEPARATOR”,如果有則將true賦給bNeedCommand后跳出。  ?、?如果是“;”,則看m_bCommon是否為true,若為true的話,則將其置false,并將bNeedCommand置為false后跳出。   ③ 如果是“TOKEN_FLAG_RESTART”,則將m_bCommon置為false,返回到根命令,返回true。  ?、?如果是“TOKEN_FLAG_COMMON”,則看m_bCommon是否為false如果是則將其置為true,將pToken的值賦給m_pTokenSave,返回true。  ?、?如果是“END”,則返回fslse。  ?、?如果以上什么都不是,則返回錯誤信息,并返回false。   2.如果是“*”,則其代表的是公共命令,將m_bCommon置為true。   3.如果是“:”,則跳出。   4.如果是“ ”,此時看bNeedCommand是否為真,如果是,則返回錯誤信息“SYNTAX ERROR”,返回主函數。   5.如果是“TOEN_FLAG_NUMBER”,返回錯誤信息“BAD COMMAND”。   6.如果是“TOKEN_FLAG_END”,返回主循環(huán)。   7.如果都不是,則返回錯誤信息“INVALID SEPARATOR”,并返回主循環(huán)。   為了便于理解,下面我來舉個例子:   在計算機里輸入“set:red 50;:set:yel?”這個指令,這個指令的作用是設置紅燈的時間為“50”,并查詢當前黃燈的時間。首先主程序的指針指向“set”,并通過“NewToken()”這個函數來返回一個標識符,把它賦給“cToken”,此時對“cToken”進行判斷,因為“set”是命令標識符,所以“NewToken()”返回的是“TOKEN_FLAG_COMMAND”,執(zhí)行里面的操作,比較自定義的命令,結果在命令縮寫形式里找到相同的命令,跳出“if”操作,程序指針“++”,由于我們定義“set”有下級指令“M_tSetup”,所以執(zhí)行“else”操作,判斷主程序的指針為“:”,后面有下級命令“red”,把它賦給“pToken”后跳出,此時的指針指向的是“red”,通過判斷標識符的類型為“TOKEN_FLAG_COMMAND”,繼續(xù)執(zhí)行里面的操作,比較自定義命令,結果找到相同的命令,程序指針“++”,我們定義的“red”指令沒有下級命令而有下級執(zhí)行函數,所以這里執(zhí)行“if”操作,這里調用“SetRed()”這個函數,向里面寫入時間“50”,此時程序指針執(zhí)行“++”指向“;:”,它是一個“TOKEN_FLAG_RESTART”類型的數據,執(zhí)行命令樹的重起操作,等待主函數的下次調用“CommandEntry()”,調用后繼續(xù)執(zhí)行命令,同樣指針指向“set”,由于返回的類型是“TOKEN_FLAG_COMMAND”,所以執(zhí)行里面的操作,比較自定義的命令,結果在命令縮寫形式里找到相同的命令,跳出“if”操作,程序指針“++”,由于我們定義“set”有下級指令“M_tSetup”,所以執(zhí)行“else”操作,判斷主程序的指針為“:”,后面有下級命令“yel?”,把它賦給“pToken”后跳出,此時的指針指向的是“yel?”,通過判斷標識符的類型為“TOKEN_FLAG_COMMAND”,繼續(xù)執(zhí)行里面的操作,比較自定義命令,結果找到相同的命令,程序指針“++”,我們定義的“yel?”指令沒有下級命令而有下級執(zhí)行函數,所以這里執(zhí)行“if”操作,這里調用“SetYellowQuery()”這個函數,執(zhí)行查詢操作。指令到此結束。   3.4延時定時器的使用   設計中,我遇到了這樣的一個問題:一開始我用一片單片機做實驗,成功后,換仿真器做實驗,結果數碼管的速度變慢了,原來的一秒變長了,經過思考,我認為是單片機的時鐘頻率和仿真器不同造成的,比較一看,單片機的時鐘頻率是20M,而我的仿真器的頻率是12M,發(fā)現(xiàn)了問題的所在,我就開始改寫時種定義函數。   首先找到定義延時定時器的文件define.h,在里面找到:   #define RELOAD_H_10MS 0x7d   #define RELOAD_L_10MS 0xcb   這里的時間定義是以20M為準的,時間計算的公式如下:   x=65536-T/t,再將x轉化成十六進制,分別賦給RELOAD_H_10MS和RELOAD_L_10MS,其中T是延時時間,t是一周期的時間。像:   12MHz@12CLK: t=1us/circle   12MHz@6CLK: t=500ns/circle   40MHz@12CLK: t=300ns/circle   像:x = 65536 –T/t 1ms = 65536–1000=64536 轉化為十六進制為0xFC18   50ms = 65536–50000=15536轉化為十六進制為0x3CB0   在本設計中,用的是12M@12CLK的芯片,延時定時器用的是10ms的,所以修改定義RELOAD_H_10MS和RELOAD_L_10MS的值就可以了,x=65536-10ms/1us=55536,修改后為: #define RELOAD_H_10MS 0Xd8   #define RELOAD_L_10MS 0Xf0   修改后運行成功,時間也正確了。   3.5測試結果   在設計里,你可以通過兩種方法來設置紅綠等亮的時間,一種是通過按鍵,直接在模板上進行操作,是通過“KeyEntry()”來完成的;一種是通過計算機串口和模板進行通信,在計算機里輸入命令來設置紅綠燈的時間,是通過“CommandEntry()”來完成的,這兩種方法在模板上都得到了實現(xiàn),通過按鍵來來設置的功能要少一點,只能對時間進行設置和實現(xiàn)暫停功能,通過串口通信來設置的功能包括了查詢,設置時間,重新啟動。在電腦里通過上位機所編的界面,來與模板通信,輸入“set:red 50”,返回“50”,同時紅燈的設置時間變?yōu)椤?0”,輸入“set:gree?”,返回“30”說明綠燈的設置時間為“30”,輸入“rst”,返回“waiting for 3s……”,3s后重新啟動,通過測試,說明我所用的SCPI的思想在里面得到了實現(xiàn)。 4、結束語   控制中出現(xiàn)的功能不足,可以通過增加指令來滿足,這是SCPI的優(yōu)點。標準的指令格式實現(xiàn)了助記符的一致性、參數格式的統(tǒng)一性以及執(zhí)行方式和功能擴展戰(zhàn)略的一致性,減少了測試軟件開發(fā)時間,使儀器的互換更容易。用SCPI編寫的程序不僅更可讀,而且更加直觀人們可以花費較少的時間來學習所使用的儀器,從而可花費較多的時間來解決實際應用問題。而且SCPI還是可擴展的,這就使它能隨著儀器能力的增加而擴大,這樣在將來人們可以購買一臺比目前所用儀器功能更多的多用表,其基本功能完全可像目前使用的舊儀器一樣程控。   因而,在本次設計中,我們就是以SCPI協(xié)議為指導思想,采用SCPI的指令助記符,分層結構及多重命令結構,來實現(xiàn)控制儀器模板的目的。在計算機通過RS232串口發(fā)送控制指令到模板時,模板接受了指令,并且做出了相應的回應,返回的數據與實際的數據相符,成功地把SCPI的思想應用于下位機的編程中,收到了很好的效果。   本文的創(chuàng)新點: SCPI協(xié)議已經編寫成功,計算機發(fā)送的指令已經被單片機接受,并解析正確,執(zhí)行了相應的函數。由此可見,在直流低阻表中,SCPI也能得到實現(xiàn)。 參考文獻   [1] 李毓輝,郭群山,周雄偉.一種自動測試系統(tǒng)軟件平臺的設計[J].微計算機信息 2005年第五期.   [2] 歐陽光,何光明.Keil_c程序設計教程[M].北京:人民大學出版社,2004.23-39.   [3] 王小龍,雷河靜.可編程儀器的前景[J].微型儀器與應用,2001,(6):16-18.   [4] H.A.Wheeler.SCPI:The Next Step in the Evolution of ATE Systems.Electronics Test[M].New York:Industry Publisher,August 1990:12-15.   [5] J.W.Duncan,and V.P.Minerva.SCPI Instruments Will Ease ATE Development[J]. Instrument,October l991:4-6.

標簽:

點贊

分享到:

上一篇:基于VI的數字萬用表四通道切...

下一篇:微能WIN-V63矢量控制變頻器在...

中國傳動網版權與免責聲明:凡本網注明[來源:中國傳動網]的所有文字、圖片、音視和視頻文件,版權均為中國傳動網(www.surachana.com)獨家所有。如需轉載請與0755-82949061聯(lián)系。任何媒體、網站或個人轉載使用時須注明來源“中國傳動網”,違反者本網將追究其法律責任。

本網轉載并注明其他來源的稿件,均來自互聯(lián)網或業(yè)內投稿人士,版權屬于原版權人。轉載請保留稿件來源及作者,禁止擅自篡改,違者自負版權法律責任。

網站簡介|會員服務|聯(lián)系方式|幫助信息|版權信息|網站地圖|友情鏈接|法律支持|意見反饋|sitemap

傳動網-工業(yè)自動化與智能制造的全媒體“互聯(lián)網+”創(chuàng)新服務平臺

網站客服服務咨詢采購咨詢媒體合作

Chuandong.com Copyright ?2005 - 2025 ,All Rights Reserved 深圳市奧美大唐廣告有限公司 版權所有
粵ICP備 14004826號 | 營業(yè)執(zhí)照證書 | 不良信息舉報中心 | 粵公網安備 44030402000946號