Codesys#PointerとReference

#Pointer
PointerはObjectをメモリアドレス(例えFunction Blockのインスタンス)を保存できます。
こちらはOnline Helpです：
https://help.codesys.com/webapp/_cds_datatype_pointer;product=codesys;version=3.5.16.0
##文法

```
<pointer name>: POINTER TO <data type | data unit type | function block>;
```
##Example
実際、そのPointer値を変更することによってあなたがアクセスする変数が変わっていく。Codesysは^でPointerのメモリアドレスの値を書いたり読んだりします。そしてObjectのアドレス値をPointerに渡すには、KeyWord ARDを使います。

```
Example1 
PROGRAM PLC_PRG
VAR	
	pt:POINTER TO INT;
	i1:INT;
	i2:INT;
END_VAR

pt:=ADR(i1);
i2:=pt^;
```

ここでみたらわかると思いますが、
Pointerのアドレス値・とそのアドレス値にある変数の値両方っも表示されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/ca04e40f-0057-71e7-82f1-86ff2f751c25.png)

そして先のEXAMPLEでは、i1がADRを使ってアドレス値をptに渡します。
そしてそのアドレス値にある変数をpt^でアクセスし、i2に渡しします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/293d6b92-3262-2ec8-b0e0-b9cc5cfa18a7.png)

ここでひとまずSTOPし、Operator ADRのこと見てみましょう。

##ADR
Online helpからみますと…
https://help.codesys.com/webapp/_cds_operator_adr;product=codesys;version=3.5.16.0
> The operator is an extension of the IEC 61131-3 standard.
ADR yields the 32-bit address (or the 64-bit address, if possible) of its argument. You can pass this address to the manufacturer functions or assign them to a pointer in the project.

このOperatorはIEC61131-3の拡張の一つです。ADRは32Bitのアドレス（もしくは64Bit）を返してくれます。あなたがそのメモリアドレスをFunctionsに渡ししたり、Pointerに割付けしたりすることができます。
そして注意点もあります：

>When you use an online change, the contents of addresses can shift. As a result, POINTER TO variables could point to an invalid memory area. To avoid problems, you should make sure that the value of pointers is updated in every cycle.

Online changeすると、アドレス値が変わる可能性があります。結果としてはPOINTER TOの変数が無効なメモリアドレスに指すになってしまうかもしれません。予防対策として、プログラマーはPointer値毎周期も更新するように作ってください、と。

##使い道
実際、どう使えるの？例えば、データの転送とか。
この例では長さ50のByte Arrayを長さ25のInt Arrayに転送するプログラムを作ります。

まずGVLでByteArrayとIntArrayを定義します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/f8e3eb72-78da-808c-1d7c-eedaebad89d2.png)

###SIZEOF

ここ使うのはSIZEOFというOperatorです。
https://help.codesys.com/webapp/_cds_operator_sizeof;product=codesys;version=3.5.16.0
Online helpからみると…
> This operator is used for defining the number of bytes that are required by the variable x. The SIZEOF operator always yields an unsigned value. 

このOperatorは変数Xが使われてるByte数を求めるOperatorです。このSIZEOF Operatorが絶対に正数が返してくれます。

話に戻りますが、ここIntArrayの長さを求めます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/f6f8958a-07a7-71db-c994-14da94b3575c.png)

これは簡単なFor loopです。

- _iは0のとき、ByteArrayの0*2、つまり０番のメモリアドレスが渡されいます。
そしてその_pt^をInArray[0]に入れます。
- _iは１のとき、ByteArrayの１*2、つまり2番のメモリアドレスが渡されいます。
そしてその_pt^をInArray[1]に入れます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/323b7c93-b337-d54d-78cd-711edccf1b3a.png)

###結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/126c17f0-d6cf-d383-c2bd-938113e2cde3.png)

うん？その1282はなんだだと疑問持ってる方がいるかもしれませんが。
そういうことです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/ada26fef-55c9-c833-2ccb-dc438b78d3cb.png)

#Reference

ReferenceはPointerと似ています。ここでまずOnline helpを見てみましょう。
https://help.codesys.com/webapp/_cds_datatype_reference;product=codesys;version=3.5.16.0
>A reference implicitly refers to another object. When accessed, the reference is implicitly dereferenced, and therefore does not need a special content operator ^ such as a pointer.

Referenceは他のObjectの参照です。ちょっとどう翻訳すればよいところがありますが、とりあえずOpertor^使わずにPointerのような機能ができます、と。

##文法

```
<identifier> : REFERENCE TO <data type> ;
<data type>: base type of the reference
```

##Example

まず一通り、先の文法で書いてみます。
myIntがref1が参照されいます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/7b5e9103-e865-b2be-6cfe-d4e27720295f.png)

そこでref1の値を変えたらmyIntの値も一緒に変えてしまいます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/c3e5717c-7368-ca8c-6d36-783dc3295b32.png)

こんな感じですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/dbcb3daa-95bf-c5e4-b759-bb259691d243.png)

お疲れ様ですー