劉俊宇,趙立宏
(南華大學 機械工程學院,湖南 衡陽 421001)
目前,卷煙廠所使用的卷煙機大多采用管道煙絲送料[1],卷煙機工作過程中,煙絲料全部由氣力輸送。當卷煙機以每分鐘生產7 000支或更高的生產速度工況下,送絲管內風速小于16 m/s,煙絲供應不足;而當管道內風速高于25 m/s時又會造成煙絲質量下降[2]。依據卷煙廠生產經驗,當煙絲速度控制在9-11 m/s時,既能保證卷煙機中煙絲給入量充足、不影響正常生產,又能使管道內大部分煙絲處于懸浮狀態,最大程度減小了燥碎,提高了卷煙質量。由于管道中煙絲速率較快,實現煙絲速度的實時監測需要處理大量數據,同時也對系統數據傳輸速率提出一定要求。因此該設計采用更大并行度的現場可編程邏輯門陣列(FPGA)作為控制核心,使用Modbus協議為數據鏈路傳遞有效數據,使其高效快速的將煙絲測速儀處理完的數據傳送到上位機和其它子模塊。
Modbus是1979年由Modicon公司發表的一種串行通信協議,由于其簡單、開放的特點已成為工業通信領域的行業標準,在電子通信領域得到廣泛的應用。Modbus有RTU(Remote Terminal Unit)和ASCII兩種模式,都是以幀報文的形式傳輸數據。但在同等情況下,RTU模式比ASCII模式的數據密度更大,更適合多字節數據的傳輸。RTU模式下,一幀報文包括:地址碼、功能碼、數據和校驗碼,見表1。由于每個數據都是16進制,因此在理論上,每個Modbus網絡可以掛載255個從機。不同的碼有著不同功能,如功能碼06為預置單寄存器,功能碼16為預置多寄存器等。功能不同數據長度和結構也有所不同,因此每幀報文發送完成后,間隔3.5個字符時長,標志著一幀報文的結束[3]。

表1 Modbus報文格式圖Tab.1 Modbus message format diagram
本次實驗采用Altera公司的MAX 10 FPGA,該芯片在眾多FPGA中屬于低成本的一款,性價比較高,內部嵌入豐富的存儲資源和乘法器資源,加上FPGA本身并行度較高,足夠對高速運動的煙絲進行采樣計算。并且該FPGA內部集成度比較高,集成了鎖相環(PLL)、RAM、PLD邏輯等。特別是雙數模轉換(ADC)通道,能直接滿足數據采集要求,減少了硬件設計要求,簡化了設計流程,節約了時間成本。
數據采集傳輸硬件系統,由信號調理電路、FPGA、數模(DA)轉換模塊和顯示模塊組成。FPGA是整個電路的控制中心,負責連接控制各個硬件部分,并用算法實現對煙絲速度的求取。傳感器電信號經信號調理電路處理后,由FPGA集成的ADC模塊讀取。數據傳輸硬件基于RS485連接的通信鏈路,通過FPGA分別將計算得到的煙絲速度和質量系數通過Modbus協議傳送到鏈路上的其它模塊。如顯示模塊,實現數據傳輸到其它控制模塊以及上位機的可視化。DA模塊除了將接收到的數據轉換成模擬量外,還完成開關量的輸入讀取功能。根據開關量的通斷,提供DA模塊是否正常運行的標志。數據采集傳輸系統的架構如圖1所示。

圖1 數據采集傳輸系統硬件框圖Fig.1 Hardware block diagram of data acquisition and transmission system
FPGA遵從自上而下的設計原則,頂層模塊只進行各個子模塊的例化和連接[4]。為節省資源和提升系統整體速度,采取完成一個數據的計算則發送一個數據的方式。Modbus通信模塊連接如圖2所示。

