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)

结果显示 

猜你喜欢

转载自blog.csdn.net/yaojiawan/article/details/106800857