public void activateAndRunPLC()
 {
     adsClient.Connect(sysMan.GetTargetNetId(), 10000); //AMS net id of target system. TwinCAT system service port = 10000
     System.Threading.Thread.Sleep(10000);              //waiting for TwinCAT to go into Run mode.
     sysMan.ActivateConfiguration();
     sysMan.StartRestartTwinCAT();
     try
     {
         bool rundo = true;
         do
         {
             if (adsClient.ReadState().AdsState == AdsState.Run) //reads TwinCAT's system state, if it is in run mode then log into plc.
             {
                 string        xml        = "<TreeItem><IECProjectDef><OnlineSettings><Commands><LoginCmd>true</LoginCmd><StartCmd>true</StartCmd></Commands></OnlineSettings></IECProjectDef></TreeItem>";
                 ITcSmTreeItem plcProject = sysMan.LookupTreeItem("TIPC^Untitled1^Untitled1 Project");
                 plcProject.ConsumeXml(xml);
                 rundo = false;
             }
         } while (rundo);
     }
     catch (Exception ex)
     {
         Debug.WriteLine(ex.Message);
     }
 }
        }   //ActivateConfiguration()

        public void EditParams(ITcSmTreeItem drive, string filename)
        {
            //Create the filepath to the motor file using the path provided to load the excel spreadsheet.
            string file = filename;
            string path = buildPathString(file);

            //open the Motor file as an xml document,read its tags with InitCmds
            XmlDocument xDoc = new XmlDocument();

            xDoc.Load(path);
            XmlNode xNode = xDoc.SelectSingleNode("/EtherCATMailbox/CoE/InitCmds");

            string      driveParams = drive.ProduceXml();
            XmlNodeList xmlInitCmds = xNode.ChildNodes;

            foreach (XmlNode Cmd in xmlInitCmds)
            {
                string newStartListParam = "<" + Cmd.Name + ">";
                foreach (XmlNode node in Cmd)
                {
                    newStartListParam += "<" + node.Name + ">";
                    newStartListParam += node.InnerText;
                    newStartListParam += "</" + node.Name + ">";
                }
                newStartListParam += "</" + Cmd.Name + ">";
                int idx = driveParams.IndexOf("</InitCmd></InitCmds><CanOpenType>55</CanOpenType></CoE></Mailbox>");
                idx         = idx + 10;
                driveParams = driveParams.Insert(idx, newStartListParam);
            }
            drive.ConsumeXml(driveParams);
        }//EditParams
示例#3
0
        /// <summary>
        /// Stops the PLC, assuming that you already have a running PLC.
        /// </summary>
        public Boolean stopPLC()
        {
            Console.WriteLine("Stopping " + project.Name);
            ITcSysManager4 systemManager = (ITcSysManager4)(project.Object);

            if (!systemManager.IsTwinCATStarted())
            {
                Console.WriteLine("No Twincat project running!!");
                return(false);
            }

            ITcSmTreeItem plcApp = getPLCApp(systemManager);

            System.Threading.Thread.Sleep(1000);
            if (!login(plcApp))
            {
                return(false);
            }

            System.Threading.Thread.Sleep(1000);
            Console.WriteLine("Stopping PLC");
            plcApp.ConsumeXml(createXMLString(PLCAction.STOP));

            if (!checkWithTimeout(COMMAND_TIMEOUT, () => checkXmlIsString(plcApp, "PlcAppState", "Stop")))
            {
                Console.WriteLine("Failed to stop!");
                return(false);
            }

            return(true);
        }
