みなさん装置のプログラムを作成するとき以下の問題があったことありますか。
- 装置Version 1.0
- 装置Version 1.1、Version 1.0上でOption A付き
- 装置Version 1.2、Version 1.0上でOption B付き
- 装置Version 1.3、Version 1.1とVersion1.2
そのOptionはDriveとRemote IOを増やしてるとか、上位通信の追加とかAlarmかLogicがちょっとした追加や変更など様々です。4つの構成だけでも従来では4つのプロジェクトに分けるか、Bitで条件分け実行コードを制御するかです。
ですがTwinCAT Build 4024から”Variants”という機能があり、TwinCAT3のIDEで数Clickするだけで自動で全部切り替えるようになります。
そうすることによってプロジェクトの管理は簡単になり、ミスも減ります。
- シミュレーションの簡易化
Simulationするとき実機がない場合が多く、従来はPLC Inputs/OutputsのMappingに変わり、一部のHardwareを無効か再Mappingする必要があります。Variantsは数Clickだけで実機バージョンとSimulationバージョンを切り替えられるようになります。 - Codeのメンテナンス性上がる
違う装置だがCodeが似てるものがよくあり、一部の原因はそのシリーズの装置しかないOptionsがついてるとか。そのときVariants機能を使うとそのように細やかな変更のために複数のProject分ける必要なくなります。
Work Flow
Variantsを構築するには4つのStepが必要です。
まずVariants・Variable Groupを定義>そのVariantsを選択>有効>設定変更の流れになります。
Variants Sturcture
こちらは今回記事で作成するVariant環境です。
GroupはSimulationとRealに分かれています。
Simulation GroupにはSimulation Option1、Simulation Option2、Simulation Allの3つのOptionsがあります、Group内のProfinet・EtherCAT Interfaceは無効され、OptionsによりOPCUA Clientを切り替えます。
Real GroupはNoSimulation VariantのみでProfinetとEtherCATをEnableしてる。
Activate Toolbars
View>Toolbars>TwinCAT XAE Project VariantsでVariantsのToolbarsを有効にします。
Toolsbarから赤枠のIconが表示されます。
Manage Project Variants
まず赤枠の青いICONをクリックします。
VariantsやGroupsを作成するManage Project Variants画面が出てきます。
Create Variants
Nameの列で直接入力すればVariantsを作成できます。
今回は4つのVariantsを作りましょう。
Description
いわゆるコメントのようなものです。該当するVariantsはどんな特徴あるかを簡単で書きましょう。
Create Groups
GroupsのTabを開きます。
列に入力するとGroupsを作成できます。
今回はSimulationとReal2つのGroupsを作成します。
Assign Member
次はGroupsのメンバーを設定します。
Groussを選択すればとなりのMemberがCheckboxに入るようになります。
Simulation
Simulation Groupを選び>Memberの列にSimulateFullFreatures/SimulateOptions1/SimulateOptions2をCheck入れます。
Real
Verification
一度Drop ListからVariantsやGroupを確認しましょう。
[ ]内のはGroupです。いまはSimulationとReal2つのGroupがあります。
そして4つのVariantが作成されています。
Add some Fields IO
[All]のGroup選び>OPCUA Virtual/EtherCAT/Profinet Controller3つのField busを追加します。
Configure
次は各GroupやVariantを構築します。
Simulation Group
[Simulation] Groupを設定します。
SimulationではOPC UA Clientを使用しますね。
OPCUA Clientを選択します。
View>Properties Windowします。
右側にProperties 設定画面出てきますね。
今度はOPC UA Clientを展開します。
Client#1をダブルクリックします。
右側のProperties>Project VariantsをTrueします。
同じくClient #2をダブルクリックします。
Properties>Disableを同じくTrueします。
そうするとClient#1とClient#2もVariantにより設定が変わるようになります。
SimulateOptions1
次はSimulateOptions1をDrop-Listから設定します。
Misc>EnableからClient #1をDisableします。
SimulationOptions2
次はSimulateOptions2です。
Misc>EnableからClient #2をDisableします。
Disable EtherCAT Group
SimulationではEtherCAT Field Busを使用しませんので[Simulation]Groupを選びます。
Device2(EtherCAT)をダブルクリックします。
Misc>直接Disableします。
Disable Profinet Group
SimulationではProfinet Field Busを使用しませんので[Simulation]Groupを選びます。
Misc>DsiabledをDisabledにします。
それでDevice2/Device3が無効してる状態になりました。
Real Group
[Real] Groupを設定します。
NoSimulations
次はNo Simulations を選択します。
Device1 のOPCUA Clientを選択します。
Project Variants>DisbaleをTrueにします。
Enable EtherCAT
EtherCATのFieldbus>Misc>DisabledをEnabledに変更します。
Enable Profinet
ProfinetのFieldbus>Misc>DisabledをEnabledに変更します。
ICON Display
Variantsの設定に影響されるObjectが右上では小さな緑三角が表示されます。
Verification
ここで一回検証してみましょう。
Group-Simulation
まずGroup Simulationを選ぶと
Group-Real
Variants-SimulateFullFreature
では実際にVariantでSimulateFullFreatureを選ぶと、OPCUA Client#1 Client#2が有効されましたが、EtherCATとProfinetが無効しました。
Variants-SimulationOptions1
SimulationOptions1 Variantを選択するとOPCUA Client#1さらに無効になりますね。
Variants-SimulationOptions2
SimulationOptions2 Variantを選択すると今度はOPCUA Client#2だけ無効になりますね。
Variants-NoSimulations
NoSimulation設定するとOPC UA Client自体が無効になる代わりにEtherCATとProfinetが有効になる状態です。
Play with PLC
今度は実際Variantの設定をPLCに取り込んでみます。まずPLCを選択します。
Properties Setup
次はView>Properties Windowをクリックします。
Project Variants>DefinesをTrueにします。
ProjectのTabを開きます。
下にCompiler Definesの項目がでてきます。
Choose your Variants
次は作業するVariants環境を設定します。今度は仮にSimulateOptions1を選びますね。
ImplicitのCheckBoxを入れます。
そうするとSimulateOptions1.Simulationが表示されます。
今度は別のVariants環境を試してみます。
そのImplicitにちゃんと反映されますね。
Test Program1
テストプログラムを作ります。今回はConditional Compliationも一緒に使用します。難しくないので単に文法とSTが少し違うだけです。
Program
いまが使用してるVariant環境を判断し、書き込みのDevice値が変わります。
PROGRAM MAIN VAR SimOptions:Int; END_VAR {IF (defined (SimulateOptions1)) } {info ‘Simulate Options1’} SimOptions:=1; {END_IF} {IF (defined (SimulateOptions2))} {info ‘Simulate Options2’} SimOptions:=2; {END_IF} |
Result
もしSimulateOptions2環境だと。
SimOptionsはいま2になります。
今度はSimulateOptions1にします。
SimOptionsはいま1になります。
Test2
GVL
Test1とあまり変わりなく、今回はGlobal Varaible Listから定義します。
{attribute ‘qualified_only’} VAR_GLOBAL {IF (defined (SimulateOptions1)) } {info ‘Simulate Options1’} bConfingsSimOptions1:BOOL:=TRUE; {ELSE} bConfingsSimOptions1:BOOL:=FALSE; {END_IF} {IF (defined (SimulateOptions2)) } {info ‘Simulate Options1’} bConfingsSimOptions2:BOOL:=TRUE; {ELSE} bConfingsSimOptions2:BOOL:=FALSE; {END_IF} END_VAR |
PROGRAM
実際アプリケーションではそのデバイスの状態により実行するプログラムを分岐できます。
PROGRAM MAIN VAR SimOptions:Int; END_VAR IF GVL_MyConfigs.bConfingsSimOptions1 THEN //your Code SimOptions:=1; END_IF IF GVL_MyConfigs.bConfingsSimOptions2 THEN //your Code SimOptions:=2; END_IF |
Result-1
SimulateOptions1 Variant環境を設定するとSimOptionsは1になります。
Result-2
SimulateOptions2 Variant環境を設定するとSimOptionsは2になります。
以上になります。
次回はVariantを使用しさらにパラメータを分けれるような構築方法を紹介します。
よろしくお願いします。