,
(成都職業技術學院 軟件分院,成都 610041)
遠程測控系統使人們可以通過計算機網絡隨時隨地查看和控制現場設備的運行狀態,也可以通過無線數據交換的形式把數據信息傳輸到其它工業測控儀器中。在整個控制系統中,上位機(也就是遠程決策系統)通過指令與數據傳輸控制遠端測控裝置通信,測控模塊的響應機制以及其控制系統工作狀態的穩定性、安全性尤為重要,其控制過程可以基于軟件或硬件實現,軟件實現最大的缺點是可靠性不夠高、響應速度較慢[1],因此對實時性可靠性要求較高的系統更多的是采用專用芯片、高速芯片或者可編程邏輯器CPLD/FPGA來設計實施和驗證,并配合易于建立的、以描述控制特性為主的、應用比較廣泛的有限狀態機(Finite_State_Machine,FSM)的建模方法來實施。
有限狀態機基于數字集成電路系統,大部分是時序電路, 時序電路可以用符號化的有限狀態機來模擬[2],不難發現遠程測控系統的各種控制狀態變化和轉移也可以描述系統的行為,而這些狀態的變化和轉移則形成了狀態機[3]。因此,采用基于狀態機的方法來定義和實現遠程測控是一種穩定、可靠、簡潔的實現方案。本文通過基于FPGA的遠程測控模塊,采用有限狀態機為測控模型,利用Verilog HDL描述,實現了有限狀態機在遠程測控模塊及系統穩定可靠地運行。
FPGA結合了微電子技術、電路技術、EDA技術,使設計者可以集中精力進行所需邏輯功能的設計,縮短設計周期,提高了設計質量。FPGA己經在計算機硬件、工業控制、遙感遙測、雷達聲納、數據處理、智能儀器儀表、廣播電視、醫療電子和現代通信等多種領域中得到廣泛應用。FPGA開發技術己經成為數字系統的科研試驗、樣機調試和中小批量生產和驗證的首選方案[4]。
對于工作點多、通信距離遠、環境惡劣且實時性和可靠性要求比較高的場合,可以利用無線電波來實現主控站與各個子站之間的數據通信,采用這種遠程測控方式有利于實現復雜連線,無需鋪設電纜或光纜,降低了環境成本[5]。本項目設計中,通信距離為3 000 m,采集點較多,采用的無線模塊可以有256個節點,現場FPGA模塊設計有模擬和數字輸入接口,可以接收大部分經過處理的現場傳感數據,根據遠程控制中心的要求實現現場情況的感知以及控制,模塊的輸出設計有數字驅動電路,可以直接控制繼電器、電機等現場設備;遠程計算機通過無線數字傳輸建立與現場模塊的通信,采集的現場數據經過基于人工智能的決策系統發給遠端模塊執行控制功能。系統框圖如圖1所示。

圖1 系統框圖

圖2 無線測控模塊中的數據流關系
本文選擇Verilog HDL來對該邏輯設計的硬件電路進行描述,主要包含以下電路模塊:開關量的采樣、異步通信接口、I2C總線接口、自主定義的模塊與決策端通信狀態機、串行ADC的時序接口、硬件電路信號輸出,以及相關的數據和地址控制電路。實驗階段的芯片選用XILINX SPARTAN3S 250E,其基于SRAM工藝,優點是使用標準的CMOS工藝,不需要任何復雜工序[6]。最后通過ISE開發平臺將整個控制電路集成到一個FPGA芯片中,減少了外界對系統的干擾,便于以后系統升級,對現場電路連接方式的控制較靈活。整個模塊核心的時序電路可以用符號化的有限狀態機來模擬,把一個時序邏輯抽象成一個同步有限狀態機是設計Verilog HDL模塊的關鍵[2]。狀態機在本項目基于FPGA的無線測控模塊設計中的數據流關系如圖2所示。
無線測控模塊在測控系統的地位處于從機或執行現場的地位,模塊的所有功能和動作圍繞主機及決策系統的要求來完成。通常情況是在周期性的間歇狀態中,接收主機的查詢、采集轉換現場數據、存儲現場數據以及向主機回傳;接收主機發送的決策控制數據,更新執行的輸出狀態以及保存當前控制狀態,在其他的時間現場模塊處于空閑狀態。本項目中基于FPGA的遠程測控模塊的主要協議與指令如表1所列。

