- 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
120 lines
3.5 KiB
PowerShell
120 lines
3.5 KiB
PowerShell
#Requires -Version 5.1
|
|
<#
|
|
.SYNOPSIS
|
|
Check EL6695 EtherCAT status via TwinCAT automation interface.
|
|
.DESCRIPTION
|
|
Opens the solution, reads EtherCAT master state, finds EL6695,
|
|
reports AL state, PDO mapping, SM configuration, and CoE objects.
|
|
#>
|
|
[CmdletBinding()]
|
|
param(
|
|
[string]$Solution = "C:\Users\tonycao\work\twincat3-auto-cli\TwinCAT_EL6695_Secondary\TwinCAT_EL6695_Secondary.sln",
|
|
[string]$TargetNetId = "10.0.0.106.1.1",
|
|
[switch]$Visible
|
|
)
|
|
|
|
. "$PSScriptRoot\tc-common.ps1"
|
|
|
|
$LogFile = Join-Path $script:DefaultLogDir "check-el6695.log"
|
|
New-Log $script:DefaultLogDir
|
|
|
|
Write-Log "=== Check EL6695 Status ===" $LogFile
|
|
|
|
try {
|
|
$dte = Get-Dte -Visible:$Visible
|
|
} catch {
|
|
Write-Log "FATAL: Cannot create DTE — $_" $LogFile
|
|
Write-Host "ERROR: Cannot create DTE: $_" -ForegroundColor Red
|
|
exit 1
|
|
}
|
|
|
|
try {
|
|
if (-not (Open-Solution -Dte $dte -Solution $Solution)) {
|
|
throw "Solution did not open"
|
|
}
|
|
|
|
$sysMgr = Get-SysManager -Dte $dte
|
|
if (-not $sysMgr) {
|
|
Write-Log "FATAL: SysManager is null" $LogFile
|
|
Write-Host "ERROR: SysManager is null" -ForegroundColor Red
|
|
exit 1
|
|
}
|
|
|
|
Write-Log "SysManager obtained OK" $LogFile
|
|
|
|
# Try to get project info
|
|
try {
|
|
$proj = $dte.Solution.Projects.Item(1)
|
|
Write-Log "Project: $($proj.Name)" $LogFile
|
|
Write-Host "Project: $($proj.Name)"
|
|
} catch {
|
|
Write-Log "Cannot get project: $_" $LogFile
|
|
}
|
|
|
|
# Try to access EtherCAT master via automation interface
|
|
# The key is to enumerate tree items to find the EtherCAT master and devices
|
|
try {
|
|
$configMgr = $sysMgr.ConfigurationManager
|
|
Write-Log "ConfigurationManager obtained" $LogFile
|
|
|
|
# Try to get the build info
|
|
$buildInfo = $configMgr.BuildInfo
|
|
Write-Log "BuildInfo: $($buildInfo | Out-String)" $LogFile
|
|
Write-Host "BuildInfo: $($buildInfo | Out-String)"
|
|
} catch {
|
|
Write-Log "ConfigManager error: $_" $LogFile
|
|
}
|
|
|
|
# Use JSON command to query EtherCAT state
|
|
Write-Log "Querying EtherCAT state via JSON command..." $LogFile
|
|
|
|
# Create a temp JSON command file
|
|
$jsonCmd = @"
|
|
{
|
|
"commands": [
|
|
{
|
|
"method": "GetInfo",
|
|
"params": {}
|
|
}
|
|
]
|
|
}
|
|
"@
|
|
$jsonFile = Join-Path $env:TEMP "tc_query.json"
|
|
$jsonCmd | Out-File -FilePath $jsonFile -Encoding UTF8
|
|
|
|
try {
|
|
$result = & "C:\Program Files (x86)\Beckhoff\TwinCAT\3.1\Components\Base\TcSysManCmdHelper.exe" `
|
|
-v 4026.0 `
|
|
-o $Solution `
|
|
-j $jsonFile 2>&1
|
|
|
|
Write-Log "JSON query result: $result" $LogFile
|
|
Write-Host "JSON query result: $result"
|
|
} catch {
|
|
Write-Log "JSON query error: $_" $LogFile
|
|
}
|
|
|
|
# Try to read specific CoE objects via command
|
|
Write-Log "Trying to read CoE objects via command interface..." $LogFile
|
|
|
|
# Try using the -c command option
|
|
$cmdJson = '{"method":"ReadCoE","params":{"address":"0x1018","subIndex":1}}'
|
|
try {
|
|
$result = & "C:\Program Files (x86)\Beckhoff\TwinCAT\3.1\Components\Base\TcSysManCmdHelper.exe" `
|
|
-v 4026.0 `
|
|
-o $Solution `
|
|
-c $cmdJson 2>&1
|
|
|
|
Write-Log "CoE read result: $result" $LogFile
|
|
Write-Host "CoE read result: $result"
|
|
} catch {
|
|
Write-Log "CoE read error: $_" $LogFile
|
|
}
|
|
|
|
Write-Log "=== Check complete ===" $LogFile
|
|
Write-Host "`nCheck complete. Log: $LogFile" -ForegroundColor Green
|
|
|
|
} finally {
|
|
try { $dte.Quit() } catch { }
|
|
}
|