This training course introduce how can we develop our application through Object-Oriented-Programming (OOP). You can see new editor framework on NXG.
このトレーニングコースでは、オブジェクト指向によるLabVIEW NXGプログラミング法を紹介します。CEFをベースとした新しいエディタフレームワークの紹介も行っています。
7. LabVIEW NXG OOP Training 7
OOP の基本 - オーバーライド
親クラスが持つメソッドは、子クラスが引き継ぐことができます。しかし同じメソッドでも、親
と異なる機能を実装したい場合もあります。
親クラスのメソッド VI と同じ名前の VI を子クラスで作成できます。これを「オーバーライ
ド」と呼び、子クラスは上書きしたメソッド VI を使用します。以下の例は、各クラスが
Speak メソッドを呼び出した時の動作を表しています。 Class B は Speak メソッドをオ
ーバーライドするので動作が異なります。
Parent
Class A
Class B
Speak Walk
Speak
Hello
Hello こんにちわ
Speak メソッドの
オーバーライド
12. LabVIEW NXG OOP Training 12
クラスへのデータ追加
Car.gtype を開き、データタブを選択します。パネル上に制御器を配置することで、クラ
スデータを定義します。また、ドキュメントタブでワイヤの外観を変更することができます。
13. LabVIEW NXG OOP Training 13
アクセサの作成
データの Write/Read を行うためにアクセス VI を作成します。プロジェクトファイルタブの
Car.gtype 上の右クリックメニューからメンバーを追加 》 データメンバーアクセスのた
めの VI またはアーキテクチャタブの + からメンバー VI を追加します。
14. LabVIEW NXG OOP Training 14
アクセサの作成
Production Date は読み取りと書き込みを、 Speed は読み取りのみ作成します。
Speed の変更はメソッド VI に限定することで、データの不整合を防ぎます。
アクセサはダイナミックディスパッチ VI としても作成できます。今回はスタティックディスパッ
チ VI として作成します。またオプションで、アクセサをプロパティノードとして使用できます。
19. LabVIEW NXG OOP Training 19
子クラスの作成
TypeA クラスのアーキテクチャタブを確認すると、親クラスが Car であり、 Car クラスが
持つ VI を継承していることがわかります。
TypeA クラス自身は Speed データを持っていませんが、親クラスが持つデータを継承す
るので、内部的に Speed データを所持し、取り扱うことができます。
20. LabVIEW NXG OOP Training 20
TypeA クラスの編集
TypeA クラスに gas データを追加します。 gas データの読み取り VI と、 Fill メソッドを
作成します。 TypeA クラスは親クラスになることはないので、 Fill メソッドはオーバーライ
ドを想定しないとし、スタティックディスパッチテンプレートから作成します。
21. LabVIEW NXG OOP Training 21
ここまでの実装
動作確認のために、以下のような VI を作成します。 Car と TypeA のクラス制御器
定数は、プロジェクトファイルタブからのドラッグアンドドロップでも作成できます。
実行すると、 2 つの Speed 表示器に「 1 」の値が表示されます。
このことから、子クラスは親クラスが持つデータも同様に継承できることがわかりま
す。 TypeA クラスは Speed up/down メソッドを持ちませんが、親クラスからの継承に
より、親と同じメソッドを使用できます。
22. LabVIEW NXG OOP Training 22
Car クラスを継承して TypeB クラスを作成します。 Speed Up.gvi をオーバーライド
します。
オーバーライド VI は、デフォルトで親クラスのメソッドを呼び出します。呼び出し関数を
削除し、 Speed Up.gvi と同じように編集をします。ところが、 Speed データがクラス
タに表示されません。
オーバーライド
23. LabVIEW NXG OOP Training 23
親データへの子からのアクセス
子クラスが親クラスのデータを使用する場合、親クラスで定義したアクセス VI やメソッドを
使用する必要があります。 TypeB クラス自身にはデータが定義されていないため、クラ
スタとして値を取りだすことはできません。
Car クラスに Speed データの書き込み VI を追加します。その後改めて、 TypeB クラ
スの Speed up.gvi を以下のように編集します。
24. LabVIEW NXG OOP Training 24
動作確認
TypeB クラスを使用するよう Demo.gvi を編集します。 Demo.gvi を実行する
と、 TypeB の Speed up メソッドはオーバーライドされておりスピードが +10 さ
れ、 Car クラスの方は元のまま +1 であることが確認できます。
25. LabVIEW NXG OOP Training 25
ダイナミックディスパッチ
ここで再度ダイナミックディスパッチについてみていきましょう。先ほどの Demo.gvi は以下
のように変更することができます。
1 親子、子同士のクラスを同じデータタイプとして配列に格納できます。この時ワイヤ上のデ
ータは親クラスになりますが、実際には親子の関係情報は保持されています。
2 For ループの中で、各クラスでのメソッドを呼び出します。この手法では、ループ内のメソッ
ドは格納された全クラスが共通で持つメソッドである必要があります。例えばここに
TypeA クラスのみが持つ Fill メソッドは加えられません。
以上でデモの作成は完了です。
26. LabVIEW NXG OOP Training 26
ダイナミックディスパッチ端子
クラスに所属するメソッド VI では、コネクタペーンの端子にダイナミックディスパッチを選択
することができます。
ダイナミックディスパッチを使用する場合、クラスの入出力端子はどちらもダイナミックディス
パッチに設定する必要があります。
27. LabVIEW NXG OOP Training 27
アクセススコープ
アクセススコープを設定することで、 VI の呼び出しを制限できます。 VI がどこからでも際
限なく呼び出せてしまうと、開発者の意図とは異なる使い方がされ、バグにつながる場合
があります。
スコープにより、処理の隠ぺい化、値変更箇所の限定化等大きなメリットがあるため、大
規模アプリケーションでは積極的な使用が求められます。
Car.gtype
Speed up.gvi
TypeA.gtype
Speed up.gvi
External
VI
Write
Speed
External VI からの呼び出しは、
予期せぬ値の更新を
引き起こすため禁止します。
28. LabVIEW NXG OOP Training 28
アクセススコープ
●
パブリック
どの VI からでも参照可能です。外部とのインタフェースとして使用します。
●
コミュニティ
フレンド登録した VI からのみ参照可能です。フレンドはドキュメントタブから追加します。
●
プロテクト
同じクラスか子クラスからのみ参照可能です。
●
プライベート
自身のクラスからのみ参照可能です。
29. LabVIEW NXG OOP Training 29
DVR による OOP
データ値リファレンス (Data Variable Reference) を用いた OOP 開発の手法を紹
介します。 DVR とは、データの代わりにデータの参照先となるリファレンスを受け渡す手
法です。
●
新規データ値リファレンスで任意のデータタイプと初期値を設定します
●
In Place 要素ストラクチャでリファレンスからのデータを読み書きします
●
データ値リファレンスを削除でリファレンスを削除します
DVR では、ワイヤ上を流れるデータは値ではなく、リファレンスです。 DVR は C++ など
のポインタに似ていて、大きな配列を取り扱う際などは、 DVR を使用することでパフォー
マンスの低下や不要なデータコピーを防止できます。
5 が返される
33. LabVIEW NXG OOP Training 33
クラスによるフレームワーク開発
以下が CEF NXG のメイン VI です。クラスを導入することで、メイン VI にアプリケーショ
ン固有のデータが実装されないというメリットがあります。これにより、メイン VI は編集アプ
リのフレームワークとして整備し、案件毎に再利用ができます。