Ex.2 PLC構造体へのアクセス

完成イメージ

構造体のメモリ展開イメージ

※TwinCAT3の構造体のINT型のアドレスはByte 0, 2, 4, 6, …からスタートする

TC3のByteアラインメントについて

TwinCAT3では、変数と構造体は8Byteのアラインメントでメモリ配置される

(→変数間のメモリギャップは最大7Byte)


PLCプログラムで構造体メンバ変数間の相対アドレスを確認した例:


同じ構造体メンバ変数のサイズを元に、相対アドレスを計算した例:

構造体のサイズは

  min(最大データ型byte数, アラインメントbyte数) x n

 (nは整数) となる                                                                          

 

参考URL: https://infosys.beckhoff.com/content/1033/tc3_plc_intro/45035999813133451.html

TwinCAT ADS.NETクラス & API

新たに使用するクラス:

AdsStream Class : ADS通信用ストリームデータのクラス

  https://infosys.beckhoff.com/content/1033/tc3_adsnetref/7313041547.html


BinaryReader/BinaryWriter Class : (Microsoftの.NET APIクラス)

  バイナリデータをストリームに読み書きするためのクラス

  http://msdn2.microsoft.com/en-us/library/a4b8basy

  http://msdn2.microsoft.com/en-us/library/ft83zssf


新たに使用するメソッド:

ハンドルとクライアントの宣言

TwinCAT PLCプロジェクト、C#プロジェクトを作成し、

必要な変数/オブジェクトをそれぞれ定義

ADSサーバーへの接続

ロード時にPLCとADS接続するコード、PLCの構造体変数に

アクセスするためのハンドルを生成するコード、を追加

TC3 PLC構造体のWrite

WriteボタンでTextBoxの値をストリームに格納し、

ADS書き込みするコードを追加

TC3 PLC構造体のRead

ReadボタンでADSからストリームにデータを読み取り

TextBoxに格納するコードを追加

ハンドルのリソース解放

終了時にハンドルを消去するコードを追加

Pack Mode

構造体を {attribute ‘pack_mode’} で宣言すると、メモリ配置の最大メモリギャップを指定できます。また、`0`あるいは`1`に設定すると、メモリギャップを無くすことが可能。

Pack_Mode=‘0’時のByteアラインメント

例:

Pack_Mode=‘0’時のTC3 PLC構造体のWrite

Pack_Mode=‘0’時のTC3 PLC構造体のRead

※ pack_modeを使うことで、PLC変数のデータ型と同じByte長でADS R/Wできる


C#構造体を利用する方法

C#での構造体定義

C#構造体を利用する方法: WriteAny()

C#構造体を利用する方法: ReadAny()