Finding targets using broadcast search

You can search the network for TwinCAT target systems on the route node via ConsumeXml, either generally for all devices on the network or specifically by IP address or hostname. The result is then retrieved via ProduceXml.

Requirements

General broadcast search for all devices

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

The variable result contains an XML representation of all ADS devices found on the network. You can select a specific device from this list:

Direct broadcast search starting with TwinCAT 3.1 Build 4020.10

C# sample:

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 sample:

$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 structure of the broadcast search:

<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>