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)
結果顯示