徐華龍, 衷衛聲
(南昌大學 信息工程學院,江西 南昌 330031)
自工業4.0概念被提出以來,各個行業都開始進入互聯領域網+制造的智能時代,在水質監測領域,除了成熟的可編程邏輯控制器(programmable logic controller,PLC)+組態的工控模式外,越來越多的嵌入式及互聯網元素也開始慢慢加入進來[1,2]。其中現場可編程門陣列(field programmable gate array,FPGA)以其豐富的邏輯單元在數字系統設計領域得到越來越廣泛的運用[3,4]。
本文設計一種水質監測平臺,通過對相關技術單元的設計分析尤其是平臺中數據通信協議的設計與實現,提出一種FPGA+云端+Android的水質監測平臺解決方案。
平臺水質分析儀表采用支持RS—232/RS—485接口的SJG—705多參數監測儀,平臺總體框架如圖1所示。

圖1 平臺總體框架設計
取配水單元將水樣無二次污染的送入預處理單元。預處理完成如沉沙等去除其他影響因素操作[5]。數據由分析儀表檢測并通過Modbus協議傳送至以FPGA芯片作為主控的數據采集模塊。通用分組無線業務(general packet radio service,GPRS)模塊則將數據發送至本地服務器,服務器與GPRS模塊通過Socket連接,創建云端數據庫,并將數據上傳,通過JDBC(Java DataBase Connectivity)完成Android對云端數據的讀取。為了在移動端直觀顯示數據,對MPAndroidChart圖表庫進行開發,以數據曲線動圖的形式完成遠程顯示。其中,數據的采集與傳輸為平臺的一大重點,本文主要對數據傳輸過程中的Modbus協議的FPGA實現及傳輸控制協議/因特網互聯協議(transmission control protocol/Internet protocol,TCP/IP)的Socket網絡編程的設計實現進行詳細開發介紹,其他模塊主要對其技術要點進行陳述并完成最后的聯調顯示。
Modbus數據幀格式如下:開始位為T1~T4,從機地址為8 bit,功能碼為8 bit,數據為N×8 bit,CRC校驗為16 bit,結束位為T1~T4。
Modbus可采取美國標準信息交換代碼(American Standard Code for Information Interchange)ASCII及遠程終端單元(remote terminal unit,RTU)兩種通信模式進行通信,兩種方法各有優點,ASCII模式具有數據傳輸間隔時間長、更穩定的優點,而RTU模式具有更長的通信距離、更高的數據傳輸速度及數據吞吐率,平臺采取默認下的RTU模式。在RTU模式下,Modbus每一幀數據的開始及結束都需要包含3.5個字符靜止時間,從機地址為同一網絡中所能承受的最大從機數為247個,在工程中一般不超過32,功能碼用于異步應答,而循環冗余校驗碼(cyclic redundancy check,CRC)校驗則一般為CRC16[7,8]。
根據FPGA的自頂向下的模塊化的設計思想,將Modbus協議分為波特率發生器模塊、數據接收模塊、數據接收緩存器模塊、數據發送模塊、數據發送緩存器模塊及CRC校驗模塊,結構框圖如圖2所示。

圖2 Modbus模塊結構框圖
波特率發生器的實現本質上為硬件描述語言Verilog的分頻計數器的實現,平臺采用的FPGA主控芯片為Altera公司Cyclone IV系列EP4CE10F17C8N,采用晶振為50 MHz,波特率采用19 200 bit/s級別,所對應的半周期計數值為1302。
接收模塊主要由三部分組成:數據檢測模塊、串并轉換模塊及數據緩存模塊。結構框圖如圖3所示[4]。

圖3 Modbus接收模塊結構
數據檢測模塊主要功能為檢測數據幀是否有3.5個字符間隔,若檢測成功,則開始信號標志位置1,當又再次檢測成功時,數據幀結束。串并轉換模塊對接收串口的串行數據進行接收,將其轉換為8位并行數據,并發送至數據緩存模塊。數據緩存格式為從機地址+功能碼+數據信息,且其中并不包含校驗碼。
發送模塊主要有分頻器模塊、并串轉換模塊及取數模塊組成。分頻器模塊控制數據發送速率,取數模塊則通過接收來自控制器指令從緩存中取出數據發送至并串轉換模塊,每執行一次取數操作則進行一次讀取字節數與數據長度寄存器值得對比:若相等,取出校驗碼;若不相等,則繼續讀取。并串轉換模塊作用為串并的逆過程。
平臺采用循環冗余校驗法,將CRC寄存器16位全部置1,對數據幀中的從機地址、功能碼及有效數據進行校驗運算。運算過程為將第一個被校驗字節與CRC寄存器低字節進行異或運算,向最低位進行移位操作,檢查最低位值,若為1,則與寄存器進行運算,為0則不運算,移位8次后,進行下一個字節的運算,當整個數據幀校驗完畢后,寄存器的值即為校驗碼。
采用Verilog硬件描述語言對模塊邏輯功能進行設計,對各個模塊分別進行文本testbench測試,模塊在modelsim中的部分仿真結果如圖4所示。在串并轉換模塊中,因為Modbus先接收低位的特性,所以,輸出端數據有效數據與輸入端相反。

