IEC61499 編程(5)- FFT 變換功能塊

FFT 是將時域轉換成爲頻域的方法,在數據處理中經常會被應用,比如振動分析。爲了測試我們正在開發過程中的Open IEC61499 功能塊庫。編寫了一個應用程序,它由如下功能塊構成

E_CYCLE 週期事件發生器

E_DIVID_N  N分頻器。產生採樣頻率

FB_WAVE 波形發生器

  目前該功能塊能產生Sin,Cos和鋸齒波。其主要參數如下。

Type 波形類型 0-Sin,1-Cos,2-Sawtooth

Sample 採樣頻率

A-幅度

F -頻率

P-相移位

V-電平移位

FB_FFT_W 快速傅里葉變換功能塊

P-FFT 的點數

DIN 是數據輸入

FFTOUT -FFT 數據輸出。

FB_BUF_256

256 個REAL 值的緩衝區功能塊。將256 個REAL 形成256 個數組。通過UDP Publish 發送。這樣網絡發送1024個字節比較高效。

如果你具有IEC61499 功能塊的基本知識,會發現OpenIEC61499 帶來的效率和便捷。

Python 接收程序

import socket
import struct
from matplotlib import pyplot as plt
def bytesToFloat(h1,h2,h3,h4): 
    ba = bytearray()
    ba.append(h1) 
    ba.append(h2) 
    ba.append(h3) 
    ba.append(h4) 
    return struct.unpack("!f",ba)[0]
HOST = '192.168.31.108'
PORT = 8888
BUFSIZ =1025
ADDR = (HOST,PORT)
udpSerSock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
udpSerSock.bind(ADDR)

x=[]
y=[]
for i in range(255):
    x.append(i)
    y.append(0)
plt.show()
while True:
    data, addr = udpSerSock.recvfrom(BUFSIZ)
    print ('Received bytes%d\n' ,len(data))
    
    for i in range(255):
       y[i]=bytesToFloat(data[i*4+4],data[i*4+3],data[i*4+2],data[i*4+1])
    max=0
    delta=0
    for i in range(128):
        if (y[i]>max):
              delta=i
              max=y[i]
    f=delta*1000/256        
    plt.clf()
    plt.title("frequncy="+str(f)+"Hz")
    plt.plot(x,y)
    plt.pause(0.05)

結果顯示 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章