吳 凱,張明珠
(上海齊耀螺桿機械有限公司,上海 201100)
濾波是從含有干擾的接收信號中提取有用信號的一種技術(shù)。干擾信號在工程中一般可以分為兩種:一種是隨機性的脈沖,此種干擾毫無規(guī)律性可言;另一種包含周期性的干擾信號。兩種干擾信號的波形分別如圖1 和圖2 所示[1]。
圖1 隨機脈沖干擾信號
圖2 周期性干擾信號
針對上述兩種不同的干擾信號,工程上一般會設(shè)計不一樣的濾波算法進行濾波。濾波算法也稱濾波器,一般分為模擬濾波器和數(shù)字濾波器兩種。模擬濾波器的濾波過程如圖3 所示。模擬濾波器一般采用由電子元件搭建的電路進行濾波。模擬信號經(jīng)過模擬濾波器后再進入A/D 轉(zhuǎn)換環(huán)節(jié)轉(zhuǎn)換為數(shù)字信號,濾波在A/D 轉(zhuǎn)換之前就完成了。針對不同的干擾信號,需要設(shè)計不同的濾波電路[2]。
圖3 模擬濾波過程
數(shù)字濾波器的濾波過程如圖4 所示,因為其濾波過程在A/D 轉(zhuǎn)換以后進行,所以其相對于模擬濾波器來說更加靈活,只需要改變不一樣的算法就可處理不同的干擾信號。工程中常用的濾波算法有算術(shù)平均濾波法、加權(quán)平均濾波法、中位值平均濾波法以及限幅濾波法。本文主要介紹平均值濾波法,其主要用來消除周期性的干擾信號。
圖4 數(shù)字濾波過程
博圖平臺內(nèi)處理的模擬量原始數(shù)據(jù)來源可以是模擬量模塊的輸入、網(wǎng)絡(luò)傳輸?shù)臄?shù)據(jù)以及內(nèi)部程序塊二次處理的輸出。平均值濾波是對一組數(shù)據(jù)求平均值,在可編程邏輯控制器(Programmable Logic Controller,PLC)中以窗口的形式來處理數(shù)據(jù)。先在PLC 中定義窗口值大小,軟件按照窗口值定義數(shù)組,針對這一組數(shù)據(jù)進行處理。數(shù)據(jù)窗口值的處理方式又分為固定窗口和滑動窗口兩種[3]。
固定窗口處理中,數(shù)據(jù)按照掃描周期依次填滿整個窗口,當(dāng)窗口滿時,對窗口內(nèi)的數(shù)據(jù)求取平均值。之后拋棄整組數(shù)據(jù),重新開始填滿窗口,直至窗口再次充滿,再求平均值。
對于固定窗口來講,第一組求平均的數(shù)據(jù)和第二組的數(shù)據(jù)在時間上是完全不同的兩組數(shù)據(jù),每組數(shù)據(jù)都不包含之前的信息。在程序執(zhí)行上,求取平均值不是每周期執(zhí)行的,而是每n周期執(zhí)行一次,n是設(shè)置的窗口值。如圖5 所示,每5 個周期存滿一組數(shù)據(jù),求取一次平均值。當(dāng)窗口值比較大,會產(chǎn)生比較大的滯后。
圖5 固定窗口處理
滑動窗口處理中,數(shù)據(jù)充滿窗口后求取平均值,再有新數(shù)據(jù)進入時窗口向右滑動,舍棄最舊的數(shù)據(jù),加入最新的數(shù)據(jù),再求取平均值。對于滑動窗口,當(dāng)窗口充滿之后,每次加入新數(shù)據(jù)舍棄最舊的數(shù)據(jù),每個周期都會求取平均值。在PLC 中,當(dāng)窗口被充滿,新的數(shù)據(jù)會覆蓋最初的數(shù)據(jù),形成一個環(huán)形的數(shù)據(jù)隊列,如圖6 所示。
圖6 滑動窗口處理
針對滑動窗口優(yōu)化后的環(huán)形隊列的數(shù)據(jù)存儲算法如圖7 所示。
圖7 環(huán)形窗口
此方式定義頭指針和尾指針兩個指針。頭指針初始化為-1,尾指針初始化為0。
第一個周期,數(shù)據(jù)寫入尾指針指向的元素0,然后尾指針后移,將頭指針賦值為0 指向第一個元素;
第二個周期,數(shù)據(jù)寫入尾指針指向的元素1,然后尾指針后移,頭指針不變;
第三個周期,數(shù)據(jù)寫入尾指針指向的元素2,然后尾指針后移,頭指針不變;
第四個周期,數(shù)據(jù)寫入尾指針指向的元素3,然后尾指針后移,頭指針不變;
第五個周期,數(shù)據(jù)寫入尾指針指向的元素4,然后尾指針移到第一個元素0,頭指針與尾指針重合,這時候通過尾指針等于頭指針,以此判斷緩沖區(qū)滿,完成判斷后頭指針移動到元素1 的位置;
第六個周期,數(shù)據(jù)寫入尾指針指向的元素0,然后尾指針移動到第一個元素1,此時判斷尾指針和頭指針相等,緩存區(qū)滿,判斷完成后,頭指針移動到元素2 的位置。
以上為滑動窗口的數(shù)據(jù)處理方式,可以使用尾指針等于頭指針來判斷隊列是否已滿。
當(dāng)緩存區(qū)滿后,開始對窗口內(nèi)的數(shù)據(jù)進行求平均值操作。本文采用去掉最大值和最小值,再對剩余的數(shù)求平均值的方法。對應(yīng)的公式為:平均值=(窗口值總和-窗口最大值-窗口最小值)/(窗口尺寸大小-2)。
考慮到此算法的通用性和可移植性,可以在博途軟件中建立一個FB 函數(shù)塊。調(diào)用這個FB 塊時,不用再修改這個FB 內(nèi)部的程序代碼,只需要給此FB 的輸入輸出接口賦予實參即可[4]。
首先,可以在FB 的靜態(tài)變量存儲區(qū)STATIC中定義一個數(shù)組ARRAY 用來存儲緩存的數(shù)據(jù),將緩存區(qū)數(shù)據(jù)中的最大值、最小值也在靜態(tài)變量緩存區(qū)STATIC 中進行定義,并將最大值以及最小值初始化為數(shù)組ARRAY 中的第一個值A(chǔ)RRAY[0]。隨著時間的推移,緩存區(qū)存儲的數(shù)據(jù)會趨向于一個穩(wěn)定的值,因此可以將第一個存儲進ARRAY 的數(shù)值定義為臨時的最大最小值,之后使用一個FOR循環(huán)來確認(rèn)數(shù)組ARRAY 中實際的最大最小值以及對所有窗口值求和。在FOR 循環(huán)過程中,如果ARRAY[i]比定義的臨時最小值A(chǔ)RRAY[0]小,就將ARRAY[i]賦值給最小值;如果ARRAY[i]比定義的臨時最大值A(chǔ)RRAY[0]大,就將ARRAY[i]賦值給最大值。其次,通過累加運算對緩存區(qū)的所有值進行求和,最后按照公式可以求出平均值的大小。
以下以西門子博途V16 軟件為例介紹模擬量濾波功能數(shù)據(jù)塊的實現(xiàn)。模擬量濾波功能數(shù)據(jù)塊接口定義如表1 所示。
表1 FB 接口數(shù)據(jù)定義表
初始化及復(fù)位程序處理部分的代碼如下。
首先進入初始化程序段,清除錯誤狀態(tài)并將報錯代碼初始化為沒有錯誤發(fā)生。一旦復(fù)位開關(guān)賦值為TRUE,程序?qū)⑶蠛椭?、頭指針、尾指針分別賦值為0、#頭指針初始值、0。將堆棧以滿的狀態(tài)賦值為FALSE,按下復(fù)位開關(guān)時,將上個周期窗口值賦值給本周期窗口值。執(zhí)行完復(fù)位程序之后,執(zhí)行RETURN 指令,跳出該程序段,直到下周期開始,從第一條指令開始重新執(zhí)行。
滑動窗口優(yōu)化后的數(shù)據(jù)緩存程序處理代碼如下。
本段程序首先讀取寫入一個新的掃描周期中的模擬量值并將尾指針后移加一,然后判斷尾指針是否等于頭指針。如果尾指針等于頭指針,則判斷數(shù)據(jù)緩存區(qū)堆棧已滿,一旦堆棧已滿狀態(tài)為TRUE,則進行濾波算法。最后進行頭指針的處理,如果頭指針等于頭指針初始值-1,此時將頭指針復(fù)位為0并指向第一個元素,如果數(shù)據(jù)緩存區(qū)堆棧已滿,頭指針后移加一,在復(fù)位開關(guān)按下時,頭指針也可賦值為-1,其他情況下頭指針不會被初始化為-1。
濾波算法程序處理部分代碼如下。
本程序段首先判斷數(shù)據(jù)緩存區(qū)堆棧是否已滿。如果堆棧已滿=FALSE,則將數(shù)據(jù)緩存區(qū)的數(shù)值直接輸出;如果堆棧已滿=TRUE,則進行濾波算法程序處理。在濾波程序中首先將數(shù)據(jù)緩存區(qū)中的第一個元素分別賦值給最大值、最小值、求和值3 個變量,再執(zhí)行FOR 循環(huán),從緩存區(qū)的第二個元素開始一直循環(huán)到最后一個元素。在循環(huán)過程中,如果該元素小于最小值,則用該元素值替代原最小值;如果該元素大于最大值,則用該元素值替代原最大值,之后執(zhí)行累加求和程序,最后根據(jù)求平均值公式將計算結(jié)果值賦值給濾波后信號輸出。
隨機信號的產(chǎn)生部分程序代碼如下。
本程序段利用西門子S71200/1500 系列PLC自帶的時鐘存儲器位產(chǎn)生隨機數(shù)進行濾波算法的仿真驗證。首先定義一個掃描周期,在該掃描周期內(nèi)利用2 個延時關(guān)斷定時器產(chǎn)生一個固定頻率的脈沖信號,利用該脈沖的上升沿結(jié)合時鐘存儲器,可以產(chǎn)生一個隨機數(shù)。利用該隨機數(shù)可以模擬實際的PLC 模擬量模塊讀取的數(shù)值。再組態(tài)一個TP1200 的觸摸屏,可以將隨機數(shù)的波形及濾波后信號輸出的波形實時地在觸摸屏上顯示出來。仿真結(jié)果波形如圖8 所示。
由圖8 可知,對于同樣的模擬量輸入信號,如果采用平均值濾波算法,得到的濾波后的波形的平滑度要比實際的未經(jīng)過濾波算法處理的波形的平滑度高[5]。
圖8 仿真結(jié)果波形
隨著實際工程中模擬量的使用范圍越來越廣,濾波算法變得尤為重要。對于變化較快的模擬量輸入信號存在的偶發(fā)性干擾,本文提出的算法可以有效地去除干擾造成的影響,且算法具有較高的靈敏度。該濾波函數(shù)程序塊具有很好的移植性,可以生成為庫文件,在不同的項目中調(diào)用。