Targets per Broadcast-Suche finden

Das Netzwerk lässt sich über ConsumeXml auf dem Routen-Knoten nach TwinCAT-Zielsystemen durchsuchen, entweder allgemein für alle Geräte im Netz oder gezielt per IP-Adresse oder Hostname. Das Ergebnis wird anschließend per ProduceXml abgerufen.

Voraussetzungen

Allgemeine Broadcast-Suche für alle Geräte

C#:

string xmlString = "<TreeItem><RoutePrj><TargetList><BroadcastSearch>true</BroadcastSearch></TargetList></RoutePrj></TreeItem>";
ITcSmTreeItem routes = sysMan.LookupTreeItem("TIRR");
routes.ConsumeXml(xmlString);
string result = routes.ProduceXml();
XmlDocument xmlDocument = new XmlDocument();
xmlDocument.LoadXml(result);
string amsNetId = xmlDocument.SelectSingleNode("//TreeItem/RoutePrj/TargetList/Target/IpAddr[text()=\"" + ipAddress + "\"]/../NetId").InnerText;
string name = xmlDocument.SelectSingleNode("//TreeItem/RoutePrj/TargetList/Target/IpAddr[text()=\"" + ipAddress + "\"]/../Name").InnerText;

PowerShell:

$xmlString = "<TreeItem><RoutePrj><TargetList><BroadcastSearch>true</BroadcastSearch></TargetList></RoutePrj></TreeItem>"
$routes = $systemManager.LookupTreeItem("TIRR")
$routes.ConsumeXml($xmlString)
$result = $routes.ProduceXml()
$xmlDocument = [xml]$result
$localAmsNetId = $xmlDocument.TreeItem.RoutePrj.Target

Die Variable result enthält eine XML-Darstellung aller gefundenen ADS-Geräte im Netzwerk. Aus dieser Liste ist ein bestimmtes Gerät auswählbar:

Direkte Broadcast-Suche ab TwinCAT 3.1 Build 4020.10

C# Beispiel:

ITcSmTreeItem routeNode = sysManager.LookupTreeItem("TIRR");

// Search by IP address
string searchXml = @"<TreeItem>
  <RoutePrj>
    <TargetList>
      <Search>192.168.1.100</Search>
    </TargetList>
  </RoutePrj>
</TreeItem>";
routeNode.ConsumeXml(searchXml);
string resultXml = routeNode.ProduceXml();

// Parse result
var doc = new System.Xml.XmlDocument();
doc.LoadXml(resultXml);
var netIdNode = doc.SelectSingleNode("//Target/NetId");
string amsNetId = netIdNode?.InnerText;

PowerShell Beispiel:

$routeNode = $sysManager.LookupTreeItem("TIRR")

$searchXml = "<TreeItem><RoutePrj><TargetList><Search>CX-12345</Search></TargetList></RoutePrj></TreeItem>"
$routeNode.ConsumeXml($searchXml)

[xml]$result = $routeNode.ProduceXml()
$target = $result.TreeItem.RoutePrj.TargetList.Target
Write-Host "Name:  $($target.Name)"
Write-Host "NetId: $($target.NetId)"
Write-Host "IP:    $($target.IpAddr)"

XML-Struktur der Broadcast-Suche:

<TreeItem>
  <RoutePrj>
    <TargetList>
      <Target>
        <Name>CX-12345</Name>
        <NetId>172.17.60.153.1.1</NetId>
        <IpAddr>172.17.60.153</IpAddr>
        <Version>3.1.4026</Version>
        <OS>Windows (10.0)</OS>
      </Target>
    </TargetList>
  </RoutePrj>
</TreeItem>