ユーザーメモリとは
デジタルI/Oの感覚でON/OFFを制御することができます。この方法では、PC内部の変数として機能するため、サーボやI/Oモジュールとの通信に影響を与えることはありません。また、APIバッファーを使用する場合は、デジタルI/Oと同等のリアルタイム動作が可能になります。(バッファー動作開始まで遅延動作が可能です)
RTX SDKを使用する方はこの機能を使うことはないと思います。
ユーザーメモリを使用を検討するタイミング
APIバッファー記録中に、IFブランチ機能で実行時の値を保持したいときに使用します。
通常の変数では、バッファー記録中の状態を保持してしまいます。
(APIバッファーを実行する前に変数の値が確定してしまい、リアルタイム処理ではありません)
Windowsスレッドでの動作
ユーザーメモリの値を読み取り、値を反転させるコードは以下の通りです。 デジタルI/Oと同じ感覚で制御できます。
サンプルコード
※WMX3.6で検証したコード
private static void ユーザーメモリbit反転()
{
var usMemo = new WMX3ApiCLR.UserMemory();
// 現在の値を取得
Byte b = 0;
usMemo.GetMBit(0, 0, ref b); // ユーザーメモリの0bit目を取得
// トグル処理
if (b == 0)
usMemo.SetMBit(0, 0, 1); // ユーザーメモリの0bit目をON
else
usMemo.SetMBit(0, 0, 0); // ユーザーメモリの0bit目をOFF
}動作状態
ユーザーメモリの0bit目が反転します

リアルタイムスレッドでの動作(APIバッファーで動作させるとき)
ユーザーメモリーの制御クラスをnewするときは UserMemory(WMX3Api wmx3Api)のコンストラクタを使用してください。WMX3Apiクラスを指定しないと、期待通りの動きにはなりません。
使用するための準備
プロジェクトに「UserMemoryApi_CLRLib.dll」を参照してください。

dllがないとコンパイルできません。参照がない場合は以下のコンパイルエラーになります。
エラー CS0234 型または名前空間の名前 ‘UserMemory’ が名前空間 ‘WMX3ApiCLR’ に存在しません (アセンブリ参照があることを確認してください)
ユーザーメモリのビット数と有効範囲
WMX3のユーザーメモリは、M0〜M127 の計128ビット(16バイト)が使用可能です。GetMBit / SetMBit の第一引数がバイト番号(0〜15)、第二引数がビット番号(0〜7)になります。範囲外を指定するとAPIがエラーを返すため、ループ処理で複数ビットを操作する場合は上限チェックが必要です。
複数ビットをバイト単位でまとめて読み書きする
1ビットずつ操作する GetMBit / SetMBit のほかに、1バイト(8ビット)をまとめて操作する GetMByte / SetMByte が用意されています。複数のフラグを同時に管理したいときに便利です。
// 1バイトまとめて読み書きするサンプル
private static void バイト単位でユーザーメモリ操作()
{
var usMemo = new WMX3ApiCLR.UserMemory();
// バイト0(M0〜M7)を一括取得
Byte b = 0;
usMemo.GetMByte(0, ref b);
Console.WriteLine("M0-M7 = " + Convert.ToString(b, 2).PadLeft(8, '0'));
// bit0とbit2をONにした値をセット
Byte setVal = 0b00000101; // bit0=1, bit2=1
usMemo.SetMByte(0, setVal);
}
APIバッファーと組み合わせた実践的な使い方
APIバッファー実行中は、通常のC#変数は記録開始時の値で固定されてしまいます。ユーザーメモリをIFブランチの条件として使うと、バッファー動作中でもリアルタイムに条件判断が可能です。
典型的なパターンは以下の通りです。バッファー記録中にM0をONにすると、次の判断ポイントで分岐先が切り替わります。
- Windowsスレッドからユーザーメモリに書き込む(例:緊急停止フラグをM0にセット)
- APIバッファー内のIFブランチでM0を条件として参照する
- バッファー動作中でも条件が動的に切り替わる
よくあるミスとトラブル
リアルタイム側でコンストラクタの引数を省略してしまう
リアルタイムスレッド(APIバッファー)でユーザーメモリを使う場合は、必ず new UserMemory(wmx3Api) のようにWMX3Apiインスタンスを渡してください。引数なしの new UserMemory() を使うと内部的にAPIバッファーと連携されず、期待した動作になりません。
DLLの参照が不足している
UserMemory クラスを使うには UserMemoryApi_CLRLib.dll をプロジェクトに追加する必要があります。追加を忘れると「型または名前空間の名前 ‘UserMemory’ が名前空間 ‘WMX3ApiCLR’ に存在しません」というコンパイルエラーが出ます。WMX3のインストールフォルダ内にあるDLLを参照に追加してください。
おわりに
ユーザーメモリは、APIバッファーとWindowsスレッドをまたいだフラグ管理に欠かせない機能です。通常の変数で実現が難しいリアルタイム条件切り替えが、GetMBit / SetMBit のシンプルなAPIで実装できます。まずはWindowsスレッドで動作を確認し、必要に応じてAPIバッファー連携に移行するのがスムーズな習得ステップです。

コメント