#Requires -Version 5.1 <# .SYNOPSIS Register TwinCAT COM components for headless automation. .DESCRIPTION Registers TcSysManager and related COM DLLs so that New-Object -ComObject TcXaeShell.DTE.17.0 works without a prior interactive TwinCAT session. Run once from an elevated PowerShell. .EXAMPLE .\tc-register.ps1 .\tc-register.ps1 -RepairPackage #> [CmdletBinding()] param( [switch]$RepairPackage ) $tcBase = "C:\Program Files (x86)\Beckhoff\TwinCAT\3.1\Components\Base" $dlls = @( "TwinCAT System Manager.dll", "TcSysManCmd.dll", "TcSysManRM.dll" ) Write-Host "=== Register TwinCAT COM Components ===" -ForegroundColor Cyan foreach ($dll in $dlls) { $path = Join-Path $tcBase $dll if (Test-Path $path) { Write-Host " regsvr32: $dll" -NoNewline & regsvr32 /s $path 2>&1 | Out-Null Write-Host " done" -ForegroundColor Green } else { Write-Host " skip: $dll (not found)" -ForegroundColor Yellow } } # .NET regasm for Automation DLL $autoDll = Get-ChildItem -Path "C:\Program Files\TwinCAT\3.1\x64" -Filter "TwinCAT.XAE.Automation.*.dll" -ErrorAction SilentlyContinue | Select-Object -First 1 if ($autoDll) { $regasm = Join-Path $env:WINDIR "Microsoft.NET\Framework64\v4.0.30319\regasm.exe" Write-Host " regasm: $($autoDll.Name)" -NoNewline & $regasm /silent /codebase $autoDll.FullName 2>&1 | Out-Null Write-Host " done" -ForegroundColor Green } if ($RepairPackage) { Write-Host " TcPkg repair TwinCAT.Standard.XAE..." -NoNewline & "C:\Program Files (x86)\Beckhoff\TwinCAT\3.1\Components\Base\TcPkg.exe" repair TwinCAT.Standard.XAE 2>&1 | Out-Null Write-Host " done" -ForegroundColor Green } # Test Write-Host " Testing TcXaeShell.DTE.17.0..." -NoNewline try { $test = New-Object -ComObject TcXaeShell.DTE.17.0 -ErrorAction Stop $test.Quit() Write-Host " OK" -ForegroundColor Green } catch { Write-Host " FAILED: $_" -ForegroundColor Red } Write-Host "=== Register complete ===" -ForegroundColor Cyan