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にプロジェクトのバックアップ取得、更新を行う手順は次の通りです。

  1. ターゲットへの接続を行うスクリプトは、IPC本体内ではなく、TwinCAT XAEがインストールされた別PCから行う事を前提としています。該当PCのEdit routeにて、ターゲットIPCへの接続を行ってください。

    本節の例では、下記の通り接続が有るものとします。

    Route名

    TRAINING-NGY8

    AmsNetId

    10.200.64.8.1.1

    ../_images/2023-12-25-16-30-51.png

    図 7.1 Edit Routesウィンドウ#

  2. 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スクリプトを準備します。

    リスト 7.1 バックアップと更新を自動化する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()
    
  3. フォルダの準備と実行

    スクリプトで指定した$prjDirにターゲットへ書き込むソリューションプロジェクトを、$prjNameというソリューション名で格納してください。

    また、$backupBaseDirで指定した、バックアップ先のフォルダを作成してください。

    以上の準備を整えてから上記スクリプトを実行すると、次の順序で処理がバッチ式に行われます。

    1. ターゲットからのバックアップ取得と保存

      下記の通り、実行した日時の数字列が先頭に付いたプロジェクトフォルダが自動的に作成され、その中に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 
         :              :            :                               :
      
    2. $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オブジェクトを収集します。

以後、SetTargetNetIdActivateConfigurationStartRestartTwinCATなどのメソッドを使って、一連のTwinCATの操作を行います。