LabVIEW:: 順応性VI (Malleable VI)のサンプル

LabVIEW:: Malleable(順応性)VI について

聞き慣れない英語で、今ひとつ、ピンとこない、使いあぐねています。
英語だと、Malleable = 従順な、順応性のあるという意味らしいのですが、同時に導入されたアサート(Assert)と相まって、使いどころも思いつかない。
とりあえず、サンプルを作ってみれば少しはイメージがつかめるかと思い、以前より、作り的になんとかならないかと考えていた「RGB To Color」を題材にサンプルを作成してみた。

RGB To ColorのMalleable化

LabVIEWの標準に付属しているRGB To Color関数が配列データには対応していない。 RGB to Color VI - LabVIEW 2018 Help - National Instruments

f:id:alucky4416:20210523092744p:plain
RGB to Color

実際の画像データ処理では、配列データになっていることが多いので、
このVIを使って、R/G/Bのそれぞれの配列データを、Colorに変換するとなると、
ForLoopで処理することになるが、それだとやはり処理に時間がかかる。

f:id:alucky4416:20210523093133p:plain
RGB to Color on ForLoop

RGB To Color のダイアグラムを見ると、Join Numbersという関数を使っており、
U8 同士をUpper/Lowerで結合してU16に変換(あるいは、U16同士をUpper/Lowerで結合してU32に変換) を組み合わせて、R/G/BのデータをUpper/Lowerで結合してU32のColor値に変換している。

f:id:alucky4416:20210523093307p:plain
RGB to Color Diagram

Join Numbersには、配列データを渡すことができるので、以下のようにForLoopにしなくてもR/G/Bの配列データをColorの配列に変換できる。

f:id:alucky4416:20210523093615p:plain
RGB to Color Speed up version

これで高速化が図れましたが、今回は、さらにこれをMalleable VI化してみることにします。

作成手順

  1. LabVIEWのファイルメニュー>>新規で作成するメニューが表示されるので、「順応性VI」を選択

    f:id:alucky4416:20210523094914p:plain
    FileMenu>>New>>MalleableVI

  2. 通常のVIとほぼ同じで、拡張子.vimがフロントパネル・ダイアグラムが表示される。

    f:id:alucky4416:20210523095110p:plain
    Malleable VI

  3. 関数パレットのストラクチャから「タイプ特化ストラクチャ」を選択してダイアグラムに配置
    Type Specialization Structure - LabVIEW 2018 Help - National Instruments

  4. タイプ特化ストラクチャの「承認(Accepted)」に、LabVIEW標準関数のRGB to Color.viのダイアグラムの中身をコピペする。

    f:id:alucky4416:20210523095313p:plain
    Type Specialization Structure

    ダイアグラムエラーのため、このケースは非承認に変わります。

  5. 入出力端子をタイプアサーションシーケンスの外に移動する

    f:id:alucky4416:20210523100302p:plain
    Pull the terminal out of the structure

    エラーが解決されたため、ケースが承認に戻ります。

  6. 他のケースは「無視」となっていますが、空のダイアグラムままにですが、そのままにしておく。

  7. 入出力端子をVIのコネクタパンに割当

    f:id:alucky4416:20210523101229p:plain
    Assign terminals to the connector pan

  8. このVIを保存。ひとまず RGBtoColor.vim として保存する。
    これで順応性VIのRGB To Colorの完成。

新しくVIを作成して、先に作成した順応性VIのRGB To Color.vim をダイアグラムに配置。

f:id:alucky4416:20210523102047p:plain
Using RGBtoColor.vim

入力RGBに渡すデータが配列の場合、出力Colorも配列に変化する。

仕組みの説明

タイプ特化ストラクチャの「承認(Accepted)」に合致しているものがあれば有効になり、最初に合致したもの以外は無視される。
今回の順応性VIのRGB To Color.vimでは、入力端子のR/G/Bにスカラー値を配線すれば、Join Numbersはスカラー値のまま計算、結果出力もスカラー値になります。
入力端子R/G/Bに1次元配列を渡せば、Join Numbersが配列での計算になり、結果出力も配列になります。
多態性VIの場合は、適用するデータ型ごとにVIの作成が必要だったのに対して、順応性VIの場合は、一つのVIで対応できるので作成が楽です。
順応性VIは、通常のVIと違い、VIの端子に接続されたデータ型は決まっておらず、渡されたータ型による動作の違いをプログラム的に対応させる、ことができるVIということのようです。

順応性VIとアサートの仕組みの導入と共に追加されたいくつかの順応性VI型の標準関数には、タイプ特化ストラクチャを使っていないものもあります。そうしたVIは、Variant型を使用しています。
データ型によらず処理が共通化できるものは、タイプ特化ストラクチャすら不要ということでしょう。