使用するバージョン
F1からみると、?=を使ってVariantの変数を参照変数として扱うことができます。
もしTagがVariantとして扱ってるときにその参照が有効だったら、参照がそのまま使えるですが、そうじゃない場合は値がNULLになります。
参照として扱ってるとき、その参照が有効かどうかをチエックする方法があります。LADとFBDの場合はENOの状態で判断することができます。もしENOが1なら有効で0なら無効です。STL、SCLの場合IS_NULLかNOT_NULLのFunctionを使えば有効かどうかをチエックできます。
ですが、この?=はルールがあります。
- VariantがTempの変数NG。
- Variantを参照するメモリエリアは必ず最適化されたメモリエリアです。
- Variantを参照する変数は配列なら、必ず長さも一緒にしないといけません。例えば[0..9]配列のVariantが[0..10]の配列に参照することができません。
- SCLの場合、a := b := cのようなマルチ与えができません。
では早速EXAMPLEを作りましょう。まず3つの構造体を作ります。
Paras1
Paras2
Paras3
Function
Interfaceは以下になります。
InputはVariantです。
Temp Areaを注目してください。REF_TOになりますね。これは先ずっと言ってた“”参照“です。3つの参照用の変数を作ります。
tparasの配列は単なるどっちの参照になるかを示すのFlagだけです。
Line2~12まではCase文とTypeOfのFunctionを使ってVariantがどっちのData Typeのものかを判断します。もしParas1ならVariantがtparas1を参照します…みたいな
Line14-16は各参照変数がNULLかどうかをCheckします。
Line1-3はもしそれらのData Typeによって違う結果を出します。
^文は参照変数を使うときにつけないといけません。
最後、試しましょう。Data Blockを作成します。
中には3つの変数があって、そして違う値が入っています。
最後は三回もFunctionを呼び出し、違う変数を入れてテストします。
Network1が入れるのは1と42でBlockの中はかけ算なので結果が42になります。Network2が入れるのは1.99と5.32でBlockの中は引き算なので結果は-3になります。
Network3が入れるのは全てOnのBoolでBlockの中にANDの演算なので結果が1になります
ではーお疲れ様です!