ユーザーメモリ

コーディング

ユーザーメモリとは

デジタル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バッファー連携に移行するのがスムーズな習得ステップです。

コメント

タイトルとURLをコピーしました