MCプロトコルを使用したラダーレス通信アプリ
ソケット通信 C++で作るアプリを徹底紹介
公開日:2019/12/24
本項では、MCプロトコルを使用したアプリを作成してネットワーク上にあるWindowdPCとPLC間で、
EtherNet通信をする方法の手順を紹介します。
リレーや、MELSECNET、CC-Linc、等を使ったPLC間同士の通信を、Ether、Wifiを使ってネットワーク内にあるPCが
ハブサーバーみたいに通信します。もっとも、Ether内臓CPU同士でも、ソケット用のラダーを組めば可能ですが、面倒
くさいラダー作成が省けるのが利点だと思います。 ここでは難しい話は抜きにして、C++(C言語)で一からアプリ
は作れないけど、超簡単に再現できるように、主に写真を使って、プログラム作成手順を紹介したいともいます。
正直、Etherでここまで他機器と通信が可能ならMelsecNET10 などもはや不要なのでは...
★MCプロトコルとは?
『MCプロトコル』とは、『三菱コミュニケーションプロトコル』 の略称になります。これは、三菱のPLCで扱うデータの シリアル通信データ(RS-232Cや、EtherNet)に特化した、データフォーマットを取り決めたものになります。 フォーマットは通信を行いたいデータの先頭に、データヘッダ、アクセス経路、データ長、デバイスコード、デバイス番号など、 通信するにあたっての必要なデータ順序を決めたものがあります。
E3フレームにおける読み出し、書き込みフォーマット
では、最もシンプルな通信である、バイナリコード、E3フレーム通信におけるPLCからデータを読み出す伝聞を記載します。
・サブヘッダ_____2byte
・アクセス経路___5byte
・要求データ長___2byte
・監視タイマ____2byte
・要求データ____10byte
5個の要素で全21byte
次に、PLCへデータを書き込む伝聞を記載します。
・サブヘッダ_____2byte
・アクセス経路___5byte
・要求データ長___2byte
・監視タイマ____2byte
・要求データ____10byte(書き込むデータを除く)
同じく5個の要素で全21byte+書き込みデータ数。
※いずれの通信でも、送信後のレスポンス(応答伝聞)も受信バッファより読み取る必要があります。 データ要求の場合、応答伝聞にデータが乗ってきます。
※応答伝聞も含め、このプロトコルについてのより詳細な情報が必要な方は、 三菱の、MELSECコミュニケーションプロトコルリファレンスマニュアル-P470 ページ目を参照下さい。
※補足: MCプロトコルは、キーエンスのPLCにもオプション設定があり、設定次第では、 Melsec⇔PC(Windows)⇔KV とクライアントがホストみたいになって、それぞれ通信が可能です
★始めに☆
まず、PLC側が、ホスト(サーバー側)となり、PC(Windows側)がクライアントとなります。 PLC同士の場合は、ソケット通信用のラダー回路を書くほうが、クライアントになります。
以上で、PLC側の準備は終了です。
※注意していただきたいのは、IPアドレスと、ポート番号は、使用する機器の設定、 占有数で変わってくるのでその都度設定しましょう
★産業用のスイッチングハブならコレ!
抜群の耐久性で、信頼のドイツ製
断線したら困るLAN構築にオススメ!
電源はDC24V
☆ C++ (Visual C++)でMFCのプログラム★
つづいて、Windowsアプリケーション側のプログラムについて、説明します。 開発プラットフォームは、VC++のMFCで、テストアプリ用のコーディングを実施してみます。 Visual Studioは2008で説明しますが、CSocketが使えればどのVerでもいいでしょう
※ここでは、ソケット通信(CSocket)を使用した、 MCプロトコルの通信例を紹介するのが目的なので、なるべく簡単に見た目などのGUIは適当です。
より簡単実現するために、アプリケーションスタイルは、ダイアログベースとします。 この時、生成ウィザード画面で、Windoesソケットのチェックボックスに、チェックをするのを忘れないようにしましょう。
スケルトンプロジェクトが出来たら、リソースの配置を適当に行いましょう。
コントロールは、 接続先用のIPアドレス、 (IDC_EDIT4)
ポート番号を入力するようのエディットボックス (IDC_EDIT5)
データ送信先の先頭アドレスを決める、エディットボックス (※今回は 100固定とします )
データに書きたい数値をセットするエディットボックス (Send Data)
通信先のデバイス種類 (※今回は D 固定とします)
後は適当に、PLCへの接続開始ボタン (Coneect IDC_BUTTON2)
接続状態を表示させるインジケータ用エディットボックス (IDC_EDIT7) etc・・・
では、準備ができたら、コードを書いてしていきましょう。 基本的に、ダイアログベースで
作成した アプリ名Dlg.cpp と アプリ名Dlg.h にのみコードを記入していきます。
始めに、メインで仕事をする変数群を、アプリ名Dlg.h ソース 内のクラス定義下部に、public
であたらしく作ります。
次に、Connectボタンから、PLCへの接続イベントを作成します。
~PLC接続関数をつくります~
この関数は、ボタンに関連した、イベントハンドラになる為、クラスウィザードから、クリックイベントの追加、 もしくは、リソース画面より、対象のボタンをダブルクリックして、イベント関数を作成してください。 ※下記の写真例では、IDC_BUTTON2 のクリックイベントなので、関数名がOnBnClickedButton2 となってます。
ここまで!! 上記の関数が出来上がり、connectボタンで接続できたら、 あなたのWindowsとPLCは接続完了です!(簡単でしょ!) この段階で、Failde となる場合は、 PLCのPCパラメータの設定か、プログラムのミス、パソコンのIPアドレスの設定、等で、何らかのミスがあると 思われるので一度見直しましょう!! 接続ができたら、今度はソケット送信、受信用の関数を作成して、 PLCにデータを送信するプログラムを作ります。 ここで重要になってくるのが、MCプロトコルの伝聞となります。 今回は1:1通信を例に、バイナリコード通信、3Eフレームのフォーマットでテストを行います。
では、PLCにデータを送るための、Sendボタンイベントをつりましょう。 ※ソケット接続ボタンの時と同じよう に、クラスウィザード画面、もしくはリソースビュー画面から、Sendボタンをダブルクリックして、関数イベントを 追加します
~PLC送信ボタン関数の作成~
ボタンの内容は、これだけでだけとします。 そして最後に、メインのプログラム内容となる、送受信用の データ考える(MCプロトコル)関数をつくります。少し長い、プログラムになりますが、これでひとまず完成と なりますので、トライしてみましょう。 ※関数名はとりあえず、PlcRwとして、今回はテストの為、送信先 のデータレジスタは、D100固定、送信データ数も1ワード定数とします。
~ボタンから呼ばれる送受信関数の本体の作成~
プログラムはこれでひとまず完成です。 SendDataエディットボックスに数値をセットして、送信してみましょう。
続いて、PLCのデバイス一括モニタ画面で確認してみましょう。
正常に送信できました。 ※-2なのは、PLC側が符号つき整数表示他のため、最大値は32768はとなり、 65534は2の歩数から、-2となるのは正常です
プログラムの前半側で、PLCのデータの送受信の為の、ルールとなるプロトコルを定義して、PLCに送信します。 この部分がMCプロトコルの伝聞となります。 後半の部分で、ソケット通信の為の、送信受信をおこなっております。 前述に述べたとおり、Windowsがクライアントであり、PLCがサーバーとなっている為、、データを送信する場合も、 受信する場合も、必ず送信(Send)から始まり、そのレスポンスに対して一度受信(Receive)をする必要があります。 今回記載したプログラムは、データ送信の例ですが、読み書きコマンドの工夫、要求データ長の数の工夫をすれば、 受信用の関数にもなります。 ただし、受信の場合は、どのようなシチュエーションかが想定できない為、スレッドなど を立てて、ポーリング監視をするような、工夫が必要になってきますね
どうだったでしょうか? うまくPLCに送信ができましたでしょうか? どうしてもうまくいかないという方は、写真のソースを 丸ごと模写してみてください。 特別なプログラムのコーディングは必要ありません。 うまく送信が出来たら、アレンジを 加えて、データの受信にも挑戦してみてください。
また別章の、PLCのWi-Fi接続ページでは、PLCのネットワーク内に
家庭用 汎用ルーター
を繋げて、WindowsとPLCのWi-Fi接続する方法を紹介しています。 本項で紹介した方法を使って、ソケット通信を行えば
PC間で無線接続も出来るので、アプリケーションを改良すればPLC間の無線接続も可能なのでこちらも是非参考にして見てください。
あなたの快適なFAライフに、少しでもお役立てられたら幸いです。
スポンサードリンク
© chosyoshinsya 2015~2019 All Rights Reserved.