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
新たに使用するメソッド:
TcAdsClient::Read(), Write() : ADS読み書きとストリームへの入出力
https://infosys.beckhoff.com/content/1033/tc3_adsnetref/7313461387.html
https://infosys.beckhoff.com/content/1033/tc3_adsnetref/7313513611.html
BinaryReader::ReadXXXX(), BinaryWriter::Write() : ストリームデータの読み書き
https://docs.microsoft.com/en-us/dotnet/api/system.io.binaryreader.readint16?view=netcore-3.1
https://docs.microsoft.com/en-us/dotnet/api/system.io.binaryreader.readuint16?view=netcore-3.1
https://docs.microsoft.com/en-us/dotnet/api/system.io.binarywriter.write?view=netcore-3.1
ハンドルとクライアントの宣言
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#での構造体定義