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