WMXとC#ではじめるモーションコントロール
このページをご覧になっているあなたは、WMXを使ったモーションコントロールシステムの構築方法、特に具体的なコーディング手法に関心をお持ちと思います。
本記事では、WMXとC# を用いたプログラミング学習の第一歩として、公式サンプルコードの読み解き方を解説します。開発環境はWMX3.6とMicrosoft Visual Studio 2019を想定しており、C#の初心者でも理解しやすいよう、基本的な文法や概念についても補足します。
WMXサンプルコードの場所
WMXをインストールしたパソコンで、サンプルコードの場所は
C:\Program Files\SoftServo\WMX3\Samples\CSharp
に配置されています。
VSxxxはMicrosoft Visual Studioのバージョンになります。Visual studio communityでもコンパイル可能です。
[1_BasicMotion]01_CreateDevice
このプロジェクトは、WMXを用いた開発の第一歩として、デバイスの作成と破棄の基本手順を学ぶためのものです。ここでは具体的なモーションコントロールは行いませんが、コンパイルが出来るか?WMXが動作するか?の基本的な確認ができます。ご自身でプロジェクトを作成される前に、環境が正しく構築できているかの確認を行いましょう。
プロジェクトの起動
C:\Program Files\SoftServo\WMX3\Samples\CSharp\VS2019\1_BasicMotion\01_CreateDevice
の.slnファイルをダブルクリックすると、Visual Studioが起動します。
管理者権限
以下の画面が出た場合は、管理者権限で実行します。

この場合、自動でプロジェクトは開きませんので、最近開いた項目をクリックしてプロジェクトを開ききます。

プロジェクトを開いたら
Visual Studio2019では以下のように表示されます。特にエラーなく起動します。

WMXをコーディングするには、参照の、WMX3Api_CLRLibが必ず必要になります。ご自身でプロジェクトを作成される場合は、ファイルの参照を行ってください。こちらに関連する記事があります。
C:\Program Files\SoftServo\WMX3\Lib\WMX3Api_CLRLib.dll
WMX3Api_CLRLibの参照を消した時の挙動
エラー一覧に以下の文字が出た場合は、ソリューションの参照を確認してください。
エラー CS0246 型または名前空間の名前 ‘WMX3ApiCLR’ が見つかりませんでした (using ディレクティブまたはアセンブリ参照が指定されていることを確認してください)
プロジェクトを開くときにエラーが出る場合
C#で開発するには、Visual Studioに.NETデスクトップ開発が有効になっている必要があります。

サンプルコード
サンプルコードの中に、私なりの補足コメントを追加しました。
using System;
using WMX3ApiCLR; // WMXには必ず必要
namespace CSharpAPISample
{
class CreateDevice
{
/// <summary>
/// デバイスを作成して閉じる方法のサンプル
/// </summary>
/// <param name="args"></param>
static void Main(string[] args)
{
// WMX3 API関数を呼び出すためのクラスです。必ず必要です。
WMX3Api Device = new WMX3Api();
// exeが実行されたことを表します。
Console.WriteLine("Program Start.");
// 現在作成されているデバイスの種類を判断
DevicesInfo devInfo = new DevicesInfo();
// Create device.
// 1つめの引数は、WMX3Engine.rtssがあるパスを指定します。基本的に変更する必要はありません。
// .rtssはIntervalZerのRTXのリアルタイム処理プログラムになります。
Device.CreateDevice("C:\\Program Files\\SoftServo\\WMX3\\",
DeviceType.DeviceTypeNormal,
0xFFFFFFFF);
// 名前をつけることができます。
Device.SetDeviceName("01_CreateDevice");
// WOSのエンジン情報と同じ情報を取得します。
Device.GetAllDevices(ref devInfo);
// IDの先頭の名前を表示します。ユーザーのプログラムでこのIDを使用することはないと思います。
Console.WriteLine(String.Format("device Id : {0}, Name : {1}",
devInfo.Devices[0].Id, devInfo.Devices[0].Name));
// ユーザーの入力を待ちます。何かキーを押すと次の処理をおこないます。
Console.ReadLine();
// exeを終了させる時には必ず必要です。
// これを行わないと、WMX3エンジンプロセスはアプリケーション終了後も実行され続けます。
Device.CloseDevice();
Device.Dispose();
Console.WriteLine("Program End.");
System.Threading.Thread.Sleep(3000);
}
}
}実行結果

