當(dāng)前位置:首頁 > 通信技術(shù) > 通信技術(shù)
[導(dǎo)讀]摘要:針對變電站中采用UART串口通信規(guī)約進行信息傳遞的各種外圍設(shè)備,在需要與其進行通信的IED智能裝置的開發(fā)中,設(shè)計了一種基于Lua腳本語言的嵌入式通信方案。通過該方案,可將具體串口報文規(guī)約的組建和解析交給Lu

摘要:針對變電站中采用UART串口通信規(guī)約進行信息傳遞的各種外圍設(shè)備,在需要與其進行通信的IED智能裝置的開發(fā)中,設(shè)計了一種基于Lua腳本語言嵌入式通信方案。通過該方案,可將具體串口報文規(guī)約的組建和解析交給Lua腳本進行處理,使設(shè)計者在具體裝置的軟件開發(fā)中,僅關(guān)注其與外圍設(shè)備以及Lua腳本間交互接口的設(shè)計,而不用關(guān)心具體的串口通信規(guī)約,從而提供了一種裝置串口通信的現(xiàn)場可配置化方案,提高了裝置應(yīng)用的靈活性。
關(guān)鍵詞:Lua;UART;串口通信;智能電子設(shè)備

引言
    隨著變電站智能化程度的逐步提高,對溫度、濕度等現(xiàn)場狀態(tài)參量的采集需求也越來越多。就目前而言,在現(xiàn)場應(yīng)用中,此類設(shè)備多采用RS232或RS485等UART串行通信方式和IED(Intelligent Electronic Device,智能電子設(shè)備)裝置進行交瓦。一般來說,不同的設(shè)備采用的通信數(shù)據(jù)幀格式并不相同。各式各樣的串口數(shù)據(jù)幀格式,對IED裝置的軟件定型造成一定的困難。傳統(tǒng)的做法一般是由裝置生產(chǎn)廠家指定和其配套的外圍設(shè)備,裝置的靈活性不夠理想。本文針對此類問題,提出了一種基于Lua腳本語言的解決方案,可有效地提高IED裝置對各種類型
串口數(shù)據(jù)報文幀格式的適應(yīng)性。該方案將具體串口報文規(guī)約的組建和解析交給Lua腳本進行處理,從而使設(shè)計者在裝置的軟件開發(fā)中,可僅關(guān)注于相關(guān)接口的設(shè)計,而不用關(guān)心具體的串口通信規(guī)約,從而方便軟件的定型,并提高了裝置自身在應(yīng)用中的靈活性。

1 Lua腳本語言介紹
    Lua是一種源碼開放的、免費的、輕量級的嵌入式腳本語言,源碼完全采用ANSI(ISO)C。這一點使它非常適合融入目前以C語言為主的嵌入式開發(fā)環(huán)境之中。兩者之間實現(xiàn)交互的關(guān)鍵在于一個虛擬的棧,通過該虛擬棧和Lua提供的可對該棧進行操作的相關(guān)接口函數(shù),可以很方便地在它們之間實現(xiàn)各種類型數(shù)據(jù)的傳遞。
    與其他腳本語言(如Perl、Tcl、Python等)相比,Lua表現(xiàn)出了足夠的簡單性以及非常高的執(zhí)行效率,結(jié)合其與平臺的高度無關(guān)以及充分的可擴展性,這使得它越來越多地得到大家的關(guān)注。因此,在本文的方案中優(yōu)先選用Lua腳本來進行設(shè)計。

2 系統(tǒng)方案概述
    本方案主要是圍繞著IED裝置和外圍串口設(shè)備之間的通信來進行設(shè)計的,系統(tǒng)框架如圖1所示。


    當(dāng)IED裝置開始運行時,將創(chuàng)建一個用于UART通信的讀寫調(diào)度任務(wù)。在該任務(wù)中,首先通過Lua提供的接口函數(shù)來啟動其腳本引擎,并創(chuàng)建Lua虛擬機。然后即可將用戶編寫的C函數(shù)注冊到Lua虛擬機中去,并將存在于Flash文件系統(tǒng)巾獨立于裝置C程序的Lua腳本文件加載到虛擬機中,從而建立起Lua和C的交互環(huán)境。在系統(tǒng)應(yīng)用中,將需要發(fā)送到外圍設(shè)備的具體數(shù)據(jù)內(nèi)容都放在Lua腳本文件中。當(dāng)裝置C程序需要發(fā)送數(shù)據(jù)時,通過通信讀寫調(diào)度程序及虛擬機的配合,將這部分?jǐn)?shù)據(jù)取出,并調(diào)用串口驅(qū)動程序發(fā)送給外圍設(shè)備。當(dāng)收到外圍設(shè)備發(fā)給IED裝置的報文時,再將相應(yīng)數(shù)據(jù)傳給虛擬機中運行的腳小程序進行處理,并由Lua根據(jù)數(shù)據(jù)處理結(jié)果來調(diào)用已注冊的C函數(shù)進行相關(guān)業(yè)務(wù)處理。


    本系統(tǒng)的程序流程如圖2所示。其中,串口通信芯片采用T1公司的帶64字節(jié)FIFO的4通道可編程UART芯片TL16C754B來實現(xiàn)。它的4個通道可分別獨立編程,在3.3 V的操作電壓下,數(shù)據(jù)傳輸速率可高達2 Mbps,適合多種UART通信環(huán)境中的應(yīng)用?;谘b置的應(yīng)用環(huán)境,本文采用RS485的問答機制并結(jié)合查詢方式來對該串口通信方案進行設(shè)計。在方案實現(xiàn)中,裝置將每隔一定時間通過串口芯片發(fā)送一次查詢報文,當(dāng)查詢到外圍沒備發(fā)送的正確響應(yīng)報文后,再進行相關(guān)業(yè)務(wù)處理。

