劉俊宇,趙立宏
(南華大學(xué) 機(jī)械工程學(xué)院,湖南 衡陽 421001)
目前,卷煙廠所使用的卷煙機(jī)大多采用管道煙絲送料[1],卷煙機(jī)工作過程中,煙絲料全部由氣力輸送。當(dāng)卷煙機(jī)以每分鐘生產(chǎn)7 000支或更高的生產(chǎn)速度工況下,送絲管內(nèi)風(fēng)速小于16 m/s,煙絲供應(yīng)不足;而當(dāng)管道內(nèi)風(fēng)速高于25 m/s時(shí)又會(huì)造成煙絲質(zhì)量下降[2]。依據(jù)卷煙廠生產(chǎn)經(jīng)驗(yàn),當(dāng)煙絲速度控制在9-11 m/s時(shí),既能保證卷煙機(jī)中煙絲給入量充足、不影響正常生產(chǎn),又能使管道內(nèi)大部分煙絲處于懸浮狀態(tài),最大程度減小了燥碎,提高了卷煙質(zhì)量。由于管道中煙絲速率較快,實(shí)現(xiàn)煙絲速度的實(shí)時(shí)監(jiān)測(cè)需要處理大量數(shù)據(jù),同時(shí)也對(duì)系統(tǒng)數(shù)據(jù)傳輸速率提出一定要求。因此該設(shè)計(jì)采用更大并行度的現(xiàn)場(chǎng)可編程邏輯門陣列(FPGA)作為控制核心,使用Modbus協(xié)議為數(shù)據(jù)鏈路傳遞有效數(shù)據(jù),使其高效快速的將煙絲測(cè)速儀處理完的數(shù)據(jù)傳送到上位機(jī)和其它子模塊。
Modbus是1979年由Modicon公司發(fā)表的一種串行通信協(xié)議,由于其簡(jiǎn)單、開放的特點(diǎn)已成為工業(yè)通信領(lǐng)域的行業(yè)標(biāo)準(zhǔn),在電子通信領(lǐng)域得到廣泛的應(yīng)用。Modbus有RTU(Remote Terminal Unit)和ASCII兩種模式,都是以幀報(bào)文的形式傳輸數(shù)據(jù)。但在同等情況下,RTU模式比ASCII模式的數(shù)據(jù)密度更大,更適合多字節(jié)數(shù)據(jù)的傳輸。RTU模式下,一幀報(bào)文包括:地址碼、功能碼、數(shù)據(jù)和校驗(yàn)碼,見表1。由于每個(gè)數(shù)據(jù)都是16進(jìn)制,因此在理論上,每個(gè)Modbus網(wǎng)絡(luò)可以掛載255個(gè)從機(jī)。不同的碼有著不同功能,如功能碼06為預(yù)置單寄存器,功能碼16為預(yù)置多寄存器等。功能不同數(shù)據(jù)長度和結(jié)構(gòu)也有所不同,因此每幀報(bào)文發(fā)送完成后,間隔3.5個(gè)字符時(shí)長,標(biāo)志著一幀報(bào)文的結(jié)束[3]。
表1 Modbus報(bào)文格式圖Tab.1 Modbus message format diagram
本次實(shí)驗(yàn)采用Altera公司的MAX 10 FPGA,該芯片在眾多FPGA中屬于低成本的一款,性價(jià)比較高,內(nèi)部嵌入豐富的存儲(chǔ)資源和乘法器資源,加上FPGA本身并行度較高,足夠?qū)Ω咚龠\(yùn)動(dòng)的煙絲進(jìn)行采樣計(jì)算。并且該FPGA內(nèi)部集成度比較高,集成了鎖相環(huán)(PLL)、RAM、PLD邏輯等。特別是雙數(shù)模轉(zhuǎn)換(ADC)通道,能直接滿足數(shù)據(jù)采集要求,減少了硬件設(shè)計(jì)要求,簡(jiǎn)化了設(shè)計(jì)流程,節(jié)約了時(shí)間成本。
數(shù)據(jù)采集傳輸硬件系統(tǒng),由信號(hào)調(diào)理電路、FPGA、數(shù)模(DA)轉(zhuǎn)換模塊和顯示模塊組成。FPGA是整個(gè)電路的控制中心,負(fù)責(zé)連接控制各個(gè)硬件部分,并用算法實(shí)現(xiàn)對(duì)煙絲速度的求取。傳感器電信號(hào)經(jīng)信號(hào)調(diào)理電路處理后,由FPGA集成的ADC模塊讀取。數(shù)據(jù)傳輸硬件基于RS485連接的通信鏈路,通過FPGA分別將計(jì)算得到的煙絲速度和質(zhì)量系數(shù)通過Modbus協(xié)議傳送到鏈路上的其它模塊。如顯示模塊,實(shí)現(xiàn)數(shù)據(jù)傳輸?shù)狡渌刂颇K以及上位機(jī)的可視化。DA模塊除了將接收到的數(shù)據(jù)轉(zhuǎn)換成模擬量外,還完成開關(guān)量的輸入讀取功能。根據(jù)開關(guān)量的通斷,提供DA模塊是否正常運(yùn)行的標(biāo)志。數(shù)據(jù)采集傳輸系統(tǒng)的架構(gòu)如圖1所示。
圖1 數(shù)據(jù)采集傳輸系統(tǒng)硬件框圖Fig.1 Hardware block diagram of data acquisition and transmission system
FPGA遵從自上而下的設(shè)計(jì)原則,頂層模塊只進(jìn)行各個(gè)子模塊的例化和連接[4]。為節(jié)省資源和提升系統(tǒng)整體速度,采取完成一個(gè)數(shù)據(jù)的計(jì)算則發(fā)送一個(gè)數(shù)據(jù)的方式。Modbus通信模塊連接如圖2所示。
圖2 Modbus通信部分功能模塊圖Fig.2 Modbus communication function module diagram
該模塊主要功能是根據(jù)項(xiàng)目要求控制發(fā)送和接收??刂撇糠钟梢粋€(gè)狀態(tài)機(jī)組成,狀態(tài)機(jī)控制FPGA從內(nèi)部數(shù)據(jù)寄存器內(nèi)讀取數(shù)據(jù),把數(shù)據(jù)按格式轉(zhuǎn)換成Modbus協(xié)議所規(guī)定的報(bào)文形式,并存儲(chǔ)到該模塊的數(shù)據(jù)寄存器中。之后將報(bào)文發(fā)送到CRC校驗(yàn)?zāi)K。驗(yàn)證正確后,給發(fā)送模塊發(fā)送報(bào)文,并且根據(jù)發(fā)送、接收等模塊返回的標(biāo)志位進(jìn)行狀態(tài)判斷,控制不同的狀態(tài)轉(zhuǎn)換,達(dá)到能夠按要求控制485總線上數(shù)據(jù)發(fā)送和接收的目的。
發(fā)送模塊基于普通串口通信原理,將Modbus報(bào)文分成若干個(gè)字節(jié),每次需要發(fā)送10位數(shù)據(jù),其中包括8位有效數(shù)據(jù)、1位起始位和1位停止位[5]。主機(jī)上485芯片DE端電平上升沿,作為每個(gè)字符發(fā)送起始標(biāo)志(DE端電位由FPGA控制),采用定時(shí)計(jì)數(shù)器,當(dāng)數(shù)據(jù)發(fā)送到停止位正中時(shí),計(jì)時(shí)器停止計(jì)時(shí),并將該計(jì)時(shí)器停止標(biāo)志位作為一個(gè)字節(jié)數(shù)據(jù)發(fā)送完成標(biāo)志。一幀報(bào)文發(fā)送完成后,發(fā)送模塊會(huì)產(chǎn)生一個(gè)標(biāo)志位,并將該標(biāo)志位傳遞給發(fā)送/接收控制模塊。每幀報(bào)文起始位標(biāo)志的實(shí)現(xiàn)采用定時(shí)器判斷,保證每幀報(bào)文之間間隔不小于3.5個(gè)字符時(shí)長。
接收模式中,485芯片的DE端必須拉低控制,為保證主機(jī)能夠接收到各從機(jī)返回?cái)?shù)據(jù),除發(fā)送模式外,其它時(shí)間將DE端拉低,等待接收數(shù)據(jù)。檢測(cè)到串口有數(shù)據(jù)輸入時(shí),接收模塊接收一個(gè)字節(jié)有效數(shù)據(jù),并存入寄存器的高8位,第二個(gè)字節(jié)存入寄存器的9-16位,以此類推,直到一幀報(bào)文接收完畢。Modbus每一幀報(bào)文都有固定的格式,如果格式位數(shù)與接收數(shù)據(jù)寄存器位數(shù)不匹配,或CRC檢驗(yàn)?zāi)K發(fā)現(xiàn)數(shù)據(jù)不正確,則接收數(shù)據(jù)失敗,將丟棄該幀接收的報(bào)文。
Modbus通信協(xié)議報(bào)文最后兩個(gè)字符都由CRC校驗(yàn)碼組成。CRC校驗(yàn)步驟如下:
(1)定義一個(gè)16位的CRC寄存器,用于寄存CRC校驗(yàn)碼,初始值為0XFFFF[6]。
(2)將報(bào)文第一個(gè)字節(jié)的數(shù)值與CRC寄存器中數(shù)據(jù)進(jìn)行異或,并將結(jié)果替換原CRC寄存器中數(shù)據(jù)。
(3)將CRC寄存器中數(shù)據(jù)右移一位,高位補(bǔ)“0”,同時(shí)檢測(cè)移出位,如果為“0”,則重復(fù)該步驟,如果移出位為“1”,將CRC寄存器數(shù)據(jù)與0XA001異或并將結(jié)果保存至CRC寄存器中。重復(fù)移動(dòng)8次,便處理完一個(gè)字節(jié)數(shù)據(jù)。
(4)按順序由高到低將報(bào)文中每一字節(jié)重復(fù)執(zhí)行步驟(2)、(3),直到報(bào)文數(shù)據(jù)全都處理完畢,最終CRC寄存器中的值即為CRC校驗(yàn)碼。
(1)提供4路測(cè)速數(shù)據(jù)模擬量輸出。其分別為煙絲速度、質(zhì)量系數(shù)的電壓和電流模擬量。電流型模擬量數(shù)據(jù)輸出范圍4-20 mA,電壓型模擬量輸出直流0-10 V。測(cè)速過程中需保證模擬量輸出的連續(xù)性,且每兩個(gè)數(shù)據(jù)間隔不超過40 ms/次。
(2)根據(jù)輸入信號(hào)(讀開關(guān)量)清零數(shù)據(jù)和保持?jǐn)?shù)據(jù)。提供24 V DC開關(guān)量測(cè)速裝置的狀態(tài),指示模擬電壓、電流輸出是否正確。
(3)提供一個(gè)實(shí)時(shí)測(cè)速顯示,至少達(dá)小數(shù)點(diǎn)后兩位。測(cè)速數(shù)據(jù)要求每秒鐘顯示10個(gè)數(shù)據(jù)以上。
該系統(tǒng)采用Mentor公司的Modelsim仿真軟件與FPGA內(nèi)部的嵌入式邏輯分析儀(Signaltap)結(jié)合調(diào)試。由于煙絲速度值和質(zhì)量系數(shù)的模擬電壓、電流輸出是連續(xù)的,因此FPGA主機(jī)必須連續(xù)不斷的向DA模塊發(fā)送更新的報(bào)文,并且每幀報(bào)文間隔小于40 ms。
在原有通信的前提下,調(diào)試的重點(diǎn)是提高數(shù)據(jù)更新速率。調(diào)試主要采用以下3種方式:
(1)提高波特率。提高波特率則能加快數(shù)據(jù)傳輸速率。1個(gè)字節(jié)數(shù)據(jù)需要傳輸10位數(shù)據(jù),當(dāng)波特率為9 600 bps情況下,傳輸時(shí)間為:10×1/9 600,約1 ms。發(fā)送一幀8字節(jié)的報(bào)文所需要的時(shí)間大約8.3 ms,將波特率提高到38 400 bps后,發(fā)送8字節(jié)報(bào)文所需時(shí)間小于2.1 ms。當(dāng)然,波特率并非越高越好,波特率越大傳輸數(shù)據(jù)準(zhǔn)確性越難以保證,最終通過調(diào)試采用波特率為38 400 bps。
(2)合并報(bào)文發(fā)送。速度、質(zhì)量系數(shù)總共4路模擬量輸出,一次寫一個(gè)寄存器,需要發(fā)送4幀報(bào)文,每幀報(bào)文8字節(jié),總共需要發(fā)送32個(gè)字節(jié)。如果采用Modbus功能碼10,一次直接向DA模塊連續(xù)寫入四個(gè)寄存器的值,僅需17個(gè)字節(jié),除去每幀報(bào)文之間的3.5個(gè)字符的起始標(biāo)志時(shí)間,合并發(fā)送報(bào)文時(shí)間可縮減一半。
(3)充分利用總線空閑。在保證模擬量連續(xù)發(fā)送情況下,可在向DA模塊發(fā)送報(bào)文后,總線空閑的時(shí)間內(nèi)完成發(fā)送顯示報(bào)文、讀開關(guān)量輸入等操作??砂匆笤趦蓭瑢慏A模塊內(nèi)寄存器的報(bào)文之間,插入一幀送顯示報(bào)文或者讀取開關(guān)量輸入。需要注意,在中間插入新的報(bào)文時(shí)要確保發(fā)送報(bào)文時(shí)間小于空閑時(shí)間,否則會(huì)影響模擬量輸出的連續(xù)性。Modelsim部分波形仿真圖如圖3所示。
圖3 Modelsim仿真圖Fig.3 Modelsim simulation diagram
由于管道中煙絲運(yùn)動(dòng)速率是無規(guī)律的,測(cè)試中采用FPGA計(jì)數(shù)器產(chǎn)生一組有規(guī)律的模擬數(shù)據(jù),將模擬數(shù)據(jù)寫入FPGA的數(shù)據(jù)寄存器中,觀察儀器運(yùn)行狀況。通過485轉(zhuǎn)USB模塊,將485總線上數(shù)據(jù)讀入PC端,將接收到數(shù)據(jù)與發(fā)送數(shù)據(jù)進(jìn)行比對(duì),通過比對(duì)發(fā)現(xiàn)總線上與發(fā)送數(shù)據(jù)完全一致。串口調(diào)試工具讀取數(shù)據(jù)如圖4所示。
圖4 串口調(diào)試模塊讀取數(shù)據(jù)圖Fig.4 The serial debugging module read data graph
測(cè)試過程中發(fā)現(xiàn),通過USB將總線上數(shù)據(jù)讀出并未出現(xiàn)異常,用示波器觀察DA模塊輸出模擬量數(shù)據(jù)也正常,但是現(xiàn)實(shí)模塊顯示數(shù)據(jù)有時(shí)出現(xiàn)異常。最終通過示波器觀察485總線上A、B的波形發(fā)現(xiàn),DA模塊和顯示模塊在接收到一幀Modbus的報(bào)文后,返回一幀報(bào)文,DA模塊返回報(bào)文狀態(tài)如圖5中“1”處所示。由于返回的一幀報(bào)文與發(fā)送報(bào)文在同一時(shí)刻占用485總線,造成與顯示模塊通訊的偶然混亂,導(dǎo)致顯示異常。而USB模塊掛載到485總線上屬于從機(jī),只會(huì)接收主機(jī)發(fā)送的數(shù)據(jù),沒有檢測(cè)到其它模塊返回?cái)?shù)據(jù)。
最終通過合理延時(shí),在DA輸出合理空隙范圍內(nèi),將DA模塊返回幀算入占用總線時(shí)長,錯(cuò)開返回幀與發(fā)送報(bào)文幀的時(shí)間,調(diào)整顯示數(shù)據(jù)報(bào)文發(fā)送時(shí)間,拉低顯示模塊485發(fā)送數(shù)據(jù)使能端,讓顯示模塊僅處于接收狀態(tài)等方式,解決了顯示紊亂的問題。
圖5 485總線A、B線波形圖Fig.5 A and B line waveform of 485 bus
該設(shè)計(jì)基于MAX 10 FPGA,通過Modbus協(xié)議搭載RS485芯片,采用主從通信的方式,將煙絲測(cè)速儀中煙絲的數(shù)據(jù)轉(zhuǎn)換成模擬量,同時(shí)在顯示模塊上顯示數(shù)字量。最終測(cè)試得出模擬量每35 ms更新一次,顯示模塊顯示數(shù)據(jù)每秒鐘更新10次,能夠準(zhǔn)確讀取提供的開關(guān)量,并做出相應(yīng)處理。目前該煙絲測(cè)速儀的樣機(jī)已經(jīng)設(shè)計(jì)完成,在風(fēng)力送絲機(jī)管道上,能夠在誤差允許范圍內(nèi),測(cè)量出管道中高速運(yùn)動(dòng)的煙絲,并將各接口數(shù)據(jù)傳遞到相應(yīng)的上位機(jī)控制系統(tǒng)中。