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