示例#4
0
        /// <summary>
        /// Checks that a solution contains at least one PLC project and starts the project running.
        /// </summary>
        public Boolean startPLC()
        {
            Console.WriteLine("Starting " + project.Name);
            ITcSysManager4 systemManager = (ITcSysManager4)(project.Object);

            ITcSmTreeItem plcApp = getPLCApp(systemManager);

            System.Threading.Thread.Sleep(1000);
            if (!login(plcApp))
            {
                return(false);
            }

            if (isRunning(plcApp))
            {
                Console.WriteLine("PLC is running");
                return(true);
            }

            System.Threading.Thread.Sleep(1000);
            Console.WriteLine("Starting PLC");
            plcApp.ConsumeXml(createXMLString(PLCAction.START));

            if (!checkWithTimeout(COMMAND_TIMEOUT, () => isRunning(plcApp)))
            {
                Console.WriteLine("Failed to start!");
                return(false);
            }

            return(true);
        }
        private void ConsumeTemplate(ITcSmTreeItem item, string templatePath)
        {
            string templ = Path.Combine(ApplicationDirectory, templatePath);

            XmlTextReader reader = new XmlTextReader(templ);

            reader.MoveToContent();
            item.ConsumeXml(reader.ReadOuterXml());
        }
示例#6
0
        private Boolean login(ITcSmTreeItem plcApp)
        {
            Console.WriteLine("Logging in");
            plcApp.ConsumeXml(createXMLString(PLCAction.LOGIN));

            if (!checkWithTimeout(COMMAND_TIMEOUT, () => checkXmlIsString(plcApp, "LoggedIn", "true")))
            {
                Console.WriteLine("Failed to login!");
                return(false);
            }
            return(true);
        }
