この記事では私がOOPプログラミングの大事なコンセプトその1DUTを紹介します。そのDUTはいわゆる三菱の構造体、SiemensのUDTです。複数の変数を一つの構造変数としてまとめることができます。例えばあなたが10個のStationがありStationことに温度や流量などのSetpointがあるとします。あなたはこのように定義できます;
process1_temperature1
process1_flowvalue1
process2_temperature1
process2_flowvalue1
が、拡張性ないですし、ミスしやすい。
もっと簡単な方法があります。それはDUTをを使用すること。DUT_ProcessというDUTをを定義します。
DUT_Process
temperature1
flowvalue1
そしてそのDUTを配列として定義します。
Process:array[0..yourLength] of DUT_Process;
そうなると、あなたが変数をこのようにアクセスできます。
Process[0].temperature1
Structure
では、まず1番基本のStructureから行きましょう。
Add DUT>Structureします。
Basic
ExtendsのCheckboxがありますが、最初はこれをなしにします。
DUT_Basicに3つの変数を定義します。
そのあとGVL(Global Variable List)から新たの変数を定義します。
Data Typeは先追加したDUT_Basicです。
RuntimeにLoginすると、BasicStructureVariableの構造変数に3つの変数があるとわかる。
Extends
今度はExtendsを試します。Add DUTのPopupから、ExtendのCheckboxを入れ、となりのボタンをクリックします。
Input Assistantの画面が出てきて、DUT_Basicを選びOKします。
このような設定でOpenします。
いま、DUT_Extends_From_DUT_BasicはDUT_Basicの変数を持ちながら自分だけの変数を定義することができます。
ここでまた3つの変数を追加しますね。
GVLからExtendStructVariableを定義します。
RuntimeにLoginすると、ExtendStructVariableを展開したら赤枠がDUT_Basicの変数です。
そして、緑枠はDUT_Extends_From_DUT_Basicの変数になります。
そのコンセプトを活用するよってプログラムの変更は最小限にすることができます。
Enumeration
次はEnumerationです。簡単にいいますと複数の定数をひとまとめにできる型のことです。定数とはあらかじめ決められたデータが入っており、後から変更できないデータのことを指します。値が変更できる「変数」とは違うものなので注意してください。
Non-Textlist Support
EnumerationはTextlist supoortかしないかのOptionsがあり、それによってVisuliaztionの表示が変わります。まずはNon-TextList Supportから行きます。
このような画面が出てきますね。先も書きましたが、複数の定数をひとまとめにできる型のことで、まずenum_member:=0は、つまり E_Reciple_No_TextList_Support.enum_memberの値は0です。
こので仮に飲みもののレシピがたくさんあり、各飲み物を1つの番号を振り分けます。
Support Text List
次はTextlist supportのCheckboxを入れ、もう1つのDUTを作成します。
変数はNon-Textlist Supportとまったく一緒です。
もちろん、作成するときにTextlist support入れたけど、あとで削除したい場合は右クリック>Remove text list supportでOK。
逆に作成するときにTextlist support入れなかったが、あとで追加したい場合は右クリック>Add text list supportでOK。
では、その2つのEnum DUTを使って2つ変数を定義します。
Example
EnumのDUTをアクセスする方法は直接DUTの名前からでもOKです。
(多分TwinCATのFunction Block使うときによくいろんなE_XX Typeがあり、そのE_XXはまさにEnum Typeです。)
Onlineすると、BeerやRedWineの”整数値”が入っていますが、プログラム上で使用するときにはE_Reciple_TextList_Support.Beerのような人間わかる定数名になります。
プログラムの可読性が上がります。
もちろん実際の値は整数なので、比較などの処理もできます。
下記のように、もしいまのRecipe番号はRedWineであれば、なにかを処理するんです。
Use in Visualization
そのSupport Textlist するかしないかによってVisualizationの表示が変わります。
まずAdd >VisualizationでVisualization追加し検証してみましょう。
白いところからCombo box integerを追加します。
上に表示用のLabelも追加します。
このような簡単なDrop Listと表示になりますね。
次はTextlist supportのDrop Listを選び、Variableをクリックします。
Reciple_TextSupportをします。
Variableから見ますと<E_Reciple_TextList_Support>がついてるとわかりますね。
次は同じく、今度はNon TextList Supportを選びます。
Reciple_No_TextSupportを選びます。
注意するのはVariableに<>がなくなりますね。
そうすると、TextListがSupportするDrop ListはBeer,RedWineのように文字表示されてるのに、Non Text Supportだと1,2,3,4のような数字Supportになります。
Alias
Aliasは配列のDUTを簡単で作成するものです。
まずAlias選び、>のクリックします。
Array Wizardをクリックします。
3Dの配列をIndexを指定することができます。
例えばいま10個のStationがあり、Stationことに4つのパラメタがあります。
そうすると、Dimension 1を0..9 Dimension 2を0..3を入れます。
そしてBase Typeのところに>をクリックし、Input Assitantします。
Realを選びます。
それで設定完成で、OKします。
このような構成になり、Openします。
DUTAliasの中にこのように定義されますね。
GVLをこのDUTAlias変数を定義しましょう。
Loginすると、 [0,3],[1,2]のような2D配列が出来上がりです。
次はPouの中にDUTAliasも定義します。
2D配列なので、myData[x,y]のように書き読みします。
UNION
UNIONは様々なデータ・タイプの変数を持つ構造体です。ですが、Union内のすべての変数は同じのMemoryのOffsetが持っています。つまり違う変数だが、同じのメモリアドレスになっています。
以下の記事を参考してください。