氷河期の暮らしかた

就職氷河期を生き延びた人のお仕事備忘録(アフィリエイトを使用しています)

ストラクチャ関数の使い方とは?



こんにちは。月曜から金曜まで会社と家をループしている氷河期の住人だよ。

とりあえず計算に必要な関数はひととおり使えるようになりましたか?

プログラムを組もうとすると、もちろんこれだけでは足りません。

今回はプログラムを作る上で必須ともいえる、ストラクチャについて説明します。

これがないと始まらない?ストラクチャを使いこなそう!

forループ

Cでもありますので、経験者の人はわかると思います。

簡単に言うと、条件が達成されるまでループ内のプログラムが繰り返されるものです。

forループの条件

条件は左上の「N」です。ここに値を入れることで、その回数実行してから出力がループ外に出されます。

forループの例

下のforループ中のサイコロ型ノードは乱数を発生するものです。下のforループは、「N」に接続されている数値の通り、10回実行をします。

なので実行としては

  1. 乱数が10回出力されます。10回出力されるまで、forループより外に値は出ません。
  2. 左下の「i」はループ回数を出力します。1回目のループは「0」を出すので、10回目には「9」を出します。
  3. 10回実行されたら、トンネルから出力が出ます。このトンネルは大変重要ですので、よく覚えておきましょう。

トンネルって何?

ループストラクチャと外のプログラムの通り道のことをトンネルといいます。

トンネルには入口と出口があり、外から数値や文字列が入ってきたり、外へ出したりします。なので、

Point!〇 全てのトンネルの入り口から入力が入らないとループが実行されない 〇 ループが終わらないと出口から出力が出てこない

という決まりがあります。他のループも同じなので覚えましょう。

whileループ

これ無しではプログラムを組めないくらい超重要なノードですので、確実に使い方を覚えましょう。

Whileループは、停止条件が入るまで延々ループし続けるものです。

マイコンのプログラムとかって、ずっと実行しっぱなしのものが多いですよね?あれはWhileループが延々回っているわけです。

Whileループの条件

forループではループ回数が条件でしたが、Whileループは停止条件が成立すると停止します。

Whileループの例

このプログラム例の動きとしては下の通りです。

Point!① 0からループ回数をカウントし続ける(100ミリ秒周期で) ② リセットボタンを押したら0にリセット ③ 停止ボタンを押したらWhileループ停止 ④ 出力値2に数値が入り、プログラム終了

この例の中に非常に大事な要素が3つあります。順に説明します。

シフトレジスタ

forループでも使えますが、Whileループとの相性が非常にいいので紹介します。

シフトレジスタはトンネルを右クリックするか、ストラクチャ関数内で設定します。

シフトレジスタの機能

次のループのために値を保持しておくのがシフトレジスタの機能です。

例えば上記の例のようにwhileループでどんどん積算するようなプログラムだと、次のループに計算結果を持ち越さないといけないですよね。

そこでシフトレジスタを使って、そのループの結果を一時的に保持して次のループに取り出すのです。

ループ周期(待機関数)

このメトロノームの書かれたノードは待機関数と呼ばれてて、これがwhileループを決められた周期で回しています。

LabVIEWというのはPC上で使うぶんには並列実行※なので、この待機関数も同時に実行されます。

そうなると、だいたい他のプログラムが実行が終わり、待機関数がカウントアップするとループが終わることになります。それでループを一定周期で回すことができます。

※cRIOなどリアルタイムOSを使う場合は、並列実行ではないのでプログラムの組み方が変わります

待機関数の微妙な違い

待機関数には「待機関数」と「次のミリ秒倍数まで待機」の2種類がありますが、この2つ、実ははっきりとした違いがあります。

Notice!〇 待機関数は「設定した秒数待機」です。 〇 次のミリ秒倍数まで待機は、「実行時間も含めて設定した秒数待機」です。

図にすると下のようになります。(100msに設定した場合です。)

「待機関数」は実行時間があるので、実際に制御周期が何秒になるかはわかりません。しかし「次のミリ秒倍数まで待機」は、実行時間が設定時間をオーバーしない限り「設定秒数=制御周期」です。

デフォルト値

プログラムを書く上で、変数が「不定」というのは避けるべきです。シフトレジスタのようなレジスタを扱う時には、あらかじめ初期値を入れておくことが大事です。

Cなど他の言語でも初期値を設定しますよね。同じように、LabVIEWでも初期値を入れておきましょう。

Whileループの例でシフトレジスタを使っていますが、先頭に定数「0」を入れています。これは実行時にシフトレジスタを初期化するためです。

実はWhileループの例から定数「0」を取っても、プログラムは実行できます。しかも初期値で「0」になっており、変な動きはしないはずです。LabVIEWはこういう所がしっかりしています。

[word_balloon id="3" position="R" size="M" balloon="talk" name_position="under_avatar" radius="true" avatar_border="false" avatar_shadow="false" balloon_shadow="true"]じゃあ入れなくていいじゃん[/word_balloon]

デフォルト値を入れる本当の理由

では、デフォルト値「0」を消して上記Whileループの例を何回か実行してみてください。シフトレジスタの値がリセットされずに前回の値から始まってしまいます。

そう、前回実行した時の値がシフトレジスタ上に残ってしまうので、確実に「0」を初期値に入れておかないといけないのです。

 

 

シーケンスストラクチャ

Labviewの実行順ってご存知ですか?

[word_balloon id="3" position="R" size="M" balloon="talk" name_position="under_avatar" radius="true" avatar_border="false" avatar_shadow="false" balloon_shadow="true"]実は上に答えがかいてあるよ[/word_balloon]

・・不明です。

なので実行順をちゃんとしたい場合は、シーケンスストラクチャを使いましょう。

Whileループと組み合わせて使うことが多いです。

フラットシーケンスストラクチャ

左から右へ順に実行していくために使います。プログラムの序盤にデータ取得を待つ時に使ったりします。アナログ写真のフィルムのような外観なので、アナログ人間にはわかりやすいですよね。

上の例では、本来実行順が決まっていない「足し算」と「次のミリ秒倍数まで待機」を、確実に「足し算」から先にやるようにできます。

スタックシーケンスストラクチャ

スタックなので、層になったシーケンスストラクチャです。

使い勝手が悪いだけなので、フラットを使うようにしましょう。

ケースストラクチャ

使用頻度Maxなので、必ず覚えましょう。

ケースによって中身を切り替えるストラクチャです。

ケースストラクチャの左側に緑の「?」があります。ここが条件端子になっていて、例えばTrueかFalseを入れると、ストラクチャの中身を切り替えることができます。

上の例では、条件端子にTrueが入ると3と2を足し算します。Falseの場合は3-2をします。

こんな感じで切り替えができるのですが、非常にこれが便利です。

また紹介しますが、ステートマシンの構成要素の一つです。

おわりに

ここまで読んで頂き、ありがとうございました。

ようやくプログラムらしい感じになってきました。今回の説明はかなり雑かもしれません・・

でも非常に大切な所の要点だけを書いたつもりですので、用語だけでも覚えておいて損はないです。

ストラクチャ関数についてはステートマシンを紹介する時にもう一度触れますので、またその時に詳細を書こうと思います。


関連記事

比較関数を使いこなそう!

論理回路を扱ってみよう!【LabVIEW】

LabVIEWで数値計算をやってみよう!【四則演算】