基于LabWindows/CVI的Modbus通信實(shí)現
虛擬儀器(Virtual Instruments)是80年代末出現的概念,即在通用硬件平臺上通過(guò)更改軟件功能,設計出不同功能的測試儀器,能大幅縮短研發(fā)周期,降低成本。NI公司的LabWindows/CVI具有強大的圖形界面設計功能,以ANSIC為核心,提供了豐富的庫函數與儀器驅動(dòng)。
本文引用地址:http://dyxdggzs.com/article/201610/306200.htmModbus是由MODICON公司于1978年提出并倡導的一種協(xié)議,其應用領(lǐng)域包括生產(chǎn)過(guò)程自動(dòng)化、過(guò)程控制和樓宇自動(dòng)化。目前主要通過(guò)以太網(wǎng)上的TCP/IP、Modbus令牌傳遞網(wǎng)絡(luò )以及各種介質(zhì)上的異步串行傳輸來(lái)實(shí)現。
文中以自動(dòng)卷煙機械控制系統為例,自動(dòng)卷煙控制系統完成卷煙動(dòng)作需要多個(gè)設備協(xié)同動(dòng)作完成,該系統可視為一個(gè)過(guò)程控制系統,需要對各設備的工作狀態(tài)進(jìn)行實(shí)時(shí)監控并要求能實(shí)時(shí)響應用戶(hù)的操作。采用Modbus協(xié)議通信的方式,以上位機作為通信主站,將遵循完成對從站的動(dòng)作控制。然而對于較為復雜的Modbus通訊協(xié)議的各設備作為子站完成組網(wǎng),可方便地以通信的方式與從站完成信息交互并過(guò)程控制系統,常規的組態(tài)軟件難以消除實(shí)時(shí)通信與界面響應之間的沖突,采用LabWindows/CVI實(shí)現Modbus協(xié)議,可充分利用多線(xiàn)程編程技術(shù)解決此問(wèn)題,從而避免產(chǎn)生沖突時(shí)造成控制系統的故障。
1 Modbus協(xié)議描述
1.1 Modbus幀描述
Modbus協(xié)議是一種應用層報文傳輸協(xié)議,是一種請求/應答協(xié)議,依照功能碼定義提供相應的服務(wù),協(xié)議定義了一個(gè)與通信層無(wú)關(guān)的通用信息幀,幀格式如圖1所示,首先由主站依據相應的請求消息格式建立發(fā)送幀發(fā)起通訊,從站接收主站請求信息后作出響應,一個(gè)請求/響應周期如圖2所示,包含了1個(gè)主站請求幀與從站回復幀。Modbus協(xié)議有3種不同的通信類(lèi)型,分別是主站請求通信,由主站發(fā)起;從站正常響應,對主站的請求作出處理后無(wú)差錯的回復幀;異常響應,從站發(fā)生異常情況后對主站請求的異?;貜?。

