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

そして先のEXAMPLEでは、i1がADRを使ってアドレス値をptに渡します。
そしてそのアドレス値にある変数をpt^でアクセスし、i2に渡しします。
image.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

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

これは簡単なFor loopです。

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

結果

image.png

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

image.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

そこでref1の値を変えたらmyIntの値も一緒に変えてしまいます。
image.png

こんな感じですね。
image.png

お疲れ様ですー

Footer_Basic

Please Support some devices for my blog

Amazon Gift List

Find ME

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

シェアする

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

フォローする