表1 FPGA 遠程測控模塊的主要協議與指令
在本系統中,基于FPGA的遠端執行模塊以及上位決策主機屬于從主關系,主從狀態機使用層次狀態機的設計方法來設計決策系統,包含一個主狀態機和多個從狀態機。主狀態機起到仲裁控制作用,決定當前有哪些從狀態機可以運行[7]。可以通過設計不同的主狀態機的狀態轉移關系達到不同的控制策略,如分時復用或基于優先級啟動不同的從狀態機等,在本系統主機中除控制可以并行執行外,其它信息的采集均可采用限時輪流詢問的方式,主機的狀態和行為描述在此不再贅述。
作為遠端模塊的從機,其狀態變化來自于第2.2節所描述的協議指令,由于采用可編程邏輯器件這種靈活的硬件設計,因此用基于Verilog HDL的有限狀態機建模,應該主要考慮以下幾點[2]:編碼方案、FSM的綜合實現、狀態機所有狀態的完備以及邊沿觸發器的設計,滿足速度和面積的設計要求。通過以上協議和指令分析可以基本確定在整個控制過程當中模塊的工作狀態,可以用圖形化的方式描述狀態機各個狀態之間的轉換關系,即該設計的狀態轉移圖如圖3所示(以遠程查詢指令為例)。

