デジタル入出力スレッド
Namespace: FVIL.IOAssembly: 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 |
---|---|
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
シミュレータ:
デバイスが実装されていない環境で画像処理アプリケーションを起動する場合にはシミュレータをご利用ください。 DioInfo の SimulatorOption で使用の有無を指定して Create()()()() 関数を実行すると生成できます。 シミュレータはデバイスコントローラのスタブです。 共有メモリやイベントを介して DI/DO、割り込みを模擬するものです。 デバイスの挙動を忠実に再現するものではありません。
Controller プロパティ
このクラスは表示処理を抽象化することを目的としており、デバイス固有の機能を使用することを考慮していません。 デバイス固有の機能を使用する場合は、Controller プロパティから 対応するデバイスコントローラを抽出して使用してください。 (※プロパティの変更や取得などは SetParam/GetParam/SendCommand である程度可能ですが、 プロパティ名が機能ごとに異なるので機能依存であることに変わりありません。)
C# | Copy |
---|---|
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 プロパティからデバイスコントローラを抽出する方法を推奨します。
- プロパティの設定と取得
SetParam(String, Object, array<Object>[]()[][])
GetParam(String, array<Object>[]()[][]) - メソッドの実行
Invoke(String, array<Object>[]()[][]) - デバイス初期化コマンドの送信
SendCommand(String)
C# | Copy |
---|---|
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
FVIL.IO..::..DioThread