#Requires -Version 7.0 <# .SYNOPSIS End-to-end CLI test for the TwinCAT (Beckhoff ADS) driver. .DESCRIPTION Requires a reachable AMS router (local TwinCAT XAR, Beckhoff.TwinCAT.Ads. TcpRouter NuGet, or an authorised remote AMS route) + a live TwinCAT runtime on -AmsNetId. Without one the driver surfaces a transport error on InitializeAsync + the script's probe fails. Set TWINCAT_TRUST_WIRE=1 to promise the endpoint is live. Without it the script skips (task #221 tracks the 7-day-trial CI fixture — until that lands, TwinCAT testing is a manual operator task). .PARAMETER AmsNetId AMS Net ID of the target (e.g. 127.0.0.1.1.1 for local XAR, 192.168.1.40.1.1 for a remote PLC). .PARAMETER AmsPort AMS port. Default 851 (TC3 PLC runtime). TC2 uses 801. .PARAMETER SymbolPath TwinCAT symbol to exercise. Default 'MAIN.iCounter' — substitute with whatever your project actually declares. .PARAMETER OpcUaUrl OtOpcUa server endpoint. .PARAMETER BridgeNodeId NodeId at which the server publishes the Symbol. #> param( [string]$AmsNetId = "127.0.0.1.1.1", [int]$AmsPort = 851, [string]$SymbolPath = "MAIN.iCounter", [string]$OpcUaUrl = "opc.tcp://localhost:4840", [Parameter(Mandatory)] [string]$BridgeNodeId ) $ErrorActionPreference = "Stop" . "$PSScriptRoot/_common.ps1" if (-not ($env:TWINCAT_TRUST_WIRE -eq "1" -or $env:TWINCAT_TRUST_WIRE -eq "true")) { Write-Skip "TWINCAT_TRUST_WIRE not set — requires reachable AMS router + live TC runtime (task #221 tracks the CI fixture). Set =1 once the router is up." exit 0 } $twinCatCli = Get-CliInvocation ` -ProjectFolder "src/ZB.MOM.WW.OtOpcUa.Driver.TwinCAT.Cli" ` -ExeName "otopcua-twincat-cli" $opcUaCli = Get-CliInvocation ` -ProjectFolder "src/ZB.MOM.WW.OtOpcUa.Client.CLI" ` -ExeName "otopcua-cli" $commonTc = @("-n", $AmsNetId, "-p", $AmsPort) $results = @() $results += Test-Probe ` -Cli $twinCatCli ` -ProbeArgs (@("probe") + $commonTc + @("-s", $SymbolPath, "--type", "DInt")) $writeValue = Get-Random -Minimum 1 -Maximum 9999 $results += Test-DriverLoopback ` -Cli $twinCatCli ` -WriteArgs (@("write") + $commonTc + @("-s", $SymbolPath, "-t", "DInt", "-v", $writeValue)) ` -ReadArgs (@("read") + $commonTc + @("-s", $SymbolPath, "-t", "DInt")) ` -ExpectedValue "$writeValue" $bridgeValue = Get-Random -Minimum 10000 -Maximum 19999 $results += Test-ServerBridge ` -DriverCli $twinCatCli ` -DriverWriteArgs (@("write") + $commonTc + @("-s", $SymbolPath, "-t", "DInt", "-v", $bridgeValue)) ` -OpcUaCli $opcUaCli ` -OpcUaUrl $OpcUaUrl ` -OpcUaNodeId $BridgeNodeId ` -ExpectedValue "$bridgeValue" $reverseValue = Get-Random -Minimum 20000 -Maximum 29999 $results += Test-OpcUaWriteBridge ` -OpcUaCli $opcUaCli ` -OpcUaUrl $OpcUaUrl ` -OpcUaNodeId $BridgeNodeId ` -DriverCli $twinCatCli ` -DriverReadArgs (@("read") + $commonTc + @("-s", $SymbolPath, "-t", "DInt")) ` -ExpectedValue "$reverseValue" $subValue = Get-Random -Minimum 30000 -Maximum 39999 $results += Test-SubscribeSeesChange ` -OpcUaCli $opcUaCli ` -OpcUaUrl $OpcUaUrl ` -OpcUaNodeId $BridgeNodeId ` -DriverCli $twinCatCli ` -DriverWriteArgs (@("write") + $commonTc + @("-s", $SymbolPath, "-t", "DInt", "-v", $subValue)) ` -ExpectedValue "$subValue" Write-Summary -Title "TwinCAT e2e" -Results $results if ($results | Where-Object { -not $_.Passed }) { exit 1 }