Pointerとは?
前回はDataTypes・Sizeof()関数を説明しました。次はPointerについて少し話しします。前Codesysを紹介する文章でもPointerのこと書いていましたが、今回もう少し深く掘ってみたいと思います。↓
それがいままで書いてた変数の定義です。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 |
結果は意味がない値になります。なので、使用中は気をつけてくださいね。
はーい、お疲れ様です。