摘 要:本文在分析Modbus協(xié)議及其通信原理的基礎(chǔ)上,結(jié)合工程實(shí)際,提出了一種在工業(yè)PC機(jī)上實(shí)現(xiàn)串行通信的方法,并在Visual C++6.0環(huán)境下開(kāi)發(fā)了通信的應(yīng)用程序,實(shí)現(xiàn)了基于Modbus協(xié)議的DCS與遠(yuǎn)程I/O系統(tǒng)通信。
關(guān)鍵詞:Modbus協(xié)議; DCS; 遠(yuǎn)程I/O; 串行通信
1 引言
近年來(lái)隨著工控領(lǐng)域自動(dòng)化水平的大幅提高,許多廠、礦企業(yè)原有的控制系統(tǒng)陸續(xù)開(kāi)始各種軟硬件的升級(jí)和改造。改造過(guò)程中,數(shù)據(jù)通信的合理、可靠關(guān)系到現(xiàn)場(chǎng)一系列大型設(shè)備的安全。由于整個(gè)工程往往由不同的單位分別完成,各部分之間的整合性必須得到保證,因此工業(yè)控制系統(tǒng)中常使用標(biāo)準(zhǔn)的協(xié)議進(jìn)行接口通信。
Modbus協(xié)議 是一種工業(yè)通信和分布式控制系統(tǒng)協(xié)議,由MODICON公司出品,現(xiàn)已被眾多的硬件生產(chǎn)廠商所支持并廣泛應(yīng)用于工業(yè)控制領(lǐng)域。DCS即集散控制系統(tǒng),是以微處理器為核心的操作顯示集中、控制功能分散的工業(yè)控制系統(tǒng)。安全可靠的性能和成熟的使用技術(shù)使得DCS廣泛地應(yīng)用于電力、冶金、石油化工、造紙、制藥等行業(yè)。
陜西某電廠改擴(kuò)建工程包括兩部分系統(tǒng):DCS,遠(yuǎn)程I/O數(shù)據(jù)采集系統(tǒng)。這兩部分之間采用Modbus協(xié)議進(jìn)行接口串行通信 。
2 Modbus通信協(xié)議
2.1 協(xié)議簡(jiǎn)介
Modbus是一種主從網(wǎng)絡(luò),允許一個(gè)主機(jī)(Master)和一個(gè)或多個(gè)從機(jī)(Slave)通信,支持兩種有效的傳送方式 :RTU(Remote Terminal Unit,遠(yuǎn)程終端裝置)和 ASCII(美國(guó)標(biāo)準(zhǔn)信息交換碼)。兩種方式的命令格式是相同的,采用何種方式取決于對(duì)通信速度的要求。要求速度快的要用RTU方式,而對(duì)通信速度要求不高的可用ASCⅡ碼方式。協(xié)議的內(nèi)容主要包括寄存器讀寫(xiě)、開(kāi)關(guān)量I/O等命令的格式。
本項(xiàng)目工程通信要求采用RTU方式,以下介紹、分析的命令格式均為標(biāo)準(zhǔn)的Modbus協(xié)議格式,所用的數(shù)據(jù)示例均引自工程中的應(yīng)用實(shí)例。
2.2 主、從機(jī)命令格式
主機(jī)和從機(jī)之間采用查詢(xún)與應(yīng)答方式進(jìn)行通信,每一種查詢(xún)命令報(bào)文都對(duì)應(yīng)著一種應(yīng)答報(bào)文。主機(jī)發(fā)出的查詢(xún)命令報(bào)文格式如表1所示:
表1 主機(jī)查詢(xún)命令報(bào)文格式
地址碼“02”表示主機(jī)要求查詢(xún)02號(hào)從機(jī),功能碼“04”表示主機(jī)要求讀保持寄存器操作,起始數(shù)據(jù)“00 00”表示從第1個(gè)數(shù)據(jù)開(kāi)始讀,數(shù)據(jù)長(zhǎng)度“00 40”表示要求讀取64個(gè)模擬量數(shù)據(jù)。
CRC校驗(yàn)碼:即循環(huán)冗余校驗(yàn)碼,當(dāng)本機(jī)計(jì)算得的CRC碼與接收到的CRC碼一致時(shí) 方認(rèn)為命令校驗(yàn)正確并進(jìn)行操作,否則返回出錯(cuò)信息或放棄此命令。具體參見(jiàn)下文2.3。
從機(jī)接收到表1所示命令時(shí)的正確信息應(yīng)答報(bào)文格式如表2所示:
表2 從機(jī)應(yīng)答命令報(bào)文格式
表中“02、04”如前所述,“80”為從機(jī)發(fā)送數(shù)據(jù)的字節(jié)個(gè)數(shù),即數(shù)據(jù)共發(fā)送了128個(gè)字節(jié)(64個(gè)數(shù)據(jù));“00 10 … 01 3A”為第1~64個(gè)數(shù)據(jù)的高、低字節(jié)值。
從機(jī)應(yīng)答命令中的地址碼、功能碼必須與主機(jī)查詢(xún)命令相同;命令中的模擬量數(shù)據(jù)必須按高位字節(jié)在前、低位字節(jié)在后的順序放置,而CRC碼與此相反,是低位字節(jié)在前、高位字節(jié)在后。
如果發(fā)生錯(cuò)誤或異常,從機(jī)將返回主機(jī)出錯(cuò)命令,格式如表3所示:
表3 從機(jī)返回出錯(cuò)命令報(bào)文格式

