tyosyoshinsy

MXコンポーネント OCXアドインを一切つかわないでExcelでPLCと通信する

公開日:2022/3/1

今更のネタですが、エクセルでPLCと通信します
三菱からは、有料でMXコンポーネント、Officeのアドインでは、OCXの個別インストールなどで、EtherNet通信用の様々なアイテムが用意されてますが、 結局使う為にはそれなりの準備が必要です。なので、本ページでは、officeのエクセルがインストールされているだけで、 三菱のPLCに繋げて、データを読み書きする方法を紹介します。前提条件として、通信方法は、EtherNetのMCプロトコルをし使用した例に限定されます。 シリアル通信や、他のフィールドネットワークでは使えないのでご注意ください。ただ、必要なのがLANポートとOfficeのエクセルだけなので、 大抵の人は既に環境が整っているはずなので、直ぐ始められるとおもいます。まだ、変な話しGUIがエクセルなので、カスタマイズ自由自在です。 用途に合わせて色々弄って見てください。
※今回は、別ページで紹介している、Excelでソケット通信のコードを使いますので、通信の核となるコードの部分はそちらを参考してください。

スポンサードリンク

まず始めにすること

まず一番始めに行う事は、VBAを走らせるために、『開発タブ』よりVBAの開発環境を開く準備からはじめます。基本的には、Excelでソケット通信 のページの冒頭から、『準備したAPIの実体関数を作る』までは全く同じくなりますので、まずはそちらを参考に進めてください。
※ただし、今回はサーバー関数部分は使用しないので、省略しても問題ありません。また、エクセルシート上にEtherNET通信用の操作部品を配置す る部分はPLCを操作するために今回はアレンジしますので、そのまま真似せず、次の項目を参考に操作用のインターフェースを作成してください。

PLC通信するための操作部品を配置する

通信操作用の、ボタン等をエクセルシート上に配置させます。具体的な方法、基本的には変わりないのですが、 前述した通り、サーバー側は今回は関係ないので、クライアント側(エクセル)の操作部品のみ作ります。 特に注意する点はないので、以下の写真を参考にコントロール部品を配置してください。そっくりそのまま真似でもOKです。

ExcelDePLC1
 

※連続読出開始ボタンにつきましては、最後の『応用』項にて解説しますのでとりあえず作っておくだけでOKです



エクセルシートからAPIを呼び出すための関数を記述する

前項で準備した、APIはEtherNet通信の基本的な部分だけなので、PLCと通信するための条件を盛り込んだ形で通信が出来るように カスタマイズする必要があります。具体的には、PLC通信用のプロトコルをセットしたか関数を、Sheet1に作成して、標準モジュール 内のAPIを呼ぶ形になります。 下記写真を参考に、関数を記述してください。

  
ExcelDePLC2

初めに、ソケットデータインスタンスを最上部に定義してください。 これはグローバル変数となるインスタンスになります。 次に、CommandButton1、2 にそれぞれクライアント接続、クライアント切断を実行させる関数を記述してください。



  
ExcelDePLC3
ExcelDePLC9

クライアント送信ボタン送信を実行した後、そのまま受信動作を続けて実行させるために、関数の終わりに CommandButton4 を呼び出している部分があります。 ※これは、ボタンを操作で受信を手動で行うため位に、わざとボタンからのトリガにて実行さるために 上記の関数名をしておりますが、今回は手動で呼ばないので別の関数名でもOKです。
timewaite 関数は、送信を実行後、すぐに受信をした場合、PLCの応答が追い付かなかった時データの取りこぼしが発生する可能性があるので、 エクセルをほんの少しだけ眠らせる事をしています。



  
ExcelDePLC4

最後に、受信用のAPIを呼び出す関数を記述します。 ※補足として、今回は、送信と受信は一連のセットで行う必要があるので、 先ほどの送信関数をあえて分ける必要はありません。

