この記事では、GX-Works3において構造体の定義のやり方と実際に構造体を使用した具体例について解説します。
目次
構造体とは
同じパターンで並ぶ基本データ型の変数をメンバとして1つのクループにまとめたものです。
この説明だけでは「えっ、ぜーんぜんイメージがわかないんだけど・・・(>_<)」となると思います。正直私もこれを使うまでは名前を聞いたことはあっても、きちんとした意味が分かりませんでした(と言うか、C言語のイメージが強くてややこしそうだったので食わず嫌いをしていました(笑)・・・)
しかし、イメージさえつかめば非常に簡単です。どの様なものかを説明していきます。
変数を一つ一つ定義するのは大変です
まずは、なぜ「構造体」と言うものがあるか、簡単に触れていきたいと思います。
例えばX軸・Y軸・Z軸で構成されたP&Pユニットがあるとします。そのP&Pユニットが装置に1台だけしか無いようでしたら、それぞれのX軸・Y軸・Z軸の現在位置座標を変数で定義したい場合このようにするとします。
・X軸現在位置座標:aX
・Y軸現在位置座標:aY
・Z軸現在位置座標:aZ
このように変数を定義するだけでOKです。
注意
P&PはPick and Place(ピック アンド プレース)の略称です。
しかしこの3軸構成のP&Pユニットが1装置に50台付いていたらどうでしょうか?50台分のそれぞれ個別に変数を起こすと150個律儀に登録する必要があります。・・・さらに数が増えると大変な作業になりますよね。
そこで登場するのが構造体です。まずこの3軸分を変数定義し、1グループとして登録します。次に各P&Pユニットに先ほど定義した1グループをそれぞれ紐づけていきます。そうすることにより50台分の紐づけ定義をするだけで簡単に150個分の登録が出来ます。
構造体の仕組み
先ほどのP&Pユニットの構成の場合、最初に3軸分を変数定義します。この3軸分を1グループとして登録します。この部分が構造体です。
上記の絵の真ん中にあります「構造体ラベル」という部分になります。このグループはP&Pユニットで使われる構造体(グループ)ですので、ラベル名を「PPunit」と定義します。
次に装置に設置されているP&Pユニットを登録していきます。1つ目のP&Pユニットを「PPunit1」として登録します。この部分をラベルと呼びます。
上記の絵では例として「グローバルラベル」と書いていますが、どこからでも使用できるラベルとしたい場合はグローバルラベルとして登録します。特定のプログラムやFB(ファンクション・ブロック)のみで使用したい場合は「ローカルラベル」として使用します。
最後に「PPunit1」というラベルに、構造体「PPunit」を紐づけます。このようにして定義していきます。
P&Pユニットが増えれば、ラベルをPPunit2、PPunit3と増やしていき、構造体「PPunit」をそれぞれに紐づけていく形で定義します。
最終的にラダーなどで使用する変数名は、P&Pユニット1のX軸の現在位置座標の場合「PPunit1.aX」となります。このような感じで他のラベルも定義していきます。
実際にGX Works3で登録していきます
実際にGX-Works3を使って登録します。少し面倒ですが、後で楽することが出来ます。
それでは設定して行きましょう!
構造体を登録する
①先ほど説明しましたP&Pユニットを例に登録していきます。今回はグローバルラベルで構造体を定義していきます。ナビゲーションより「構造体」を右クリック⇒「データ新規作成」を選択します。
②PPunitという名称の構造体を作成します。データ名の所に「PPunit」と入力し、OKをクリックします。
③構造体設定画面が表示されますので、ラベル名の所に「aX」「aY」「aZ」とそれぞれ入力します。
④「aX」「aY」「aZ」のデータ型を登録していきます。[・・・]の部分をクリックすると、データ型選択画面が表示されます。今回はダブルワード[符号付き]を選択します。
⑤このようにデータ型を設定して埋めていきます。
⑥それぞれにコメントを入力していきます。
⑦最後に赤枠の「チェック」をクリックします。
⑧「エラーはありませんでした」と表示されましたら、正常に登録が出来ています。「OK」をクリックして構造体設定の画面を閉じて下さい。右上の「×」から閉じて下さい。ここで構造体の登録が完了です。
グローバルラベルを定義する
①次にグローバルラベルを定義していきます。赤枠の「Global」をダブルクリックします。ここではラベルの登録と構造体との紐づけの設定をしていきます。
②「グローバルラベル設定」画面が表示されますので、ラベル名に「PPunit1」と入力します。
③[・・・]の部分をクリックすると、データ型選択画面が表示されます。今回は型分類「構造体」から既に登録しているPPunitを選択します。選択したら「OK」をクリックします。
④「グローバルラベル設定」画面から赤枠の「詳細設定」をクリックします。
⑤「構造体デバイス設定画面」が表示されますので、PPunit1のX軸現在位置座標、Y軸現在位置座標、Z軸現在位置座標に割り当てるアドレスを登録します。今回の場合、「D100」を打ち込むとD104まで自動的に入力されます。入力が終わりましたら「OK」をクリックします。
⑥同じようにPPunit2も登録します。
注意
このようにグローバルラベルの時は構造体の要素ごとにアドレスを割り付けることが出来ますが、割り付けしないで進めることも出来ます。割り付けしないときは、ラベルエリアに自動的に割付されます。
ラベルエリアについてはパラメータ設定から確認することが出来ます。
ラダーで入力してみます
①試しにPPunit1のX軸現在位置座標をD200にBMOVで転送するラダーを書きます。まず「PP」と入力すると、予測ラベルが表示されます。
②「PPunit1」を選択し、「.」←ドットを入力します。すると構造体の要素を選ぶ画面が表示されますので、「aX」を選択します。
③続いてD200を打ち込み、コメントを入力します。「PPunit1.aX」にはコメントが自動的に入ります。
④このように入力されます。
⑤ちなみにSTでこのように書けば、PPunit1の構造体の全データをPPunit2に一括転送することが出来ます。
構造体登録にまつわる注意点を2つ解説します
①「X」や「Y」など1文字での登録が出来ない
②機種がIQ-Fの場合、データ型で「倍精度実数」が選択できない
「X」や「Y」など1文字での登録が出来ない
1文字での登録が出来ないのは、予約語として既に登録されているためです。
このように「X」と入力して、「チェック」をクリックすると、赤く表示されます。
そのまま、コンパイルをしようとすると・・・
コンパイルエラーが表示されてしまいます。
機種がIQ-Fの場合、データ型で「倍精度実数」が選択できない
「これは意外だなー」と思ったのが、機種をIQ-Fに設定すると、データ型で倍精度実数が選択できません。
IQ-Fも速度が速くなって、命令も使いやすくなっている点から計算させる場面が増えてきているので少し気になりました。もし本気でIQ-Fで倍精度実数を使った演算を検討している方はご注意ください。
まとめ
今回の記事を要約するとこんな感じです。
ポイント要約
①構造体とは同じパターンで並ぶ基本データ型の変数をメンバとして1つのグループにまとめたもの
②同じパターンの機器が多数ある場合は、最初に構造体を登録すれば後は楽できる
③構造体は「X」や「Y」など1文字での登録が出来ない
④構造体で機種がIQ-Fの場合、データ型で「倍精度実数」が選択できない