デジタル入出力スレッド

Namespace: FVIL.IO
Assembly: FVILforms (in FVILforms.dll) Version: 3.1.0.0 (3.1.0.9)

Syntax

C#
public abstract class DioThread : IDisposable
Visual Basic
Public MustInherit Class DioThread
	Implements IDisposable

Remarks

このクラスは、デジタル入出力デバイスコントローラのラッパーです。
スレッドで割り込みを監視し、割り込み発生をイベントによりユーザーアプリケーションに通知します。
対応するデジタル入出力デバイスコントローラ:


このクラスのインスタンスを生成するには、 DioInfo クラスと スタティック関数の Create()()()() を使用してください。 生成されたインスタンスの Start()()()() メソッドを実行すると スレッドが作動し割り込み監視を開始します。 Interrupted イベントにハンドラを登録すると割り込みの発生を受け取ることができます。 イベントハンドラとは別に Wait(Int32) メソッドを使用する方法もあります。 この場合は、割り込みが発生するまで処理をブロックします。

C# Copy imageCopy
private void DioThread_Create()
{
    FVIL.IO.DioInfo info = new FVIL.IO.DioInfo(FVIL.IO.DioKind.FIO01, -1);
    FVIL.IO.DioThread thread = FVIL.IO.DioThread.Create(info);
    thread.Interrupted += new FVIL.IO.DioEventHandler(DioThread_Interrupted);
    thread.Start();

    // Wait
    FVIL.IO.DioEventArgs args = thread.Wait(10 * 1000);
    if (args != null)
    {
        Console.WriteLine("TimeStamp={0}", args.TimeStamp);
        Console.WriteLine("Exception={0}", args.Exception);
        Console.WriteLine("DI={0}", args.DI);
    }

    // DO:
    thread.DO = 0xF731;
    Console.WriteLine("DO={0}", thread.DO);

    // DI: (Simulator のみ可能)
    thread.DI = 0x137F;
    Console.WriteLine("DI={0}", thread.DI);

    // 解放.
    thread.Dispose();
}

void DioThread_Interrupted(object sender, FVIL.IO.DioEventArgs e)
{
    Console.WriteLine("Interrupted");
    byte di0 = (byte)((e.DI) & 0xFF);
    byte di1 = (byte)((e.DI >> 8) & 0xFF);
    Console.WriteLine(
        Convert.ToString(di1, 2).PadLeft(8, '0') + " " +
        Convert.ToString(di0, 2).PadLeft(8, '0')
        );
}

出力結果:
Interrupted
00010001 00001001
DO=63281
DI=4991

シミュレータ:

デバイスが実装されていない環境で画像処理アプリケーションを起動する場合にはシミュレータをご利用ください。 DioInfoSimulatorOption で使用の有無を指定して Create()()()() 関数を実行すると生成できます。 シミュレータはデバイスコントローラのスタブです。 共有メモリやイベントを介して DI/DO、割り込みを模擬するものです。 デバイスの挙動を忠実に再現するものではありません。


Controller プロパティ

このクラスは表示処理を抽象化することを目的としており、デバイス固有の機能を使用することを考慮していません。 デバイス固有の機能を使用する場合は、Controller プロパティから 対応するデバイスコントローラを抽出して使用してください。 (※プロパティの変更や取得などは SetParam/GetParam/SendCommand である程度可能ですが、 プロパティ名が機能ごとに異なるので機能依存であることに変わりありません。)

C# Copy imageCopy
FVIL.IO.DioInfo info = new FVIL.IO.DioInfo(FVIL.IO.DioKind.FIO01, -1);
FVIL.IO.DioThread thread = FVIL.IO.DioThread.Create(info);

if (thread.Controller is FVIL.Dio.CFviDioFIO01)
{
    FVIL.Dio.CFviDioFIO01 controller = (FVIL.Dio.CFviDioFIO01)thread.Controller;
    Console.WriteLine("DeviceID={0}", controller.DeviceID);
    Console.WriteLine("DriverVersion={0}.{1}.{2}.{3}",
        controller.DriverVersion.Major,
        controller.DriverVersion.Minor,
        controller.DriverVersion.Release,
        controller.DriverVersion.Build
        );
}

// 解放.
thread.Dispose();

下記のメンバを使用することでデバイスコントローラのメンバ(プロパティまたはメソッド)にアクセスすることができますが、 呼び出しのオーバーヘッドが大きいので推奨しません。 前述のように Controller プロパティからデバイスコントローラを抽出する方法を推奨します。

C# Copy imageCopy
FVIL.IO.DioInfo info = new FVIL.IO.DioInfo(FVIL.IO.DioKind.FIO01, -1);
FVIL.IO.DioThread thread = FVIL.IO.DioThread.Create(info);

// SetParam/GetParam
{
    thread.SetParam("Timeout", 5000);
    thread.SetParam("InterruptEdge", FVIL.Dio.InterruptEdge.Rise);
    Console.WriteLine("Timeout={0}", (int)thread.GetParam("Timeout"));
    Console.WriteLine("InterruptEdge={0}", (FVIL.Dio.InterruptEdge)thread.GetParam("InterruptEdge"));
}

// SendCommand
{
    thread.SendCommand("Timeout=6000");
    thread.SendCommand("InterruptEdge=Fall");
    Console.WriteLine("Timeout={0}", (int)thread.GetParam("Timeout"));
    Console.WriteLine("InterruptEdge={0}", (FVIL.Dio.InterruptEdge)thread.GetParam("InterruptEdge"));
}

// 解放.
thread.Dispose();

Inheritance Hierarchy

System..::..Object
FVIL.IO..::..DioThread

See Also