“84”是與主機(jī)查詢(xún)命令中功能碼“04”相對(duì)應(yīng)的出錯(cuò)功能碼,出錯(cuò)碼“03”表明主機(jī)查詢(xún)命令中的“數(shù)據(jù)長(zhǎng)度”項(xiàng)有錯(cuò),例如超出了最大數(shù)據(jù)量等。
在其他工程應(yīng)用中,Modbus協(xié)議的各種功能碼、出錯(cuò)碼的含義及其具體選擇、使用可參見(jiàn)參考文獻(xiàn)[1]。
2.3 錯(cuò)誤檢測(cè)方法
標(biāo)準(zhǔn)的Modbus協(xié)議串行通信網(wǎng)絡(luò)采用兩種錯(cuò)誤檢測(cè)方法。一是奇偶校驗(yàn),對(duì)每個(gè)字符都可用;二是幀檢測(cè)(CRC 或LRC),應(yīng)用于整個(gè)命令報(bào)文。
RTU方式下幀檢測(cè)采用的是CRC校驗(yàn),方法是先調(diào)入一值是全“1”的16位寄存器,然后調(diào)用一過(guò)程對(duì)命令中連續(xù)的8位字節(jié)各當(dāng)前寄存器中的值進(jìn)行處理 。最終寄存器中的值,就是命令字符串中所有的字節(jié)都執(zhí)行之后的CRC校驗(yàn)碼值。
下面給出Visual C++ 6.0下CRC校驗(yàn)碼計(jì)算函數(shù):
WORD CRC_Calc (PBYTE buf, UINT num)
?。?
UINT i, j;
WORD temp, crc = 0xFFFF;
for ( i = 0; i < num; i ++){
temp = buf[ i ] & 0x00FF;
crc ︿= temp;
for ( j = 0; j < 8; j ++){
if ( crc & 0x0001)
{crc >>= 1;crc ︿= 0xA001;}
else crc >>= 1;
?。?
}
return crc;
?。?
計(jì)算得的CRC校驗(yàn)碼添加到命令中時(shí),必須按低位字節(jié)在前、高位字節(jié)在后的順序放置。例如,對(duì)表1所示的主機(jī)查詢(xún)命令調(diào)用計(jì)算函數(shù)得到其CRC碼為C9F1,則命令中最后兩個(gè)字節(jié)是F1、C9。
3 硬件構(gòu)架
系統(tǒng)中通信網(wǎng)絡(luò)采用點(diǎn)對(duì)點(diǎn)方式,即網(wǎng)絡(luò)中只有一臺(tái)主機(jī)和一臺(tái)從機(jī)。將一臺(tái)工業(yè)PC機(jī)模擬PLC作為從機(jī)(遠(yuǎn)程I/O數(shù)據(jù)采集系統(tǒng)),采用RS-485信號(hào)與DCS主機(jī)進(jìn)行串口通信。通信的模擬量參數(shù)為#1機(jī)組217點(diǎn)、#2機(jī)組217點(diǎn)和公用部分48點(diǎn),共計(jì)三個(gè)數(shù)據(jù)塊482點(diǎn)。
系統(tǒng)的硬件實(shí)現(xiàn)如圖1所示:
[align=center]

圖1 系統(tǒng)硬件接口框圖[/align]
主機(jī)、從機(jī)之間裝有一對(duì)臺(tái)灣研華公司的ADAM4520轉(zhuǎn)換器,用于完成RS-232與RS-485信號(hào)的轉(zhuǎn)換,實(shí)現(xiàn)長(zhǎng)距離的通信。另外,此轉(zhuǎn)換器還需要+24V直流電源。
4 軟件設(shè)計(jì)
4.1 軟件功能
主機(jī)通信子程序已內(nèi)嵌在DCS系統(tǒng)中,以下介紹從機(jī)通信子程序的設(shè)計(jì)和開(kāi)發(fā)。
從機(jī)操作系統(tǒng)為Win2000,程序設(shè)計(jì)平臺(tái)為VC++6.0 ,通信程序采用Win32的API函數(shù)讀、寫(xiě)串口。
程序的界面設(shè)計(jì)主要包括:一個(gè)復(fù)選框,用于選擇通信的數(shù)據(jù)塊;一系列下拉列表,用于設(shè)置通信的串口參數(shù);網(wǎng)絡(luò)狀態(tài)顯示控件。復(fù)選框的內(nèi)容是#1、#2及公用部分三個(gè)數(shù)據(jù)塊,下拉列表主要包括設(shè)定波特率(9600bps)、起始位(1位)、數(shù)據(jù)位(7位)、奇偶校驗(yàn)位(1位)、停止位(1位),有無(wú)奇偶檢驗(yàn)(無(wú))等,設(shè)置的內(nèi)容均可以調(diào)整。
程序的功能設(shè)計(jì)請(qǐng)參見(jiàn)通信子程序以及解析應(yīng)答模塊的流程圖,分別如圖2、3所示:
[align=center]

圖2 從機(jī)通信子程序流程圖[/align]
從機(jī)通信子程序采取了多線程的工作方式。程序首先設(shè)置與DCS相同的串口參數(shù)以進(jìn)行串口初始化,并按照DCS的要求選定通信的數(shù)據(jù)塊,之后創(chuàng)建一個(gè)偵聽(tīng)串口事件線程CommWatchThread( ),由此線程監(jiān)測(cè)網(wǎng)絡(luò)狀態(tài)及主機(jī)發(fā)送來(lái)的命令消息等各種串口事件,再調(diào)用相應(yīng)的函數(shù)對(duì)事件進(jìn)行處理。
[align=center]

圖3 從機(jī)解析應(yīng)答模塊流程圖[/align]
解析應(yīng)答模塊共有兩個(gè)函數(shù):RecvData( )、SendData( )。當(dāng)RecvData( )函數(shù)成功讀取到主機(jī)的查詢(xún)命令后,首先對(duì)數(shù)據(jù)量和校驗(yàn)碼進(jìn)行校驗(yàn),如果有錯(cuò),則由SendData( )向主機(jī)返回相應(yīng)的出錯(cuò)命令報(bào)文;如果正確,則由SendData( )按照命令中要求的起始數(shù)據(jù)和數(shù)據(jù)量讀取數(shù)據(jù)庫(kù),準(zhǔn)備應(yīng)答命令報(bào)文,并調(diào)用CRC計(jì)算函數(shù)計(jì)算出CRC碼添加到命令的最后兩個(gè)字節(jié)中,發(fā)送給主機(jī)。
由于通信系統(tǒng)網(wǎng)絡(luò)采用點(diǎn)對(duì)點(diǎn)方式且只進(jìn)行模擬量數(shù)據(jù)的通信,所以從機(jī)程序的解析、應(yīng)答模塊在對(duì)命令進(jìn)行校驗(yàn)的時(shí)候只進(jìn)行了數(shù)據(jù)量和CRC校驗(yàn),省略了地址碼和功能碼等的校驗(yàn),以節(jié)省時(shí)間,提高通信的效率。
4.2 軟件特點(diǎn)
1、 采用VisualC++面向?qū)ο蟮脑O(shè)計(jì)方法編寫(xiě)通信軟件程序,模擬PLC通信的原理在工業(yè)PC機(jī)上實(shí)現(xiàn)基于Modbus協(xié)議的串行通信,操作方便。
2、 采用多線程技術(shù)和消息驅(qū)動(dòng)的工作方式,可以充分利用計(jì)算機(jī)系統(tǒng)的資源,避免瓶頸的產(chǎn)生,達(dá)到將系統(tǒng)進(jìn)行合理組織的目的,有效地避免了網(wǎng)絡(luò)數(shù)據(jù)的沖突,使得數(shù)據(jù)通信安全可靠。
5 結(jié)束語(yǔ)
本文介紹了使用工業(yè)PC機(jī)通過(guò)Modbus協(xié)議實(shí)現(xiàn)DCS與遠(yuǎn)程I/O系統(tǒng)進(jìn)行串口數(shù)據(jù)通信的過(guò)程,采用VC開(kāi)發(fā)的通信軟件已成功應(yīng)用于陜西某電廠的改造工程,這種通信方式靈活方便,可靠性高,完全達(dá)到了預(yù)期的要求。了解Modbus協(xié)議是我們掌握PLC、智能儀表、單片機(jī)等通信機(jī)制的重要內(nèi)容,對(duì)過(guò)程監(jiān)控、數(shù)據(jù)采集等系統(tǒng)中使用PC機(jī)進(jìn)行串行通信的軟件開(kāi)發(fā)本文不失為具有普遍的意義。
參考文獻(xiàn):
[1] Modicon Modbus Protocol Reference Guide[EB/OL]. June 1996, MODICON, Inc.
[2] Mark Nelson著.瀟湘工作室譯.串行通信開(kāi)發(fā)指南[M].北京:中國(guó)水利水電出版社,2000年
[3] 王常力,廖道文.集散型控制系統(tǒng)的設(shè)計(jì)與應(yīng)用[M].北京:清華大學(xué)出版社,1993年.
[4] Davis Chapman著.駱長(zhǎng)樂(lè)譯.學(xué)用Visual C++ 6.0.北京:清華大學(xué)出版社,1999年.