1.2 Modbus傳輸模式
Modbus協(xié)議定義了兩種串行傳輸模式,分別是ASCII模式和RTU模式。兩種模式使用不同的方法對幀起始和傳輸做出定義。在同樣的波特率下,相比于A(yíng)SCII模式,RTU模式具有更高的吞吐率,故工業(yè)現場(chǎng)控制的智能儀器儀表大多選用RTU模式。同樣,自動(dòng)卷煙機Modbus網(wǎng)絡(luò )傳輸使用的是RTU模式。RTU模式以傳輸相鄰字符的間隔時(shí)間作為報文起始和結束標志,兩報文間必須有大于發(fā)送3.5個(gè)字符的時(shí)間,同一個(gè)報文傳輸中,相鄰字符之間間隔必須小于發(fā)送1.5個(gè)字符的時(shí)間。實(shí)際應用中,需要根據網(wǎng)絡(luò )采用的波特率來(lái)確定標識幀起始和結束時(shí)間,以波特率9 600 bit·s-1為例,1個(gè)字符用8 Byte表示,則發(fā)送1個(gè)字符的時(shí)間為ts=8/9 600≈0.83 ms。1.5個(gè)字符對應的時(shí)間約為1.25 ms,3.5個(gè)字符對應的時(shí)問(wèn)為3 ms,計算出的時(shí)間作為幀起始與結束的依據。
2 多線(xiàn)程技術(shù)的應用
LabWindows/CVI采用事件驅動(dòng)與回調函數的編程方式,對于傳統的順序過(guò)程控制,無(wú)需使用多線(xiàn)程。當系統任務(wù)實(shí)時(shí)性要求較高時(shí),CPU如果一直執行實(shí)時(shí)性任務(wù),則不能響應界面的其它事件。引入多線(xiàn)程技術(shù)可以較好地解決這個(gè)問(wèn)題,操作系統中,線(xiàn)程是進(jìn)程的一個(gè)執行單元,是可以由系統調度的最簡(jiǎn)單的代碼單元。對于單核系統,多線(xiàn)程技術(shù)充分應用了CPU的空閑時(shí)間片,利用空閑時(shí)間片在主線(xiàn)程與次線(xiàn)程之間進(jìn)行切換,由于系統切換速度快,所以?xún)蓚€(gè)程序可視為同時(shí)運行。
多線(xiàn)程技術(shù)主要是線(xiàn)程池技術(shù)與異步定時(shí)器,線(xiàn)程池技術(shù)利用線(xiàn)程池對多個(gè)線(xiàn)程進(jìn)行分配,適用于不定時(shí)事件。異步定時(shí)器使用的是Windows多媒體定時(shí)器,適用于定時(shí)循環(huán)事件,當有多個(gè)異步事件執行時(shí),優(yōu)先采用線(xiàn)程池技術(shù)。
3 Modbus協(xié)議實(shí)現
3.1 網(wǎng)絡(luò )拓撲結構
自動(dòng)卷煙控制系統包含5個(gè)站點(diǎn),上位機作為主站點(diǎn),4個(gè)從站對應4個(gè)執行機構,其網(wǎng)絡(luò )拓撲如圖3所示,主站需要實(shí)現的功能主要有3個(gè)方面:(1)輪詢(xún)功能。實(shí)時(shí)查詢(xún)子站的轉速信息,位置信息以及極限位置信息。(2)獨立控制功能。單獨控制從站執行機構動(dòng)作,例如啟動(dòng),停止。(3)參數刷新功能。刷新參數信息,如轉速,運動(dòng)位置等。

3.2 線(xiàn)程分配
輪詢(xún)功能及參數刷新功能在系統運行過(guò)程中持續執行,如果在主線(xiàn)程中完成,會(huì )使CPU一直處于忙狀態(tài),無(wú)法響應界面對從站的單獨操作,造成界面響應與實(shí)時(shí)性任務(wù)存在沖突。解決辦法是開(kāi)辟新的線(xiàn)程,將輪詢(xún)功能以及參數刷新功能放到次線(xiàn)程中完成,這樣既能保證系統能及時(shí)響應,又保證實(shí)時(shí)任務(wù)順利執行。程序初始化時(shí),新建線(xiàn)程池,調用線(xiàn)程池分配函數CmtScheduleThreadPoolFunetionAdv()新建輪詢(xún)線(xiàn)程PollThread(),發(fā)送線(xiàn)程SendRTUThread()以及接收線(xiàn)程ReceiveRTUThread()。輪詢(xún)線(xiàn)程實(shí)現輪詢(xún)功能,通過(guò)通訊操作獲取從站的實(shí)時(shí)信息,發(fā)送線(xiàn)程和接收線(xiàn)程針對用戶(hù)的界面操作,分別完成從站的獨立控制功能。
3.3 Modbus協(xié)議實(shí)現
3.3.1 線(xiàn)程安全變量定義
通信過(guò)程中,多個(gè)線(xiàn)程訪(fǎng)問(wèn)的全局變量有兩種,分別是發(fā)送和接收信息幀。各從站的速度和位置等信息,由于變量較多且類(lèi)型不一,如果全部定義線(xiàn)程安全變量,可能會(huì )造成線(xiàn)程發(fā)生阻塞,故將集中訪(fǎng)問(wèn)的變量定義為結構體變量,再調用DefineThreadSafeVar。(VarType,VarName)將結構體變量聲明為線(xiàn)程安全變量。每次訪(fǎng)問(wèn)這些變量之前,都需要調用函數GetPointerToVarName(void)獲取對應線(xiàn)程安全變量的指針,訪(fǎng)問(wèn)完后,調用ReleasePointerVarName(void)函數及時(shí)釋放指針。
主程序中定義了Modhus RTU幀的結構類(lèi)型,如下
typedef struct
{
int ByteLength;//幀內字節數
unsigned char message[256];//幀信息數組
}Message;
幀變量用來(lái)存放發(fā)送幀或是接收幀的全部信息,針對每個(gè)從站定義了結構變量類(lèi)型,表征從站的特征信息,如下
typedef struct
{
int velocity;//速度信息
int codevalue;//編碼器信息
int startplace;//起始位置
int endplace;//終止位置
int slavestate;//子站在線(xiàn)狀態(tài)
int errorstate;//子站錯誤狀態(tài),用于異常響應
}Slave;
3.3.2 應用層協(xié)議實(shí)現
輪詢(xún)線(xiàn)程周期性地查詢(xún)各個(gè)子站,發(fā)送線(xiàn)程完成主站對從站的單獨控制功能并及時(shí)響應界面事件。其次,新建一個(gè)異步定時(shí)器,完成參數的定時(shí)刷新。為保證界面響應的實(shí)時(shí)性,對3個(gè)線(xiàn)程的優(yōu)先級進(jìn)行規定,優(yōu)先級從高到低為發(fā)送線(xiàn)程,接收線(xiàn)程,輪詢(xún)線(xiàn)程,異步定時(shí)器。