3 功能實現(xiàn)
    在嵌入式應(yīng)用領(lǐng)域,串口通信的應(yīng)用比較成熟,因此,本文將著重介紹Lua是如何服務(wù)于這一應(yīng)用的。從圖2可以看出,Lua的使用主要體現(xiàn)在如下幾個方面:
    ◆Lua與C交互環(huán)境的建立;
    ◆提取腳本中的串口配置數(shù)據(jù);
    ◆調(diào)用Lua函數(shù)設(shè)置發(fā)送緩沖區(qū);
    ◆通過Lua函數(shù)處理接收緩沖區(qū)數(shù)據(jù)。
3.1 Lua與C交互環(huán)境的建立
    要建立交互環(huán)境,首先要啟動Lua腳本引擎,并創(chuàng)建虛擬機。其機制雖然相對復(fù)雜,但對應(yīng)用來說卻比較簡單,通過“L=lua_opcn(NUL L);”即可實現(xiàn)。其中,L是一個指向結(jié)構(gòu)類型為lua_State的指針變量,該結(jié)構(gòu)將負(fù)責(zé)對Lua的運行狀態(tài)進行維護。
    為了實現(xiàn)Lua腳本函數(shù)對系統(tǒng)程序中串口發(fā)送和接收緩存區(qū)的數(shù)據(jù)進行訪問,定義了幾個C函數(shù)供腳本調(diào)用,即用于設(shè)置串口發(fā)送緩沖區(qū)的函數(shù)set_tx_buf、讀取串口接收緩沖區(qū)的函數(shù)get_rx_buf,以及在Lua腳本中判斷串口數(shù)據(jù)交互正常時調(diào)用的結(jié)果處理函數(shù)uart_ok_del。
    在Lua腳本中,要成功調(diào)用以上函數(shù),必須將其加載到Lua虛擬機中去,本文采用Lua提供的一種注冊C函數(shù)庫的方法來實現(xiàn)。具體加載過程如下:
    ①按以下格式定義調(diào)用函數(shù):
    static int set tx buf(lua State *L);
    static int get rx_buf(lua State *L);
    static int uart_ok_del(lua State*L);
    ②聲明一個結(jié)構(gòu)數(shù)組,每個數(shù)組元素分別為C函數(shù)在Lua腳本中的淵用名字及對應(yīng)的C函數(shù),即以“namefunction”對的形式出現(xiàn),如下所示:
    static const struct luaL_reg uartLib[]={
    {“set_tx_buf”,set_tx_buf},
    {“get_tx_buf”,get_tx_buf),
    {“uart_ok_del”,uart_ok_de},
    {NULL,NULL}
    };
    ③調(diào)用以下函數(shù)對C函數(shù)庫進行注冊:
    luaL register(L.“ied”,uartLib);
    其中,參數(shù)L即為創(chuàng)建虛擬機時的函數(shù)返回值(以下同),字符串“ied”為注冊到虛擬機中的庫名稱。第3個參數(shù)uartLib即為前面聲明的結(jié)構(gòu)數(shù)組,對應(yīng)需要注冊的庫函數(shù)表。
    通過以上步驟,即可完成Lua腳本中需要調(diào)用的3個C函數(shù)的注冊過程,從而就可以在Lua腳本中通過“庫名稱,庫函數(shù)”的形式來對其進行調(diào)用,如“ied.set_tx_buf(函數(shù)參數(shù))”。
    腳本文件本身的加載則相對簡單,只需通過如下函數(shù)調(diào)用即可:
    luaL_dofile(L,“uart script.lua”);
    其中,參數(shù)L和以上的函數(shù)調(diào)用相同,第2個參數(shù)則為腳本文件在Flash中的具體存儲路徑。
    至此,就成功建立了一個Lua與C的交互環(huán)境。
