如何通过编程方式构建并运行Beckhoff TwinCAT解决方案?
我正在为我的TwinCAT3 PLC项目设置持续集成,包括通过Python pytest 进行的外部测试。
为使其工作,我需要一个脚本来执行以下步骤:
- 构建解决方案
- 激活配置(包括上传PLC程序)
- 将TwinCAT以运行模式重新启动
我应该如何把这些步骤纳入持续集成中?
一些类似的问题(我认为没有完全覆盖我的场景):
解决方案
这是可能的,尽管文档有点含糊。Beckhoff将此称为“TwinCAT Automation Interface”。你可以在 [TwinCAT 3 > Technologies > TE1000 | Automation Interface] 了解相关信息。
不过先说一句:要完全用程序化方式处理TwinCAT解决方案并没有一个既简洁又快速的办法。没有等价于例如一个基本的 make 命令。
不过,有两条方向可以走:
1 - devenv.exe
你可以直接调用安装了TC的 Microsoft Visual Studio来触发构建。以PowerShell(针对VS 2022 Community)为例:
PS> & "C:\Program Files\Microsoft Visual Studio\2022\Community\Common7\IDE\devenv.exe" "plc.sln" /rebuild "Debug|TwinCAT OS (x64)"
以上命令将在给定配置下为名为 plc.sln 的解决方案触发重新构建。
注:该命令似乎在构建实际完成之前就返回。
- 在此处了解
devenv:https://learn.microsoft.com/en-us/visualstudio/ide/reference/devenv-command-line-switches - MSBuild 大致是
devenv的现代替代,但它 不能 与.tsprojTwinCAT项目一起工作 -
TwinCAT XAE Shell显示了相同的CLI选项,但用于构建时它基本上什么也不做:
-
TcXaeShell.exe "plc.sln" /build产生无输出或文件变更 - 但这不能用于激活配置或改变运行模式。然而,就单纯的构建而言,这似乎是最快的方法——远远领先。
2 - DTE
你可以通过DTE [COM对象] 编程方式控制Visual Studio或 XAE Shell。这在: [TE1000 | Automation Interface > Configuration > Best practice > System > Opening and activating existing configurations] 中有描述。
下面给出完整的PowerShell脚本。另有一个Github Gist,提供一个更高级的脚本,能够处理等待并解决大多数常见错误: https://gist.github.com/RobertoRoos/3b97a94647d71d791303da7c1d54b2af
Write-Host "Loading TcXaeShell instance..."
# Get shell instance though DTE object ("64-bit" version):
$dte = New-Object -ComObject TcXaeShell.DTE.17.0
# Optionally, don't hide the instance:
# $dte.SuppressUI = $false
# $dte.MainWindow.Visible = $true
Write-Host "Opening solution..."
$sln = $dte.Solution # Get solution helper and then open our solution:
$sln.Open("$root/plc/plc.sln")
$project = $sln.Projects.Item(1) # Get reference to our project (just pick the first one)
$systemManager = $project.Object # Get reference to the TC manager
Write-Host "Target AMS ID:" $systemManager.GetTargetNetId()
# Activate and switch mode:
Write-Host "Activating configuration..."
$systemManager.ActivateConfiguration()
Write-Host "Starting run mode..."
$systemManager.StartRestartTwinCAT()
$dte.Quit()
- 关于DTE对象代码,请参阅:Handling different Visual Studio versions。对于Visual Studio 2022,请使用
VisualStudio.DTE.17.0。 - 这正是我想要的效果,但因为它本质上只是启动了一个不可见的程序实例,所以速度极慢。
- 进行一次快速计时测试,
TcXaeShell.DTE.17.0在我的(大部分空的)解决方案上大约用时54秒执行上述脚本,而VisualStudio.DTE.17.0大约用时27秒。 - 重要提示:VS DTE接口在阻塞操作或程序状态的管理方面非常糟糕。每条命令都可能在底层操作尚未完成时就返回,导致后续操作意外失败。遗憾的是我找到的最佳解决办法就是对失败的命令进行盲目重试……
3 - ADS PowerShell模块(额外奖励)
掌控TwinCAT实例的一个相对简单的方法是“TwinCAT 3 ADS PowerShell模块”: [TwinCAT 3 > Technologies > ADS > ADS PowerShell Module]
它本身不提供构建或激活TwinCAT的功能,但可以较容易地修改运行模式。先 [安装模块]: https://infosys.beckhoff.com/english.php?content=../content/1033/tc3_ads_ps_tcxaemgmt/index.html&id= 的基础步骤
PS> Install-Module -Name TcXaeMgmt
(重新)启动TwinCAT可能像这样进行:
PS> Restart-TwinCat -Command Reset -Force
这适用于本地实例。若为远程实例,请包含类似的选项:-NetId "192.168.88.10.1.1"