- 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
32 lines
1.3 KiB
PowerShell
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)
|
|
}
|