今回の記事はSysmac StuidoのGetECError・ResetECErrorを使用しEtherCATネットワーク情報を収集やリセットします。
さ、FAを楽しもう!

前書き
いつも私の技術ブログとYouTubeチャンネルをご覧いただき、心より感謝申し上げます。また、いまFullさん(full@桜 八重 (@fulhause) / X)と共に毎週水曜日の夜にお届けしている「高橋クリス」ラジオ番組を運営しています。
技術は独り占めせず、届けるもの
私たちは工場の生産技術や制御に関する技術情報を、ブログや動画などで無料公開しています。「知識は誰でもアクセスできるべき」という信念のもと、現場で役立つ具体的なノウハウやトラブル事例などを発信してきました。すべて無料で続けているのは、「知らなかったせいで困る人」を少しでも減らしたいからです。
また、もしあなたの現場で…
- 「このPLCとデバイスの組み合わせ、ちゃんと動くのかな?」
- 「EtherCAT通信でうまくいかない部分を検証してほしい」
- 「新しいリモートI/Oを試したいけど社内に検証環境がない」
など、困っている構成や試してみたいアイデアがあれば、ぜひお知らせください。機器の貸出や構成の共有が可能であれば、検証し、記事や動画で発信します(ご希望に応じて匿名対応も可能です)。
支援のかたち
現在、私達の活動はほぼ無償で続けており、記事や動画の制作には、時間と検証環境の整備が必要です。この活動を継続的にコンテンツを提供するためには、皆様の温かいご支援が大変重要です。
メンバーシップ(ラジオの応援)
Fullさんとのラジオをより充実させるための支援プランです。
https://note.com/fulhause/membership/join
Amazonギフトリスト
コンテンツ制作に必要な機材・書籍をリストにしています。
https://www.amazon.co.jp/hz/wishlist/ls/H7W3RRD7C5QG?ref_=wl_share
Patreon(ブログ・動画活動への応援)
月額での小さなご支援が、記事の執筆・検証環境の充実につながります。
https://www.patreon.com/user?u=84249391
Paypal
小さな支援が大きな力になります。
https://paypal.me/soup01threes?country.x=JP&locale.x=ja_JP
知ってたら助かること、届けたいだけです
あなたの応援が、知識の共有をもっと自由で持続可能なものにしてくれます。これからもどうぞよろしくお願いします。
soup01threes*gmail.com
技術はひとりじゃもったいない。
Reference Link
VAR
最初に今回記事で使用した変数を紹介します。
_EC_IndataInvalidErr(入力プロセスデータ無効エラー)
EtherCATマスターがOperational状態において、プロセスデータ通信を正常に実行できなかった結果、入力データ無効状態が一定期間継続した場合にTRUEとなるBOOL型変数です。継続判定の期間はタスク周期によって異なり、タスク周期が10ms以下の場合は100ms、タスク周期が10msより長い場合はタスク周期の10倍となります。
_EC_CommErrTbl(通信エラースレーブテーブル)
スレーブノードアドレス順に並べられたARRAY[1..512] OF BOOL型の変数です。マスターが該当スレーブのエラーを検出した場合、対応するスレーブの要素がTRUEとなります。
FB
次は今回の記事で使用した関数を紹介します。
GetECError?
GetECError命令はEtherCATマスターファンクションモジュールのエラーを検出する命令です。エラーが存在する場合はOutの値がTRUE、存在しない場合はFALSEとなります。Levelは現在の最高レベルエラーのステータスを、Codeは現在の最高レベルエラーのイベントコードをそれぞれ示します。
注意するのはこの命令でスレーブエラーを検出するには、ユニットバージョン1.02以降のCPUユニットが必要です。

VAR_OUTPUT
変数名 | 意味 | 説明 |
|---|---|---|
Out | エラーフラグ | TRUE:エラーありFALSE:エラーなし |
Level | 最高レベルステータス | 現在の最高レベルエラーのステータス 0:エラーなし 2:部分的障害レベル 3:軽度障害レベル |
Code | 最高レベルイベントコード | 現在の最高レベルエラーのイベントコード |
ResetECError?
ResetECError命令は、EtherCATマスターファンクションモジュールのコントローラエラーをリセットする命令です。