プロジェクトの説明
このプロジェクトはコンソールアプリケーションになります。ボタンなどはなく、文字でユーザとやり取りします。.NET Framework4.5になります。Windowsに環境がない場合はこちらからインストールしてください。

コードの説明
using WMX3ApiCLR; ディレクティブ
using の記述でWMXのクラスやメソッドなどを、名前空間を省略してプログラムから呼び出すことができます。感覚的には「ライブラリのインポート」に近い機能です。おまじないとして記述してください。
WMX3 の処理はすべて、WMX3ApiCLRの名前空間の中にあります。そのため、このusingは記述してください。
WMX3Api.CreateDevice
ご自身が作られた、WMXのAPIが動作しているかの判断として使用します。プログラマーがわかりやすい名前をつけてください。WOSのエンジン情報にディバイス名として表示されます。
このサンプルのexeを終了すると、WOSの表示も消えます。

このサンプルでは、WMXが起動するかの確認方法でした。コンパイルとデバック実行は無事出来ましたでしょうか。
[1_BasicMotion]02_StartCommunication
このサンプルでは、サーボネットワークとの通信を開始および停止する方法を説明します。
具体的には、EtherCAT、Realtime Express、MECHATROLINK IIIの通信開始と終了を行います。
サンプルコード
サンプルコードの中に、私なりの補足コメントを追加しました。
using System;
using WMX3ApiCLR;
namespace CSharpAPISample
{
class _StartCommunication
{
/// <summary>
/// サーボネットワークとの通信を開始および停止する方法
/// </summary>
/// <param name="args"></param>
static void Main(string[] args)
{
WMX3Api Wmx3Lib = new WMX3Api();
EngineStatus EnStatus = new EngineStatus();
Console.WriteLine("Program Start.");
Wmx3Lib.CreateDevice("C:\\Program Files\\SoftServo\\WMX3\\",
DeviceType.DeviceTypeNormal,
0xFFFFFFFF);
// 遅いスレッドでよい場合はDeviceTypeLowPriorityを設定します。
//Wmx3Lib.CreateDevice("C:\\Program Files\\SoftServo\\WMX3\\",
// DeviceType.DeviceTypeLowPriority,
// 0xFFFFFFFF);
Wmx3Lib.SetDeviceName("StartCommunication");
//-----------------------------------------------------------------
// WMX管理下のネットワークに接続します。
// 例)接続されているEtherCAT、Realtime Express、MECHATROLINK IIIの通信がはじまります。
//-----------------------------------------------------------------
for (uint i = 0; i < 100; i++)
{
Wmx3Lib.StartCommunication(0xFFFFFFFF);
Wmx3Lib.GetEngineStatus(ref EnStatus);
if(EnStatus.State == EngineState.Communicating)
{
break;
}
}
Console.WriteLine("Enter Waiting\n");
Console.ReadLine();
//-----------------------------------------------------------------
// WMX管理下のネットワーク通信を終了します。こことは別のexeで通信を行っていても終了します。
// ユーザーが作成したWMXのプログラムを使用している場合は、スレーブとの通信がなくなりますので注意してください。
// 位置表示などのサブexeはStopCommunicationを行わずに、CloseDeviceを行ってください。
//-----------------------------------------------------------------
Wmx3Lib.StopCommunication(0xFFFFFFFF);
// 終了処理
Wmx3Lib.CloseDevice(); // StopCommunicationを先に行ってください
Wmx3Lib.Dispose();
Console.WriteLine("Program End.");
System.Threading.Thread.Sleep(3000);
}
}
}
実行結果
GetEngineStatusプログラムを実行すると、通信状態になります。軸やI/Oの命令も実行可能の状態です。

StopCommunicationプログラムを実行すると、通信が止まります。

エンジン状態がWMXが起動しているかの表示で、
通信状態がEtherCATなどの通信を行っているかを表しています。
おわりに
以上で、EtherCATなどの通信を開始することができました。このようにWMXでは通信のプロトコルなどを知らなくても、接続した機器と通信を行うことができます。簡単ですね。
この記事が、これからWMXを始める方のお力になれば幸いです。

コメント