Beckhoff#TwinCAT3 IEC61131-3 Pointers

Pointerとは?

前回はDataTypes・Sizeof()関数を説明しました。次はPointerについて少し話しします。前Codesysを紹介する文章でもPointerのこと書いていましたが、今回もう少し深く掘ってみたいと思います。↓

Codesys#PointerとReference

それがいままで書いてた変数の定義です。VAR END_VARの間でこのコードを書くとnVarという変数が2ByesのMemory上で定義され、プログラムの中にnVarという変数に読み書きすることができますね。

Pointerというのは変数の形でメモリのアドレスを表現できるシンボルと思ってください。そうになりますと、プログラム中にではそのPointer値変われば、直接読み書きたいMemoryアドレスを操作することができます。つまり、Pointerは変数のアドレスを保存します。

国産PLCなら三菱のZ、Omronの*のようなイメージですね。ちなみにシーメンスはS7-300,400のときにもAR(Adrress Regisiter)というアクセス方も一般的ですが、S7-1200,S71500ではそのやり方も推奨しません。

Pointer定義

さて、まずPointer定義はこうなります。

VAR
    pPointer:=POINTER TO INT;
END_VAR

pPointerは変数のアドレスを保存すると書いていましたが、この時点でPointerはまだ”空”です。そしてPOINTER値を見ると、”0”だとわかります。

Pointer使う

次はPointer値をアサインします。ADRというOperatorを使用します。そうすると、pPointer

の中にいまnVarの”Memoryアドレス”が保存されています。

VAR
    nVar:INT:=10;
    pPointer:POINTER TO INT:=ADR(nVar);
END_VAR

nPointerはいま16#FFFF930C5EAAD0B2になっています。これはnVarのアドレスです。

イメージ的にはこうですね。

では、もしこのようにnPonterの値を変えたらどうになります?

nVarはそのまあ20ー>30になるでしょうか。

nPointer:=30;

実になりません。実際このコードをの意味はこうになります:

nPointerが保存してるメモリアドレスが30になるだけです。つまりどこにメモリ、そしてそのメモリどんな意味持つのかさえわからないくなります。

その”30”ってパソコン上の30番のメモリ番地に過ぎません。

では、nPointerが示してるnVarの値を変更したいときはどうすればよいでしょうか。このようになります。

pPointer^:=30;

nPointerがいましめしてるのはnVarのメモリアドレスなので、この^記号を使えばその16#FF930C5EAAD0B2というメモリ番地>この例ではnVarという変数の値が30に変更するという流れになります。

注意

ここで注意するのはPointer使うときはコンパイラーにはなにもエラーになりません。たとえ存在しないメモリ番地とか、データタイプ違ったりとか。なので、使うときは気をつけてください。下手になると、CPUが止まりますからね。例えば、以下の例でStringのPointerをTimeデータタイプのヘンスうに参照したらどうになります?

VAR
nTime:TIME:=T#10M5S4MS;
pPointer:POINTER TO STRING(300):=ADR(nTime);
END_VAR

結果は意味がない値になります。なので、使用中は気をつけてくださいね。

はーい、お疲れ様です。

Footer_Basic

Find ME

Twitter:@3threes2
Email:soup01threes*gmail.com (* to @)
YoutubeChannel:https://www.youtube.com/channel/UCQ3CHGAIXZAbeOC_9mjQiWQ

シェアする

  • このエントリーをはてなブックマークに追加

フォローする