パルス制御を行っていた自体に比べて、EtherCATサーボは本当に自由度が高いですね。本記事では、サーボエラーが発生した際の上位制御アプリケーションでのエラー検知方法について解説します。
今回はサーボエラーが起こった時の状態を、上位の制御アプリ側で検知させる内容をご紹介いたします。
具体的には、EtherCAT通信のサイクルタイム内の空き時間(アイドルタイム)を利用して、サーボドライブの状態やエラー情報といった非同期通信データを取得します。
そもそもEtherCATのSDOって何?
SDOは「Service Data Object(サービスデータオブジェクト)」の略称で、個々のスレーブと対話する時に使う物になります。リアルタイムでスレーブの値が書き換わるわけじゃないけど、色々な設定項目があります。EtherCAT通信で、モータの制御を行いながら、空き時間にSDO通信が行われるイメージです。
SDO通信でアラーム番号を取得する
この記事はPanasonic A6シリーズで検証しています。
装置の開発を行っていると、いろんなサーボアラームがでますね。 昔はI/Oで「アラームが発生」しかわかりませんでしたが、EtherCAT通信ではサーボアンプのアラーム番号を取得できます。
取り扱い説明書の通信コマンド
アドレスの603Fの値を読むことにより、現在のアラームか警告の番号が帰ってきます。取説には”アラーム”とありますが、”警告”も取得する事が出来ました。

通信をコードで行うには以下のコードになります。
C#の画面から呼び出す場合はこちら(WMX3 Ver3.6で検証)
using WMX3ApiCLR.EcApiCLR; // EcApi_CLRLib.dll
public int SDO通信でアラーム番号を取得する(int スレーブ番号)
{
var read = ReadSDO(スレーブ番号, 0x603F, 0x00, 2);
return read[0];
}
/// <summary>
/// SDOスレーブから読込
/// </summary>
/// <param name="slaveId">スレーブ番号</param>
/// <param name="index">コマンドメイン番号</param>
/// <param name="subIndex">コマンドスレーブ番号</param>
/// <param name="buffSize">受信サイズ数</param>
/// <returns>受信データ(byte)</returns>
public byte[] ReadSDO(int slaveId, int index, int subIndex, int buffSize)
{
uint errorCode = 0; // [out] SDO Error code
uint actualSize = 0; // [out] Size of actually uploaded SDO data
byte[] sdoReadBuff = new byte[buffSize];
uint waitTime = 3000; // [in] SDO Upload Process timeout time
_ecLib.SdoUpload(slaveId, index, subIndex, sdoReadBuff, ref actualSize, ref errorCode, waitTime);
return sdoReadBuff;
}
上のコードを動かすには、EcatをNewしてください
private Ecat _ecLib;
_ecLib = new Ecat(_api); // EtherCAT 通信
気軽に画面側のコードから、直接サーボの情報を得ることが出来るのはWMXの魅力ですね。
IntervalZero RTX版のコードはこちら(WMX3 Ver3.6で検証)
#include "EcApi.h" // EtherCAT制御
using namespace ecApi; // EtherCAT制御
/// <summary>
/// EtherCAT スレーブから読み込み
/// </summary>
void ReadSDO(int slaveId, int index, int subIndex, int buffSize, byte* readValue)
{
unsigned int actualSize;
unsigned int waitTime = 0; // [in] SDO Upload Process timeout time
unsigned int errCode;
ecat->SdoUpload(slaveId, index, subIndex, buffSize, readValue, &actualSize, &errCode, waitTime);
}
上のコードを動かすには、EcatをNewしてください
Ecat *ecat;
エラー 型または名前空間の名前 ‘EcApiCLR’ が名前空間 ‘WMX3ApiCLR’ に存在しません (アセンブリ参照があることを確認してください)
C:\Program Files\SoftServo\WMX3\Lib\EcApi_CLRLib.dll を参照させてください。
このエラーが出る場合は、プロジェクトにdllの参照も必要です。

DLLの設定方法はこちらを参照してください
SDO通信でサーボアンプからアラームの値を取得したときの挙動
例として、エンコーダ配線のケーブルを抜いた時の挙動を確認します。電源を入れると、アラーム55番が表示されます。

セットアップ支援ソフト「PANATERM」では、A相結線異常が出ています。

今の状態で、Visual Studioのデバック実行を行うと、以下の状態になります。

indexの24639は16進数の603Fです。帰ってきた値の配列0番の55(10進数)は16進数の55です。
この値を画面に表示させれば、ユーザーにサーボのアラーム番号を通知させることができます。
おわりに
もうユーザーにサーボアラームの番号を尋ねる必要はありません。アラームがコード上で明確に扱えるようになったことで、稼働ログに自動記録できるようになりました。これでトラブルシューティングが格段に楽になりますね。
では、よいWMX開発ライフを!
コメント