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)
结果显示