鄭 軼,楊明超
(武漢船用電力推進(jìn)裝置研究所,武漢 430064)
隨著艦船設(shè)備的不斷更新?lián)Q代,對(duì)艦船的操作與控制也在逐步向集中式的方向靠攏。艇員依靠集中控制室的計(jì)算機(jī)便可觀測(cè)艦船各設(shè)備的狀態(tài),并可通過(guò)計(jì)算機(jī)向各設(shè)備發(fā)送指令。艦船設(shè)備的狀態(tài)參數(shù)的獲取與指令的發(fā)送,需要船用通信系統(tǒng)的良好支持。目前應(yīng)用于艦船的通信方式主要包括CAN通信及以太網(wǎng)通信,其中,以太網(wǎng)通信速率較快,數(shù)據(jù)傳輸穩(wěn)定,不易受到外部干擾,適合大量數(shù)據(jù)參數(shù)的循環(huán)上傳。
MODBUS協(xié)議由Modicon在1979年發(fā)明,是OSI模型第7層上的應(yīng)用層報(bào)文傳輸協(xié)議,它定義了一個(gè)與基礎(chǔ)通信層無(wú)關(guān)的協(xié)議數(shù)據(jù)單元(PDU),即PDU=MODBUS功能碼+數(shù)據(jù)域。在某些特定總線或網(wǎng)絡(luò)上,MODBUS協(xié)議能夠映射在應(yīng)用數(shù)據(jù)單元(ADU)上,即ADU=地址域+PDU+校驗(yàn)碼,其通用幀格式如圖1所示。
圖1 MODBUS通用幀格式
目前MODBUS協(xié)議主要應(yīng)用于以太網(wǎng)通信(MODBUS TCP)、串口通信(MODBUS RTU)及高速令牌傳遞網(wǎng)絡(luò)(MODBUS PLUS)。在不同類別的網(wǎng)絡(luò)中,對(duì)ADU的封裝也存在差異,以MODBUS TCP/IP為例,其ADU的組成如圖2所示。
圖2 MODBUSTCP/IP幀格式
可以看出,在MODBUS TCP協(xié)議中,ADU=MBAP+PDU。MBAP是TCP/IP協(xié)議上使用的一種專用報(bào)文頭,用以識(shí)別ADU。MBAP報(bào)文頭由7個(gè)字節(jié)組成,其格式如下表1所示。
表1 MBAP報(bào)文頭組成
從表格中可以看到,由于MBAP中含有長(zhǎng)度信息,接收者能夠清晰的識(shí)別報(bào)文的邊界,因此在MODBUS TCP協(xié)議中,其ADU不再含有校驗(yàn)碼。
MODBUS TCP通信系統(tǒng)模型一般基于客戶機(jī)/服務(wù)器模型搭建,如圖3所示。
圖3 MODBUS TCP通信系統(tǒng)客戶機(jī)/服務(wù)器模型
客戶機(jī)/服務(wù)器模型基于4種類型的報(bào)文:請(qǐng)求、指示、響應(yīng)和證實(shí)??蛻魴C(jī)向服務(wù)器發(fā)送請(qǐng)求指令(MODBUS請(qǐng)求),服務(wù)器接收到來(lái)自客戶機(jī)的指令(MODBUS指示)后,對(duì)該指令進(jìn)行響應(yīng)(MODBUS響應(yīng)),即按照約定的協(xié)議內(nèi)容向客戶機(jī)發(fā)送數(shù)據(jù),并由客戶機(jī)對(duì)發(fā)送的數(shù)據(jù)進(jìn)行辨識(shí)和處理(MODBUS證實(shí))。
MODBUS TCP通信系統(tǒng)可以包括多個(gè)MODBUS客戶機(jī)和服務(wù)器,其他互聯(lián)設(shè)備也可通過(guò)客戶機(jī)或服務(wù)器TCP/IP網(wǎng)關(guān)接入該通信系統(tǒng),如圖4所示。
圖4 MODBUS TCP通信系統(tǒng)示意圖
目前廣泛使用的船用以太網(wǎng)通信系統(tǒng)多采用“一主多從”的構(gòu)建思路,即由集中控制室的計(jì)算機(jī)擔(dān)任主機(jī),依次向各設(shè)備輪詢數(shù)據(jù),如圖5所示。
圖5 船用以太網(wǎng)通信系統(tǒng)結(jié)構(gòu)示意圖
采用集中式輪詢方式的好處在于可以分時(shí)段向各設(shè)備發(fā)送數(shù)據(jù)請(qǐng)求,一來(lái)可以有效利用集控室計(jì)算機(jī)的系統(tǒng)資源,二來(lái)可以避免各設(shè)備同時(shí)返回?cái)?shù)據(jù)造成通信線路堵塞。
圖6 船用MODBUS TCP通信系統(tǒng)結(jié)構(gòu)
結(jié)合圖3、圖4和圖5可以看出,船用以太網(wǎng)通信系統(tǒng)可以按照MODBUS TCP通信系統(tǒng)結(jié)構(gòu)進(jìn)行搭建,如圖6所示。
將集控室計(jì)算機(jī)作為客戶機(jī),各設(shè)備作為服務(wù)器,由集控室計(jì)算機(jī)向各設(shè)備發(fā)送輪詢請(qǐng)求,并接收返回?cái)?shù)據(jù)。以客戶機(jī)與其中一臺(tái)服務(wù)器為例,其信息交換示意圖如圖7所示。
圖中,socket()函數(shù)用于創(chuàng)建套接字,bind()函數(shù)用來(lái)綁定一個(gè)端口號(hào)到該套接字,并在套接字與所指定的端口號(hào)之間建立一個(gè)連接。socket初始化完成后,服務(wù)器端需要使用listen()函數(shù)將狀態(tài)置為偵聽(tīng),才能夠接收到來(lái)自客戶機(jī)的連接請(qǐng)求。此時(shí),若客戶機(jī)需要與服務(wù)器進(jìn)行數(shù)據(jù)交換,則需要使用connect()函數(shù)來(lái)指定套接字號(hào)、服務(wù)器IP地址和端口號(hào),服務(wù)器在接收到客戶機(jī)的連接請(qǐng)求后,需要使用accept()函數(shù)指定之前在listen()函數(shù)中所指定的套接字號(hào),用以確定當(dāng)前訪問(wèn)的客戶機(jī)。在連接完成后,客戶機(jī)可以使用send()函數(shù)向服務(wù)器發(fā)送MODBUS請(qǐng)求,服務(wù)器需要使用recv()函數(shù)進(jìn)行接收,再使用send()函數(shù)向客戶機(jī)發(fā)送MODBUS響應(yīng)。值得注意的是,客戶機(jī)在發(fā)送一個(gè)MODBUS請(qǐng)求后,無(wú)需等待服務(wù)器端的響應(yīng)便可以繼續(xù)發(fā)送下一個(gè)MODBUS請(qǐng)求。
圖7 MODBUS TCP通信系統(tǒng)信息交換示意圖
MODBUS服務(wù)器端的主要處理流程如圖8所示。
程序在初始化完成后即進(jìn)入等待,在接收到來(lái)自客戶機(jī)的請(qǐng)求PDU后,對(duì)該P(yáng)DU進(jìn)行檢驗(yàn),根據(jù)檢驗(yàn)情況決定生成MODBUS應(yīng)答或是MODBUS異常,并將該應(yīng)答或者異常作為響應(yīng)發(fā)送給客戶機(jī),其詳細(xì)設(shè)計(jì)分述如下:
圖8 MODBUS服務(wù)器端信息處理流程圖
1)初始化
與其他基于TCP/IP協(xié)議的設(shè)備類似,作為服務(wù)器端程序,MODBUS服務(wù)器端首先需要進(jìn)行初始化,其核心內(nèi)容是設(shè)置并綁定自身IP。建立服務(wù)器函數(shù)CreateServer()的核心代碼如下:
接下來(lái)需要將服務(wù)器置于偵聽(tīng)狀態(tài)。MODBUS服務(wù)器端應(yīng)支持多個(gè)并發(fā)的客戶機(jī)同時(shí)連接。在設(shè)計(jì)時(shí),采用多線程策略可以實(shí)現(xiàn)該項(xiàng)功能,即每當(dāng)偵聽(tīng)到新的連接請(qǐng)求時(shí),便建立一個(gè)新的線程來(lái)進(jìn)行操作。偵聽(tīng)函數(shù)TcpListen()的核心代碼如下:
2)生成MODBUS應(yīng)答/異常
對(duì)于并發(fā)的連接,在接收到來(lái)自客戶機(jī)的請(qǐng)求時(shí),服務(wù)器端將在對(duì)應(yīng)的線程內(nèi)對(duì)請(qǐng)求進(jìn)行處理。根據(jù)MODBUS協(xié)議的MBAP報(bào)文頭判斷請(qǐng)求類別,再按照約定的協(xié)議內(nèi)容向客戶機(jī)返回?cái)?shù)據(jù)。響應(yīng)函數(shù)ClientService()的核心代碼如下:
MODBUS客戶端的主要處理流程如圖9所示。
圖9 MODBUS客戶端信息處理流程圖
程序在初始化完成后即進(jìn)入等待,根據(jù)需求發(fā)送請(qǐng)求PDU,同時(shí)監(jiān)測(cè)是否收到響應(yīng)PDU,根據(jù)檢驗(yàn)情況決定生成MODBUS肯定證實(shí)或是MODBUS否定證實(shí),并將該證實(shí)發(fā)送給用戶應(yīng)用,其詳細(xì)設(shè)計(jì)分述如下:
1)初始化
MODBUS客戶端初始化的主要內(nèi)容是建立客戶機(jī)與服務(wù)器端的連接。使用Socket類中的Connect函數(shù)可以完成這一目標(biāo)。連接函數(shù)TcpConnect()的核心代碼如下:
2)發(fā)送MODBUS請(qǐng)求
可采用多種策略發(fā)送MODBUS請(qǐng)求,最為常用的是使用timer定時(shí)器作為觸發(fā),定時(shí)發(fā)送。發(fā)送函數(shù)timersend_Tick()的核心代碼如下:
3)處理數(shù)據(jù)并生成肯定/否定證實(shí)
與服務(wù)器端的處理方式類似,接收函數(shù)根據(jù)MODBUS協(xié)議的MBAP報(bào)文頭判斷數(shù)據(jù)類別,再按照約定的協(xié)議內(nèi)容解析數(shù)據(jù)。接收函數(shù)ReceiveMsg()的核心代碼如下:
根據(jù)第二章的內(nèi)容,采用C#編寫(xiě)MODBUS服務(wù)器端測(cè)試程序,使用0x03功能碼進(jìn)行測(cè)試,起始地址為40101,大端模式。其主界面如圖10所示。
測(cè)試時(shí)使用TCP/UDP調(diào)試工具模擬MODBUS客戶端。運(yùn)行MODBUS服務(wù)器端測(cè)試程序,單擊程序中的“開(kāi)啟服務(wù)器”按鈕,并在TCP/UDP調(diào)試工具中設(shè)置本機(jī)IP為192.168.163.1,端口為9000,連接類型為TCP,單擊“連接”按鈕。此時(shí)調(diào)試工具已與本機(jī)連接。按照MODBUS協(xié)議,其MODBUS請(qǐng)求格式及數(shù)值如表2所示。
圖10 MODBUS服務(wù)器端測(cè)試程序
單擊TCP/UDP調(diào)試工具中“發(fā)送”按鈕,可在接收欄中看到數(shù)據(jù)序列如圖11所示。
將該數(shù)據(jù)序列進(jìn)行解析,如表3所示。
可見(jiàn)調(diào)試工具接收到的報(bào)文信息完整、正確,通信正常。
表2 MODBUS請(qǐng)求格式及數(shù)值
根據(jù)第二章的內(nèi)容,采用C#編寫(xiě)MODBUS客戶端測(cè)試程序,使用0x03功能碼進(jìn)行測(cè)試,起始地址為40101,大端模式,采用定時(shí)器觸發(fā)方式向服務(wù)器發(fā)送MODBUS請(qǐng)求。使用Modbus Slave調(diào)試工具模擬MODBUS服務(wù)器端,設(shè)置如圖12所示。
圖11 TCP/UDP調(diào)試工具結(jié)果
表3 調(diào)試結(jié)果解析
圖12 Modbus Slave調(diào)試工具設(shè)置
運(yùn)行MODBUS客戶端測(cè)試程序,單擊“連接服務(wù)器”按鈕,得到的結(jié)果如圖13所示。
圖13 MODBUS客戶端測(cè)試程序結(jié)果
對(duì)比圖12和圖13可以看出,客戶端收到服務(wù)器端數(shù)據(jù),且數(shù)據(jù)完整、正確,通信正常。
本文結(jié)合MODBUS TCP通信系統(tǒng)與船用以太網(wǎng)通信系統(tǒng)的結(jié)構(gòu)特征,設(shè)計(jì)了基于MODBUS TCP協(xié)議的船用以太網(wǎng)通信系統(tǒng),采用C#開(kāi)發(fā)環(huán)境對(duì)通信系統(tǒng)的服務(wù)器端和客戶端進(jìn)行了編程設(shè)計(jì)并進(jìn)行了通信測(cè)試。測(cè)試結(jié)果表明,該編程設(shè)計(jì)正確,能夠有效進(jìn)行數(shù)據(jù)交互。
參考文獻(xiàn):
[1] 張小川.Modbus設(shè)備嵌入式網(wǎng)頁(yè)控制方法的研究與實(shí)現(xiàn)[J].科技風(fēng),2014,(20):26-27.
[2] 黃波.虛擬儀器技術(shù)在電力諧波分析系統(tǒng)中的應(yīng)用[D].華中科技大學(xué),2014.
[3] 史妍.基于Modbus的人防工程能源監(jiān)控系統(tǒng)研究[D].哈爾濱工業(yè)大學(xué),2012.
[4] 張芳.網(wǎng)絡(luò)控制系統(tǒng)時(shí)延分析、控制器設(shè)計(jì)及仿真研究[D].北京交通大學(xué),2007.
[5] 郝曉弘,祖守圓,徐維濤.基于VC的Modbus/TCP協(xié)議模型通信測(cè)試軟件的實(shí)現(xiàn)[J].微計(jì)算機(jī)信息,2006,(07):64-67.