趙 炯,楊天豪,肖 杰,熊肖磊
(同濟大學機械與能源工程學院,上海 201804)
隨著工業(yè)4.0、智能系統(tǒng)、物聯(lián)網(wǎng)[1]的發(fā)展,對于各類傳感器的采集、應用需求愈發(fā)增大。工業(yè)數(shù)據(jù)采集器的采集對象大多是RS-232/RS-485、CAN總線接口或以太網(wǎng)接口的傳感器。在目前的工程應用中,常用的智能采集系統(tǒng)架構有“傳感器-可編程邏輯控制器(programmable logic controller,PLC)-計算機監(jiān)控系統(tǒng)”和“傳感器-串口服務器-計算機解析”模式。前者價格高昂且依賴PLC開發(fā);后者則只能適用于RS-232/RS-485接口,不易進行網(wǎng)絡擴展,且在軟件開發(fā)時需要進行Modbus等底層協(xié)議的解析。
在嵌入式系統(tǒng)成本大大降低,應用范圍日漸廣泛的背景下,針對目前數(shù)據(jù)采集系統(tǒng)搭建、開發(fā)過程復雜的問題,本文設計了一種適用于工業(yè)通用采集接口、便于個性化配置、面向多傳感器并發(fā)讀寫的嵌入式遠程數(shù)據(jù)采集器。
結合工業(yè)數(shù)據(jù)采集應用場合,數(shù)據(jù)采集應用系統(tǒng)框架如圖1所示。整個系統(tǒng)主要由數(shù)據(jù)采集器、多個傳感器以及遠程監(jiān)控中心構成。數(shù)據(jù)采集器與數(shù)個傳感器直接相連,同時通過自身的3G/4G功能或以太網(wǎng)與遠程監(jiān)控中心間接相連。數(shù)據(jù)采集器負責根據(jù)用戶配置分別采集各個傳感器數(shù)據(jù),經(jīng)處理后直接轉發(fā)至遠程監(jiān)控中心。
圖1 數(shù)據(jù)采集應用系統(tǒng)框架
根據(jù)嵌入式系統(tǒng)的硬件設計原理及本數(shù)據(jù)采集器的需求,本數(shù)據(jù)采集器包括以下主要模塊:核心模塊、電源模塊、采集接口模塊、網(wǎng)絡功能模塊及基本外圍電路。數(shù)據(jù)采集器硬件框架如圖2所示。
圖2 數(shù)據(jù)采集器硬件框架圖
核心模塊采用Freescale公司生產(chǎn)的i.MX6Q核心平臺,其集成了Cortex-A9四核處理器,工作頻率可達1 GHz,搭載了2 GB的DDR3內存以及8 GB的eMMC Flash;同時支持以太網(wǎng)、CAN總線、UART等接口驅動;支持Linux操作系統(tǒng),滿足本數(shù)據(jù)采集器硬、軟件的開發(fā)需求。
在電源模塊的設計上,數(shù)據(jù)采集器需要為自身處理器、各控制芯片供電。根據(jù)工業(yè)設備常用電源,最終選定采用24 VDC電源輸入,穩(wěn)壓輸出5 V、3.3 V電源。RS-232及CAN總線接口電路如圖3所示。
本文的數(shù)據(jù)采集器面向工業(yè)通用接口,因此圖2中與各類傳感器連接的RS-232接口及CNA總線接口電路模塊主要包含RS-232模塊、CAN總線、以太網(wǎng)模塊。
圖3 RS-232及CAN總線接口電路
RS-232模塊主要依靠MAX232芯片進行晶體管-晶體管邏輯電平信號(transistor-transistor logic,TTL)電平與RS-232電平之間的轉換,TTL電平與核心模塊串口輸入/輸出接口直接相連。對于CAN總線模塊,由于核心模塊具備了CAN總線控制器的功能,因此只需要增加CAN收發(fā)器即可。此處選用的是MCP2551芯片。
根據(jù)功能定義,數(shù)據(jù)采集器需要完成實時數(shù)據(jù)采集以及Web實時配置訪問兩大功能。數(shù)據(jù)采集器軟件功能構架如圖4所示。
圖4 數(shù)據(jù)采集器軟件功能構架圖
Web實時配置訪問功能是指將采集器作為服務器為用戶開放一個Web界面,用戶不需要修改采集器內部軟件,通過此界面便可增加、刪除傳感器,配置各傳感器的解析協(xié)議、地址等參數(shù)。同時可以觀察數(shù)據(jù)采集器內部數(shù)據(jù)庫的摘要內容,了解數(shù)據(jù)采集器的運行狀態(tài)。
實時數(shù)據(jù)采集功能(data acquisition,DAQ)是數(shù)據(jù)采集器的核心功能,主要包含本地自檢功能,面向多個通信的傳感器采集、處理功能以及遠程傳輸功能。
Linux運行環(huán)境搭建是指在i.MX6Q核心板上移植Linux系統(tǒng),主要步驟如下。
①配置編譯環(huán)境。在計算機端的虛擬機中安裝ubuntu 16.04系統(tǒng),安裝gcc-5.3.1 版本交叉編譯器,并配置相關環(huán)境變量。
②獲取系統(tǒng)源碼。本系統(tǒng)使用的是由天嵌公司提供的TQIMX6_linux_v3.0源碼包(4.1內核)以及相應的u-boot源碼。
③進行內核配置。在編譯源碼前,運行make menuconfig配置系統(tǒng)功能,主要打開串口設備、CAN總線設備的相關配置。
④編譯源碼。分別進入Linux源碼和u-boot源碼根目錄,運行編譯腳本,進行內核編譯和u-boot編譯。
⑤燒錄系統(tǒng)。將編譯完成的zImage文件和dtb文件存入mfgtools工具中,通過USB連接線進行系統(tǒng)燒錄。
實時配置訪問功能是指數(shù)據(jù)采集器為用戶開放Web頁面,用戶可以通過網(wǎng)絡靈活配置數(shù)據(jù)采集器的參數(shù),同時獲知其中數(shù)據(jù)庫的存儲情況。以下將從XML配置文件設計、數(shù)據(jù)庫設計以及Web服務器的開發(fā)三方面介紹具體實現(xiàn)方法。
由于該數(shù)據(jù)采集器主要面向通用的工作環(huán)境,因此有必要設計合適的配置文件以描述系統(tǒng)的各項參數(shù)。配置文件的載體并不統(tǒng)一,常用的主要有INI配置文件、XML配置文件或系統(tǒng)注冊表等。本數(shù)據(jù)采集器選用帶有樹形層次結構、且方便擴展的XML文件[2]。
XML配置文件樹型結構如圖5所示。
圖5 XML配置文件樹型結構圖
SYS為根節(jié)點,第一層分為LOCAL、REMOTE、DAQ三部分,分別代表本地參數(shù)、遠程服務器參數(shù)及傳感器參數(shù)。第二層是第一層的子節(jié)點元素,描述了詳細的參數(shù)設定。其中DAQ下屬二級節(jié)點中,包含的是屬性值num唯一且互不相同的多個Sensor節(jié)點,Sensor節(jié)點下的三級節(jié)點描述了詳細的傳感器參數(shù)設置。
隨著嵌入式設備硬件的升級,目前嵌入式系統(tǒng)中可以支持加入輕量級或中低量級的數(shù)據(jù)庫。通過加入數(shù)據(jù)庫,可以有序地儲存采集到的數(shù)據(jù),同時記錄系統(tǒng)的運行狀態(tài)。
嵌入式Linux系統(tǒng)中常用的數(shù)據(jù)庫為SQlite或Mysql。SQlite的優(yōu)點是功能簡約、小型化、上層應用可以直接訪問數(shù)據(jù)文件,缺點是沒有用戶管理并且不支持并行讀寫。Mysql數(shù)據(jù)庫優(yōu)點是功能全面,有線程池機制,追求最大并發(fā)效率[3],缺點是占用空間較大??紤]到本系統(tǒng)中儲存空間充足,且Mysql需要并發(fā)操作,因此選用Mysql數(shù)據(jù)庫,且選用MyIASM傳統(tǒng)數(shù)據(jù)庫引擎[4]。
根據(jù)功能需求,為數(shù)據(jù)采集器設計了兩個主要表,即daq_status_tb表和data_store_tb表,分別用于儲存DAQ軟件的運行狀態(tài)以及各傳感器的數(shù)據(jù)。data_store_tb表和設計如表1和表2所示。
表1 data_store_tb表設計
表2 daq_status_tb表設計
數(shù)據(jù)采集器中的Web服務器主要提供了操作XML配置文件和讀取數(shù)據(jù)庫的接口。本數(shù)據(jù)采集器選用Apache服務器并配合LAMP(Linux、apache、Mysql、PHP)架構進行開發(fā),同時使用javascript、Ajax等技術以增強頁面交互性。
Web服務器的主要操作對象是數(shù)據(jù)采集器內的XML配置文件以及Mysql數(shù)據(jù)庫。LAMP架構訪問原理如圖6所示。
圖6 LAMP架構訪問原理圖
用戶通過瀏覽器向服務器發(fā)送http請求,Apache服務器接受請求后,調用php處理模塊進行php腳本的處理,進行XML文件的讀寫或Mysql的讀寫。Apache服務器接收php腳本的返回信息,并將結果發(fā)送給瀏覽器。瀏覽器解析后將數(shù)據(jù)呈現(xiàn)至整個網(wǎng)頁。用戶可通過Web瀏覽器實現(xiàn)對數(shù)據(jù)采集器的配置和監(jiān)控。
實時數(shù)據(jù)采集功能主要在Linux平臺上使用C/C++語言進行開發(fā),結合多進程、多線程、驅動開發(fā)等技術以保證整體軟件的穩(wěn)定運行[5]。下面將介紹整體軟件流程以及基本功能的設計與實現(xiàn)。
實時數(shù)據(jù)采集功能中包含的三個并發(fā)運行的功能(本地自檢、傳感器采集、遠程轉發(fā)),但又互相關聯(lián)的。本設計中提出使用Linux系統(tǒng)中的多進程技術來實現(xiàn)三個功能的同時協(xié)調運作[6]。多進程技術與多線程技術相比,優(yōu)勢在于不同進程享有獨立的資源,相互影響較少。
針對其中傳感器采集功能,有三個重要指標:高速性、連續(xù)性和并發(fā)性。采集過程中可能會對多種傳感器同時進行高頻率采集。本設計提出使用Linux系統(tǒng)中的多線程技術來實現(xiàn)多路傳感器的并發(fā)采集、轉發(fā)功能。
整體系統(tǒng)程序流程如圖7所示。軟件系統(tǒng)通過三次fork()函數(shù)向Linux內核申請資源,獲得MONITOR、DAQ、REMOTE三個進程。
圖7 整體系統(tǒng)程序流程圖
MONITOR即監(jiān)控進程,負責實時讀取XML配置文件內容、監(jiān)控REMOTE、DAQ進程的狀況并向Mysql數(shù)據(jù)庫寫入數(shù)據(jù)采集器狀態(tài)。
REMOTE即遠程連接進程,負責建立、維持與遠程服務器的連接,同時定時獲取并轉發(fā)共享數(shù)據(jù)緩沖區(qū)的內容。
DAQ即數(shù)據(jù)采集進程,負責多路傳感器的數(shù)據(jù)采集和處理。DAQ進程會根據(jù)配置文件中的傳感器數(shù)量生成相同數(shù)量的采集線程,每個采集線程在初始化后,依序循環(huán)實現(xiàn)數(shù)據(jù)采集、預處理及轉發(fā)功能。多個采集線程會將采集結果轉發(fā)至系統(tǒng)的共享內存中,由REMOTE進程進行統(tǒng)一轉發(fā)。
三個進程間互有關聯(lián),都需要訪問配置屬性、數(shù)據(jù)緩沖區(qū)等參數(shù)。此部分主要通過共享內存與信號量以實現(xiàn)進程間的互斥通信。
本地自檢功能主要由MONITOR進程實現(xiàn)。該進程會定時對比XML配置文件內容。當檢測到XML配置文件被改變時,會向REMOTE和DAQ進程發(fā)出kill信號,然后創(chuàng)建新的REMOTE進程和DAQ進程。如此便可在不重啟整個軟件的情況下改變系統(tǒng)的參數(shù)配置。
MONITOR進程會定時檢測REMOTE、DAQ進程的存活情況,并在Mysql數(shù)據(jù)庫中寫入數(shù)據(jù)采集器的狀態(tài)。
單個傳感器的數(shù)據(jù)采集是由DAQ進程生成的采集線程來實現(xiàn)的。每個線程根據(jù)傳感器的不同種類調用不同的初始化函數(shù),然后循環(huán)實現(xiàn)數(shù)據(jù)采集、處理及轉發(fā)功能,如圖7中DAQ多線程部分所示。
5.3.1 采集接口初始化
本數(shù)據(jù)采集器所面向的是工業(yè)中常用的RS-232/RS-485總線(如Modbus RTU協(xié)議)、以太網(wǎng)總線(如Modbus TCP協(xié)議)以及CAN總線。接口初始化與驅動層間關系如圖8所示。在進行傳感器初始化時,程序需要調用與硬件底層驅動相關的文件或函數(shù),例如啟動RS-232/RS-485總線需要調用uart.c中的串口初始化函數(shù),啟動以太網(wǎng)總線需要調用socket.c中的socket套接字函數(shù)。初始化后,通過對虛擬文件系統(tǒng)(virtual file system,VFS)的讀寫訪問,即可實現(xiàn)對硬件設備的讀寫[7]。
圖8 接口初始化與驅動層間關系圖
5.3.2 數(shù)據(jù)預處理
數(shù)據(jù)預處理過程是對原始數(shù)據(jù)進行簡單解包、數(shù)據(jù)類型轉化并儲存的過程。定義每條數(shù)據(jù)的格式主要包含數(shù)據(jù)類型、傳感器序號、數(shù)據(jù)包序號、實際數(shù)量及采集時間。傳感器序號用一字節(jié)表示,數(shù)據(jù)包序號用兩字節(jié)(16進制)表示,格式之間用“,”逗號分隔。單個數(shù)據(jù)包格式如圖9所示。
圖9 單個數(shù)據(jù)包格式
經(jīng)預處理后的數(shù)據(jù)將會被儲存至Mysql數(shù)據(jù)庫作為備份,同時被轉存至轉發(fā)緩沖區(qū)中,等待REMOTE進程進行統(tǒng)一轉發(fā)。
5.3.3 數(shù)據(jù)同步轉發(fā)及轉發(fā)緩沖區(qū)設計
整個系統(tǒng)中,REMOTE進程和多個采集線程會頻繁地并發(fā)操作轉發(fā)緩沖區(qū),因此需要避免對內存的誤讀寫操作,否則容易造成內存越界而導致軟件崩潰。針對并發(fā)讀寫的緩沖區(qū),一種有效的方案是采用環(huán)形緩沖區(qū)結構[8]。
環(huán)形緩沖區(qū)是一種先進先出模型,可為頻繁讀寫緩沖區(qū)的過程減少操作步驟。數(shù)據(jù)采集系統(tǒng)中的讀寫操作及環(huán)形緩沖區(qū)結構如圖10所示。
系統(tǒng)中的環(huán)形緩沖區(qū)主要儲存字符數(shù)組的地址,本系統(tǒng)中定義每個字符數(shù)組空間為64字節(jié),環(huán)形緩沖區(qū)總大小為64個元素(即k=64)。環(huán)形緩沖區(qū)內定義了head和tail兩個指針,分別用于讀、寫操作,tail和head之間的灰色區(qū)域表示緩沖區(qū)內已有數(shù)據(jù)。
圖10 讀寫操作及環(huán)形緩沖區(qū)結構圖
緩沖區(qū)的讀寫采用操作系統(tǒng)中經(jīng)典的“生產(chǎn)者-消費者”模型[9]。REMOTE進程負責從緩沖區(qū)中取數(shù)據(jù),主要操作head指針,各個采集線程負責往緩沖區(qū)內寫數(shù)據(jù),操作tail指針。此處的操作是面向共享內存的操作,因此添加了信號量來實現(xiàn)多進程間的互斥訪問:semop(wait)代表取信號的函數(shù)。若緩沖區(qū)正在被其他函數(shù)操作,即會阻塞掛起,直至獲取信號;semop(release)代表釋放當前占用的信號[10]。
該環(huán)形緩沖區(qū)有兩個特殊的設定:一是總是保持一個存儲單元為空,用于區(qū)分緩沖區(qū)內“滿”和“空”的情況;二是允許覆蓋緩沖區(qū)數(shù)據(jù),即在進行寫操作過程中,若緩沖區(qū)已滿,則以新數(shù)據(jù)覆蓋舊數(shù)據(jù)。
遠程轉發(fā)功能由REMOTE進程實現(xiàn),主要實現(xiàn)建立遠程服務器TCP連接、定時發(fā)送心跳包以及打包發(fā)送數(shù)據(jù)。其中,心跳包功能中會實時判斷網(wǎng)絡連通狀況。
數(shù)據(jù)打包協(xié)議如圖11所示。
圖11 數(shù)據(jù)打包協(xié)議圖
在實際應用中,每個傳感器的采集頻率fn不盡相同,REMOTE進程向服務器發(fā)送數(shù)據(jù)的頻率也不易確定。本系統(tǒng)中,由用戶自行設置統(tǒng)一發(fā)送頻率F,REMOTE進程會根據(jù)統(tǒng)一頻率F定時獲取環(huán)形緩沖區(qū)內數(shù)據(jù),進行統(tǒng)一打包、發(fā)送數(shù)據(jù)。這樣做的好處是可以靈活處理發(fā)送頻率:當數(shù)據(jù)實時性要求較高時,設置統(tǒng)一轉發(fā)頻率F高于傳感器的頻率fn,即可實時發(fā)送每個數(shù)據(jù);當數(shù)據(jù)實時性要求不高時,可以設置統(tǒng)一轉發(fā)頻率F最低,同時打包多項數(shù)據(jù),節(jié)約網(wǎng)絡資源。
協(xié)議首部CMD代表操作請求號;daqSerial代表當前數(shù)據(jù)采集器的序列號,用于區(qū)分不同數(shù)據(jù)采集器;SensorNum代表當前在線的傳感器數(shù)量;dataNum代表正文中數(shù)據(jù)包數(shù)量;headLen代表首部長度。正文部分是各個數(shù)據(jù)包的內容,以換行符區(qū)分。
本文主要介紹了基于i.MX6Q核心芯片及嵌入式Linux的工業(yè)通用數(shù)據(jù)采集器設計,完成了采集器硬件系統(tǒng)的設計、基于LAMP架構的Web服務器搭建,以及C/C++數(shù)據(jù)采集軟件的編寫與測試;實現(xiàn)了數(shù)據(jù)采集器實時配置、多路并發(fā)采集儲存數(shù)據(jù)、遠程轉發(fā)數(shù)據(jù)等功能。與傳統(tǒng)的數(shù)據(jù)采集器相比,本文設計不僅通用性更強,而且配置操作更加人性化、網(wǎng)絡化。
系統(tǒng)著重關注多路數(shù)據(jù)采集的并發(fā)性設計以及實際應用的通用性,主要通過多進程、多線程的設計以保證系統(tǒng)各功能的穩(wěn)定運行,同時通過環(huán)形緩沖區(qū)數(shù)據(jù)結構和信號量的操作以實現(xiàn)多路數(shù)據(jù)的并發(fā)讀寫。測試過程中,上位服務器可以穩(wěn)定、準確地接收多個Modbus協(xié)議傳感器的數(shù)據(jù)。