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