圖3 狀態轉移圖
根據狀態轉移圖編寫有限狀態機程序,由于Verilog具有并行執行的特點[8],一個指令的判斷模塊輸出指令下跳沿給狀態機,即一個指令只執行一次。下面的程序以主機發送查詢指令FF為例。
//------------判斷FF指令下跳沿---------------
reg[2:0] com_ff_neg;
wire neg_ff_com; //采樣判斷FF指令下跳沿后的輸出
always @ (posedge clk or negedge rst_n)
begin
if(!rst_n)
com_ff_neg <= 3'b111;
else //com_ff來自于無線模塊接收數據
com_ff_neg <={com_ff_neg[1:0],com_ff};
end
assign neg_ff_com = ~com_ff_neg[1] & com_ff_neg[2];
//-------------遠程控制命令FF狀態機-------------
//采樣本地控制模塊的轉換數據,來自于4種傳感器
//寫入本地I2C存儲區后(作為斷電或開機后的本地采樣數據)
//通過無線模塊將該原始數據發送給主機
parameter/*WAIT_FF*/ S0 = 3'b000;
parameter/*SAMPLE0*/ S1 = 3'b001;
parameter/*SAMPLE1*/ S2 = 3'b010;
parameter/*SAMPLE2*/ S3 = 3'b011;
parameter/*TX_LOCAL*/ S4 = 3'b101;
parameter/*TX_END*/ S5= 3'b100;
reg[2:0] state_ff; //主機查詢指令狀態機-狀態
always @ (posedge clk or negedge rst_n)
begin
if(!rst_n) //復位狀態
begin
write_data_loc <=8'b00000000; byte_addr_loc <=3'b000;
state_ff <= S0;
inquiry <= 1'b1;
tx_bytes <= 4'b0; //uart 發送數據字節控制
end
else
case(state_ff)
S0: begin
inquiry <=1;
if(neg_ff_com) //inquiry 低電平啟動采樣
begin
state_ff <= SAMPLE0;
inquiry <=0; //1次寫入本地采樣到I2C
write_data_loc <= local_data[3];
byte_addr_loc <= 3'b011; //LOCAL_ADDR0 +3;
end
else state_ff <=S0;
end
S1: if(cstate == STOP2) // 寫入數據完成
begin
state_ff <= S2;
inquiry <=0; //
write_data_loc <= local_data[4];
byte_addr_loc <= 3'b100; //LOCAL_ADDR0 + 4 ;
end
else state_ff <= S1;
S2: if(cnt_20ms==20'hffff0) //寫入數據完成
begin
state_ff <= S3;
inquiry <=0; //
write_data_loc <= local_data[5];
byte_addr_loc <= 3'b101; //LOCAL_ADDR0 + 5 ;
end
else state_ff <= S2;
S3: if(cnt_20ms==20'hffff0) //寫入數據完成
begin
state_ff <= S4;
inquiry <=0; //
write_data_loc <= local_data[6];
byte_addr_loc <= 3'b110; //LOCAL_ADDR0 + 6 ;
end
else state_ff <= S3;
S4: if(cstate == STOP2)
begin tx_bytes <=BYTE_LENGTH; //發送長度載入
state_ff <=S5;
end
else state_ff <= S4;
S5 : begin
if (tx_num == 4'd11) tx_bytes <= tx_bytes - 1'b1;
if(tx_bytes == 0) state_ff <= S0;
end
default : state_ff <= S0;
endcase
end
主從機的通信和控制模式核心為遠程模塊根據現場數據接收遠端主機的決策控制信號。在本項目中采用的主機為臺式計算機,從機或遠端的執行機構采用本項目設計的基于FPGA的遠程測控模塊。實驗對象為水產養殖環境的信息測量——溫度、溶氧量,主要執行對象是對現
場水環境進行調節控制,控制對象為充氧機和進出水泵,由于模塊本身的輸出電壓基本為3.3 V,因此需要在輸出端加驅動及保護控制繼電器。
增氧泵是系統的主要控制對象之一,它是否正常工作直接決定了能否為魚塘充氧。增氧能力和動力效率是衡量增氧泵性能的重要指標,增氧能力是指每小時溶解到水中的氧氣的重量,動力效率是指在一定的條件下(如溫度)單位千瓦輸出功率的增氧能力。為了達到良好的增氧效果,系統選用葉輪式增氧泵[9]。在模塊的電路中設有兩片高耐壓、大電流復合晶體管IC——ULN2003,可以輸出14路驅動控制信號,其輸入端與FPGA-I/O口直接相連。
系統初始化后,主機通過采樣指令開始接收傳感器檢測到的各項數據,依次獲取溶氧量、溫度等參數,將獲取值與設定值比較,根據專家決策做出相應的動作從而實現自動控制。溫度傳感器采用 AD590,AD590為電流型溫度傳感器,它有非常好的線性輸出性能。當環境溫度為0 ℃時,其輸出電流為273 μA ,流過AD590的電流與絕對溫度成正比,溫度每增加1 ℃其輸出電流增加1 μA,即電流與溫度的關系是:I=(273+T) μA[10]。本項目現場模塊不對傳感器數值做任何判定和描述,直接根據時序傳遞給后端主機,由主機根據數據庫或專家決策系統做出相應的顯示和控制。
應用測試中,將本地模塊放于浮標桶內,采用干電池供電,在距離1000 m左右的室內對采集數據進行比較分析,時間跨度從早上9點到下午5點,間隔采樣時間為1小時,可以看出,該模塊對水養殖環境信息的檢測與標準參考值的相對誤差基本滿足使用需求。測試結果如表2所列。

表2 無線測控模塊對水產養殖信息的測試 測試時間:2017.08.04

[1] 唐健隆,梁自澤,蔡麗,等.基于狀態機的巡線機器人控制系統設計[J].機器人技術,2008,24(1-2):247-249.
[2] 陳勇.有限狀態機的建模與優化設計[J].重慶工學院學報:自然科學版,2007,21(5):55-58.
[3] 熊振云,阮俊波,金惠華.嵌入式軟件中狀態機的抽象與實現[J].計算機應用,2003,23(10):84-86.
[4] 孔利東.基于FPGA的數據采集與處理技術的研究[D].武漢:武漢理工大學,2007.
[5] 孫先逵,秦嵐.遠程測控技術的發展現狀和趨勢[J].儀器儀表學報,2004(8):562-564.
[6] Clive Max Maxfield.The Design Warrior’s Guide to FPGAs Devices,Tools and Flows[M].杜生海,等譯.北京:人民郵電出版社,2007:221-225.
[7] 豐平,馬曉川,陳模江.主從并行狀態機用于復雜FPGA控制系統設計[J].微計算機應用,2009,30(6):1-5.
[8] 夏宇聞.Verilog數字系統設計教程[M].北京:北京航空航天大學出版社,2003.
[9] 劉海陸.基于 GSM 的魚塘增氧泵的遠程控制研究[D].舟山:浙江海洋學院,2014.
[10] 劉冬香.基于CPLD/FPGA的溫度測控系統的設計[J].機電工程技術,2009,38(12):20-21.
林永宏(高級工程師),主要研究方向為應用電子、嵌入式系統設計;邱紹峰(副教授),主要研究方向為圖像處理、電子技術應用。