示例#7
0
        static void Main(string[] args)
        {
            bool showHelp = false;
            bool enableDebugLoggingLevel = false;

            Console.CancelKeyPress += new ConsoleCancelEventHandler(CancelKeyPressHandler);
            log4net.GlobalContext.Properties["LogLocation"] = AppDomain.CurrentDomain.BaseDirectory + "\\logs";
            log4net.Config.XmlConfigurator.ConfigureAndWatch(new System.IO.FileInfo(AppDomain.CurrentDomain.BaseDirectory + "log4net.config"));

            OptionSet options = new OptionSet()
                                .Add("v=|VisualStudioSolutionFilePath=", "The full path to the TwinCAT project (sln-file)", v => VisualStudioSolutionFilePath = v)
                                .Add("t=|TcUnitTaskName=", "[OPTIONAL] The name of the task running TcUnit defined under \"Tasks\"", t => TcUnitTaskName      = t)
                                .Add("a=|AmsNetId=", "[OPTIONAL] The AMS NetId of the device of where the project and TcUnit should run", a => AmsNetId       = a)
                                .Add("w=|TcVersion=", "[OPTIONAL] The TwinCAT version to be used to load the TwinCAT project", w => ForceToThisTwinCATVersion = w)
                                .Add("u=|Timeout=", "[OPTIONAL] Timeout the process with an error after X minutes", u => Timeout = u)
                                .Add("d|debug", "[OPTIONAL] Increase debug message verbosity", d => enableDebugLoggingLevel      = d != null)
                                .Add("?|h|help", h => showHelp = h != null);

            try
            {
                options.Parse(args);
            }
            catch (OptionException e)
            {
                Console.WriteLine(e.Message);
                Console.WriteLine("Try `TcUnit-Runner --help' for more information.");
                Environment.Exit(Constants.RETURN_ARGUMENT_ERROR);
            }


            if (showHelp)
            {
                DisplayHelp(options);
                Environment.Exit(Constants.RETURN_SUCCESSFULL);
            }

            /* Set logging level.
             * This is handled by changing the log4net.config file on the fly.
             * The following levels are defined in order of increasing priority:
             * - ALL
             * - DEBUG
             * - INFO
             * - WARN
             * - ERROR
             * - FATAL
             * - OFF
             */
            XmlDocument doc = new XmlDocument();

            doc.Load(AppDomain.CurrentDomain.BaseDirectory + "log4net.config");
            XmlNode root          = doc.DocumentElement;
            XmlNode subNode1      = root.SelectSingleNode("root");
            XmlNode nodeForModify = subNode1.SelectSingleNode("level");

            if (enableDebugLoggingLevel)
            {
                nodeForModify.Attributes[0].Value = "DEBUG";
            }
            else
            {
                nodeForModify.Attributes[0].Value = "INFO";
            }
            doc.Save(AppDomain.CurrentDomain.BaseDirectory + "log4net.config");
            System.Threading.Thread.Sleep(500); // A tiny sleep just to make sure that log4net manages to detect the change in the file

            /* Make sure the user has supplied the path for the Visual Studio solution file.
             * Also verify that this file exists.
             */
            if (VisualStudioSolutionFilePath == null)
            {
                log.Error("Visual studio solution path not provided!");
                Environment.Exit(Constants.RETURN_VISUAL_STUDIO_SOLUTION_PATH_NOT_PROVIDED);
            }

            if (!File.Exists(VisualStudioSolutionFilePath))
            {
                log.Error("Visual studio solution " + VisualStudioSolutionFilePath + " does not exist!");
                Environment.Exit(Constants.RETURN_VISUAL_STUDIO_SOLUTION_PATH_NOT_FOUND);
            }

            LogBasicInfo();

            /* Start a timeout for the process(es) if the user asked for it
             */
            if (Timeout != null)
            {
                log.Info("Timeout enabled - process(es) timesout after " + Timeout + " minute(s)");
                System.Timers.Timer timeout = new System.Timers.Timer(Int32.Parse(Timeout) * 1000 * 60);
                timeout.Elapsed  += KillProcess;
                timeout.AutoReset = false;
                timeout.Start();
            }

            MessageFilter.Register();

            TwinCATProjectFilePath = TcFileUtilities.FindTwinCATProjectFile(VisualStudioSolutionFilePath);
            if (String.IsNullOrEmpty(TwinCATProjectFilePath))
            {
                log.Error("Did not find TwinCAT project file in solution. Is this a TwinCAT project?");
                Environment.Exit(Constants.RETURN_TWINCAT_PROJECT_FILE_NOT_FOUND);
            }

            if (!File.Exists(TwinCATProjectFilePath))
            {
                log.Error("TwinCAT project file " + TwinCATProjectFilePath + " does not exist!");
                Environment.Exit(Constants.RETURN_TWINCAT_PROJECT_FILE_NOT_FOUND);
            }

            string tcVersion = TcFileUtilities.GetTcVersion(TwinCATProjectFilePath);

            if (String.IsNullOrEmpty(tcVersion))
            {
                log.Error("Did not find TwinCAT version in TwinCAT project file path");
                Environment.Exit(Constants.RETURN_TWINCAT_VERSION_NOT_FOUND);
            }

            try
            {
                vsInstance = new VisualStudioInstance(@VisualStudioSolutionFilePath, tcVersion, ForceToThisTwinCATVersion);
                bool isTcVersionPinned = XmlUtilities.IsTwinCATProjectPinned(TwinCATProjectFilePath);
                log.Info("Version is pinned: " + isTcVersionPinned);
                vsInstance.Load(isTcVersionPinned);
            }
            catch
            {
                log.Error("Error loading VS DTE. Is the correct version of Visual Studio and TwinCAT installed? Is the TcUnit-Runner running with administrator privileges?");
                CleanUpAndExitApplication(Constants.RETURN_ERROR_LOADING_VISUAL_STUDIO_DTE);
            }

            try
            {
                vsInstance.LoadSolution();
            }
            catch
            {
                log.Error("Error loading the solution. Try to open it manually and make sure it's possible to open and that all dependencies are working");
                CleanUpAndExitApplication(Constants.RETURN_ERROR_LOADING_VISUAL_STUDIO_SOLUTION);
            }

            if (vsInstance.GetVisualStudioVersion() == null)
            {
                log.Error("Did not find Visual Studio version in Visual Studio solution file");
                CleanUpAndExitApplication(Constants.RETURN_ERROR_FINDING_VISUAL_STUDIO_SOLUTION_VERSION);
            }


            AutomationInterface automationInterface = new AutomationInterface(vsInstance.GetProject());

            if (automationInterface.PlcTreeItem.ChildCount <= 0)
            {
                log.Error("No PLC-project exists in TwinCAT project");
                CleanUpAndExitApplication(Constants.RETURN_NO_PLC_PROJECT_IN_TWINCAT_PROJECT);
            }


            ITcSmTreeItem realTimeTasksTreeItem = automationInterface.RealTimeTasksTreeItem;

            /* Task name provided */
            if (!String.IsNullOrEmpty(TcUnitTaskName))
            {
                log.Info("Setting task '" + TcUnitTaskName + "' enable and autostart, and all other tasks (if existing) to disable and non-autostart");
                bool foundTcUnitTaskName = false;

                /* Find all tasks, and check whether the user provided TcUnit task is amongst them.
                 * Also update the task object (Update <Disabled> and <Autostart>-tag)
                 */
                foreach (ITcSmTreeItem child in realTimeTasksTreeItem)
                {
                    ITcSmTreeItem testTreeItem = realTimeTasksTreeItem.LookupChild(child.Name);
                    string        xmlString    = testTreeItem.ProduceXml();
                    string        newXmlString = "";
                    try
                    {
                        if (TcUnitTaskName.Equals(XmlUtilities.GetItemNameFromRealTimeTaskXML(xmlString)))
                        {
                            foundTcUnitTaskName = true;
                            newXmlString        = XmlUtilities.SetDisabledAndAndAutoStartOfRealTimeTaskXml(xmlString, false, true);
                        }
                        else
                        {
                            newXmlString = XmlUtilities.SetDisabledAndAndAutoStartOfRealTimeTaskXml(xmlString, true, false);
                        }
                        testTreeItem.ConsumeXml(newXmlString);
                        System.Threading.Thread.Sleep(3000);
                    }
                    catch
                    {
                        log.Error("Could not parse real time task XML data");
                        CleanUpAndExitApplication(Constants.RETURN_NOT_POSSIBLE_TO_PARSE_REAL_TIME_TASK_XML_DATA);
                    }
                }

                if (!foundTcUnitTaskName)
                {
                    log.Error("Could not find task '" + TcUnitTaskName + "' in TwinCAT project");
                    CleanUpAndExitApplication(Constants.RETURN_FAILED_FINDING_DEFINED_UNIT_TEST_TASK_IN_TWINCAT_PROJECT);
                }
            }

            /* No task name provided */
            else
            {
                log.Info("No task name provided. Assuming only one task exists");
                /* Check that only one task exists */
                if (realTimeTasksTreeItem.ChildCount.Equals(1))
                {
                    // Get task name
                    ITcSmTreeItem child        = realTimeTasksTreeItem.get_Child(1);
                    ITcSmTreeItem testTreeItem = realTimeTasksTreeItem.LookupChild(child.Name);
                    string        xmlString    = testTreeItem.ProduceXml();
                    TcUnitTaskName = XmlUtilities.GetItemNameFromRealTimeTaskXML(xmlString);
                    log.Info("Found task with name '" + TcUnitTaskName + "'");
                    string newXmlString = "";
                    newXmlString = XmlUtilities.SetDisabledAndAndAutoStartOfRealTimeTaskXml(xmlString, false, true);
                    testTreeItem.ConsumeXml(newXmlString);
                    System.Threading.Thread.Sleep(3000);
                }
                /* Less ore more than one task, which is an error */
                else
                {
                    log.Error("The number of tasks is not equal to 1 (one). Found " + realTimeTasksTreeItem.ChildCount.ToString() + " number of tasks. Please provide which task is the TcUnit task");
                    CleanUpAndExitApplication(Constants.RETURN_TASK_COUNT_NOT_EQUAL_TO_ONE);
                }
            }


            /* Build the solution and collect any eventual errors. Make sure to
             * filter out everything that is an error
             */
            vsInstance.CleanSolution();
            vsInstance.BuildSolution();

            ErrorItems errorsBuild = vsInstance.GetErrorItems();

            int tcBuildWarnings = 0;
            int tcBuildError    = 0;

            for (int i = 1; i <= errorsBuild.Count; i++)
            {
                ErrorItem item = errorsBuild.Item(i);
                if ((item.ErrorLevel != vsBuildErrorLevel.vsBuildErrorLevelLow))
                {
                    if (item.ErrorLevel == vsBuildErrorLevel.vsBuildErrorLevelMedium)
                    {
                        tcBuildWarnings++;
                    }
                    else if (item.ErrorLevel == vsBuildErrorLevel.vsBuildErrorLevelHigh)
                    {
                        tcBuildError++;
                        log.Error("Description: " + item.Description);
                        log.Error("ErrorLevel: " + item.ErrorLevel);
                        log.Error("Filename: " + item.FileName);
                    }
                }
            }

            /* If we don't have any errors, activate the configuration and
             * start/restart TwinCAT */
            if (tcBuildError.Equals(0))
            {
                /* Check whether the user has provided an AMS NetId. If so, use it. Otherwise use
                 * the local AMS NetId */
                if (String.IsNullOrEmpty(AmsNetId))
                {
                    AmsNetId = Constants.LOCAL_AMS_NET_ID;
                }

                log.Info("Setting target NetId to '" + AmsNetId + "'");
                automationInterface.ITcSysManager.SetTargetNetId(AmsNetId);
                log.Info("Enabling boot project and setting BootProjectAutostart on " + automationInterface.ITcSysManager.GetTargetNetId());

                for (int i = 1; i <= automationInterface.PlcTreeItem.ChildCount; i++)
                {
                    ITcSmTreeItem plcProject = automationInterface.PlcTreeItem.Child[i];
                    ITcPlcProject iecProject = (ITcPlcProject)plcProject;
                    iecProject.BootProjectAutostart = true;

                    /* add the port that is used for this PLC to the AmsPorts list that
                     * is later used to monitory the AdsState
                     */
                    string xmlString = plcProject.ProduceXml();
                    AmsPorts.Add(XmlUtilities.AmsPort(xmlString));
                }
                System.Threading.Thread.Sleep(1000);
                automationInterface.ActivateConfiguration();

                // Wait
                System.Threading.Thread.Sleep(10000);

                /* Clean the solution. This is the only way to clean the error list which needs to be
                 * clean prior to starting the TwinCAT runtime */
                vsInstance.CleanSolution();

                // Wait
                System.Threading.Thread.Sleep(10000);

                automationInterface.StartRestartTwinCAT();
            }
            else
            {
                log.Error("Build errors in project");
                CleanUpAndExitApplication(Constants.RETURN_BUILD_ERROR);
            }

            /* Establish a connection to the ADS router
             */
            TcAdsClient tcAdsClient = new TcAdsClient();

            /* Run TcUnit until the results have been returned */
            TcUnitResultCollector tcUnitResultCollector = new TcUnitResultCollector();
            ErrorList             errorList             = new ErrorList();

            log.Info("Waiting for results from TcUnit...");

            ErrorItems errorItems;

            while (true)
            {
                System.Threading.Thread.Sleep(10000);

                /* Monitor the AdsState for each PLC that is used in the
                 * solution. If we can't connect to the Ads Router, we just
                 * carry on.
                 */
                try
                {
                    foreach (int amsPort in AmsPorts)
                    {
                        tcAdsClient.Connect(AmsNetId, amsPort);
                        AdsState adsState = tcAdsClient.ReadState().AdsState;
                        if (adsState != AdsState.Run)
                        {
                            log.Error("Invalid AdsState " + adsState + "<>" + AdsState.Run + ". This could indicate a PLC Exception, terminating ...");
                            Environment.Exit(Constants.RETURN_INVALID_ADSSTATE);
                        }
                    }
                }
                catch (Exception ex)
                { }
                finally
                {
                    tcAdsClient.Disconnect();
                }

                errorItems = vsInstance.GetErrorItems();

                var newErrors = errorList.AddNew(errorItems);
                if (log.IsDebugEnabled)
                {
                    foreach (var error in newErrors)
                    {
                        log.Debug(error.ErrorLevel + ": " + error.Description);
                    }
                }

                log.Info("... got " + errorItems.Count + " report lines so far.");
                if (tcUnitResultCollector.AreResultsAvailable(errorItems))
                {
                    log.Info("All results from TcUnit obtained");

                    /* The last test suite result can be returned after that we have received the test results, wait a few seconds
                     * and fetch again
                     */
                    System.Threading.Thread.Sleep(10000);
                    break;
                }
            }

            List <ErrorList.Error> errors       = new List <ErrorList.Error>(errorList.Where(e => (e.ErrorLevel == vsBuildErrorLevel.vsBuildErrorLevelHigh || e.ErrorLevel == vsBuildErrorLevel.vsBuildErrorLevelLow)));
            List <ErrorList.Error> errorsSorted = errors.OrderBy(o => o.Description).ToList();

            /* Parse all events (from the error list) from Visual Studio and store the results */
            TcUnitTestResult testResult = tcUnitResultCollector.ParseResults(errorsSorted, TcUnitTaskName);

            /* Write xUnit XML report */
            if (testResult != null)
            {
                // No need to check if file (VisualStudioSolutionFilePath) exists, as this has already been done
                string VisualStudioSolutionDirectoryPath = Path.GetDirectoryName(VisualStudioSolutionFilePath);
                string XUnitReportFilePath = VisualStudioSolutionDirectoryPath + "\\" + Constants.XUNIT_RESULT_FILE_NAME;
                log.Info("Writing xUnit XML file to " + XUnitReportFilePath);
                // Overwrites all existing content (if existing)
                XunitXmlCreator.WriteXml(testResult, XUnitReportFilePath);
            }

            CleanUpAndExitApplication(Constants.RETURN_SUCCESSFULL);
        }
        /// <summary>
        /// Import an xml file for an IO device
        /// </summary>
        /// <param name="xmlFile"></param>
        public void importIoXmls(string xmlFile)
        {
            if (!File.Exists(xmlFile))
            {
                throw new ApplicationException($"IO Xml file {xmlFile} could not be found.");
            }

            string        deviceName = Path.GetFileNameWithoutExtension(xmlFile);
            ITcSmTreeItem currentIo  = null;

            //Need to look for a match "somewhere"
            //Top level first
            try
            {
                currentIo = Io.LookupChild(deviceName);
            }
            catch
            {
                //do nothing
            }
            //If not found, search next level
            if (currentIo == null)
            {
                for (int i = 1; i <= Io.ChildCount; i++)
                {
                    try
                    {
                        currentIo = Io.Child[i].LookupChild(deviceName);
                        if (currentIo != null)
                        {
                            break;
                        }
                    }
                    catch
                    {
                        //do nothing, go for next run
                    }
                }
            }
            //If still not found, go for next level
            if (currentIo == null)
            {
                for (int i = 1; i <= Io.ChildCount; i++)
                {
                    for (int j = 1; j <= Io.Child[i].ChildCount; i++)
                    {
                        try
                        {
                            currentIo = Io.Child[i].Child[j].LookupChild(deviceName);
                            if (currentIo != null)
                            {
                                break;
                            }
                        }
                        catch
                        {
                            //do nothing, go for next run
                        }
                    }
                }
            }

            //we've looked everywhere dude
            if (currentIo == null)
            {
                throw new ApplicationException($"Could not find device {deviceName}");
            }

            XmlDocument ioXml = new XmlDocument();

            ioXml.Load(xmlFile);
            try
            {
                currentIo.ConsumeXml(ioXml.OuterXml);
            }
            catch
            {
                throw new ApplicationException($"Failed to load xml for {deviceName}");
            }
        }
        public void ScanDevicesAndBoxes(DataTable dt)
        {
            int config;

            if ((config = checkForRunMode()) == 1)
            {
                ITcSmTreeItem ioDevicesItem = sysMan.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 = new XmlDocument();
                xmlDoc.LoadXml(scannedXml); // Loads the Xml data into an XML Document
                XmlNodeList          xmlDeviceList = xmlDoc.SelectNodes("TreeItem/DeviceGrpDef/FoundDevices/Device");
                List <ITcSmTreeItem> devices       = new List <ITcSmTreeItem>();

                //local variables for our spreadsheet writing statements
                int deviceCount = 0;

                int i = 2;

                // 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);
                    }
                    int j = 0;
                    foreach (ITcSmTreeItem Box in device)
                    {
                        if (Box.ItemSubTypeName.Contains("EP7402-0057"))
                        {
                            Box.Name = dt.Rows[j].ItemArray[0].ToString() + j.ToString();
                            this.EditParams(Box, dt.Rows[j].ItemArray[2].ToString());
                            j++;
                            LinkIoToPlc(Box);
                        }
                    } //for each Box
                }     //end of foreach loops
            }
        }             //ScanDevicesandBoxes()