警告

現在、このドキュメントは古いバージョンをご覧いただいています。 最新の情報をご希望の場合は、下記をご参照してください 5.1 .

(例)ベッコフTwinCAT

ここでは、ベッコフTwinCATバージョン3.1のEtherCATモジュールに EYE+ を簡単に統合する例を紹介します。

前提条件

以下の例は、ベッコフTwinCATのバージョン3.1をベースにしていますので、お使いのバージョンが最新であることをご確認ください。

始める前に、以下のファイルが既にダウンロードされていることを確認してください。
  • EYE+ EtherCAT ESIファイル(電子データシート)

  • 容易な統合を可能にするEYE+ TwinCATプロジェクトテンプレート(事前に宣言された変数を含む)【オプション】

これらのファイルは、 EtherCAT ダウンロード からダウンロードできます。

必要なファイルをダウンロードしたら、ベッコフTwinCATのインストールフォルダにESIファイルを必ずインストールしてください。

<path_to_twincat_install>\3.1\Config\Io\EtherCAT

<path_to_twincat_install> は、通常 C:\TwinCAT\ です。

ESIファイルを正しいフォルダにインストールしたら、ベッコフTwinCATを再起動したことを確認してください。

基本的な統合

すべての準備が整ったら、新しいベッコフTwinCATプロジェクトの作成に進みます。そして、左上の部分にある以下のアイコンを押して、Co設定モード(Configuration Mode)になっていることを確認してください。

../../_images/twincat_config_mode.png

その後、EtherCATバスをスキャンして EYE+ とマスターデバイスを認識し、位置を特定する準備が整いました。スキャンオプションは、左ペインにあるデバイス(Devices)を右クリックすることで利用できます。

../../_images/twincat_scan.png

スキャンプロセスには数秒かかるかもしれませんが、現在バスに接続されているすべてのデバイスが検出されます。

注釈

スキャンが終了してもお使いの EYE+ がリストに表示されない場合は、正しく接続され、電源が入っていることを確認してください。それでも問題が解決しない場合は、サポートチームまでお問い合わせください。

正しくスキャンが完了できると、デバイス(Devices)の下のリストに EYE+ のボックスも表示されます。

../../_images/twincat_scan_complete.png

オプションのテンプレートをダウンロードされた方は、次のステップに進んでください。テンプレートをインポートすることで、 EYE+ を完全に活用するために必要なすべての変数が作成されます。テンプレートのインポートは簡単で、PLCプロジェクトを右クリックして、ZIPからインポート(Import From ZIP)をクリックします。

../../_images/twincat_import_template.png

正しくインポートできていれば、変数の構造全体が利用できるようになります。

../../_images/twincat_variables.png

TwinCAT内で変数を利用できるようにプロジェクトを構築する必要があります。変数を EYE+ の変数にマッピングするには、マルチリンク機能(Multi Link functionality)を使うと簡単に行うことができます。

../../_images/twincat_variables_built.png
../../_images/twincat_multilink.png

変数のマッピングが完了し、ランニングモードで再起動すると、レジスタのライブフィードバックが得られるはずです。

../../_images/twincat_prod.png

以下のサンプルコードは、自動運転を開始し、1個目のパーツを取得することができます。なお、変数 udRecipeID にはあなたのレシピIDを設定してください。

(*
 * This sample code is distributed under the license CC0 1.0 Universal,
 * you can get a copy of the license at https://creativecommons.org/publicdomain/zero/1.0/
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
 * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
 * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 *)

 VAR CONSTANT
         STATE_WAIT_CMD: UDINT := 0;
         STATE_START_PRODUCTION: UDINT := 10;
         STATE_GET_PART: UDINT := 20;
         STATE_READ_COORDINATES: UDINT := 30;
 END_VAR

 VAR
         //Input EYE+ controller
         suEYEplusInputGLO: EYEplus_TxPDO;
         //Output EYE+ controller
         suEYEplusOutputGLO: EYEplus_RxPDO;
         eState: UDINT := STATE_WAIT_CMD;
         udRecipeID: UDINT;
         boStartProduction: BOOL;
         boGetPart: BOOL;
         reRobotTargetX: REAL;
         reRobotTargetY: REAL;
         reRobotTargetRz: REAL;
         fbRTrig_StartProductionDone: R_TRIG;
         fbRTrig_GetPartDone: R_TRIG;
 END_VAR

 (* --------------------------------------------------------------------------------------- *)

 // Monitor rising edge of the Done flag for the "start production" command.
 fbRTrig_StartProductionDone(CLK := suEYEplusInputGLO.boStartProductionDoneGIN);

 // Monitor rising edge of the Done flag for the "get_part" command.
 fbRTrig_GetPartDone(CLK := suEYEplusInputGLO.boGetPartDoneGIN);

 CASE eState OF
         // State: waiting to receive a command from the PLC application.
         STATE_WAIT_CMD:
                 IF boStartProduction THEN // Command Start Production set.
                         boStartProduction := FALSE;
                         eState := STATE_START_PRODUCTION;
                 ELSIF boGetPart THEN // Command Get Part set.
                         boGetPart := FALSE;
                         eState := STATE_GET_PART;
                 END_IF

         // State: send a "start production" command to EYE+ and wait for completion.
         STATE_START_PRODUCTION:
                 // Set recipe ID according to EYE+ Studio.
                 suEYEplusOutputGLO.udRecipeIDGOU := udRecipeID;

                 // Send "start production" command to EYE+.
                 suEYEplusOutputGLO.boStartProductionTriggerGOU := TRUE;

                 // Wait for EYE+ response after command completion.
                 IF fbRTrig_StartProductionDone.Q THEN
                         // Reset command.
                         suEYEplusOutputGLO.boStartProductionTriggerGOU := FALSE;
                         eState := STATE_WAIT_CMD;
                 END_IF

         // State: send a "get_part" command to EYE+ and wait for completion.
         STATE_GET_PART:
                 // Send "get_part" command to EYE+.
                 // EYE+ looks for the number of parts set in "usPartQuantityGIN".
                 suEYEplusOutputGLO.boGetPartTriggerGOU := TRUE;

                 // Wait for EYE+ response after command completion.
                 IF fbRTrig_GetPartDone.Q THEN
                         // Reset command.
                         suEYEplusOutputGLO.boGetPartTriggerGOU := FALSE;
                         eState := STATE_READ_COORDINATES;
                 END_IF

         // State: read the coordinates returned by the EYE+ "get_part" command.
         STATE_READ_COORDINATES:
                 // Read coordinates returned by the "get_part" command.
                 reRobotTargetX  := suEYEplusInputGLO.rePose1XGIN;
                 reRobotTargetY  := suEYEplusInputGLO.rePose1YGIN;
                 reRobotTargetRz := suEYEplusInputGLO.rePose1RzGIN;

                 eState := STATE_WAIT_CMD;
 END_CASE