3.2 提取腳本中的串口配置數(shù)據(jù)
    要正確地進行Lua和C的交互過程,首先必須對Lua和C交互時所采用虛擬棧的作用和操作有比較深入的了解。在Lua和C的交互中,它們彼此之間函數(shù)參數(shù)以及返回值都將由該棧來負(fù)責(zé)傳遞。Lua和C在棧的操作方式上稍有不同,在Lua中采用嚴(yán)格的LIFO方式,而C則還可以通過索引的方式進行。以3個參數(shù)為例,參數(shù)1首先入棧,參數(shù)2、3隨后順次入棧,Lua虛擬棧存儲結(jié)構(gòu)及索引對應(yīng)關(guān)系如圖3所示。


    如需在C中訪問參數(shù)1,則既可以通過索引號1進行,也可通過索引號-3進行。其中,正索引按入棧順序從1依次遞增,負(fù)索引按出棧順序從-1依次遞減。
    通常情況下,串口的配置主要有以下幾項:是否使能、數(shù)據(jù)位數(shù)、停止位數(shù)、奇偶校驗標(biāo)志位和波特率。因此,在Lua腳本中,本文采用Lua的表結(jié)構(gòu)對其進行設(shè)置,示例如下(本文中斜體代碼表示為Lua腳本,以下同):
   
    該例表示對UART芯片的P0 口進行使能,并且采用8位數(shù)據(jù)位、1位停止位、偶校驗(本文定義parityBit的值取0為無校驗,取1為奇校驗,取2為偶校驗)的幀格式,波特率為9 600 bps。
    在C語言中,要獲取表中enable屬性字段的值,可采用以下步驟:
    ①調(diào)用接口函數(shù)并以表名稱作為參數(shù),將該表入棧:
    lua_getglobal(L,“uart_p0”);
    ②調(diào)用接口函數(shù)將enable屬性字段的屬性名稱入棧:
    lua_pushstring(L,“enable”);
    ③調(diào)用接口函數(shù)提取屬性值,該操作在C中可看作是一個先出棧再入棧的過程,結(jié)果將在②中已入棧的屬性名稱所在位置填入屬性值:
    lua_gettable(L,-2);
    其中,參數(shù)“-2”為棧中的索引號。
    ④調(diào)用接口函數(shù)取出棧頂中該屬性字段的值,并調(diào)用出棧函數(shù),以恢復(fù)調(diào)用環(huán)境:
    p0_enable=(int)lua_tonumber(L,-1);
    lua_pop(L,1);
    其中,lua_tonumber函數(shù)的參數(shù)“-1”也為棧中的索引號,該操作將取出棧頂元素的數(shù)值,鑒于Lua中的數(shù)據(jù)都為浮點數(shù),所以需將其強制轉(zhuǎn)換為整型數(shù)據(jù)。lua_pop中參數(shù)“1”為非索引,僅說明從棧頂將1個元素出棧。


    通過以上操作,就可以正確地取出腳本中p0口參數(shù)沒置表中cnable屬性字段的值。其他屬性字段的提取與其相同。虛擬棧中的內(nèi)容變化如圖4所示。
3.3 調(diào)用Lua函數(shù)設(shè)置發(fā)送緩沖區(qū)
    為通過Lua腳本對串口發(fā)送緩沖區(qū)進行設(shè)置,在腳本中定義了如下函數(shù):
   
    從腳本內(nèi)容可以看出,在此采用了一個Lua中的循環(huán)結(jié)構(gòu)對發(fā)送緩沖區(qū)進行沒置,并返回設(shè)置的數(shù)據(jù)個數(shù)。其中,全局變量data是Lua腳本巾的表,類似于數(shù)組,在此表示需要設(shè)置的緩沖區(qū)內(nèi)容;ied.set_tx_buf()為在3.1節(jié)中提到的已注冊到虛擬機中的C函數(shù)庫中的一個函數(shù)。其參數(shù)port表示端口號,i-1表示緩沖區(qū)索引號,data[i]表示具體的數(shù)據(jù)內(nèi)容。在應(yīng)用中需要注意的是,在Lua中,數(shù)組索引默認(rèn)從1開始,而不像C中從0開始。另外,在C中定義set_tx_buf函數(shù)時并未設(shè)置參數(shù),這主要是因為參數(shù)的提取必須借助于虛擬棧才能實現(xiàn)。在腳本中調(diào)用時,對其參數(shù)將按照從左到右的順序依次入棧,在C中要取出參數(shù)時,按照其在棧中相應(yīng)的索引號取出即可。存Lua中對每個函數(shù)的調(diào)用都有一個獨立的棧,因此,若以i取2時調(diào)用情況為例,在C函數(shù)set_tx_buf中看到的棧內(nèi)容將如圖5所示。


    從而在C程序中,只需要調(diào)用下面語句即可將該串口發(fā)送緩沖區(qū)中索引為1的內(nèi)存區(qū)域沒置成0x22:
   
    當(dāng)在C程序中需對串口發(fā)送緩沖區(qū)進行設(shè)置時,將按如下方法調(diào)用該腳本函數(shù):
    lua_getglobal(L,“uart_p0_set_txBuf”);
    lua pcall(L,0.1,0);
    其中,函數(shù)lua_getglobal的參數(shù)“uart_p0_set_txBuf”為要調(diào)用的腳本函數(shù)名,函數(shù)lua_pcall的函數(shù)原型為:
   
    因所調(diào)用的腳本函數(shù)uart_p0_set_txBuf沒有參數(shù),有一個返回值,所以分別將nargs、nresults置為0、1,而錯誤處理函數(shù)暫不使用,故置為0。
    對于腳本中的返回值,將在腳本函數(shù)調(diào)用結(jié)束時,置于lua_pcall調(diào)用環(huán)境所在的虛擬棧的棧頂中,可由C程序根據(jù)索引取出。
    經(jīng)以上過程,就完成了對串口發(fā)送緩沖區(qū)的內(nèi)容設(shè)置,然后就可以通過串口芯片的驅(qū)動程序?qū)⑵浒l(fā)送到外圍設(shè)備。
    在現(xiàn)場應(yīng)用時,只需根據(jù)不同外圍設(shè)備問詢報文的要求來修改腳本中data數(shù)組以及p0_send_num變量的內(nèi)容即可,而不用對裝置的C程序進行任何修改。
