ethercat-linux/scripts/tc-list-vs-windows.ps1
Tony Cao 309aaba342 EL6695 8-byte bidirectional exchange with per-byte verification
- 8B PDO config: ULINT-sized payload, no 0x1A01 diag PDO on SM3
  (device rejected SM3=8 with diag assigned: 'size not allowed, min/max 0xa')
- twin_layout_blob_sized(): single 64-bit mapping entry for 8B payloads
- Ticker: per-byte XOR 0x5A transform in 8B mode so TwinCAT can verify
  every byte individually (1KB path unchanged, const-guarded)
- TwinCAT automation scripts: deploy with RPC retry, LinkVariables-based
  whole-array relink (element links only carry 1 byte), ADS watch, diag
- Docs: 8B design, verification methodology, test report
2026-07-27 19:01:05 +08:00

32 lines
1.3 KiB
PowerShell

Add-Type -TypeDefinition @'
using System;
using System.Text;
using System.Runtime.InteropServices;
public class WinEnum {
[DllImport("user32.dll")] static extern bool EnumWindows(EnumProc cb, IntPtr l);
[DllImport("user32.dll")] static extern int GetWindowText(IntPtr h, StringBuilder s, int n);
[DllImport("user32.dll")] static extern int GetWindowTextLength(IntPtr h);
[DllImport("user32.dll")] static extern uint GetWindowThreadProcessId(IntPtr h, out uint pid);
[DllImport("user32.dll")] static extern bool IsWindowVisible(IntPtr h);
public delegate bool EnumProc(IntPtr h, IntPtr l);
public static void Dump(uint targetPid) {
EnumWindows((h, l) => {
uint pid; GetWindowThreadProcessId(h, out pid);
if (pid == targetPid && IsWindowVisible(h)) {
int len = GetWindowTextLength(h);
var sb = new StringBuilder(len + 1);
GetWindowText(h, sb, sb.Capacity);
Console.WriteLine(" hwnd={0} title='{1}'", h, sb.ToString());
}
return true;
}, IntPtr.Zero);
}
}
'@
$procs = Get-Process TcXaeShell -ErrorAction SilentlyContinue
if (-not $procs) { Write-Host "no TcXaeShell running"; exit 0 }
foreach ($p in $procs) {
Write-Host "PID $($p.Id):"
[WinEnum]::Dump([uint32]$p.Id)
}