Automation Interfaceを使ったプロジェクト更新の自動化(Powershell編)#
プロジェクト更新をTwinCAT XAEを使わず行う節では、ターゲットIPC内のWindowsのファイルシステム内(Bootフォルダ)に対してイメージを直接書き込む方法でした。この節では、ファイル操作ではなくTwinCAT XAEとその操作を自動化するTwinCAT Automation Interfaceの機能を使ってプロジェクトを自動更新する方法をご紹介します。
TwinCAT Automation Interfaceとは.NETを用いてさまざまな言語からTwnCAT XAEを操作する仕組みです。
本節では、このうちPosershellを用いる方法でTwinCATプロジェクトを、XAEの操作無しに設備へ展開する方法をご紹介します。
サンプルスクリプトの機能仕様#
事前にターゲットからTwinCATプロジェクトをアップロードし、日時の付いたバックアップフォルダ内に保存する機能を有します。
バックアップ取得後、更新するプログラムをIPCに書き込み、RUNモードへ移行し、プログラムスタートします。
Visual Studioの言語設定のご注意
本スクリプトでは、ターゲットIPCからのバックアップ取得の際、Visual Studioのメニューコマンドをリモートで操作するExecuteCommand
を用いています。このコマンドは、Visual Studioの言語設定により変化します。
ツールバーの Tools > Options... メニューの Environment > International 設定
紹介するスクリプトは、この設定が英語であることを前提としています。その他の言語に切り替えてお使いいただいている方は、バックアップが正しく機能しませんのでご注意ください。
ターゲットにソースファイルを含める設定を行ってください。
ターゲットからバックアップしたプロジェクトのPLCを開くには、そもそもIPCに書き込むPLCプロジェクトにソースファイルが含まれていなければなりません。
PLCプロジェクトのSettings
タブを開いて、Project Source
およびそのサブメニュー全てにチェックを入れてください。
手順#
スクリプトを用いてIPCにプロジェクトのバックアップ取得、更新を行う手順は次の通りです。
ターゲットへの接続を行うスクリプトは、IPC本体内ではなく、TwinCAT XAEがインストールされた別PCから行う事を前提としています。該当PCのEdit routeにて、ターゲットIPCへの接続を行ってください。
本節の例では、下記の通り接続が有るものとします。
- Route名
TRAINING-NGY8
- AmsNetId
10.200.64.8.1.1
図 7.1 Edit Routesウィンドウ#
Powershellの準備
リスト 7.1に示すスクリプトをテキストファイルを編集し、
****.ps1
という拡張子を付けて保存します。この際、スクリプト先頭にある次の各行を適切に設定します。- $prjDir
プロジェクトの配置するディレクトリのパスを指定します。スクリプト実行場所は、
$PSScriptRoot
で指定できるため、そこからの相対パスを指定する方法でも構いません。- $backupBaseDir
バックアップを保存する親フォルダパスを指定します。
$prjDir
同様、$PSScriptRoot
からの相対パス表記でも構いません。- $prjName
プロジェクトソリューションファイル名
****.sln
から拡張子sln
を取り除いた文字列を指定します。- $targetNetId
図 7.1の接続先AmsNetIdを指定します。
- $targetName
図 7.1の接続先Route名を小文字に変換した文字列を指定します。
警告
$targetName
は、下記の通りAdd Route Dialogで作成した際の、Route Name(Target)
項目で設定した内容に準じます。この設定はデフォルトで小文字ですが、意図してこの設定を変更した場合は、その文字列を指定する必要があります。一方、Routerの一覧(図 7.1)ではRoute名が全て大文字となっています。大文字小文字が異なると、正しくRoute名として認識できなくなりますのでご注意ください。
- $dte
Visual Studioのオートメーションモデルである
EnvDTE.DTE
インターフェースが提供するAPI機能です。Visual Studio または TwinCAT XAEシェルなどの開発環境のバージョンにより異なるProgram IDを指定することでオブジェクトを生成することができます。Visual StudioのProgram IDを参照してください。リスト 7.1例では、TwinCAT XAEシェル版の開発環境を用いています。
上記をカスタマイズした次のPowershellスクリプトを準備します。
1$prjDir = $PSScriptRoot + "\sample_project" # 元となるプロジェクトが格納されたフォルダパス 2$backupBaseDir = $PSScriptRoot + "\backup" # バックアップを保存する親フォルダパス 3$prjName = "sample_project" # $prjDir以下にあるソリューションファイル名から拡張子(*.sln)を取り除いたもの 4$targetNetId = "10.200.64.8.1.1" # ルータ設定で行ったターゲットIPCのAmsNetIdを指定 5$targetName = "training-ngy8" # ルータ設定で行ったターゲットIPCのRoute名を全て小文字にしたもの 6 7#$dte = new-object -com VisualStudio.DTE.10.0 # VS2010 8#$dte = new-object -com VisualStudio.DTE.11.0 # VS2012 9#$dte = new-object -com VisualStudio.DTE.12.0 # VS2013 10#$dte = new-object -com VisualStudio.DTE.14.0 # VS2015 11#$dte = new-object -com VisualStudio.DTE.15.0 # VS2017 12#$dte = new-object -com VisualStudio.DTE.16.0 # VS2019 13$dte = new-object -com TcXaeShell.DTE.15.0 # TwinCAT XAE Shell 14$dte.SuppressUI = $false 15 16### backup process 17 18# create backup directory including datetime string. 19$now = Get-Date 20$strDT = $now.ToString('yyyyMMddHHmmss') 21$backupDir = $backupBaseDir + "\" + $strDT + "_" + $prjName 22 23if (test-path $backupDir -pathtype container) { 24 Remove-Item $backupDir -Recurse -Force 25} 26New-Item $backupDir -type directory 27 28# fetch from target 29$dte.ExecuteCommand("File.OpenProjectFromTarget", $targetName + " " + $backupDir + " " + $prjName); 30# Save as solution 31$sln = $dte.Solution 32$sln.SaveAs($backupDir + "\" + $prjName + ".sln") 33 34### download process 35$prjPath = $prjDir + "\" + $prjName + ".sln" 36$sln = $dte.Solution 37$sln.Open($prjPath) 38 39$project = $sln.Projects.Item(1) 40$systemManager = $project.Object 41 42$systemManager.SetTargetNetId($targetNetId) 43$systemManager.ActivateConfiguration() 44$systemManager.StartRestartTwinCAT()
フォルダの準備と実行
スクリプトで指定した
$prjDir
にターゲットへ書き込むソリューションプロジェクトを、$prjName
というソリューション名で格納してください。また、
$backupBaseDir
で指定した、バックアップ先のフォルダを作成してください。以上の準備を整えてから上記スクリプトを実行すると、次の順序で処理がバッチ式に行われます。
ターゲットからのバックアップ取得と保存
下記の通り、実行した日時の数字列が先頭に付いたプロジェクトフォルダが自動的に作成され、その中に
sample_project.sln
が保存されています。更新する前のプロジェクトファイルです。Mode LastWriteTime Length Name ---- ------------- ------ ---- d----- 2023/12/25 16:22 20231225162119_sample_project d----- 2023/12/25 16:28 20231225162755_sample_project d----- 2023/12/25 16:33 20231225163334_sample_project : : : :
$prjDir
に格納したプロジェクトをターゲットIPCへの書き込み、その後自動スタートします。
API解説#
まず基本としてTwinCATのアプリケーションリソースへ接続する方法は、次の二通りがあります。(参考)
- Visual Studio DTE
Microsoft社が提供するVisual Studio用のインターフェース
EnvDTE.DTE
を使ってアクセスします。本スクリプト上では、$dte
にオブジェクトが格納されています。- TwinCAT Automation Interface
Beckhoff TwinCAT プロジェクトが提供するAPIインターフェースを使ってアクセスします。本スクリプト上では、
$SystemManager
にオブジェクトが格納されています。
上記を組み合わせて、TwinCAT上の操作を自動化させることができます。
Visual Studio DTEインターフェースの使い方#
スクリプト中での使用箇所は次のとおりです。COMオブジェクトを作成するには、Visual StudioのProgram IDに示されるように各アプリケーションのバージョン毎に異なる Program IDが割り振られており、new-object -com
でProgram IDを指定することで取得できます。これをオブジェクト変数$dte
に代入し、以後dteインターフェースで定義されたプロパティやメソッドを活用してリソースにアクセスします。
$dte = new-object -com TcXaeShell.DTE.15.0 # TwinCAT XAE Shell
:
:
$dte.ExecuteCommand("File.OpenProjectFromTarget", $targetName + " " + $backupDir + " " + $prjName);
多用されるメソッドとしては、ExecuteCommand
があります。これの第一引数には、コマンド名File.OpenProjectFromTarget
を指定し、第二引数にはスペース区切りで、そのコマンドの引数を指定します。これらのProgram IDで指定したアプリケーションが提供するコマンドは、Visual Studioの場合、ツールバーのTools
>Options...
メニューのEnvironment
>Keyboard
を開くと全てのコマンドが一覧されます。
ただし、コマンド名は言語が変わると変化します。ExecuteCommand
メソッドでは、文字列でコマンド名を指定する必要がありますので、言語設定を変更された場合は、このメニューから都度選び直す必要があります。
TwinCAT Automation Interface APIの使い方#
APIドキュメントはこちらにあります。まず、大きく分けて下記二つのメインインターフェースが用意されています。
- ITcSysManager
基本機能のオブジェクトです。最も初期に新しい構成を新規作成したり、ターゲットIPCのAmsNetIdを指定してリモートIPCと接続したり、構成(プログラムや設定)をIPCに適用してRUNモードへ移行させたり、といった基本機能です。
- ITcSmTreeItem
プロジェクト内にあるツリー形式の様々なリソースに対する追加、削除、変更などの機能を提供します。
その他、ライブラリに特化したものや、タスク設定、ライセンス設定など専用のインターフェースが用意されています。
オブジェクトの取得からオブジェクトの使い方までは、次の通りの手順になります。
$prjPath = $prjDir + "\" + $prjName + ".sln"
$sln = $dte.Solution
$sln.Open($prjPath)
$project = $sln.Projects.Item(1)
$systemManager = $project.Object
$systemManager.SetTargetNetId($targetNetId)
$systemManager.ActivateConfiguration()
$systemManager.StartRestartTwinCAT()
まず、Visual StudioのDTEインターフェースのSolutionプロパティにより、ソリューションオブジェクトを取得します。これを使ってソリューションを開き、Projectsプロパティからソリューションにぶら下がっているプロジェクトのコレクションを取得します。大概は、一つ目のアイテムにTwinCATオブジェクトが格納されていますので、Projects.Item
メソッドを使って、要素番号でこれを取得し、ObjectでTwinCATのITcSysManager
オブジェクトを収集します。
以後、SetTargetNetId
やActivateConfiguration
やStartRestartTwinCAT
などのメソッドを使って、一連のTwinCATの操作を行います。