王勇平,張英豪
(廣州致新電力科技有限公司,廣東 廣州 510540)
電力系統(tǒng)通信規(guī)約(協(xié)議)是指通信雙方必須共同遵守的約定,也叫做通信控制規(guī)程或傳輸控制規(guī)程。通信規(guī)約的內(nèi)容主要分為信息傳送的具體步驟和信息傳送格式兩部分。其中,信息傳送格式包括收發(fā)方式、傳送速率、幀結(jié)構(gòu)、幀同步字、位同步方式以及抗干擾措施等[1-3]。隨著科學(xué)技術(shù)的不斷發(fā)展,電力系統(tǒng)調(diào)度運行的信息傳輸要求不斷提高,促使信息傳輸方式已逐步走向數(shù)字化和網(wǎng)絡(luò)化。為此,國際電工委員會電力系統(tǒng)控制及其通信技術(shù)委員(ITCTC57)根據(jù)形勢發(fā)展的要求,制定調(diào)度自動化和變電站自動化系統(tǒng)的數(shù)據(jù)通信標準,以適應(yīng)和引導(dǎo)電力系統(tǒng)調(diào)度自動化的發(fā)展,規(guī)范調(diào)度自動化和遠動設(shè)備的技術(shù)性能[4]?;贛odbus的傳感器通信在數(shù)據(jù)采集方面有著廣泛應(yīng)用,常見的通信方式有基于串口(RTU)方式和基于傳輸控制協(xié)議(Transmission Control Protocol,TCP)方式兩類[5]。
Modbus通信協(xié)議基本可以分為上位機查詢和下位機回應(yīng)兩個部分的通信過程[6]。
主機先確定通信鏈路中所有從機設(shè)備的地址信息,然后上位機發(fā)送數(shù)據(jù)查詢指令。為保證上位機能夠準確查詢到下位機狀態(tài)信息,上位機的查詢指令中必須有和下位機一致的地址信息,同時保證此通信中下位機收到的數(shù)據(jù)是上位機發(fā)送的。下位機通過上位機數(shù)據(jù)中的功能碼執(zhí)行上位機所要完成的具體功能,同時在數(shù)據(jù)中還包含有下位機相應(yīng)功能碼的輔助信息。上位機發(fā)送的數(shù)據(jù)中還包含校驗碼,在Modbus中一般是CRC16。校驗碼主要是用來檢測下位機收到的查詢請求是否正確。在請求數(shù)據(jù)中加上校驗碼,可有效驗證通信過程中數(shù)據(jù)是否被完整且正確接收[7]。
下位機接收到上位機的請求后,對此數(shù)據(jù)幀進行請求應(yīng)答即響應(yīng)。在響應(yīng)的數(shù)據(jù)中也必須包含相應(yīng)的功能碼。功能碼[8]是對下位機接收到上位機發(fā)送數(shù)據(jù)的執(zhí)行情況的響應(yīng),響應(yīng)中包括功能碼的實現(xiàn)情況和校驗碼,以說明數(shù)據(jù)的接收是否準確和讀寫操作的執(zhí)行情況等。
傳感器通信主要根據(jù)通信接口分為Modbus TCP和Modbus RTU串行兩大類。
在一次網(wǎng)絡(luò)通信中,TCP協(xié)議要求每個通信對象必須要知道此通信鏈路中每個節(jié)點的地址和端口號[9]。根據(jù)地址和端口號確定一個通信節(jié)點,識別通信節(jié)點中發(fā)送的數(shù)據(jù),并且產(chǎn)生對應(yīng)的響應(yīng)。響應(yīng)時,通信節(jié)點將數(shù)據(jù)通過Modbus發(fā)出。其他網(wǎng)絡(luò)中包含了此Modbus數(shù)據(jù)轉(zhuǎn)換的包結(jié)構(gòu)。這種轉(zhuǎn)換為網(wǎng)絡(luò)解決節(jié)地址和路由路徑錯誤檢測提供了借鑒。
將傳感器與其接收裝置接電后,通過網(wǎng)線將傳感器接收裝置和PC連接進行網(wǎng)絡(luò)通信。此通信是基于網(wǎng)絡(luò)傳輸?shù)模趹?yīng)用程序中應(yīng)用Socket技術(shù),通過傳感器接收裝置的IP和端口號建立連接。通信中傳感器接收裝置為下位機,應(yīng)用程序為上位機。
將傳感器與其檢測裝置接電后,通過串口可與應(yīng)用程序端實現(xiàn)通信。此通信中,傳感器內(nèi)置寄存器作為通信中的下位機,而應(yīng)用程序為上位機。
Modbus協(xié)議定義了一個比較簡單且和底層通信無關(guān)的協(xié)議數(shù)據(jù)單元(Protocol Data Unit,PDU)[10],包括功能碼和數(shù)據(jù)。Modbus協(xié)議的數(shù)據(jù)幀由地址域、功能碼、數(shù)據(jù)單元以及校驗碼組成。上位機和下位機的數(shù)據(jù)格式也是如此,只是在數(shù)據(jù)單元中稍有區(qū)別。上位機的數(shù)據(jù)單元由寄存器地址和寄存器數(shù)量組成,而下位機數(shù)據(jù)單元由數(shù)據(jù)字節(jié)數(shù)量和響應(yīng)數(shù)據(jù)組成。
上位機請求數(shù)據(jù)示例:01 03 00 00 00 02 C4 0B
下位機響應(yīng)數(shù)據(jù)示例:01 03 04 02 DB 01 16 0B EE
Modbus常見功能碼有01(讀線圈狀態(tài))、02(讀(開關(guān))輸入狀態(tài))、03(讀保持寄存器)、04(讀輸入寄存器)、05(寫單個線圈)、06(寫單個保持寄存器)、15(寫多個線圈)以及16(寫多個保持寄存器)。
上位機接收到下位機的響應(yīng)數(shù)據(jù)后,要按照一定的解析規(guī)則,在下位機返回消息幀中的數(shù)據(jù)單元中解析16進制的消息幀。每種傳感器的解析規(guī)則都不相同,因此需要相應(yīng)傳感器的通信規(guī)約文檔,以說明下位機響應(yīng)的數(shù)據(jù)中傳感器采集的監(jiān)測量字節(jié)數(shù)和比例轉(zhuǎn)換關(guān)系。
數(shù)據(jù)解析以下位機響應(yīng)報文(16進制)01 03 04 02 92 FF 9B 5A 3D為例。溫度計算規(guī)則是,若溫度小于0 ℃,則以補碼形式上傳,其中16進制的FF9B轉(zhuǎn)10進制是-101,再根據(jù)轉(zhuǎn)換關(guān)系除以10,得到真實溫度為-10.1 ℃。同理,可得相對濕度為65.8%。
在應(yīng)用程序中,使用的開發(fā)語言是Java,故根據(jù)實際業(yè)務(wù)需求在MySQL數(shù)據(jù)庫中建立數(shù)據(jù)采集表,在程序中使用定時任務(wù)將采集的數(shù)據(jù)解析后封裝為對應(yīng)的對象,并使用MyBatis進行數(shù)據(jù)存儲。
在Java中實現(xiàn)Modbus通信時,根據(jù)通信規(guī)約不同,使用的實現(xiàn)方式也不相同,主要分為Modbus TCP和Modbus RTU。
3.5.1 用Java實現(xiàn)Modbus TCP傳感器數(shù)據(jù)采集
程序中,TCP方式采集傳感器數(shù)據(jù)的實現(xiàn)方式如下。
(1)用Socket getSocketConn(String host,int port)接口獲取Socket連接對象,用此接口建立應(yīng)用程序與傳感器接收裝置之間的網(wǎng)絡(luò)通信連接。接口中,host參數(shù)表示下位機IP,參數(shù)port表示下位機端口。
(2)用String getResponseCode(Socket socket,String reqCode,int len)接口獲取下位機響應(yīng)。接口中,socket參數(shù)表示建立網(wǎng)絡(luò)連接的Socket對象,參數(shù)reqCode表示應(yīng)用程序需要發(fā)送的請求數(shù)據(jù),參數(shù)len表示請求數(shù)據(jù)中寄存器數(shù)量。
(3)用List
(4)用List
(5)用void socketClose(Socket socket)接口關(guān)閉網(wǎng)絡(luò)通信連接。接口中,參數(shù)socket表示建立網(wǎng)絡(luò)連接的Socket對象。
(6)用List
3.5.2 用Java實現(xiàn)Modbus RTU傳感器數(shù)據(jù)采集
程序中,RTU方式采集傳感器數(shù)據(jù)的實現(xiàn)方式如下。
(1)用ArrayList
(2)用SerialPort openPort(String portName,int baudrate)接口獲取串口連接對象。接口中,參數(shù)portName表示串口名稱,參數(shù)baudrate表示串口波特率。
(3)用void sendToPort(SerialPort serialPort,byte[] order)接口實現(xiàn)上位機向下位機發(fā)送數(shù)據(jù)查詢請求。接口中,參數(shù)serialPort表示串口連接對象,參數(shù)order表示發(fā)送數(shù)據(jù)。
(4)用byte[] readFromPort(SerialPort serialPort)接口從下位機獲取響應(yīng)結(jié)果。接口中,參數(shù)serialPort表示串口連接對象。
(5)用void closePort(SerialPort serialPort)接口關(guān)閉串口連接。接口中,參數(shù)serialPort表示串口連接對象。
(6)用T getJdrkTempAndHum(int comNum)接口解析傳感器響應(yīng),以獲取業(yè)務(wù)數(shù)據(jù)對象。接口中,參數(shù)comNum表示串口序號。
(7)用List
研究的技術(shù)主要通過ModBus TCP/IP和ModBus RTU兩種通信方式,分別實現(xiàn)電氣設(shè)備傳感器數(shù)據(jù)的采集和存儲,方便了數(shù)據(jù)采集系統(tǒng)的快速集成開發(fā)。這不僅簡化了通信規(guī)約解析的開發(fā)工作,也為電氣設(shè)備智能化運維的數(shù)據(jù)采集分析提供了有效的實踐借鑒意義。目前,數(shù)據(jù)采集方案已經(jīng)實際應(yīng)用于多個項目,且采集程序運行穩(wěn)定,對基于ModBus通信協(xié)議下的數(shù)據(jù)采集分析應(yīng)用場景具有借鑒意義。