これで、PLCと単体で、ソケット通信をするための準備はできましたが、これでは単なる無手順の送受信で、実用的なPLC間のデータが 送受信できません。 ですので、次の項目ではPLCのデータを効率良く扱うための準備と方法を解説します。

スポンサードリンク
       
 

MCプロトコルの電文を作る

前項で説明した通り、ソケットのAPIを使えば、バイトデータ単位で、データの送受信が可能ですが、PLCと通信するためには使い勝手が悪いです。 ですので、サーバー側となるPLCには、、クライアント(今回はエクセル)から特定のメッセージを受け取った場合にのみメッセージ内容に応じた専用のレスポンスを返してくれます。 この、特定のメッセージのことをプロトコルと呼び、三菱のPLC用のプロトコルをMCプロトコルと呼んでおります。(三菱コミュニケーションプロトコルの略らしい)
このMCプロトコルは三菱製コントローラのシリアル通信全般で使われていて、マニュアルがタウンページ位の 分厚さがある程深い内容になるので詳しくは言及しませんが、とにかく3Eフレームを使って、送受信をするとだけ、理解してもらえれば良いです。
MCプロトコルのフレーム電文をについては、MCプロトコルにて概要を説明していますので、 詳しくは、そちらを参考にしてみてください。 本項では、エクセルのシートの上で電文を生成する方法の一例を紹介します。
まず、通信内容に応じて動的に条件を変化、変更させたい内容を、特定のセルを使って任意設定できるようにさせます。 必要なものは下記とします。
・書込or読込
これは、PLCにデータを送るか、現在値を取得するかの選択です。文字列で直接書いても良いですが、余裕があればドロップダウンリスト形式のセルにして、 選択出来ると、よりユーザーフレンドリーになると思います。

・アクセスしたいデバイスの選択
次は、デバイスの選択です。I/Oチェックなどで、XやYのデバイスのモニタは恐らく必ず使うかと思います。 勿論、XやY以外のデバイスにもアクセス出来るので、ここも選択出来るようドロップダウンリストをつかうと 便利かと思います。
※例えば、Dのデバイスであれば、デバイスコードは0xA8 となります。

・アクセスしたいデバイスの先頭アドレス
アドレスを選択出来るように入力欄を設けます。 ここで注意したいのが、XやY等のデバイス16進数に対してDやMのデバイスは、10進数であることを別途考慮する必要があります。

・アクセスしたいデバイス点数
最後は、何点分デバイスにアクセスするかを選択できるように、同じ入力欄を設けます。 ここも同じように、ビットデバイスは1設定あたり、16点扱いになることに注意が必要です。

設定欄を設けたら、それらの値を別のセルから参照させて、3Eフレームの電文に必要なプロトコルヘッダー下記を参考に組み合わせてつくります。

ExcelDePLC5

※3Eフレームプロトコル の記載があるセルは、色付きのセルと相互参照されています。 つまり左側の(C列)の内容のセルが変わると右側のセル群の内容が 自動にで変わるようにシートを作成してください。 白色のセルは基本的にかわらないので即値を記入して大丈夫です。


スポンサードリンク

モニタ及び書き込み用の、任意入力欄を作る

MCプロトコルのヘッダー部が出来たら、次にデータ送信(書込)部分の入力欄を用意します。ここは、自分がPLCに送りたいデータを直接セルに打って 設定できるようにします。
注意する点は、送信で送るデータは、16bitを超えないようにする必要があります。(符号無しで0~65535の範囲です)これをより大きな値を送信する場合は、 データを2ワードに跨がってセットする必要があります。 入力セルのデータを、16進に変換して、上位バイト、下位バイトに分割してプロトコルにセットしていきます。   

ExcelDePLC6