每個(gè)線(xiàn)程都需完成主站與從站之間的通信,將Modbus主站的一次通信分解為3個(gè)流程,分別是發(fā)送,接收和幀解析,完成3個(gè)流程則表明主站與從站完成了一次完整的通信。定義發(fā)送函數SendMessage()、接收函數ReceiveMessage()與幀分析FrameAnalyze()完成上述流程,以方便各個(gè)線(xiàn)程調用,程序流程圖如圖4所示,發(fā)送程序內的幀間字符延時(shí)通過(guò)函數SyncWait()實(shí)現,要求>3.5個(gè)字符時(shí)間。



每個(gè)線(xiàn)程都為主程序預留了標志位,主線(xiàn)程通過(guò)置位while循環(huán)標志位來(lái)完成對線(xiàn)程的控制。輪詢(xún)線(xiàn)程在程序運行過(guò)程中循環(huán)執行,并且由異步定時(shí)器實(shí)時(shí)獲取最新的參數信息實(shí)時(shí)刷新界面;發(fā)送線(xiàn)程完成主站請求功能,接收線(xiàn)程獲取從站的響應信息,解析從站接收是否正常并做出規定動(dòng)作。發(fā)送和接收線(xiàn)程僅在響應界面事件時(shí)執行一次。
串口作為公共硬件資源,存在多個(gè)線(xiàn)程占用的問(wèn)題,LabWindows/CVI為訪(fǎng)問(wèn)串口提供了一系列的接口訪(fǎng)問(wèn)函數。為避免各線(xiàn)程造成訪(fǎng)問(wèn)沖突,采用類(lèi)似線(xiàn)程鎖的機制來(lái)處理,將串口視為一個(gè)全局變量,為每個(gè)串口分配一個(gè)線(xiàn)程鎖對象,任何時(shí)候訪(fǎng)問(wèn)串口之前都必須獲取線(xiàn)程鎖,訪(fǎng)問(wèn)完畢之后及時(shí)釋放。
4 實(shí)驗驗證
軟件運行界面圖5所示。卷煙控制系統對完成空煙管填充的要求為卷煙時(shí)間1.5 min,成煙重量為6.500±0.010 g。點(diǎn)擊開(kāi)始操作之后系統自動(dòng)運行完成卷煙動(dòng)作,在系統運行過(guò)程中,需不斷發(fā)送查詢(xún)指令輪詢(xún)各從站轉速及位置信息,由異步定時(shí)器進(jìn)行刷新,每個(gè)從站都能單獨控制啟動(dòng)、停止和復位功能,卷煙過(guò)程中不會(huì )發(fā)生死鎖現象。以10支空煙管為例,記錄完成每支煙管卷煙完成的時(shí)間以及重量,試驗結果如表1所示。

5 結束語(yǔ)
利用LabWindows/CVI實(shí)現Modbus通信,充分發(fā)揮了虛擬儀器開(kāi)發(fā)的便捷功能,完成了實(shí)時(shí)性控制工作。相比于使用組態(tài)王等軟件,其功能更為豐富,并且可以充分利用多線(xiàn)程技術(shù),合理分配多個(gè)實(shí)時(shí)性任務(wù),保證多個(gè)并發(fā)任務(wù)順利執行。
評論