圖2 Modbus通信部分功能模塊圖Fig.2 Modbus communication function module diagram
該模塊主要功能是根據項目要求控制發送和接收。控制部分由一個狀態機組成,狀態機控制FPGA從內部數據寄存器內讀取數據,把數據按格式轉換成Modbus協議所規定的報文形式,并存儲到該模塊的數據寄存器中。之后將報文發送到CRC校驗模塊。驗證正確后,給發送模塊發送報文,并且根據發送、接收等模塊返回的標志位進行狀態判斷,控制不同的狀態轉換,達到能夠按要求控制485總線上數據發送和接收的目的。
發送模塊基于普通串口通信原理,將Modbus報文分成若干個字節,每次需要發送10位數據,其中包括8位有效數據、1位起始位和1位停止位[5]。主機上485芯片DE端電平上升沿,作為每個字符發送起始標志(DE端電位由FPGA控制),采用定時計數器,當數據發送到停止位正中時,計時器停止計時,并將該計時器停止標志位作為一個字節數據發送完成標志。一幀報文發送完成后,發送模塊會產生一個標志位,并將該標志位傳遞給發送/接收控制模塊。每幀報文起始位標志的實現采用定時器判斷,保證每幀報文之間間隔不小于3.5個字符時長。
接收模式中,485芯片的DE端必須拉低控制,為保證主機能夠接收到各從機返回數據,除發送模式外,其它時間將DE端拉低,等待接收數據。檢測到串口有數據輸入時,接收模塊接收一個字節有效數據,并存入寄存器的高8位,第二個字節存入寄存器的9-16位,以此類推,直到一幀報文接收完畢。Modbus每一幀報文都有固定的格式,如果格式位數與接收數據寄存器位數不匹配,或CRC檢驗模塊發現數據不正確,則接收數據失敗,將丟棄該幀接收的報文。
Modbus通信協議報文最后兩個字符都由CRC校驗碼組成。CRC校驗步驟如下:
(1)定義一個16位的CRC寄存器,用于寄存CRC校驗碼,初始值為0XFFFF[6]。
(2)將報文第一個字節的數值與CRC寄存器中數據進行異或,并將結果替換原CRC寄存器中數據。
(3)將CRC寄存器中數據右移一位,高位補“0”,同時檢測移出位,如果為“0”,則重復該步驟,如果移出位為“1”,將CRC寄存器數據與0XA001異或并將結果保存至CRC寄存器中。重復移動8次,便處理完一個字節數據。
(4)按順序由高到低將報文中每一字節重復執行步驟(2)、(3),直到報文數據全都處理完畢,最終CRC寄存器中的值即為CRC校驗碼。
(1)提供4路測速數據模擬量輸出。其分別為煙絲速度、質量系數的電壓和電流模擬量。電流型模擬量數據輸出范圍4-20 mA,電壓型模擬量輸出直流0-10 V。測速過程中需保證模擬量輸出的連續性,且每兩個數據間隔不超過40 ms/次。
(2)根據輸入信號(讀開關量)清零數據和保持數據。提供24 V DC開關量測速裝置的狀態,指示模擬電壓、電流輸出是否正確。
(3)提供一個實時測速顯示,至少達小數點后兩位。測速數據要求每秒鐘顯示10個數據以上。
該系統采用Mentor公司的Modelsim仿真軟件與FPGA內部的嵌入式邏輯分析儀(Signaltap)結合調試。由于煙絲速度值和質量系數的模擬電壓、電流輸出是連續的,因此FPGA主機必須連續不斷的向DA模塊發送更新的報文,并且每幀報文間隔小于40 ms。
在原有通信的前提下,調試的重點是提高數據更新速率。調試主要采用以下3種方式:
(1)提高波特率。提高波特率則能加快數據傳輸速率。1個字節數據需要傳輸10位數據,當波特率為9 600 bps情況下,傳輸時間為:10×1/9 600,約1 ms。發送一幀8字節的報文所需要的時間大約8.3 ms,將波特率提高到38 400 bps后,發送8字節報文所需時間小于2.1 ms。當然,波特率并非越高越好,波特率越大傳輸數據準確性越難以保證,最終通過調試采用波特率為38 400 bps。
(2)合并報文發送。速度、質量系數總共4路模擬量輸出,一次寫一個寄存器,需要發送4幀報文,每幀報文8字節,總共需要發送32個字節。如果采用Modbus功能碼10,一次直接向DA模塊連續寫入四個寄存器的值,僅需17個字節,除去每幀報文之間的3.5個字符的起始標志時間,合并發送報文時間可縮減一半。
(3)充分利用總線空閑。在保證模擬量連續發送情況下,可在向DA模塊發送報文后,總線空閑的時間內完成發送顯示報文、讀開關量輸入等操作。可按要求在兩幀寫DA模塊內寄存器的報文之間,插入一幀送顯示報文或者讀取開關量輸入。需要注意,在中間插入新的報文時要確保發送報文時間小于空閑時間,否則會影響模擬量輸出的連續性。Modelsim部分波形仿真圖如圖3所示。

圖3 Modelsim仿真圖Fig.3 Modelsim simulation diagram
由于管道中煙絲運動速率是無規律的,測試中采用FPGA計數器產生一組有規律的模擬數據,將模擬數據寫入FPGA的數據寄存器中,觀察儀器運行狀況。通過485轉USB模塊,將485總線上數據讀入PC端,將接收到數據與發送數據進行比對,通過比對發現總線上與發送數據完全一致。串口調試工具讀取數據如圖4所示。

圖4 串口調試模塊讀取數據圖Fig.4 The serial debugging module read data graph
測試過程中發現,通過USB將總線上數據讀出并未出現異常,用示波器觀察DA模塊輸出模擬量數據也正常,但是現實模塊顯示數據有時出現異常。最終通過示波器觀察485總線上A、B的波形發現,DA模塊和顯示模塊在接收到一幀Modbus的報文后,返回一幀報文,DA模塊返回報文狀態如圖5中“1”處所示。由于返回的一幀報文與發送報文在同一時刻占用485總線,造成與顯示模塊通訊的偶然混亂,導致顯示異常。而USB模塊掛載到485總線上屬于從機,只會接收主機發送的數據,沒有檢測到其它模塊返回數據。
最終通過合理延時,在DA輸出合理空隙范圍內,將DA模塊返回幀算入占用總線時長,錯開返回幀與發送報文幀的時間,調整顯示數據報文發送時間,拉低顯示模塊485發送數據使能端,讓顯示模塊僅處于接收狀態等方式,解決了顯示紊亂的問題。

圖5 485總線A、B線波形圖Fig.5 A and B line waveform of 485 bus
該設計基于MAX 10 FPGA,通過Modbus協議搭載RS485芯片,采用主從通信的方式,將煙絲測速儀中煙絲的數據轉換成模擬量,同時在顯示模塊上顯示數字量。最終測試得出模擬量每35 ms更新一次,顯示模塊顯示數據每秒鐘更新10次,能夠準確讀取提供的開關量,并做出相應處理。目前該煙絲測速儀的樣機已經設計完成,在風力送絲機管道上,能夠在誤差允許范圍內,測量出管道中高速運動的煙絲,并將各接口數據傳遞到相應的上位機控制系統中。