亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        基于Python的SCPI命令解釋器的設(shè)計

        2019-09-20 00:39:16
        測控技術(shù) 2019年5期
        關(guān)鍵詞:關(guān)鍵字省略字典

        (北京航空航天大學(xué) 自動化科學(xué)與電氣工程學(xué)院,北京 100191)

        現(xiàn)如今,隨著可程控測量儀器的不斷發(fā)展,SCPI(Standard Commands for Programmable Instruments,可編程儀器標(biāo)準(zhǔn)命令)依然是用于控制可程控測量儀器的重要標(biāo)準(zhǔn)。如安捷倫、泰克等大型儀器廠商生產(chǎn)的各型號測量儀器依然在廣泛使用。

        目前,SCPI命令解釋器擁有多種設(shè)計思路,經(jīng)總結(jié)如下:

        ① 建立詞法、語法分析器,利用字符串比較的方式進(jìn)行解析[1];

        ② 采用XML文檔描述SCPI命令,解析時通過查詢XML文檔判斷匹配項[2];

        ③ 使用鏈表的數(shù)據(jù)結(jié)構(gòu)按照一定順序?qū)CPI命令信息進(jìn)行存儲,解析時遍歷查找[3];

        ④ 使用鏈?zhǔn)蕉鏄涞臄?shù)據(jù)結(jié)構(gòu)來構(gòu)建和存儲命令集,解析時遍歷查找[4-6];

        ⑤ 以XML文檔描述SCPI命令,以哈希表構(gòu)建命令樹,遍歷解析SCPI命令[7]。

        如上方法均為可行設(shè)計,但是依然存在不足之處。如方法1、方法3、方法4所設(shè)計的SCPI解釋器將SCPI命令樹寫進(jìn)程序中,不具有通用性,若使用儀器發(fā)生變更就需要重新編寫程序。方法2的設(shè)計在解析時直接對位于文件系統(tǒng)中的文本文件進(jìn)行查詢,而與文件系統(tǒng)交換數(shù)據(jù)速度遠(yuǎn)慢于RAM,所以其解析速度很慢,不適于實際應(yīng)用。方法5的設(shè)計雖具有通用性,但是針對存在可省略關(guān)鍵字的等效命令無法準(zhǔn)確識別。所以,基于Python語言提出一種新的設(shè)計思路,致力于解決上述常用SCPI命令解釋器存在的如通用性不強、解析效率低、等效命令識別不清等問題。

        1 SCPI命令介紹

        1.1 SCPI命令簡介

        SCPI于1990年與IEEE 488.2協(xié)議一起面世。它定義了一套用于控制可編程儀器的標(biāo)準(zhǔn)語法命令格式,于各大儀器廠商間普遍使用,是現(xiàn)在控制可編程儀器的重要標(biāo)準(zhǔn)。

        1.2 SCPI命令語法

        SCPI命令分為兩種。第一種是與IEEE 488.2共用的公用命令,結(jié)構(gòu)圖如圖1所示。語法有以下兩種格式。

        ① 執(zhí)行命令。

        語法格式:“*”+<程控助記符>

        示例:*CLS 表示清除狀態(tài)

        ② 查詢命令。

        語法格式:“*”+<程控助記符>+‘?’

        示例:*ESE? 表示標(biāo)準(zhǔn)事件狀態(tài)使能查詢

        圖1 SCPI公用命令格式

        第二種是儀器特定控制命令,結(jié)構(gòu)圖如圖2所示。語法格式有以下兩種。

        ① 執(zhí)行命令。

        語法格式:“:”+<關(guān)鍵字>+<空格>+<參數(shù)>

        示例::CONFigure:VOLTage:AC 5,0.01 表示配置測量交流電壓的量程為5 V,精度為0.01 V,以空格字符為界,前部分:CONFigure:VOLTage:AC表示命令,后部分5,0.01為參數(shù)

        ② 查詢命令。

        語法格式:“:”+<關(guān)鍵字>+“?”

        示例::CONFigure? 表示查詢配置信息

        在SCPI命令中,存在某些可省略關(guān)鍵字。例如前面舉例的命令:CONFigure:VOLTage:AC,若這條命令

        圖2 SCPI特定命令格式

        在去掉VOLTage關(guān)鍵字后不存在其他歧義,則VOLTage關(guān)鍵字為可省略關(guān)鍵字,即上述命令等同于:CONFigure:AC。

        SCPI命令既可以單條命令使用,也可以以“;”連接,多條命令串聯(lián)使用。

        SCPI命令樹是用于定義SCPI的命令集,它描述了各關(guān)鍵字之間的層次關(guān)系,相關(guān)的參數(shù)以及必要的注釋。

        1.3 SCPI命令解析難點

        通過前面對SCPI語法簡單的介紹得知SCPI命令分為公用命令與特定控制命令兩種結(jié)構(gòu)。公用命令結(jié)構(gòu)簡單,而特定控制命令由關(guān)鍵字及符號組成,結(jié)構(gòu)較復(fù)雜。整體形成一個表示命令層次關(guān)系的樹形結(jié)構(gòu)稱為命令樹。而特定控制命令中存在某些可省略關(guān)鍵字,會為解析帶來困難。

        從解析的角度而言,SCPI命令實際為一命令字符串,而解析過程即為通過字符串操作于命令樹中尋找匹配的關(guān)鍵字,最終獲取相應(yīng)信息。所以,SCPI命令樹的構(gòu)建是解析SCPI命令的關(guān)鍵,而且構(gòu)建命令樹的方式直接關(guān)乎于解釋器的通用性。為提高解析速度,命令樹需存儲于內(nèi)存中。難點在于需要設(shè)計合適的存儲結(jié)構(gòu)在內(nèi)存中存儲SCPI命令樹的節(jié)點信息。其中,每一個關(guān)鍵字應(yīng)為一節(jié)點,節(jié)點中需存儲如父節(jié)點、兄弟節(jié)點地址等相應(yīng)信息,終葉節(jié)點還需存儲對應(yīng)命令的操作碼等信息。

        所以,對于設(shè)計SCPI命令解釋器共有以下難點:

        ① 設(shè)計命令樹的構(gòu)建方式使設(shè)計的SCPI解釋器具有通用性;

        ② 設(shè)計合適的存儲結(jié)構(gòu)存儲節(jié)點信息;

        ③ 處理可省略關(guān)鍵字,使等效命令得到相同的預(yù)期結(jié)果。

        2 SCPI命令解釋器整體設(shè)計

        由以上分析得知,難點之一為需設(shè)計合適的存儲結(jié)構(gòu)存儲節(jié)點信息,這需要選取合適的數(shù)據(jù)結(jié)構(gòu)。目前大部分的設(shè)計均以C語言實現(xiàn),實現(xiàn)復(fù)雜而且代碼不易維護(hù),使用的數(shù)據(jù)結(jié)構(gòu)多為鏈表或鏈?zhǔn)蕉鏄?,SCPI命令集的添加或刪除操作都很復(fù)雜。而且匹配命令時通過遍歷命令樹實現(xiàn),查詢次數(shù)多效率慢。本文欲采用Python語言開發(fā)。Python是面向?qū)ο蟮母呒壘幊陶Z言,可拓展性極強,具有豐富的開源庫,能快速實現(xiàn)應(yīng)用程序所需的各種功能。以Python實現(xiàn),代碼簡單可維護(hù)性強。同時,Python中一些新型的數(shù)據(jù)結(jié)構(gòu)可以簡化查找過程,提高查找效率。

        同時,要解析SCPI命令,需要在內(nèi)存中建立SCPI命令樹。而建立的方式關(guān)乎于SCPI命令解釋器的通用性。如前文中提到,大多數(shù)SCPI解釋器僅針對單個儀器設(shè)計,而不同儀器間SCPI特定控制命令有所不同,他們在設(shè)計時將SCPI命令樹直接寫進(jìn)程序,導(dǎo)致若是使用儀器發(fā)生更改就需重新編寫程序,通用性較差。

        為提高SCPI命令解釋器的通用性,欲將SCPI命令樹以某固定文本格式存儲于ROM中,當(dāng)開機時將其解析加載進(jìn)內(nèi)存中,解析過程通過查詢內(nèi)存中命令樹的方式進(jìn)行。以此種方式實現(xiàn),當(dāng)使用儀器發(fā)生變化時,僅需按照固定格式重寫文本文件,無需修改程序,這樣就提高了SCPI命令解釋器的通用性??紤]到XML文件的書寫格式為樹形結(jié)構(gòu),與SCPI命令樹結(jié)構(gòu)相似,故決定采用XML文件來描述SCPI命令樹。

        所以,首先需設(shè)計XML文檔來描述SCPI命令樹,之后設(shè)計程序解析XML文檔將其加載進(jìn)內(nèi)存中,最后設(shè)計SCPI命令解釋程序,整體結(jié)構(gòu)設(shè)計如圖3所示。

        圖3 SCPI解釋器整體結(jié)構(gòu)

        3 SCPI命令樹建立過程的設(shè)計

        3.1 SCPI命令樹XML文檔的設(shè)計

        SCPI命令有公用命令與特定控制命令兩種。這里需根據(jù)這兩種命令分別設(shè)計XML標(biāo)簽。

        根節(jié)點標(biāo)簽,屬性Instrument表示當(dāng)前SCPI命令樹所屬儀器類別。

        特定控制命令標(biāo)簽,屬性Cmd、Level、LastLevel、IsEnd、Omissible、ImplementID、QueryID分別表示關(guān)鍵字長型助記符、當(dāng)前關(guān)鍵字所屬層級、當(dāng)前關(guān)鍵字上一層級、此節(jié)點是否為終葉節(jié)點、此關(guān)鍵字是否可省略、執(zhí)行函數(shù)ID、查詢函數(shù)ID。

        公用命令標(biāo)簽,屬性Cmd、ImplementID、QueryID分別表示公用命令、查詢函數(shù)ID、查詢函數(shù)ID。

        下面為部分特定控制命令封裝為XML文檔的實例:

        上述的XML文檔實例表示的SCPI命令樹如圖4所示。

        圖4 XML文檔對應(yīng)SCPI命令樹

        3.2 內(nèi)存節(jié)點存儲結(jié)構(gòu)設(shè)計

        在第1節(jié)分析中得知難點之一就是要設(shè)計合適的存儲結(jié)構(gòu)存儲節(jié)點信息。SCPI命令樹是一種典型的樹形結(jié)構(gòu)。常用的SCPI解釋器通常使用鏈表或鏈?zhǔn)蕉鏄鋪泶鎯?jié)點信息。這種方式在解析時,查詢次數(shù)多、效率慢。同時不易進(jìn)行添加、刪除等操作。

        SCPI命令樹擁有嚴(yán)格的層級之分,而解析時即為在各層級中查詢匹配關(guān)鍵字。所以這里擬采用Python中的字典結(jié)構(gòu)來實現(xiàn)查詢操作。字典是一種可變?nèi)萜髂P停铱纱鎯θ我忸愋蛯ο?。字典的每個鍵值對用“:”分割,每個鍵值對之間用“,”分割,整個字典包括在“{}” 中。字典中不可出現(xiàn)重復(fù)的“鍵”,鍵與值一一對應(yīng),它內(nèi)置實現(xiàn)利用了hash函數(shù),所以無論字典多么龐大,它的查詢和刪除都是常數(shù)時間的。故而設(shè)計這樣一個節(jié)點結(jié)構(gòu):其中存儲節(jié)點各相關(guān)信息,其中一個信息為下層與之關(guān)聯(lián)節(jié)點的地址集,以字典結(jié)構(gòu)實現(xiàn)。字典的鍵為簡寫關(guān)鍵字,與之對應(yīng)的值為對應(yīng)關(guān)鍵字的節(jié)點地址。則內(nèi)存中SCPI命令樹結(jié)構(gòu)如圖5所示。以此種方式實現(xiàn)的命令樹,在解析時若SCPI命令由3個關(guān)鍵字組成,則僅需經(jīng)過3次查詢即可得到結(jié)果,與常用的鏈表及鏈?zhǔn)蕉鏄涞姆绞较啾却蟠鬁p少了查詢次數(shù),提高了效率。

        圖5 內(nèi)存中SCPI命令樹結(jié)構(gòu)

        3.3 可省略關(guān)鍵字的處理

        前面提到,SCPI特定控制命令中存在某些可省略關(guān)鍵字,那么刪除或保留可省略關(guān)鍵字的兩條命令應(yīng)為等效命令,在解析后應(yīng)該得到同樣的結(jié)果。

        仍以之前示例為例,:CONFigure:VOLTage:AC中VOLTage為可省略關(guān)鍵字。則針對可省略關(guān)鍵字的處理過程為,將可省略關(guān)鍵字VOLT的下層地址集字典拼接至上層的地址集字典中。那么在解析完整命令時,在地址集中可以逐級向下查找得到最終結(jié)果,而在解析刪除了可省略關(guān)鍵字的等效命令時,即可越過可省略關(guān)鍵字查詢到下一級的命令。處理方法如圖6所示。

        圖6 可省略關(guān)鍵字處理方法

        3.4 內(nèi)存命令樹建立程序設(shè)計

        確定節(jié)點存儲結(jié)構(gòu)后,需設(shè)計解析建立程序。其中需按照公用命令與特定控制命令分別設(shè)計。

        公用命令若以層級劃分僅有一層,即無需上面設(shè)計的結(jié)構(gòu),僅以一個字典結(jié)構(gòu)即可滿足存儲。故而公用命令的建立過程如圖7所示。

        圖7 內(nèi)存公用命令集建立流程

        特定控制命令的SCPI命令樹建立比較復(fù)雜。由于每個子系統(tǒng)命令樹的深度并不固定,所以這里擬采用一個遞歸函數(shù)來建立,以XML文檔中的IsEnd屬性來作為遞歸終止條件。遞歸函數(shù)流程如圖8所示。命令樹的創(chuàng)建首先通過解析XML文檔獲取根節(jié)點,然后獲取相應(yīng)的屬性同時建立層級節(jié)點地址集,最終以參數(shù)傳入相應(yīng)屬性值以及地址集來調(diào)用遞歸函數(shù)實現(xiàn)SCPI命令樹于內(nèi)存中的建立,而命令樹建立的具體流程如圖9所示。

        圖8 遞歸建立函數(shù)流程

        圖9 內(nèi)存中特定控制命令樹建立流程

        4 SCPI命令解析程序設(shè)計

        目前,大多SCPI命令解釋器均以字符串比較的方式實現(xiàn)。而本文中由于使用了字典結(jié)構(gòu),那么在每一層級字典中查詢時即完成了關(guān)鍵字的匹配,無需進(jìn)行進(jìn)一步的字符串比較。而在此之前,首先要對SCPI命令進(jìn)行一些處理。

        SCPI命令可單條使用亦可以“;”連接多條使用。首先,若傳入的為多條串聯(lián)的命令,則需以“;”為分隔符將其分割為單條命令。Python中有一split函數(shù)可非常方便地實現(xiàn)此功能。它可通過指定分隔符對字符串進(jìn)行切片,結(jié)果存儲于list結(jié)構(gòu)中,若不指定分隔符則默認(rèn)以空格作為分隔符。

        在分離出單條命令后,針對每條命令提取首字符,分辨其為“:”還是“*”。若首字符為“:”則為特定控制命令;若首字符為“*”則為公用命令,對兩種命令需分別做處理。

        之后,提取尾字符,分辨尾字符是否為“?”,若尾字符為“?”則為查詢命令,否則為執(zhí)行命令。若為公用命令的查詢命令,則去掉尾字符匹配命令獲取對應(yīng)執(zhí)行函數(shù)的操作碼;若為公用命令的執(zhí)行命令,若有參數(shù)則首先分離參數(shù),之后匹配命令獲取操作碼。若為特定控制命令的查詢命令,則去掉尾字符,以“:”分割各關(guān)鍵字,于命令樹中逐層查詢匹配關(guān)鍵字最終獲取操作碼;若為特定控制命令的執(zhí)行命令,首先以空格為分隔符分離命令與參數(shù),之后以“:”為分隔符分離各關(guān)鍵字,于命令樹中逐層查詢匹配關(guān)鍵字最終獲取操作碼。得到操作碼及參數(shù)后即可由下層進(jìn)行函數(shù)調(diào)用。具體流程如圖10所示。

        5 結(jié)束語

        本文敘述了SCPI命令解釋器的整個設(shè)計過程。與常用的SCPI命令解釋器設(shè)計思路及實現(xiàn)方式均有所不同。大部分常用的SCPI命令解釋器的設(shè)計均以C語言實現(xiàn),實現(xiàn)復(fù)雜且代碼不易維護(hù),使用的數(shù)據(jù)結(jié)構(gòu)多為鏈表或鏈?zhǔn)蕉鏄?,在匹配命令時以遍歷的方式查詢命令樹,查詢次數(shù)多效率慢。而本文敘述的SCPI命令解釋器采用Python語言開發(fā)。通過靈活運用Python語言的優(yōu)勢,設(shè)計出的SCPI命令解釋器簡潔實用,代碼易維護(hù)。通過使用Python的字典結(jié)構(gòu)設(shè)計的內(nèi)存存儲結(jié)構(gòu)來存儲SCPI命令樹,在解析時減少了查詢次數(shù),提高了解析效率。如常用的鏈表及鏈?zhǔn)蕉鏄涞姆绞绞且环N遍歷的思路,若解析一個由3個關(guān)鍵字構(gòu)成的命令時最理想的情況是查詢3次,但絕大部分情況查詢次數(shù)應(yīng)大于甚至遠(yuǎn)大于3次,即最不理想的狀況應(yīng)為遍歷完整個命令樹。而本文利用Python字典實現(xiàn)的存儲結(jié)構(gòu),在解析時僅需進(jìn)行3次查詢即可得到結(jié)果。

        同時,本文亦針對可省略關(guān)鍵字給出處理方式,解決了等效命令識別不清的問題。即通過將可省略關(guān)鍵字的下層地址集字典拼接至上層的地址集字典中實現(xiàn),使其在查找時能越過可省略關(guān)鍵字直接查詢下層地址。

        而且通過以XML文檔描述SCPI命令集,當(dāng)開機時將其解析加載進(jìn)內(nèi)存中的方式,使SCPI命令解釋器

        擁有通用性。針對不同儀器,僅需根據(jù)固定格式重寫XML文檔即可實現(xiàn)SCPI命令樹的替換而無需修改程序。

        由于Python語言跨平臺的特性,本文設(shè)計的SCPI解釋器同樣也具有跨平臺的特性。通過實驗驗證,在PC及ARM上均運行良好,解析結(jié)果快速準(zhǔn)確。

        猜你喜歡
        關(guān)鍵字省略字典
        開心字典
        家教世界(2023年28期)2023-11-14 10:13:50
        開心字典
        家教世界(2023年25期)2023-10-09 02:11:56
        履職盡責(zé)求實效 真抓實干勇作為——十個關(guān)鍵字,盤點江蘇統(tǒng)戰(zhàn)的2021
        華人時刊(2022年1期)2022-04-26 13:39:28
        偏旁省略異體字研究
        成功避開“關(guān)鍵字”
        我是小字典
        正版字典
        讀者(2016年14期)2016-06-29 17:25:50
        中間的省略
        詩選刊(2015年6期)2015-10-26 09:47:13
        基于用戶反饋的關(guān)系數(shù)據(jù)庫關(guān)鍵字查詢系統(tǒng)
        誘導(dǎo)性虛假下載鏈接不完全評測
        一区二区三区内射视频在线观看| аⅴ天堂中文在线网| 朋友的丰满人妻中文字幕| 日本道精品一区二区三区| 无码一级视频在线| 无码人妻少妇久久中文字幕| 国产三级视频在线观看国产 | 色婷婷精品久久二区二区蜜臀av| 国产自拍精品视频免费观看| 国产三级精品三级在线专区| 成人欧美一区二区三区在线| 久久国产劲暴∨内射| 亚洲AV永久无码精品导航| 亚洲愉拍自拍视频一区| 国产免费人成视频在线观看| 亚洲av成人无码久久精品老人| 亚洲av无码久久精品蜜桃| 日本老熟妇50岁丰满| 乱伦一区二| 男子把美女裙子脱了摸她内裤 | 中文字幕亚洲无线码a| 国产av午夜精品一区二区入口| 日本免费在线不卡一区二区| aⅴ精品无码无卡在线观看| 一区二区三区人妻无码| 亚洲av乱码中文一区二区三区| 亚洲美女性生活一级片| 免费精品人妻一区二区三区| 国产成人av一区二区三区在线观看| 日韩高清在线观看永久| 婷婷一区二区三区在线| 麻豆国产精品伦理视频| 亚洲av无码国产精品色| 国产美女在线精品免费观看| 国产精彩视频| 国产网红一区二区三区| 视频在线观看一区二区三区| 性欧美videofree高清精品| 女女同性黄网在线观看| 日韩精品成人一区二区三区 | 亚洲欧美激情精品一区二区|