オレンジのセルがD列になります。 この値を1ワードのデータになるように、上位、下位バイトになるようにデータを分解をしてセルにセットします。
具体的にどのような事をしているのかというと、D列の値を、E列のセルで16進データに変換してます『=DEC2HEX(D22,4)』 次に、E列のデータをF列で、『=LEFT(E22,2)』 で上位2桁抽出、G列で、『=RIGHT(E22,2)』で下位2桁抽出、してます。 これを、書き込みたいワード数分セルに作成してデータとして一度セルにセットします。
こうして出来た1バイトデータを先ほど作成した3Eフレームのプロトコルと、1番目下位、上位、2番目下位、上位・・・・と送信データ分だけ文字列を連結させて、 送信データセル(E7)にセットして送信を実行させます。

受信したデータを読み解く

受信データは、正常応答のメッセージの後ろ11バイト目以降、要求数分受信します。データは書き込みの時と同じく、バイト配列で入ってくるので、 上位バイトデータ、下位バイトデータ、連結させると、PLCのデータと同じになるはずなので確認してみてください。 余力があれば、この1ワードデータを、ビット配列に変換して、1なら●、0なら○になる、条件式をいれてみて遊んでみてください。 デバイス一括モニタ風にすることも出来ます。

ExcelDePLC7

上記の赤枠で囲ったデータ以降か、データ読み出しを実行した後のPLCのデータです。

ExcelDePLC8

このままだと分かりづらいので、データ書き込みに行った1ワードデータを分解した逆の要領で、バイトデータを各セルに落として、16進データから10進データに変換するなどをして 読みやすいようにカスタマイズしてみて下さい。

スポンサードリンク


応用:リアルタイム風モニタをしてみる

今回のシート上では、ボタンを配置して、データの送信受信を操作をする事で実行されます。 これを自動化させて、デバイスモニタ風のアクション実行させてみます。これを実現させるためには、WindowsのAPI、SetTimer関数を呼び出して、 周期的に実行させることで実現できます。     
まず、手順としては、この自動化の処理を行いたい場合の時のみ、APIとなるSetTimer関数を、コールバックで呼び出す適当な関数を作り、一度だけ呼び出します。

ExcelDePLC10

上記APIの宣言と、関数の実態は標準モジュール内に記述してください。
注意したいのは、この処理を必ず終わらせる、関数も作る必要があります。 SetTimerを終わらせるには、KillTimer関数を実行させます。これをさせないで、エクセルを閉じたり、他のマクロがバグ等で止まった場合に、 SetTimerメッセージが正常に発行されず、ハングアップや異常終了がおきます。 最悪、エクセルは起動していないのに、タスクに残るといった厄介な現象が起きる事もあり得るので、必ず作って下さい。
SetTimer関数にセットされたコールバック関数は、設定した周期で毎回呼び出されるようになります。 そこで、この周期的に呼ばれる関数、先ほど作った、送信、眠り、受信、処理を一括で行う関数をセットしておきます。 そうすることで、自動的にデバイス読み出し処理を、永遠に繰り返してくれるようになります。 では、上記で準備したAPIを実際に呼び出すための関数を、Sheet1 内に記述します。 まずは、『連即読出開始』 ボタンを押された際の関数を下記写真を参考に記述してください。

ExcelDePLC11

この関数では、連続読出を開始する場合、『TimerStart』 関数が呼び出されて、以降サブクラス化された、『TimerProc』 が周期的に呼び出されるようになり、再度、連続読出ボタンを押すとフラグが反転され、『TimerStop』関数から『KillTimer』APIが呼び出し、 サブクラス化された、『TimerProc』 イベントを破棄してくれます。

いかかだったでしょうか? 無事PLCとの通信は出来ましたか?今回は、MCプロトコル3Eフレームで紹介になりますが、iQ-R、Qシリーズ共にフォーマットが同じなので、 どちらでも通信が可能です。エクセル上で設定した、数値が手軽にPLCに送受信できれば、座標設定や、数値制御、PLC内のデータ収集がエクセルで簡単に出来るようになります。 是非色々、アレンジしてみて自分だけの便利ツールを作ってみてください。もし、面白いツールができたら、感想含めメッセージ頂けたら嬉しいです。

スポンサードリンク

chosyoshinsya 2015~2019 All Rights Reserved.

tyosyoshinsy