【シリーズすごいぞiQ-F】「いわゆる構造化プログラミング」への道　3回目の記事～データの構造化、構造体によるデバイスマッピング

## つづきを始める前に
[「いわゆる構造化プログラミング」への道　2回目の記事](https://qiita.com/fujiteruo/items/3d50a37055549de7d01e)
からのつづきになります。

前回は以下の論を展開しました。
- FB＝「よく使う回路」では無く、「FB=盤内に組み込む部品を仮想化したもの」
- 構造化では無く、まずは部品化

そして、今回からはデータの構造化について書きます。
全体像を語ると分かりにくいし説明も長くなるので一つの実践的な手法を紹介したいと思います。

## ラベル（変数）、デバイス（アドレス）論争は意味が無い 
未だにPLCプログラミングを行うに当たって、まだまだデバイスの方が良いとか比較表を作られる方がいますが、それぞれ特性が違うので特性にあった使用法が必要になります。

ラベルを使用する上での原則から外れるとデバイスを使用した方が良いという事になります。
私が考える原則は以下になります。
- プログラム中で補完が効いて入力し易くなるような命名規則を採用する
- POU毎に宣言するローカルラベルの数は可能な限り少なくする
- 同じような用途のローカルラベルを違うPOUで使用する場合は同じような名称を使用する
- ラベルの宣言の数を減らすため、配列や構造体を活用する

そして、入出力に使用したり、再割付時に値を保持するためにグローバルラベルを宣言して、それらをデバイスに関連付ける必要があります。

ここでグローバルラベルをデバイスに一点一点関連付けるのか？ということになるとラベルを使うメリットが感じられにくくなります。

なので、リンクリフレッシュデバイスを構造体を利用してマッピングしたので取っかかりに紹介したいと思います。

## 構造体によるデバイスマッピングとは
リンクリフレッシュデバイスでの例なので、入力用と出力用に分かれる事になります。
簡単に手順を記載します。
### 1．機器毎の構造体を定義する
リンクリフレッシュデバイスに乗せるので機器毎に8点とか16点とか10点とか点数を決めてビットとワードのメンバを定義します。

私はメンバ名には「b_SW01～16」とか「w_設定01～16」とかと連番で適当な数量登録し、具体的な用途はコメントで記載するようにしています。

ラベルエディタの拡張表示でデバイスを割り付けることになるので、ビットとワードに使用できるデバイスの種類は1種類ずつです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3765338/a45bddf5-2a51-4182-b030-a91fc44ed8d6.png)

### 2.局毎に機器の構造体をまとめた構造体を定義する
各リンク局で使用する機器をひとまとめにした構造体を定義します。
データ型構造体のラベルを複数定義した形の構造体になります。
リンクリフレッシュデバイスの局毎の点数に合わせるため、隙間は配列ラベル等を宣言して埋め合わせます。
私は機器毎の構造体と区別するために「stg_1階SEND」等と構造体グループを意味する「stg」という付番をして構造体を定義しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3765338/4cdaee98-e81e-408e-a7d1-4a62ec08098f.png)

### 3.局毎の構造体をまとめた構造体を定義する
各局毎の機器構成に違いが無ければ局毎の構造体を配列で定義できます。
局毎に違いがあればそれぞれのstg構造体をデータ型としてメンバに持つマスター構造体といえるような構造体を定義します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3765338/dec62292-6158-4ed5-9fb7-a78ae16d7c73.png)


### 4.全てをまとめた構造体型ラベルを要素数1の配列で宣言する
配列で宣言しないとそれぞれのメンバのグループ毎にデバイス割付の設定を行う必要が出てきます。
要素数1の配列で宣言することにより、先頭デバイスを設定するだけでマスター構造体となる構造体のメンバ全てにデバイスが割付きます。

リンクリフレッシュデバイスの場合で説明していのでこの場合、送信用と受信用でそれぞれ1つずつ、計2つのマスター構造体となる構造体を定義することになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3765338/62f8544d-3043-4754-9a64-9d9919f48863.png)

## この手法の注意点
### 割り付けたはずのデバイスが勝手に解除される時がある
 構造体の編集、差し替えを行った場合にその部分だけデバイスの割付が空になります。
 構造体メンバのコメントを編集するのは構造体を編集した事にはなりません。
 マスター構造体型ラベルのデバイス割付欄を一旦空白にしてEnterし、再度先頭デバイスを入力します。
 （カット-Enter-ペースト-Enter)
 マスター構造体型ラベルのコメント欄に先頭デバイス番号を記入しておくことを推奨します。
 
### 割り付けたデバイスを確認しにくい
ウォッチに登録し、「割付（デバイス）」列を表示させるのが一番確認し易いと思います。
ただし、ラベルの展開が非常に遅い事があるので下記の手順でExcelにコピーした方が良い場合もあります
1. 「Ctrl+→」で全て展開
1. PgDnキーでスクロールしながら全てのデバイスを表示させる
1. Ctrl+A Ctrl＋Cでコピーし、EXCELに貼り付ける

マニュアルでは割り付けたデバイスを確認するためにはXMLで出力させるとなっていますが、私はこの方法はおすすめしません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3765338/b7a252ac-542f-4b6d-a53e-4aec9533cd70.png)

### ウォッチウィンドウの表示が遅い
ウォッチウィンドウが遅いのでウォッチ上で選択した項目を右クリックして「ウォッチに再登録」して手打ちやExcelに連番処理させて目的のラベルをウォッチできるようにするなど工夫が必要になります。

## なかやすみ
データの構造化といっても何から話して良いか分からないので構造体によるデバイスマッピングについて説明しました。

このようにリンクリフレッシュデバイスを構造体でマッピングすることにより、ウォッチでモニターする限りではデバイスもラベルも検索を行う必要が一切無くなりました。

結局グローバルラベルにデバイスを割付かい？と思っていたところ、ブレイクスルーになった手法です。

つぎはこの手法を有効に活用するために必要なFBの分類とデータ構造について書いてみたいと思います。



## 過去記事一覧
+ [過去記事一覧](https://qiita.com/fujiteruo/items/af2459d320e8109963db)
+