廉永樂+王明
摘要:串口通訊是工業設備組網的主要通訊接口,ModBus協議作為一種全球通用的工業標準,是不同設備組成工業網絡的總線協議。本文采用VC++開發平臺,設計開發基于ModBus協議的串口通訊軟件,以實現不同設備的組網和遠程監視控制。
關鍵詞:串口傳輸;Modbus協議;MSComm控件;ModSim32軟件
中圖分類號:TP273 文獻標識碼:A 文章編號:1007-9416(2017)09-0158-03
串行通訊的距離從幾米到幾千米,傳輸線最少時只需一根即可實現通信,比較適合遠距離通訊傳輸,在工業控制、測量設備以及遠程監控中串行通訊廣泛使用。Microsoft Visual C++作為微軟公司面向對象程序的開發平臺,具有集成的開發環境,支持C、C++等編程語言。ModBus協議在OSI七層參考模型中作為應用層協議,是全球最早應用于工業現場的總線協議。目前,ModBus協議已經成為一種通用工業標準,不同設備通過ModBus協議可以組成工業網絡,實現集中監控。本設計針對VC++開發平臺設計并實現了基于ModBus協議的串口通訊軟件。
1 串口通信原理
1.1 串行通信的特點
串口通信的特點是數據流在通訊傳輸線上逐位按順序分時進行傳輸,每次通信雙方傳輸一個數據位,也就是一個二進制數0或1,以最小單位二進制數0或1逐位進行傳輸。串口通信分為三種傳輸模式,分別是全雙工、半雙工和單工,具體劃分是按照數據流的方向劃分,數據通常是在通信雙方的二個站點之間點對點進行傳輸[1]。
1.2 串行通信的接口標準
一個完整的的串行通信系統如圖1所示,該系統包括數據終端設備(Data Terminal Equipment ,DTE)和數據通信設備(Data Communication Equipment,DCE)。
串行接口標準定義了DTE的串行接口電路與DCE之間的連接標準,包括連接電纜、接口幾何尺寸、引腳功能和電平定義等,在計算機網絡中,構成網絡的物理層協議。
1.3 串行傳輸協議
通訊協議是一種對通訊雙方之間進行通訊交流規則的約定。協議中規定了雙方進行通訊的數據格式、傳送速度、控制字符、同步方式、檢錯方式及傳送步驟。通訊協議屬于OSI七層參考模型中的數據鏈路層[2]。串口通訊按照同步方法的不同分為異步傳輸和同步傳輸。
1.4 Modbus通信協議
按照OSI七層參考模型,Modbus通訊協議屬于應用層協議,是一種全球通用的工業標準。標準Modbus通訊,具有兩種通信模式分別是Modbus RTU和Modbus ASCII模式。無論是RTU模式還是ASCII模式,Modbus信息以幀的方式傳輸,每幀有確定的起始點和結束點,使接收設備在信息的起點開始讀地址,并確定要尋址的設備 (廣播時對全部設備),以及信息傳輸的結束時間[3]。
2 通信軟件設計與實現
本文基于VC++軟件開發設計串口通信傳輸的上位機軟件,歸納了實現串口通信傳輸的三大模塊,分別是通信串口初始化、通信參數初始化以及串口數據接收處理流程,并概括總結了實現串口通訊編程的步驟和流程。
2.1 串口初始化
上位機與從機終端監控采集儀表通過串口實現通訊,首先通訊軟件需要對上位機串口進行初始化,串口初始化內容包括設置實施通訊傳輸的上位機端口號,設置通訊參數如數據位、波特率、停止位和校驗位,收發數據類型,串口打開等操作。執行串口初始化的流程圖如圖2所示。
2.2 基于特定通訊協議通訊參數初始化
不同設備實現通訊,雙方需要遵循一定的通信準則,要實現不同設備之間的串口通訊傳輸就必須規定通訊雙方使用相同的通訊協議。上位機軟件若要實現主從設備之間的串口通訊需要對雙方所采用的通訊參數進行初始化操作,本設計以Modbus RTU協議為例介紹如何通過編程實現串口通訊協議的初始化操作,流程圖如圖3所示。
2.3 基于串口事件的接收數據處理
上位機軟件采用控件編程實現串口通訊時,如何從串口接收緩沖區準確接收從機發送來的數據是串口通訊軟件的核心部分。采用控件從串口接收數據是通過觸發事件執行函數讀緩沖區數據,完成串口數據的接收。事件觸發的條件是屬性的值變化,無論何時屬性值發生變化就會觸發事件。串口通訊傳輸過程中當接收緩沖區接收到數據時,屬性的值被置為2,并觸發事件。
上位機軟件采用控件通訊,處理輸入緩沖區和輸出緩沖區的數據是軟件編程的一個難點。串口通訊過程中讀取輸入緩沖區數據和軟件寫入輸出緩沖區的數據都是類型,上位機軟件通訊使用的數據包括多種類型有二進制數值、文本型字符串,正確處理類型數據與二進制數據、字符串數據轉換是上位機軟件能否實現正常串口通訊的關鍵(圖4)。
以上位機軟件采用控件接收二進制數據為事例,讀取含有二進制數據的接收緩沖區數據的程序代碼如下:
VARIANT variant_var;
Longn,lens=0;
COleSafeArray safearray_var;//構造一個任何類型的空數組.
BYTE rxdata[1024];
variant_inp=m_port.GetInput(); //讀取接收緩沖區 數據
safearray_var=variant_var;//將VARIANT類型變量轉換為ColeSafeArray類型變量
lens=safearray_var.GetOneDimSize(); //獲取接收到的字符數
for (n=0;n {
safearray_var.GetElement(&n,rxdata+n);//將COleSafeArray數組中第n個元素賦予BYTE數組中第n個元素
BYTE bt=*(char *)(rxdata+n);//字節數組元素轉換字符型
}
以上詳細介紹了基于VC++開發平臺實現協議串口通訊編程的主要功能模塊和編程流程。
3 軟件調試及數據分析
本文采用虛擬軟件模擬測試和硬件調試兩種方法,對串口通信軟件進行功能調試和數據分析。
3.1 虛擬軟件模擬測試
虛擬軟件模擬測試分為三部分,分別是終端智能監控儀表、通信傳輸端口和上位機軟件;其中,終端采集監控儀表采用軟件模擬實現,通信端口采用軟件虛擬,上位機軟件基于VC++開發平臺編程實現。
搭建虛擬軟件測試平臺,第一步,打開上位機上的虛擬串口軟件,虛擬兩個串口、,將兩個虛擬串口模擬連接。第二步,啟動從機模擬軟件,初始化從機設備屬性,包括從機設備地址、串口通信參數、寄存器功能代碼、寄存器地址和添加從機各寄存器儲存數據,并打開串口。第三步,運行上位機通信軟件,保持上位機串口通訊參數初始化與模擬軟件一致。
在上位機軟件與從機模擬軟件通訊傳輸中,通過虛擬串口可以實時監測和端口收發數據流量。
3.2 硬件搭建調試
硬件聯調測試首先需要搭建硬件環境,由于監控終端采集儀表端口為RS485串口,上位機含有RJ45網口和RS232串口,沒有RS485串口。本設計通過USR-N540串口服務器將RS485串口信號轉換為網口信號,經過交換機接入以太網。上位機通過RJ45網口接入以太網訪問串口服務器IP地址實現與串口服務器通訊,以實現上位機與終端采集儀表通信。
3.3 軟件調試中存在的問題及解決方案
上位機軟件調試中出現部分采集數據為亂碼,通過對軟件的逐條測試發現,由于上位機軟件串口通信采用基于事件驅動,并且程序中控件的屬性值設置為1,所以通信端口接收緩沖區數據多于或等于1個字符時便引發一個接收數據事件。實際串口通訊傳輸時采集終端發送的數據較多,每次傳輸并未完全傳輸結束就觸發了接收數據事件,使得上位機軟件采集到的數據出現亂碼。
本文通過在上位機軟件的接收程序前加入延時函數,觸發事件后延時100ms再讀取接收緩沖數據,保證所有數據傳輸完畢,延時函數的加入解決了上位機軟件通信中出現的亂碼問題。
4 結語
本文在設計實現基于VC++開發平臺的串口通信傳輸軟件的基礎上,對編程開發串口通訊軟件歸納凝練了三大模塊,分別是串口初始化模塊、基于通訊協議的通訊參數初始化模塊和基于串口事件的接收數據處理模塊,并介紹了串口通訊編程的流程和步驟。采用ModSim32軟件模擬從機設備搭建虛擬軟件測試平臺既節約了軟件開發成本,又提高了軟件開發效率和軟件代碼質量,減少了軟件運行中的bug。硬件連接調試進一步優化了上位機軟件在實際運行環境中存在的干擾等問題。
參考文獻
[1]王秀彪.淺談基于半雙工通信系統的通信控制協議設計[J].民營科技,2010,(09):36-37.
[2]許永康.RS-232轉RS-485網絡的通信[J].微計算機信息,2007,23(10):228-229.
[3]闞能琪.VC++串口通信中多線程技術的應用研究[J].西華大學學報(自然科學版), 2005,24(04):84-85.endprint