PLC+エクセルの連携 FUNドライバをエクセルで使う

投稿日 2012/01/24

PLCで収集したデータを、エクセルで加工/表示したいという要求は、現実味があります。

 

エクセルという高度なデータ解析ツールを使わない手はないからです。

 

解析までしなくても、体裁よく表示させたり、すぐグラフ化したり、印刷したりするだけでも利用する価値があります。

 

PLCにはADコンバータやDIOなど、データ収集モジュールが多く用意されています。

 

それらのデータを視覚的に表示するには、PA-Panelのようなソフトを使用してパソコンで表示するか、

 

タッチパネルのようなものに表示する方法があります。

 

PA-Panelは高度な処理が行え、ひじょうに便利にできていますが、いかんせん高価です。

 

タッチパネルなどは解析処理には向きません。

 

そこでイーサネットかRS-232C経由でPLCのCPUと交信する仕組みがあれば、あとはエクセルに取り込めばよいのですが、それを実現してくれるのが東京電機産業のFUNドライバです。これは、Visual BasicやC++のような言語で使うことができますが、エクセルのアドインとしても提供されているため、エクセルのセルに直接データを取り込んだり、VBAでプログラミングすることも可能です。


 

FUNドライバは以前PLCのGPIBからデータを取り込んだ「PLC版真空管試験器」を作ったときはVisual Basicから使ってみました。

 

今回はエクセルにアドインしてVBAから使ってみます。といっても今回はさして目的がなかったので、簡単なデモプロです。

 

FUNドライバ(FUN FA-M3 Universal Network Driver)は、東京電機産業のホームページから体験版がダウンロードできますが、購入しても比較的安くすみます。

 

今回は、PLCのCPUの中で発生させたサインカーブのデータを、エクセルでグラフ表示するという簡単なものにしました。それだけでは面白くないのでエクセル側で計算した搬送波をPLCで発生させた波形でAM変調してみましょう。

 

まずPLCのCPUでサインカーブのデータを発生させるラダープログラムを作ります。

 

驚くほど簡単です。リレーコイルI00010がTRUEになったら、レジスタD00007のデータのサインを計算し、結果をレジスタD00009に入れます。

PLC_FUN1.jpg

PLC側のラダープログラム


次に、FUNドライバを使用したVBAのプログラムを作ります。以下のように簡単です。エラー処理は省略しています。

 

VBAのソースコード

 

Dim i As Integer
Dim Error As Integer

 

Public Sub Read_Sin()
Worksheets("Sin" ).Select
Error = SetFunParameter(1, "192.168.1.8", 1, 0, 1, 0)
i = 0

 

Do While (i < 1441)

Error = FWriteDirect("", 1, 1, "D00007", i * 0.01745329)
Error = BWriteDirect("", 1, 1, "I00010", 1)
Cells(i + 2, 4).Value = FReadDirect("", 1, 1, "D00009" )
i = i + 1

Loop
End Sub


 

VBAではレジスタD00007にラジアン値をセットし、リレーコイルI00010をTRUEにして、サインの計算結果をレジスタD00009から読み取ります。0から3660度 4周期分計算したら自動的にグラフに表示されます。

 

FUNドライバのアドインをあらかじめエクセルに設定しておきます。

 

FUNの関数は以下のようになっています。
SetFunParameterはPLCのIPアドレスを指定し、ユニット番号を決めます。
FWriteDirectは、PLCのレジスタに値を書き込みます。
FReadDirectは逆に読み込みます。Fは浮動小数点数を扱います。
BWriteDitectは1ビットのリレーコイルをセットします。


 

搬送波とAM変調の計算式は予めセットしてあるので、グラフにはAM変調された波形も表示されます。

PLC_FUN2.jpg

グラフに表示されたサイン波とAM変調波

 

以上のようにFUNドライバを使えばエクセルのアドインとして簡単に使えます。

 

実務面では、さまざまなレジスタのデータを取り込んで日報を作成したり、ペンレコーダの代替のような用途など、用途は無限です。



 

(JF1VRR)