実装例:構造体と共用体を使ったマッピング

実装例:構造体と共用体を使ったマッピング#

EtherCATのサブデバイスによっては、様々なデータを入出力できるようにバイトデータ型の配列が用意されているものがあります。サブデバイス側のファームウェアの設定やユーザプログラムによりこのエリアを使って自由なデータ型をマッピングする事ができ、TwinCATとデータの送受信が可能です。

図 6.33 1 Byte Out (n) 以下にバイトデータの配列がアサインされているEtherCATサブデバイス例#

図 6.33はあるデバイスの出力例です。汎用的なバイト型のデータの配列が続き、デバイス側で様々な型のデータにマッピングして受け取ることができます。

表 6.6 マッピングするTwinCAT側の構造体#

変数名

サイズ(Byte)

1 Byte Out (n) のnへの対応

trigger

BOOL

1

0

axis_x

REAL

32

1~4

axis_y

REAL

32

5~8

axis_z

REAL

32

9~12

本節の例では、表 6.6の通りTwinCATの構造体を定義し、この構造体に値を代入すると、EtherCATのサブデバイスの1 Byte Out (n)エリアに順次マッピングするための構成方法を説明します。

構造体定義と共用体定義#

まずは、表 6.6に示したとおり、cordinates_send_data構造体を定義します。

通信用の構造体なので、メモリアライメント節で説明したとおり{attribute 'pack_mode' := '1'}を加えなければなりません。

{attribute 'pack_mode' := '1'}
TYPE ST_cordinates_send_data :
STRUCT
    trigger: BOOL;
    axis_x: REAL;
    axis_y: REAL;
    axis_z: REAL;
END_STRUCT
END_TYPE

Tip

{attribute 'pack_mode' := '1'}を加えなければ8バイトアライメントとなり、その後のREAL型の変数に合わせて1バイト占有するtriggerの変数の後に3バイトの空きが発生します。

つづいて、マッピングするための共用体を定義します。バイト配列の出力用変数には、AT%Q*を指定し、出力変数であることを宣言します。(入力変数として宣言する場合はAT%I*と記述します)

TYPE U_send_data_mapper :
UNION
	st_corditnates_send_data : ST_PositionCordinates;
	byte_stream AT%Q* : ARRAY [0..12] OF BYTE;
END_UNION
END_TYPE

定義した共用体を、グローバル変数等でインスタンス化します。

{attribute 'qualified_only'}
VAR_GLOBAL
    robot_cordinate_send_output: U_send_data_mapper;
END_VAR

このあとビルドを行うと、次の通り、PLCプロジェクトのInstanceとしてAT%Q*を指定した変数のインスタンスが出来上がります。

EtherCATアドレスへのマッピング#

連続したバイト配列の場合、EtherCATデバイス側からマッピングすることで、マルチリンクが活用できます。これにより13Byteまとめて1回でマッピングが可能となり、1Byteづつマッピングする必要がありません。

同じサイズのバイト配列分を範囲指定し、コンテキストメニューからChange Multi Link...を選択します。

次図の通り、配列変数が一覧されていますので、選択してOKボタンを押します。

これによりプログラム上で作成したグローバル変数GVL.robot_cordinate_send_output.st_corditnates_send_dataの構造体要素にそれぞれのデータを代入することができます。

共用体によりバイトデータとしてシリアライズされ、EtherCATのプロセスデータとしてリアルタイムに相手側へデータ転送することができます。