Infosys在阅读器中打开 / AI 翻译

Automation Interface · 0 次阅读

How to scan devices and boxes

Requirements

When creating a new configuration, it is often necessary to align the TwinCAT XAE configuration to the actually available hardware. One option to fulfill this is to start a new TwinCAT XAE configuration from scratch and process the following steps: Creation of a new TwinCAT XAE configuration

  • Setting the address of the target system
  • Scan of the available devices
  • Addition and parametrization of the devices to be used
  • Scanning and insertion of boxes for each device

Procedure

The procedure to create the ITcSysManager interface (the 'systemManager' instance here) is described in the chapter Accessing TwinCAT Configurations. This interface has a LookupTreeItem method that returns a ITcSmTreeItem pointer to a specific tree item given by its pathname, in this case the shortcut "TIID" which references the I/O devices node.

Code snippet (C#):

ITcSysManager3 systemManager = null; // How to create the System Manager instance and how to open configuration is shown in Concepts chapter     

public void ScanDevicesAndBoxes()
{
     systemManager.SetTargetNetId("1.2.3.4.5.6"); // Setting of the target NetId.
     ITcSmTreeItem ioDevicesItem = systemManager.LookupTreeItem("TIID"); // Get The IO Devices Node
     
     // Scan Devices (Be sure that the target system is in Config mode!)
     string scannedXml = ioDevicesItem.ProduceXml(false); // Produce Xml implicitly starts the ScanDevices on this node.
     
     XmlDocument xmlDoc = newXmlDocument();
     xmlDoc.LoadXml(scannedXml); // Loads the Xml data into an XML Document
     XmlNodeList xmlDeviceList = xmlDoc.SelectNodes("TreeItem/DeviceGrpDef/FoundDevices/Device");
     List<ITcSmTreeItem> devices = newList<ITcSmTreeItem>();
     
     int deviceCount = 0;
       
     // Add all found devices to configuration
     foreach (XmlNode node in xmlDeviceList)
     {
          // Add a selection or subrange of devices
          int itemSubType = int.Parse(node.SelectSingleNode("ItemSubType").InnerText);
          string typeName = node.SelectSingleNode("ItemSubTypeName").InnerText;
          XmlNode xmlAddress = node.SelectSingleNode("AddressInfo");
    
          ITcSmTreeItem device = ioDevicesItem.CreateChild(string.Format("Device_{0}",++deviceCount),itemSubType,string.Empty,null);
         
          string xml = string.Format("<TreeItem><DeviceDef>{0}</DeviceDef></TreeItem>",xmlAddress.OuterXml);
          device.ConsumeXml(xml); // Consume Xml Parameters (here the Address of the Device)
          devices.Add(device);
     }
 
     // Scan all added devices for attached boxes
     foreach (ITcSmTreeItem device in devices)
     {
          string xml = "<TreeItem><DeviceDef><ScanBoxes>1</ScanBoxes></DeviceDef></TreeItem>"; // Using the "ScanBoxes XML-Method"
          try
          {
               device.ConsumeXml(xml); // Consume starts the ScanBoxes and inserts every found box/terminal into the configuration
          }
          catch (Exception ex)
          { 
               Console.WriteLine("Warning: {0}",ex.Message);
          } 
    
          foreach (ITcSmTreeItem box in device)
          {
               Console.WriteLine(box.Name);
          }
     }
}

Code snippet (IronPython):

import xml.etree.ElementTree as ET 

# Create the System Manage 
instance “sysMan” first
ioDevicesItem = sysMan.LookupTreeItem("TIID") # Get the IO Devices Node
scannedXml = ioDevicesItem.ProduceXml(False)  # Produce Xml implicitly starts the ScanDevices on this node

xmlDoc =      ET.fromstring(scannedXml) # Loads the Xml data into an XML Document
xmlDeviceList = xmlDoc.findall("./DeviceGrpDef/FoundDevices/Device")
devices = [] # Container to store Scanned devices
deviceCount = 0


# Add the Scanned devices
for device in xmlDeviceList:
       typeName = device.findtext("ItemSubTypeName")
    itemSubType = device.findtext("ItemSubType")
     xmlAddress = device.find("AddressInfo")
 deviceCount = deviceCount + 1;
  device =      ioDevicesItem.CreateChild("Device_" + str(deviceCount) + typeName, itemSubType,"",None)
      xml = "<TreeItem><DeviceDef>" + ET.tostring(xmlAddress) + "</DeviceDef></TreeItem>"
    device.ConsumeXml(xml); # Consumes Xml Parameters (here the Address of the Device)
    devices.append(device);

for device in devices:
      xml = "<TreeItem><DeviceDef><ScanBoxes>true</ScanBoxes></DeviceDef></TreeItem>"
      try:
      print device.ConsumeXml(xml) # Consumes starts the ScanBoxes and inserts every found box/Terminal into the config
     except:
        print "Scan Failed!"

for box in device:
   print box.Name