3.4 通過Lua函數(shù)處理接收緩沖區(qū)數(shù)據(jù)
    通過Lua和C的交互來對串口接收緩沖區(qū)數(shù)據(jù)的處理方法同發(fā)送緩沖區(qū)的處理基本相似。
    當(dāng)裝置通過串口驅(qū)動程序?qū)⑼鈬O(shè)備發(fā)來的數(shù)據(jù)置入接收緩沖區(qū)后,在C函數(shù)中調(diào)用腳本函數(shù):
    lua_getglobal(L,“uart p0_del_rxBuf”);
    lua pushnumber(L,size);
    ret=lua_pcall(L,1.1,0);
    其中,參數(shù)uart_p0_del_rxBuf為腳本中定義的緩沖區(qū)數(shù)據(jù)處理函數(shù)名,通過lua_pushnumber將接收數(shù)據(jù)的大小入棧,從而傳給Lua腳本函數(shù),腳本函數(shù)的原型如下:
    function uart_p0_del_rxBuf(rx_size)
    在該函數(shù)中,可通過調(diào)用注冊的C函數(shù)get_rx_buf來獲取接收緩沖區(qū)中的內(nèi)容:
    data[i]=ied.get_rx_buf(port,index)
    其中,data為腳本中類似于數(shù)組的表類型。port為串口芯片的端口號,index為緩沖區(qū)的索引號,在C程序中通過以下語句對腳本返回所取數(shù)據(jù)值:
   
    可以看出,在腳本中也是借助于虛擬棧來獲取C程序的返回值。通過以上方法成功獲取了串口接收緩存區(qū)的內(nèi)容后,就可根據(jù)具體的外圍設(shè)備在腳本中對其接收數(shù)據(jù)的正確性進行判斷,如果判斷結(jié)果正確,則調(diào)用前面注冊的C函數(shù)uart_ok_del進行相關(guān)業(yè)務(wù)處理。
    ied.uart_ok_del(port)

結(jié)語
    從本文提供的方案可以看出,從始至終,IED裝置的C語言應(yīng)用程序在lua虛擬機與外圍設(shè)備之間,除了報文的透明傳輸功能外,并不負(fù)責(zé)具體數(shù)據(jù)業(yè)務(wù)的處理,這就使在C程序的設(shè)計中完全不需要考慮外圍設(shè)備所采用的串口通信數(shù)據(jù)格式,具體的數(shù)據(jù)內(nèi)容都可放在腳本文件中進行沒置和處理。在現(xiàn)場應(yīng)用中,就可以達到僅修改Lua腳本文件就能完成IED裝置與不同的串口通信外圍設(shè)備之間的數(shù)據(jù)交互功能,從而實現(xiàn)對裝置串口通信規(guī)約的現(xiàn)場可配置化。

本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫毥谦F公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術(shù)解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關(guān)鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運行,同時企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險,如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機 衛(wèi)星通信

要點: 有效應(yīng)對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實提質(zhì)增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競爭力 堅持高質(zhì)量發(fā)展策略,塑強核心競爭優(yōu)勢...

關(guān)鍵字: 通信 BSP 電信運營商 數(shù)字經(jīng)濟

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術(shù)學(xué)會聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(shù)(集團)股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