VAR_INPUT
変数名 | 意味 | 説明 |
|---|---|---|
Execute | 実行トリガー |
VAR_OUTPUT
変数名 | 意味 | 説明 |
|---|---|---|
Busy | 実行中フラグ | 命令実行中にTRUEとなります。Doneがどちらの値になってもBusyはFALSEになります |
Error | エラーフラグ | 命令実行中にエラーが発生した場合にTRUEとなります |
ErrorID | エラーコード | Errorエラーの時のエラーの原因を示すコードが格納されます。ErrorがFALSEの時は0となります |
注意
この命令を実行した直後にエラーがリセットされない場合があります。GetECError命令を使用してエラーがリセットされたことを確認してください。
ケーブル redundancy(冗長)状態でResetECError命令を実行した場合、ステータスが一時的にクリアされることがあります。
OMRON G5シリーズサーボドライブに対してこの命令を実行する場合、ResetMCError、MC_Reset、またはMC_GroupReset命令とResetECError命令が同時に実行されないよう、排他制御を行ってください。これら3つの命令のいずれかとResetECError命令が同時に実行された場合、G5シリーズサーボドライブはSDO通信を受け付けなくなります。
以下の命令の実行中は、この命令を実行できません:
- EC_DisconnectSlave
- EC_ConnectSlave
- EC_ChangeEnableSetting
- ResetECError
- RestartNXUnit
- NX_ChangeWriteMode
以下の場合にエラーが発生し、ErrorがTRUEになります:
- EtherCATマスターファンクションモジュールのコントローラエラークリア処理中に、この命令が再度実行された場合
- EC_DisconnectSlave、EC_ConnectSlave、EC_ChangeEnableSetting、ResetECError、RestartNXUnit、またはNX_ChangeWriteMode命令がすでに実行中の場合
Implementation1
Implementation1ではシステム変数を使用し、現在のEtherCAT Slaveの状態を確認します。
OMRON Side
Sysmac Studioでオムロンのプログラムを作成します。

プログラム
Program0にp0003EtherCATStatusプログラムを追加します。

こちらはプログラムです。

変数
プログラムに必要な変数を定義します。

Rung0
_EC_InDataInvalid(入力データ無効)がTRUEの場合、ECInDataInvalidコイルをONにします。EtherCATマスターの入力プロセスデータが無効状態であることを示すフラグを内部変数に転送するラングです。

Rung1
_EC_CommErrTbl[1](通信エラースレーブテーブルのノード1)がTRUEの場合、xNode01EJS08CommErrコイルをONにします。ノードアドレス1番のスレーブで通信エラーが検出されたことを示すフラグを内部変数に転送するラングです。

Rung2
_EC_CommErrTbl[120](通信エラースレーブテーブルのノード120)がTRUEの場合、xNode120XLE02CommErrコイルをONにします。ノードアドレス120番のスレーブで通信エラーが検出されたことを示すフラグを内部変数に転送するラングです。

Rung3
_EC_PDSlavTbl[120](プロセスデータ通信スレーブテーブルのノード120)がTRUEの場合、xNode120XLE02CommOKコイルをONにします。ノードアドレス120番のスレーブがプロセスデータ通信中(正常通信中)であることを示すフラグを内部変数に転送するラングです。

結果
ラング2の_EC_CommErrTbl[120]がTRUEになっており、xNode120XLE02CommErrコイルがONしています。ノードアドレス120番のスレーブ(XLE02)で通信エラーが検出されている状態です。

Implementation2
Implementation2ではGetECErrorを使用しEtherCAT ネットワークのエラー情報を取得します。
OMRN Side
Sysmac Studioでオムロンのプログラムを作成します。

プログラム
こちらはプログラムです。

変数
プログラムに必要な変数を定義します。

Rung4
GetECError命令を実行し、EtherCATマスターファンクションモジュールのエラー情報を取得します。取得した最高レベルエラーのステータスをuiECErrorLevelに、イベントコードをdwECErrorCodeにそれぞれ格納します。

Rung5
uiECErrorLevelの値をEQ命令で比較し、結果を各フラグに格納します。
- uiECErrorLevel = 0の場合、xECNoErrorをON(エラーなし)
- uiECErrorLevel = 2の場合、xECPartialFaultLevelをON(部分的障害レベル)
- uiECErrorLevel = 3の場合、xECPartialFaultLevelをON(軽度障害レベル)

結果
ラング4のGetECError命令の実行結果として、uiECErrorLevel = 3(軽度障害レベル)、dwECErrorCode = 8431 00(16進数)が取得されています。
ラング5ではuiECErrorLevelの値が3であるため、3つ目のEQ命令(uint#3との比較)がTRUEとなり、xECPartialFaultLevelコイルがONしています

Implementation3
Implementation2ではResetECErrorを使用しEtherCAT ネットワークのエラーをリセットします。
OMRN Side
Sysmac Studioでオムロンのプログラムを作成します。

プログラム
こちらはプログラムです。

変数
プログラムに必要な変数を定義します。

Rung6
xResetECErrorExeの立ち上がりエッジでfbResetECError(ResetECError命令)を実行し、EtherCATマスターファンクションモジュールのコントローラエラーをリセットします。各出力は以下の変数に格納されます。
- Done → xResetECErrorDone(正常完了フラグ)
- Busy → xResetECErrorBusy(実行中フラグ)
- Error → xResetECErrorError(エラーフラグ)
- ErrorID → wResetECErrorErrorID(エラーコード)

Rung7
xResetECErrorDone(完了フラグ)またはxResetECErrorBusy(実行中フラグ)のいずれかがTRUEの場合、xResetECErrorExeをリセット(R命令でOFF)します。エラーリセット命令の完了または実行中を検知して、トリガー信号を自動的にOFFにする自己解除ラングです。

結果
xResetECErrorExeをTRUEにし、関数を実行します。

ResetECError命令の実行後、uiECErrorLevel = 0となり、ラング5の1つ目のEQ命令(uint#0との比較)がTRUEとなってxECNoErrorがONしました。EtherCATマスターのエラーが正常にリセットされたことが確認できます。
