新聞中心

        EEPW首頁 > 設計應用 > 基于LabWindows/CVI的Modbus通信實現

        基于LabWindows/CVI的Modbus通信實現

        作者: 時間:2016-10-10 來源:網絡 收藏

        虛擬儀器(Virtual Instruments)是80年代末出現的概念,即在通用硬件平臺上通過更改軟件功能,設計出不同功能的測試儀器,能大幅縮短研發周期,降低成本。NI公司的LabWindows/CVI具有強大的圖形界面設計功能,以ANSIC為核心,提供了豐富的庫函數與儀器驅動。

        本文引用地址:http://www.104case.com/article/201610/306200.htm

        Modbus是由MODICON公司于1978年提出并倡導的一種協議,其應用領域包括生產過程自動化、過程控制和樓宇自動化。目前主要通過以太網上的TCP/IP、Modbus令牌傳遞網絡以及各種介質上的異步串行傳輸來實現。

        文中以自動卷煙機械控制系統為例,自動卷煙控制系統完成卷煙動作需要多個設備協同動作完成,該系統可視為一個過程控制系統,需要對各設備的工作狀態進行實時監控并要求能實時響應用戶的操作。采用Modbus協議通信的方式,以上位機作為通信主站,將遵循完成對從站的動作控制。然而對于較為復雜的Modbus通訊協議的各設備作為子站完成組網,可方便地以通信的方式與從站完成信息交互并過程控制系統,常規的組態軟件難以消除實時通信與界面響應之間的沖突,采用LabWindows/CVI實現Modbus協議,可充分利用編程技術解決此問題,從而避免產生沖突時造成控制系統的故障。

        1 Modbus協議描述

        1.1 Modbus幀描述

        Modbus協議是一種應用層報文傳輸協議,是一種請求/應答協議,依照功能碼定義提供相應的服務,協議定義了一個與通信層無關的通用信息幀,幀格式如圖1所示,首先由主站依據相應的請求消息格式建立發送幀發起通訊,從站接收主站請求信息后作出響應,一個請求/響應周期如圖2所示,包含了1個主站請求幀與從站回復幀。Modbus協議有3種不同的通信類型,分別是主站請求通信,由主站發起;從站正常響應,對主站的請求作出處理后無差錯的回復幀;異常響應,從站發生異常情況后對主站請求的異常回復。

        基于LabWindows/CVI的Modbus通信實現

        1.2 Modbus傳輸模式

        Modbus協議定義了兩種串行傳輸模式,分別是ASCII模式和RTU模式。兩種模式使用不同的方法對幀起始和傳輸做出定義。在同樣的波特率下,相比于ASCII模式,RTU模式具有更高的吞吐率,故工業現場控制的智能儀器儀表大多選用RTU模式。同樣,自動卷煙機Modbus網絡傳輸使用的是RTU模式。RTU模式以傳輸相鄰字符的間隔時間作為報文起始和結束標志,兩報文間必須有大于發送3.5個字符的時間,同一個報文傳輸中,相鄰字符之間間隔必須小于發送1.5個字符的時間。實際應用中,需要根據網絡采用的波特率來確定標識幀起始和結束時間,以波特率9 600 bit·s-1為例,1個字符用8 Byte表示,則發送1個字符的時間為ts=8/9 600≈0.83 ms。1.5個字符對應的時間約為1.25 ms,3.5個字符對應的時問為3 ms,計算出的時間作為幀起始與結束的依據。

        2 技術的應用

        LabWindows/CVI采用事件驅動與回調函數的編程方式,對于傳統的順序過程控制,無需使用。當系統任務實時性要求較高時,CPU如果一直執行實時性任務,則不能響應界面的其它事件。引入多線程技術可以較好地解決這個問題,操作系統中,線程是進程的一個執行單元,是可以由系統調度的最簡單的代碼單元。對于單核系統,多線程技術充分應用了CPU的空閑時間片,利用空閑時間片在主線程與次線程之間進行切換,由于系統切換速度快,所以兩個程序可視為同時運行。

        多線程技術主要是線程池技術與異步定時器,線程池技術利用線程池對多個線程進行分配,適用于不定時事件。異步定時器使用的是Windows多媒體定時器,適用于定時循環事件,當有多個異步事件執行時,優先采用線程池技術。

        3 Modbus協議實現

        3.1 網絡拓撲結構

        自動卷煙控制系統包含5個站點,上位機作為主站點,4個從站對應4個執行機構,其網絡拓撲如圖3所示,主站需要實現的功能主要有3個方面:(1)輪詢功能。實時查詢子站的轉速信息,位置信息以及極限位置信息。(2)獨立控制功能。單獨控制從站執行機構動作,例如啟動,停止。(3)參數刷新功能。刷新參數信息,如轉速,運動位置等。

        基于LabWindows/CVI的Modbus通信實現

        3.2 線程分配

        輪詢功能及參數刷新功能在系統運行過程中持續執行,如果在主線程中完成,會使CPU一直處于忙狀態,無法響應界面對從站的單獨操作,造成界面響應與實時性任務存在沖突。解決辦法是開辟新的線程,將輪詢功能以及參數刷新功能放到次線程中完成,這樣既能保證系統能及時響應,又保證實時任務順利執行。程序初始化時,新建線程池,調用線程池分配函數CmtScheduleThreadPoolFunetionAdv()新建輪詢線程PollThread(),發送線程SendRTUThread()以及接收線程ReceiveRTUThread()。輪詢線程實現輪詢功能,通過通訊操作獲取從站的實時信息,發送線程和接收線程針對用戶的界面操作,分別完成從站的獨立控制功能。

        3.3 Modbus協議實現

        3.3.1 線程安全變量定義

        通信過程中,多個線程訪問的全局變量有兩種,分別是發送和接收信息幀。各從站的速度和位置等信息,由于變量較多且類型不一,如果全部定義線程安全變量,可能會造成線程發生阻塞,故將集中訪問的變量定義為結構體變量,再調用DefineThreadSafeVar。(VarType,VarName)將結構體變量聲明為線程安全變量。每次訪問這些變量之前,都需要調用函數GetPointerToVarName(void)獲取對應線程安全變量的指針,訪問完后,調用ReleasePointerVarName(void)函數及時釋放指針。

        主程序中定義了Modhus RTU幀的結構類型,如下

        typedef struct

        {

        int ByteLength;//幀內字節數

        unsigned char message[256];//幀信息數組

        }Message;

        幀變量用來存放發送幀或是接收幀的全部信息,針對每個從站定義了結構變量類型,表征從站的特征信息,如下

        typedef struct

        {

        int velocity;//速度信息

        int codevalue;//編碼器信息

        int startplace;//起始位置

        int endplace;//終止位置

        int slavestate;//子站在線狀態

        int errorstate;//子站錯誤狀態,用于異常響應

        }Slave;

        3.3.2 應用層協議實現

        輪詢線程周期性地查詢各個子站,發送線程完成主站對從站的單獨控制功能并及時響應界面事件。其次,新建一個異步定時器,完成參數的定時刷新。為保證界面響應的實時性,對3個線程的優先級進行規定,優先級從高到低為發送線程,接收線程,輪詢線程,異步定時器。

        基于LabWindows/CVI的Modbus通信實現

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

        基于LabWindows/CVI的Modbus通信實現
        基于LabWindows/CVI的Modbus通信實現
        基于LabWindows/CVI的Modbus通信實現

        每個線程都為主程序預留了標志位,主線程通過置位while循環標志位來完成對線程的控制。輪詢線程在程序運行過程中循環執行,并且由異步定時器實時獲取最新的參數信息實時刷新界面;發送線程完成主站請求功能,接收線程獲取從站的響應信息,解析從站接收是否正常并做出規定動作。發送和接收線程僅在響應界面事件時執行一次。

        串口作為公共硬件資源,存在多個線程占用的問題,LabWindows/CVI為訪問串口提供了一系列的接口訪問函數。為避免各線程造成訪問沖突,采用類似線程鎖的機制來處理,將串口視為一個全局變量,為每個串口分配一個線程鎖對象,任何時候訪問串口之前都必須獲取線程鎖,訪問完畢之后及時釋放。

        4 實驗驗證

        軟件運行界面圖5所示。卷煙控制系統對完成空煙管填充的要求為卷煙時間1.5 min,成煙重量為6.500±0.010 g。點擊開始操作之后系統自動運行完成卷煙動作,在系統運行過程中,需不斷發送查詢指令輪詢各從站轉速及位置信息,由異步定時器進行刷新,每個從站都能單獨控制啟動、停止和復位功能,卷煙過程中不會發生死鎖現象。以10支空煙管為例,記錄完成每支煙管卷煙完成的時間以及重量,試驗結果如表1所示。

        基于LabWindows/CVI的Modbus通信實現

        5 結束語

        利用LabWindows/CVI實現Modbus通信,充分發揮了虛擬儀器開發的便捷功能,完成了實時性控制工作。相比于使用組態王等軟件,其功能更為豐富,并且可以充分利用多線程技術,合理分配多個實時性任務,保證多個并發任務順利執行。



        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 绵阳市| 佛学| 建湖县| 垣曲县| 达孜县| 渑池县| 花莲市| 龙口市| 镇坪县| 军事| 安义县| 三原县| 呼和浩特市| 黄陵县| 类乌齐县| 广河县| 长武县| 扶绥县| 封丘县| 广丰县| 大连市| 噶尔县| 丹棱县| 扶沟县| 特克斯县| 中卫市| 会昌县| 顺义区| 许昌县| 大厂| 神池县| 济南市| 仙桃市| 通渭县| 承德县| 华安县| 铅山县| 潢川县| 微山县| 南澳县| 崇州市|