今回の記事ではEXORのパネルとBeckhoff TwinCAT PLCをADS通信しデータ交換や基本的な考え方を説明し、なおかつレシピ機能を紹介します。
さ、はじめよう!
ADS
ADSプロトコル(ADS: Automation Device Specification)は、TwinCATシステム内のトランスポート層で、異なるソフトウェアモジュール間のデータ通信のために開発されました。
このプロトコルは、TwinCAT内のどこからでも他のツールとの通信を可能にし、別のPCやデバイスと通信する必要がある場合は、TCP/IPの上にADSプロトコルを使用します。ネットワーク化されたシステム内では、どのポイントからでもすべてのデータにアクセスできます。
Device concept
TwinCATシステムアーキテクチャでは、ソフトウェアの個々のモジュール(TwinCAT PLC、HMIなど)を独立したデバイスとして扱うことができます。
各タスクには、ソフトウェアモジュール(”サーバ “または “クライアント”)があります。
システム内のサーバは、ソフトウェアの形で実行中の”デバイス”であり、その動作はハードウェアデバイスとまったく同じです。
クライアント “は、”サーバ “のサービスを要求するプログラムであり、例えばビジュアライゼーションや、プログラム形式の “プログラミングデバイス “も含まれる。カムシャフトコントローラ、オシロスコープ、PIDコントローラなどのタスクのために、常に新しいサーバとクライアントを追加できるのもTwinCATは成長し続けてる証拠です。
これらのオブジェクト間のメッセージは、”message router “によってADS(Automation Device Specification)インターフェースを通して交換される。message router “は、システム内およびTCP/IP接続上のすべてのメッセージを管理・分配します。
また、TwinCATの”message router “は、すべてのTwinCATデバイス上に存在します。
これにより、すべてのTwinCATサーバープログラムとクライアントプログラムがコマンドとデータを交換し、メッセージの送信やステータス情報の転送などを行うことができます。
Reference Link
Implementation-1
最初にEXOR PanelとBeckhoff TwinCATを繋がるには必要なmessage router設定を行い、接続テストをします。
EXOR Side
Add Protocol
Configuration>ProtocolsからDroplistでProtocolを設定します。
Drop-ListからBeckhoff ADSを設定しましょう。
EXORのBeckhoff ADS通信設定画面が表示されます。
Panel AMS Net ID
Panel AMS Net IDはEXORパネル自身のAMS Net IDになります。
設定FormatはPanel IP.1.1になります。
Panel AMS Port
パネルで使用するAMS ポート番号を指定します。
- TwinCAT2を使用する場合、デフォルトのパネルAMSポートは32976です。
- TwinCAT3を使用する場合、デフォルトのパネルAMSポートは32844です。
Target IP Address
Beckhoff IPCのIPアドレスを定義します。
Taget TCP Port
Beckhoff TwinCAT RuntimeのTCP Portを設定します。
Defaultでは48898ですが、32768から65535まではADS Clientの接続用の予約Portです。
Target AMS Net ID
Target AMS Net IDはTwinCAT RuntimeのAbout TwinCAT System画面から確認できます。
How can you find it?
AMS Net IDを確認するにはTwinCAT RuntimeがインストールされたIPCにAbout TwinCATを開きます。
About TwinCAT Systemの画面からAMS Net Idを確認できます。
Target AMS Port
TwinCAT システムのAMS Portを設定します。
- TwinCAT2を使用する場合、デフォルトのターゲットAMSポートは801です。
- TwinCAT3を使用する場合、デフォルトのターゲットAMSポートは851です。
PLC models
接続する機器に対応するモデルを選択します。機種選択は正しく設定するために非常に重要です。
Summary
こちらはEXOR側のBeckhoff ADS接続設定になります。
Beckhoff Side
Add Routes
Beckhoff Controllerでは、HMIデバイスからの接続を許可するために、いくつかの特別な設定が必要です。TwinCAT3 XAEからStatic Routingを設定する必要があります。
まず、TwinCAT3システムをConfigu Modeでリセットします。
Project>SYSTEM>Routesを開きます。
Routes画面が表示されます。
Static Routes 画面を開きます。
左下にあるAddボタンでRoutesを追加します。
Add Route Dialog画面が表示されます。
Advanced SettingsでRouteの設定を行います。
先程と比べれば設定できる項目がかなり増えました。
Route Name
Route Name(target)を接続するClientの名前を入力します。
AmsNetId
AmsNetIdはTwinCAT Runtimeに接続するADS ClientのAms Net Idになります。
今回の場合はEXORの192.168.5.236.1.1です。
Transport Type
Transport TypeはTCP_IPにしてください。
Address Info
Address InfoはTwinCAT Runtimeに接続するADS ClientのIP アドレスになります。
Target Route
Target RouteはStaticで結構です。
Add Route
最後はAdd RouteでRouteを追加しましょう。
Secure ADS のCheckboxを外しOKで設定を保存します。
Done!Static RoutesにJMOBILE のルートが追加されました。
Current Routesも同じです。
Add Data
通信確認するためのデータを追加します。
中に実数の配列を定義します。
MAINプログラムを開きます。
中にINTの配列も定義しましょう。(注意するには%I*は必須ではありません)
Compile Configure
次はプロジェクトをコンパイルする設定を変更します。PLCのプロジェクトをクリックします。
Settings>Target fileのところにTMC FileとTPY FileもCheckboxを入れます。
Target Files
Target Filesグループボックスでは、ターゲットシステムでブートプロジェクトを作成する際に、どの情報を”\Boot\Plc “フォルダに転送するかを設定できます。
TMC File
TwinCAT Module Classの略です。
TPY File
TPYFileにはプロジェクト情報、ルーティング情報、コンパイラ情報、ターゲットシステム情報などが含まれています。
Build
プロジェクトをビルドするためBuild>Build Solutionします。
コンパイルされたプロジェクトに.ptyというFileが生成されました。
Back to EXOR Side
ベッコフシステムのデータはタグに基づいていて、コントローラの内部メモリの構成は固定ではなく、開発時にユーザーが設定されています。それらのデータ項目はTagと呼ばれる文字列で識別できます。
TwinCAT開発環境は、アプリケーションの設定において、各コントローラ用に作成されたタグのリストを生成します。
EXORのプロジェクトは、開発時にTwinCAT PLC制御プログラミングソフトウェアで割り当てられたタグ名を参照する必要があります。Designer Tag Editorは、ベッコフソフトウェアで生成されたタグファイルの直接インポートをサポートしています。
Add Tag
Configuration>Tags>先程追加したBeckhoff Protoclを選び>Import Dictionaryします。
TwinCAT V1.0を選び>OKで進みます。
先程の.tpy FileをImportしましょう。
TagをImportするとき、.tpyファイルからすべてのTagをImportするか、またはTagのサSubsetのみをImportするFilterを適用するかを選べます。
Done!今回はImport Allなので.tpyの中にあるTagを全部プロジェクトにImportできます。
中に必要なTagをプロジェクトに生成しましょう。
Filter?
次はEXORのFilter例を説明します。例えば下記のFunction Blockとプログラムを作成しました。fbMotor2のInstanceのみがHMIという文字がついています。
FUNCTION_BLOCK FB_Motor VAR_INPUT bStartMotor: BOOL; bReset: BOOL; END_VAR VAR_OUTPUT bMotorOn: BOOL; bAlarm: BOOL;(* HMI Thermal alarm *) END_VAR VAR sData: STRING; bResetStatistics: BOOL; (* HMI Reset statistics *) END_VAR VAR PERSISTENT stStat: ST_MotorStats; (* HMI Motor statistics *) END_VAR Function block instances declaration: VAR fbMotor1: FB_Motor; fbMotor2: FB_Motor; (* HMI only show Motor 2!! *) END_VAR |
FilterのところにHMIを入力しOKをします。
以下のTagのみImportになります。
MAIN/fbMotor2/bAlarm MAIN/fbMotor2/bResetStatistics MAIN/fbMotor2/ST_MotorStats |
Result
Done!WiresharkからAMSの Protocolがありました。
それはADS ProtocolのPacketです。
Recipe Implementation
次はEXORのレシピ機能を使用します。
レシピは、特定のアプリケーションの要件で編成されたタグ値のCollectionsです。
たとえば、午前、午後、夕方に部屋の変数(温度と湿度)を制御する必要があるとしましょう。あなたは3つのセット(午前、午後、夕方)を作成し、適切なタグ値を設定します。
レシピの各要素をタグに関連付け使用すれば、メモリに制限のあるコントローラの機能をレシビ機能として拡張することができます。そのレシピデータにはすべてのコントローラデータアイテムが含まれますが、データはコントローラから直接読み込まれるのではなく、HMIデバイスの関連するレシピエレメントから読み込まれます。
レシピデータはJMobile Studioに設定し、Userはデータレコードの各要素のデフォルト値を指定できます。JMobile HMI Runtimeでは、データを編集して新しいデータファイルに保存することができ、レシピデータの変更はディスクに保存されます。
EXOR Side
Insert Recipe
Recipe>右クリック>Insert recipeします。
新しいRecipeが追加され、ダブルクリックしRecipe画面を開きます。
こちらはRecipeの編集画面です。
Add Recipe Elements
+ButtonでRecipe 要素を追加します。
レシピ要素と接続するTagを設定します。
今回は先程Beckhoff TwinCAT プロジェクトに追加されたGVL/datasという実数配列を使用しましょう。
Done!Index=0はElement0で、使用するTagはBeckhoffのGVL/datas[0]になりました。
同じの操作で4つのレシビ要素を追加しましょう。
Storge Device
こちらのICONでレシピの保存場所を設定できます。
DefaultではLocalになります。
注意するにはレシピ設定ファイルはプロジェクト保存時に自動的に作成され、プロジェクトの data Sub Folderに保存されます。外部記憶装置を使用するには、このフォルダを外部装置にコピーする必要があります。(下図は私のSampleプロジェクトのDirectoryで、DataというSub Folderにレシピの設定Fileが保存されています)
Element name
各Elementにわかりやすい名前を定義しましょう。
Add Recipe Set
Name of set
レシピのPropertiesからNumber of setという項目があり、つまりこのレシピは何個あるかを設定できます。
今回の記事では3つを設定します。
Recipeの設定画面にSet0,Set1,Set2という項目が増えました。
Rename the set
Nunber of setのSub menuにはセット数にあるFieldが表示されます。
アプリケーションに合わせてRecipe Set名を設定しましょう。
Configure screen
次はレシピ画面を作成します。Widget GalleryからRecipes Folderを開くとRecipe setとRecipe menu Objectがあります。
- Recipe set:
- レシピをアップロードまたはダウンロードするレシピセットを選択できます。
- Recipe menu
- プロジェクトに多くのレシピが作成された場合、このウィジェットを使用してすべてのレシピを管理し、それぞれのレシピに必要なセットを選択します。
Add Recipe set
今回はRecipe set1つしかありませんので、Recipe setを選び、画面に追加しましょう。
Done!Recipe set Objectが追加されました。
Configure Recipe set
次はRecipe setのObjectと繋がるRecipe setを設定するため、Recipe set ObjectのProperties画面を開きます。
Recipe NameのDrop listからRecipesを設定しましょう。
Recipe Name/Recipe Status
数字ラベルと文字らbるを追加し、Recipe Set名と状態を表示します。
Status
Recipe Setの状態を取得できる変数がEXOR用意されています。SourceのところからRecipe>表示したいRecipe>Statusを設定しましょう。
Name
Recipe set名と文字列ラベルの接続も同じ操作です。
Recipe Element
次はRecipe set#0の要素を表示できるようにします。
文字列ラベルとR/W(Read/Writeできる)の数字ラベルを追加します。
Name
Recipesにある各要素の名前はCurrentSelectedSet >#0(つまりいま選択中のRecipe Set)のName変数を参照すればよいです。
Value
同じく、Recipesにある各要素の現在値はCurrentSelectedSet >#0(つまりいま選択中のRecipe Set)のValue変数を参照すればよいです。
Beckhoff tags
次は画面にBeckhoff PLC のtagsを追加します。
Recipeの要素と繋がってるPLC Tagsを設定しましょう。
Done!
Add Status Message
今度はRecipeのStatus Messageを追加します。先程のStatus数字表示と同じですが、Messageで表示させたほうがわかりやすいと思います。
Done!
#0のStatus変数と接続しましょう。
こちらはStatus値に相当する意味になります。
Code | Function | Descripion |
0 | Set modified | 選択してるRecipe setが変更された |
1 | Download triggered | Recipe Donwload操作がトリガーされた |
2 | Download Done | Recipe Donwload動作が完了 |
3 | Download Error | Recipe Donwload動作がエラーあり |
4 | Upload triggered | Recipe Upload動作がトリガーされた |
5 | Upload done | Recipe Upload動作が完了 |
6 | Upload Error | Recipe Upload動作がエラーあり |
7 | General Error | エラー |
Current Recipe
最後は現在選択されているRecipe setを表示するため、文字列ラベルを追加します。
CurrentSelectSet>Nameを設定します。
Download
初めてRecipe機能を使用する、もしくはRecipe機能が変更ある場合、Downloadするとき”Delete runtime dynamic files”のCheckboxを入れてからDownloadしましょう。
Result
RecipeのDownload Upload機能はBeckhoff PLC Tagsと連動していますね。
Status Messageにも動作に合わせて適切に表示されています。
いま選択してるReciple Setに沿って表示も変わってくれます。