摘 要:本文在分析Modbus協議及其通信原理的基礎上,結合工程實際,提出了一種在工業(yè)PC機上實現串行通信的方法,并在Visual C++6.0環(huán)境下開發(fā)了通信的應用程序,實現了基于Modbus協議的DCS與遠程I/O系統通信。
關鍵詞:Modbus協議; DCS; 遠程I/O; 串行通信
1 引言
近年來隨著工控領域自動化水平的大幅提高,許多廠、礦企業(yè)原有的控制系統陸續(xù)開始各種軟硬件的升級和改造。改造過程中,數據通信的合理、可靠關系到現場一系列大型設備的安全。由于整個工程往往由不同的單位分別完成,各部分之間的整合性必須得到保證,因此工業(yè)控制系統中常使用標準的協議進行接口通信。
Modbus協議 是一種工業(yè)通信和分布式控制系統協議,由MODICON公司出品,現已被眾多的硬件生產廠商所支持并廣泛應用于工業(yè)控制領域。DCS即集散控制系統,是以微處理器為核心的操作顯示集中、控制功能分散的工業(yè)控制系統。安全可靠的性能和成熟的使用技術使得DCS廣泛地應用于電力、冶金、石油化工、造紙、制藥等行業(yè)。
陜西某電廠改擴建工程包括兩部分系統:DCS,遠程I/O數據采集系統。這兩部分之間采用Modbus協議進行接口串行通信 。
2 Modbus通信協議
2.1 協議簡介
Modbus是一種主從網絡,允許一個主機(Master)和一個或多個從機(Slave)通信,支持兩種有效的傳送方式 :RTU(Remote Terminal Unit,遠程終端裝置)和 ASCII(美國標準信息交換碼)。兩種方式的命令格式是相同的,采用何種方式取決于對通信速度的要求。要求速度快的要用RTU方式,而對通信速度要求不高的可用ASCⅡ碼方式。協議的內容主要包括寄存器讀寫、開關量I/O等命令的格式。
本項目工程通信要求采用RTU方式,以下介紹、分析的命令格式均為標準的Modbus協議格式,所用的數據示例均引自工程中的應用實例。
2.2 主、從機命令格式
主機和從機之間采用查詢與應答方式進行通信,每一種查詢命令報文都對應著一種應答報文。主機發(fā)出的查詢命令報文格式如表1所示:
表1 主機查詢命令報文格式
地址碼“02”表示主機要求查詢02號從機,功能碼“04”表示主機要求讀保持寄存器操作,起始數據“00 00”表示從第1個數據開始讀,數據長度“00 40”表示要求讀取64個模擬量數據。
CRC校驗碼:即循環(huán)冗余校驗碼,當本機計算得的CRC碼與接收到的CRC碼一致時 方認為命令校驗正確并進行操作,否則返回出錯信息或放棄此命令。具體參見下文2.3。
從機接收到表1所示命令時的正確信息應答報文格式如表2所示:
表2 從機應答命令報文格式
表中“02、04”如前所述,“80”為從機發(fā)送數據的字節(jié)個數,即數據共發(fā)送了128個字節(jié)(64個數據);“00 10 … 01 3A”為第1~64個數據的高、低字節(jié)值。
從機應答命令中的地址碼、功能碼必須與主機查詢命令相同;命令中的模擬量數據必須按高位字節(jié)在前、低位字節(jié)在后的順序放置,而CRC碼與此相反,是低位字節(jié)在前、高位字節(jié)在后。
如果發(fā)生錯誤或異常,從機將返回主機出錯命令,格式如表3所示:
表3 從機返回出錯命令報文格式
“84”是與主機查詢命令中功能碼“04”相對應的出錯功能碼,出錯碼“03”表明主機查詢命令中的“數據長度”項有錯,例如超出了最大數據量等。
在其他工程應用中,Modbus協議的各種功能碼、出錯碼的含義及其具體選擇、使用可參見參考文獻[1]。
2.3 錯誤檢測方法
標準的Modbus協議串行通信網絡采用兩種錯誤檢測方法。一是奇偶校驗,對每個字符都可用;二是幀檢測(CRC 或LRC),應用于整個命令報文。
RTU方式下幀檢測采用的是CRC校驗,方法是先調入一值是全“1”的16位寄存器,然后調用一過程對命令中連續(xù)的8位字節(jié)各當前寄存器中的值進行處理 。最終寄存器中的值,就是命令字符串中所有的字節(jié)都執(zhí)行之后的CRC校驗碼值。
下面給出Visual C++ 6.0下CRC校驗碼計算函數:
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;
}
計算得的CRC校驗碼添加到命令中時,必須按低位字節(jié)在前、高位字節(jié)在后的順序放置。例如,對表1所示的主機查詢命令調用計算函數得到其CRC碼為C9F1,則命令中最后兩個字節(jié)是F1、C9。
3 硬件構架
系統中通信網絡采用點對點方式,即網絡中只有一臺主機和一臺從機。將一臺工業(yè)PC機模擬PLC作為從機(遠程I/O數據采集系統),采用RS-485信號與DCS主機進行串口通信。通信的模擬量參數為#1機組217點、#2機組217點和公用部分48點,共計三個數據塊482點。
系統的硬件實現如圖1所示:
[align=center]
圖1 系統硬件接口框圖[/align]
主機、從機之間裝有一對臺灣研華公司的ADAM4520轉換器,用于完成RS-232與RS-485信號的轉換,實現長距離的通信。另外,此轉換器還需要+24V直流電源。
4 軟件設計
4.1 軟件功能
主機通信子程序已內嵌在DCS系統中,以下介紹從機通信子程序的設計和開發(fā)。
從機操作系統為Win2000,程序設計平臺為VC++6.0 ,通信程序采用Win32的API函數讀、寫串口。
程序的界面設計主要包括:一個復選框,用于選擇通信的數據塊;一系列下拉列表,用于設置通信的串口參數;網絡狀態(tài)顯示控件。復選框的內容是#1、#2及公用部分三個數據塊,下拉列表主要包括設定波特率(9600bps)、起始位(1位)、數據位(7位)、奇偶校驗位(1位)、停止位(1位),有無奇偶檢驗(無)等,設置的內容均可以調整。
程序的功能設計請參見通信子程序以及解析應答模塊的流程圖,分別如圖2、3所示:
[align=center]
圖2 從機通信子程序流程圖[/align]
從機通信子程序采取了多線程的工作方式。程序首先設置與DCS相同的串口參數以進行串口初始化,并按照DCS的要求選定通信的數據塊,之后創(chuàng)建一個偵聽串口事件線程CommWatchThread( ),由此線程監(jiān)測網絡狀態(tài)及主機發(fā)送來的命令消息等各種串口事件,再調用相應的函數對事件進行處理。
[align=center]
圖3 從機解析應答模塊流程圖[/align]
解析應答模塊共有兩個函數:RecvData( )、SendData( )。當RecvData( )函數成功讀取到主機的查詢命令后,首先對數據量和校驗碼進行校驗,如果有錯,則由SendData( )向主機返回相應的出錯命令報文;如果正確,則由SendData( )按照命令中要求的起始數據和數據量讀取數據庫,準備應答命令報文,并調用CRC計算函數計算出CRC碼添加到命令的最后兩個字節(jié)中,發(fā)送給主機。
由于通信系統網絡采用點對點方式且只進行模擬量數據的通信,所以從機程序的解析、應答模塊在對命令進行校驗的時候只進行了數據量和CRC校驗,省略了地址碼和功能碼等的校驗,以節(jié)省時間,提高通信的效率。
4.2 軟件特點
1、 采用VisualC++面向對象的設計方法編寫通信軟件程序,模擬PLC通信的原理在工業(yè)PC機上實現基于Modbus協議的串行通信,操作方便。
2、 采用多線程技術和消息驅動的工作方式,可以充分利用計算機系統的資源,避免瓶頸的產生,達到將系統進行合理組織的目的,有效地避免了網絡數據的沖突,使得數據通信安全可靠。
5 結束語
本文介紹了使用工業(yè)PC機通過Modbus協議實現DCS與遠程I/O系統進行串口數據通信的過程,采用VC開發(fā)的通信軟件已成功應用于陜西某電廠的改造工程,這種通信方式靈活方便,可靠性高,完全達到了預期的要求。了解Modbus協議是我們掌握PLC、智能儀表、單片機等通信機制的重要內容,對過程監(jiān)控、數據采集等系統中使用PC機進行串行通信的軟件開發(fā)本文不失為具有普遍的意義。
參考文獻:
[1] Modicon Modbus Protocol Reference Guide[EB/OL]. June 1996, MODICON, Inc.
[2] Mark Nelson著.瀟湘工作室譯.串行通信開發(fā)指南[M].北京:中國水利水電出版社,2000年
[3] 王常力,廖道文.集散型控制系統的設計與應用[M].北京:清華大學出版社,1993年.
[4] Davis Chapman著.駱長樂譯.學用Visual C++ 6.0.北京:清華大學出版社,1999年.