高速フーリエ変換を行うファンクションです
振動センサや音のデータを元に振動パターンを分析して故障の兆候を早期に発見するためにFFTを使用します
FFTは時間領域の信号を周波数領域に変換する手法です
時間領域の信号は、振幅が時間とともに変化する波形として表現されます
周波数領域では、信号を構成する各周波数成分の振幅と位相として表現されます
FFTを使用することで、信号に含まれる周波数成分を分析することができます
信号をデジタル化する際の時間間隔の逆数です
ナイキストの定理により、分析したい最高周波数の2倍以上のサンプリング周波数が必要です
例:100Hzの信号を分析するには、200Hz以上のサンプリング周波数が必要です
FFTは2のべき乗のサンプル数(256, 512, 1024など)で実行する必要があります
サンプル数が多いほど周波数分解能が向上します
周波数分解能 = サンプリング周波数 ÷ サンプル数
信号の両端で不連続が生じるのを防ぐために使用します
ハン窓、ハミング窓、ブラックマン窓などがあります
信号の特性に応じて適切なウィンドウ関数を選択します
複素数の実部と虚部を計算
振幅スペクトルと位相スペクトルを算出
パワースペクトル密度の計算
デジタルフィルタでノイズを除去
これらの要素を適切に設定することで、より正確な周波数分析が可能になります。
デジタルフィルタで解説しています


| 値 | 窓関数 |
|---|---|
| 0 | ハミング窓 |
| 1 | ハン窓 |
| 2 | ブラックマン窓 |
| それ以外 | 矩形窓 |
FFT分析するアナログデータをサンプル数分の配列にセットして入力します
DataはLREAL型の配列で配列の数は次のサイズにします
ウィンドウ関数は、FFT分析時に信号の両端で生じる不連続を防ぐために使用されます。
以下のウィンドウ関数から選択できます
各ウィンドウ関数の特徴:
パワースペクトル密度を出力します
周波数分解能あたりのパワーを表します
周波数分解能 = サンプリング周波数 ÷ サンプル数
配列数は8192ですが、サンプル数の半分の配列に計算結果を出力します
検証用で3つの波形の合成したアナログ波形を使用して説明します
サンプリング周期: 10000Hz
サンプリング数: 2048

カットオフ周波数=1000Hzを設定して1000Hz以上の周波数を取り除きます

窓関数はハミング窓,ハン窓,ブラックマン窓,矩形窓をFFTファンクションの入力で選択できます

矩形窓以外は繰り返しアナログデータをサンプリングしながらFFTの計算をして波形を出力するような場合に繋ぎ目がノイズなってしまうのを防ぐため最初と最後の出力をゼロに近づけています
連続した振動や音を単発でサンプリングするのであれば矩形窓で入力波形をそのまま使います
ここではハミング窓を使っています
ハミング窓の波形をもとにFFTを計算したグラフです (窓関数の計算はファンクションの中で計算しています)
ここでは次の3つの周波数を合成したダミーのアナログデータを使用します
ダミーのアナログデータは1スキャンで10個分をAnalogData[]の配列に順番に格納していきます
(実際にはアナログユニットなどからのデータを取得することになります)
取得したアナログデータにローパスフィルタ(LPF)を通します
サンプリング周波数 = 10kHz
カットオフ周波数 = 1kHz
LPFファンクションブロックはデジタルフィルタで入手できます
StoreSamplingDataフラグをONすることでサンプリングを開始します
StoreSamplingDataフラグは次のブロックでデータが揃ったらOFFになるので待ちます
StoreSamplingDataフラグがONのときにローパスフィルタ後の値をData[]に貯えます
Data[]のデータが揃ったらStoreSamplingDataをOFFにします
(ここでは要素数2048)
StoreSamplingDataの立下りでFFTの演算を行います
サンプリング数: 2048
窓関数は 0:ハニング窓にしました
計算で得られたFFTDataをファイルに書き出すか下記の補足のようにExcelにコピペしてグラフを作成しました

分解能: サンプリング周波数/サンプリング数 = 10000/2048 = 4.882813
有効周波数: サンプリング周波数/2 = 10000/2 = 5000Hz
50Hz, 800Hz, 2000Hzが確認できます
取得したアナログデータにローパスフィルタ(LPF)を通します
サンプリング周波数 = 10kHz
カットオフ周波数 = 1kHz
LPFファンクションブロックはデジタルフィルタで入手できます
StoreSamplingDataフラグをONすることでサンプリングを開始します
StoreSamplingDataフラグは次のブロックでデータが揃ったらOFFになるので待ちます
StoreSamplingDataフラグがONのときにローパスフィルタ後の値をData[]に貯えます
Data[]のデータが揃ったらStoreSamplingDataをOFFにします
(ここでは要素数2048)
StoreSamplingDataの立下りでFFTの演算を行います
サンプリング数: 2048
窓関数は 0:ハニング窓にしました
計算で得られたFFTDataをファイルに書き出すか下記の補足のようにExcelにコピペしてグラフを作成しました

分解能: サンプリング周波数/サンプリング数 = 10000/2048 = 4.882813
有効周波数: サンプリング周波数/2 = 10000/2 = 5000Hz
50Hz, 800Hz, 2000Hzが確認できます
スマートなやり方が分からなかったのでこんなやり方になった
メニューバーから「モニタ/シミュレータ」-「デバイス値一括変更/読出し」
Ctrl+Iでインクリメント挿入を必要な配列分を繰り返し

PLC-全項目読出しのあと
Ctrl+A で全選択のあとコピー(Ctrl+C)してExcelの貼り付けたいセルにペースト(Ctrl+V)
