1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Siemens#?=とはなに?

Posted at

この記事はここにも乗っています↓
http://soup01.com/ja/2019/12/25/post-1990/

F1からみると、?=を使ってVariantの変数を参照変数として扱うことができます。
もしTagがVariantとして扱ってるときにその参照が有効だったら、参照がそのまま使えるですが、そうじゃない場合は値がNULLになります。
参照として扱ってるとき、その参照が有効かどうかをチエックする方法があります。LADとFBDの場合はENOの状態で判断することができます。もしENOが1なら有効で0なら無効です。STL、SCLの場合IS_NULLかNOT_NULLのFunctionを使えば有効かどうかをチエックできます。

ルール

1.VariantがTempの変数NG。
2.Variantを参照するメモリエリアは必ず最適化されたメモリエリアです。
3.Variantを参照する変数は配列なら、必ず長さも一緒にしないといけません。例えば[0..9]配列のVariantが[0..10]の配列に参照することができません。
4.SCLの場合、a := b := cのようなマルチ与えができません。

実装

では早速EXAMPLEを作りましょう。まず3つの構造体を作ります。

Paras1

image.png

Paras2

image.png

Paras3

image.png

Function

Interfaceは以下になります。
image.png

InputはVariantです。

Temp Areaを注目してください。REF_TOになりますね。これは先ずっと言ってた“”参照“です。3つの参照用の変数を作ります。
tparasの配列は単なるどっちの参照になるかを示すのFlagだけです。

Program

Line2~12まではCase文とTypeOfのFunctionを使ってVariantがどっちのData Typeのものかを判断します。もしParas1ならVariantがtparas1を参照します…みたいな
Line14-16は各参照変数がNULLかどうかをCheckします。
image.png


Line1-3はもしそれらのData Typeによって違う結果を出します。
^文は参照変数を使うときにつけないといけません。
image.png

Check

最後、試しましょう。Data Blockを作成します。
image.png

中には3つの変数があって、そして違う値が入っています。
image.png


最後は三回もFunctionを呼び出し、違う変数を入れてテストします。
Network1が入れるのは1と42でBlockの中はかけ算なので結果が42になります。
Network2が入れるのは1.99と5.32でBlockの中は引き算なので結果は-3になります。
Network3が入れるのは全てOnのBoolでBlockの中にANDの演算なので結果が1になります。

image.png

はいーお疲れ様です。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?