圖4 仿真結果
TCP/IP網絡中傳輸層具有TCP及用戶數據報協議(user datagram protocol,UDP)[8],結合平臺對數據的要求,采用GPRS模塊實現硬件模塊與本地服務器的通信。
平臺采用的SIM900A模塊,其內嵌TCP/IP,且信號質量及處理能力較好的特點在市場上應用極為廣泛[9]。在對模塊進行參數設置時,利用花生殼獲取域名,將本地內網IP及端口映射到外網,編寫Socket程序,實現無線連接[10]。程序流程及相關應用程序編程接口(application programming interface,API)如圖5所示。

圖5 Socket連接流程
使用軟件VS2010完成本地服務器端的編寫獲取硬件模塊數據,在購買的阿里云服務器上創建Sqlserver數據庫[11],開啟遠程連接接口,配置數據源等相關信息,在C環境下采用開放數據庫互連(open database connectivity,ODBC),在本地完成對數據庫的連接并添加數據。
平臺中移動客戶主要功能為完成對云端數據庫的連接及對檢測數據進行動態曲線顯示,同時在移動端建立本地SQLite數據庫,對獲取的數據進行備份管理。軟件開發環境為Eclipse[12]。設計模塊包含用戶界面(user interface,UI)設計模塊:各界面顯示的搭建;用戶登入模塊:完成用戶注冊、登入操作,確定用戶操作權限;往期列表顯示模塊:對不同時間段內水質信息進行列表管理,用戶可進行點擊查看具體參數;數據連接及解析模塊:完成移動端對數據庫的連接及數據的讀取解析;曲線圖表的設計模塊:完成對數據曲線動圖的顯示操作;此外還包含軟件管理如版本、更新等相關模塊。
在移動客戶端連接數據庫有多種方式,平臺采用JDBC的方式對數據庫進行連接。在連接數據庫前必須加載數據庫驅動,實現方法為Class.forName("com.microsoft.SQL-server.jdbc.SQLServerDriver"),通過數據庫統一資源定位器(uniform resoure locator,URL)地址,用戶,密碼,利用驅動類DriverManager完成連接,創建Statement對象,將SQL語句發送至數據庫管理系統,完成對數據的操作[13]。
為完成移動端對圖表的顯示,對開源圖表庫MPAndroidChart進行開發,MPAndroidChart支持各類圖表及縮放、局部放大、移動和動畫等功能。平臺中測量參數包含溶解氧、pH值等。以此兩個參數變化過程進行曲線設計。在工程中添加MPAndroidChartLibrary—2—2—4.jar包至libs目錄下完成對圖表的支持,在布局文件Layout中添加曲線基本布局:
Android:id="@+id/chart" Android:layout_width="match_parent" Android:layout_height="match_parent"/> 在主界面中完成曲線圖格式設置、數據讀取及相關邏輯功能。包含圖表對象格式、坐標軸相關格式、限制線格式、曲線格式、曲線數據的獲取與集合等[14]。對于曲線數據的描繪,其主要邏輯為創建數據集合,通過add()方法對數據進行添加,創建LineDataSet對象描述曲線,創建LineDataSet集合,添加創建的LineDataSet對象,創建LineData對象描述圖表數據集合,最后將LineData對象導入獲取的圖表資源中。二參數曲線如圖6所示。 圖6 二參數曲線變化 在平臺中,監測數據上報頻率為1次/5 min,為直觀顯示,在二參數的變化數據中選取9個在圖6中顯示,完成圖中的數據標記。圖中曲線動畫顯示方式為沿X軸正方向持續描繪,方法為animateX(),通過數據變化曲線在移動端的顯示,有利于用戶對水質數據變化趨勢的了解。 本文設計一種基于FPGA的水質監測平臺,研究總線式通信協議Modbus及TCP/IP的實現,利用Verilog編程語言及相關工具完成Modbus各模塊功能仿真,在C語言環境下對Socket網絡編程進行實現,同時對移動端及云端設計要點進行設計,經聯合調試,各模塊工作狀態良好,界面顯示及數據庫運行無誤。對未來水質監測領域的無人值守、水質信息的多方共享技術有一定幫助。
5 結束語