Exemple #1
0
        /// <summary>
        /// 更改PLC的保持寄存器的值
        /// </summary>
        /// <param name="sender">文本框</param>
        /// <param name="register">保持寄存器</param>
        /// <param name="DecimalDigits">小数位数</param>
        /// <param name="Max">最大值</param>
        /// <param name="Min">最小值</param>
        protected void ChangePLCValue(object sender, HoldingRegister register, int DecimalDigits, double Max = 999d, double Min = 0d)
        {
            double d = 0d;

            if (TextClick(sender, ref d, DecimalDigits, Max, Min))
            {
                int Rate = 1;
                if (m_AxisName == Axis.Carry)
                {
                    Rate = GlobalVar.ConverRate_Carry;                          //搬运轴的换算倍数
                }
                else
                {
                    Rate = GlobalVar.ConverRate;
                }

                if (m_AxisName == Axis.CCD)//CCD--[20180418 lqz]
                {
                    GlobalVar.c_Modbus.AddMsgList(register, (int)(d / GlobalVar.ConverRate_CCD));
                }
                else
                {
                    GlobalVar.c_Modbus.AddMsgList(register, (int)(d * Rate));
                }
            }
        }
Exemple #2
0
        /// <summary>
        /// 更改PLC的保持寄存器的值
        /// </summary>
        /// <param name="sender">文本框</param>
        /// <param name="register">保持寄存器</param>
        /// <param name="DecimalDigits">小数位数</param>
        /// <param name="Rate">换算倍数</param>
        /// <param name="Max">最大值</param>
        /// <param name="Min">最小值</param>
        protected void ChangePLCValue(object sender, HoldingRegister register, int DecimalDigits, int Rate = GlobalVar.ConverRate, double Max = 999d, double Min = 0d)
        {
            double d = 0d;

            if (TextClick(sender, ref d, DecimalDigits, Max, Min))
            {
                GlobalVar.c_Modbus.AddMsgList(register, (int)(d * Rate));
            }
        }
Exemple #3
0
        /// <summary>
        /// 更改PLC的保持寄存器的值
        /// </summary>
        /// <param name="sender">文本框</param>
        /// <param name="register">保持寄存器</param>
        protected void ChangePLCValue(object sender, HoldingRegister register)
        {
            int d = 0;

            if (TextClick(sender, ref d))
            {
                GlobalVar.c_Modbus.AddMsgList(register, d);
            }
        }
Exemple #4
0
        /// <summary>
        /// 修改单个保持寄存器的值
        /// </summary>
        /// <param name="register">保持寄存器</param>
        /// <param name="Value">修改的值(包含小数的值,将数值*100后写入)</param>
        internal void AddMsgList(HoldingRegister register, int Value)
        {
            InputModule input = new InputModule();

            input.nStartAddr  = register.Addr;
            input.nDataLength = register.Size;
            if (register.Size > 1)
            {
                input.byFunction  = Modbus.byWRITE_MULTI_HOLDING_REG;
                input.byWriteData = ModbusTool.HostToNetOrder32(Value);
            }
            else
            {
                input.byFunction  = Modbus.byWRITE_SINGLE_HOLDING_REG;
                input.byWriteData = ModbusTool.HostToNetOrder16((short)Value);
            }

            AddMsgList(input);
        }
Exemple #5
0
        /// <summary>
        /// Создаёт контроллер сети Modbus из файла конфигурации сети
        /// </summary>
        /// <param name="pathToXmlFile">Путь + название файла конфигурации сети *.xml</param>
        /// <param name="pathToXsdFile">Путь + название файла файла схемы для файла конфигурации *.xsd</param>
        /// <returns>Если возникла ошибка возвращается null, если процесс создания 
        /// успешно завершён возвращается контроллер сети</returns>
        public static NetworkController Create(String pathToXmlFile, 
            String pathToXsdFile)
        {
            XmlReaderSettings xmlrdsettings;
            XmlReader reader;
            NetworkController network;
            Device device;
            Coil coil;
            DiscreteInput dinput;
            HoldingRegister hregister;
            InputRegister iregister;
            File file;
            Record record;
            List<Device> devices;
            String networkName;

            networkName = String.Empty;
            devices = new List<Device>();

            xmlrdsettings = new XmlReaderSettings();
            xmlrdsettings.IgnoreComments = true;
            xmlrdsettings.IgnoreWhitespace = true;
            xmlrdsettings.Schemas.Add("", pathToXsdFile);
            xmlrdsettings.ValidationType = ValidationType.Schema;
            //xmlrdsettings.ValidationEventHandler +=
            //    new ValidationEventHandler(EventHandler_vr_ValidationEventHandler);
            reader = XmlReader.Create(pathToXmlFile, xmlrdsettings);

            try
            {
                while(reader.Read())
                {
                    if (reader.NodeType == XmlNodeType.Element)
                    {
                        if (!reader.IsEmptyElement)
                        {
                            switch (reader.Name)
                            {
                                case "Network":
                                    {
                                        if (reader.HasAttributes)
                                        {
                                            // Получаем наименование сети
                                            networkName = reader.GetAttribute("Name");
                                            //network.NetworkName = reader.GetAttribute("Name");
                                        }
                                        else
                                        {
                                            throw new Exception(String.Format(
                                                "Ошибка в строке {0}.Элемент Network не имеет свойства Name",
                                                reader.Settings.LineNumberOffset.ToString()));
                                        }
                                        break;
                                    }
                                case "Device":
                                    {
                                        if (reader.HasAttributes)
                                        {
                                            device = new Device(Byte.Parse(reader.GetAttribute("Address")));
                                            device.Description = reader.GetAttribute("Description");                                          
                                            device.Status = (Status)Enum.Parse(typeof(Status), 
                                                reader.GetAttribute("Status"));
                                            //network.Devices.Add(device);
                                            devices.Add(device);
                                        }
                                        else
                                        {
                                            throw new Exception(String.Format(
                                                "Ошибка в строке {0}.Элемент Device не имеет свойств",
                                                reader.Settings.LineNumberOffset.ToString()));
                                        }
                                        break;
                                    }
                                case "Coil":
                                    {
                                        if (reader.HasAttributes)
                                        {
                                            Boolean value;
                                            UInt16 address = UInt16.Parse(reader.GetAttribute("Address"));

                                            reader.Read();
                                            if (reader.NodeType == XmlNodeType.Element)
                                            {
                                                if (reader.Name == "Value")
                                                {
                                                    reader.Read();
                                                    value = Boolean.Parse(reader.Value);
                                                }
                                                else
                                                {
                                                    throw new Exception(String.Format(
                                                        "Ошибка в строке {0}. Элемент Coil не содержит элемент Value",
                                                        reader.Settings.LineNumberOffset.ToString()));
                                                }
                                            }
                                            else
                                            {
                                                throw new Exception(String.Format(
                                                    "Ошибка в строке {0}. Элемент Coil содержит элемент недопустимого типа",
                                                    reader.Settings.LineNumberOffset.ToString()));
                                            }

                                            reader.Read(); // EndElement Value
                                            reader.Read();
                                            if (reader.NodeType == XmlNodeType.Element)
                                            {
                                                if (reader.Name == "Description")
                                                {
                                                    reader.Read();
                                                    coil = new Coil(address, value, reader.Value);
                                                    //network.Devices[network.Devices.Count - 1].Coils.Add(coil);
                                                    devices[devices.Count - 1].Coils.Add(coil);
                                                }
                                                else
                                                {
                                                    throw new Exception(String.Format(
                                                        "Ошибка в строке {0}. Элемент Coil не содержит элемент Description",
                                                        reader.Settings.LineNumberOffset.ToString()));
                                                }
                                            }
                                            else
                                            {
                                                throw new Exception(String.Format(
                                                    "Ошибка в строке {0}. Элемент Coil содержит элемент недопустимого типа",
                                                    reader.Settings.LineNumberOffset.ToString()));
                                            }
                                        }
                                        else
                                        {
                                            throw new Exception(String.Format(
                                                "Ошибка в строке {0}.Элемент Coil не имеет свойств",
                                                reader.Settings.LineNumberOffset.ToString()));
                                        }
                                        break;
                                    }
                                case "DiscreteInput":
                                    {
                                        if (reader.HasAttributes)
                                        {
                                            Boolean value;
                                            UInt16 address = UInt16.Parse(reader.GetAttribute("Address"));

                                            reader.Read();
                                            if (reader.NodeType == XmlNodeType.Element)
                                            {
                                                if (reader.Name == "Value")
                                                {
                                                    reader.Read();
                                                    value = Boolean.Parse(reader.Value);
                                                }
                                                else
                                                {
                                                    throw new Exception(String.Format(
                                                        "Ошибка в строке {0}. Элемент DiscreteInput не содержит элемент Value",
                                                        reader.Settings.LineNumberOffset.ToString()));
                                                }
                                            }
                                            else
                                            {
                                                throw new Exception(String.Format(
                                                    "Ошибка в строке {0}. Элемент DiscreteInput содержит элемент недопустимого типа",
                                                    reader.Settings.LineNumberOffset.ToString()));
                                            }

                                            reader.Read(); // EndElement Value
                                            reader.Read();
                                            if (reader.NodeType == XmlNodeType.Element)
                                            {
                                                if (reader.Name == "Description")
                                                {
                                                    reader.Read();
                                                    dinput = new DiscreteInput(address, value, reader.Value);
                                                    
                                                    //network.Devices[network.Devices.Count - 1].DiscretesInputs.Add(dinput);
                                                    devices[devices.Count - 1].DiscretesInputs.Add(dinput);
                                                }
                                                else
                                                {
                                                    throw new Exception(String.Format(
                                                        "Ошибка в строке {0}. Элемент DiscreteInput не содержит элемент Description",
                                                        reader.Settings.LineNumberOffset.ToString()));
                                                }
                                            }
                                            else
                                            {
                                                throw new Exception(String.Format(
                                                    "Ошибка в строке {0}. Элемент DiscreteInput содержит элемент недопустимого типа",
                                                    reader.Settings.LineNumberOffset.ToString()));
                                            }
                                        }
                                        else
                                        {
                                            throw new Exception(String.Format(
                                                "Ошибка в строке {0}.Элемент DiscreteInput не имеет свойств",
                                                reader.Settings.LineNumberOffset.ToString()));
                                        }
                                        break;
                                    }
                                case "HoldingRegister":
                                    {
                                        if (reader.HasAttributes)
                                        {
                                            UInt16 value;
                                            UInt16 address = UInt16.Parse(reader.GetAttribute("Address"));

                                            reader.Read();
                                            if (reader.NodeType == XmlNodeType.Element)
                                            {
                                                if (reader.Name == "Value")
                                                {
                                                    reader.Read();
                                                    value = UInt16.Parse(reader.Value);
                                                }
                                                else
                                                {
                                                    throw new Exception(String.Format(
                                                        "Ошибка в строке {0}. Элемент HoldingRegister не содержит элемент Value",
                                                        reader.Settings.LineNumberOffset.ToString()));
                                                }
                                            }
                                            else
                                            {
                                                throw new Exception(String.Format(
                                                    "Ошибка в строке {0}. Элемент HoldingRegister содержит элемент недопустимого типа",
                                                    reader.Settings.LineNumberOffset.ToString()));
                                            }

                                            reader.Read(); // EndElement Value
                                            reader.Read();
                                            if (reader.NodeType == XmlNodeType.Element)
                                            {
                                                if (reader.Name == "Description")
                                                {
                                                    reader.Read();
                                                    hregister = new HoldingRegister(address, value, reader.Value);
                                                    //network.Devices[network.Devices.Count - 1].HoldingRegisters.Add(hregister);
                                                    devices[devices.Count - 1].HoldingRegisters.Add(hregister);
                                                }
                                                else
                                                {
                                                    throw new Exception(String.Format(
                                                        "Ошибка в строке {0}. Элемент HoldingRegister не содержит элемент Description",
                                                        reader.Settings.LineNumberOffset.ToString()));
                                                }
                                            }
                                            else
                                            {
                                                throw new Exception(String.Format(
                                                    "Ошибка в строке {0}. Элемент HoldingRegister содержит элемент недопустимого типа",
                                                    reader.Settings.LineNumberOffset.ToString()));
                                            }
                                        }
                                        else
                                        {
                                            throw new Exception(String.Format(
                                                "Ошибка в строке {0}.Элемент HoldingRegister не имеет свойств",
                                                reader.Settings.LineNumberOffset.ToString()));
                                        }
                                        break; 
                                    }
                                case "InputRegister":
                                    {
                                        if (reader.HasAttributes)
                                        {
                                            UInt16 value;
                                            UInt16 address = UInt16.Parse(reader.GetAttribute("Address"));

                                            reader.Read();
                                            if (reader.NodeType == XmlNodeType.Element)
                                            {
                                                if (reader.Name == "Value")
                                                {
                                                    reader.Read();
                                                    value = UInt16.Parse(reader.Value);
                                                }
                                                else
                                                {
                                                    throw new Exception(String.Format(
                                                        "Ошибка в строке {0}. Элемент InputRegister не содержит элемент Value",
                                                        reader.Settings.LineNumberOffset.ToString()));
                                                }
                                            }
                                            else
                                            {
                                                throw new Exception(String.Format(
                                                    "Ошибка в строке {0}. Элемент InputRegister содержит элемент недопустимого типа",
                                                    reader.Settings.LineNumberOffset.ToString()));
                                            }

                                            reader.Read(); // EndElement Value
                                            reader.Read();
                                            if (reader.NodeType == XmlNodeType.Element)
                                            {
                                                if (reader.Name == "Description")
                                                {
                                                    reader.Read();
                                                    iregister = new InputRegister(address, value, reader.Value);
                                                    //network.Devices[network.Devices.Count - 1].InputRegisters.Add(iregister);
                                                    devices[devices.Count - 1].InputRegisters.Add(iregister);
                                                }
                                                else
                                                {
                                                    throw new Exception(String.Format(
                                                        "Ошибка в строке {0}. Элемент InputRegister не содержит элемент Description",
                                                        reader.Settings.LineNumberOffset.ToString()));
                                                }
                                            }
                                            else
                                            {
                                                throw new Exception(String.Format(
                                                    "Ошибка в строке {0}. Элемент InputRegister содержит элемент недопустимого типа",
                                                    reader.Settings.LineNumberOffset.ToString()));
                                            }
                                        }
                                        else
                                        {
                                            throw new Exception(String.Format(
                                                "Ошибка в строке {0}.Элемент InputRegister не имеет свойств",
                                                reader.Settings.LineNumberOffset.ToString()));
                                        }
                                        break; 
                                    }
                                case "File":
                                    {
                                        file = new File(UInt16.Parse(reader.GetAttribute("Number")),
                                            reader.GetAttribute("Description"));
                                        //network.Devices[network.Devices.Count - 1].Files.Add(file);
                                        devices[devices.Count - 1].Files.Add(file);
                                        break;
                                    }
                                case "Record":
                                    {
                                        UInt16 number = UInt16.Parse(reader.GetAttribute("Number"));
                                        String description = reader.GetAttribute("Description");
                                        // Вычитываем следующий элемент. Это долно быть Value
                                        reader.Read();
                                        if (reader.NodeType == XmlNodeType.Element)
                                        {
                                            if (reader.Name == "Value")
                                            {
                                                reader.Read();
                                                record = new Record(number,
                                                    UInt16.Parse(reader.Value), description);
                                                //device = network.Devices[network.Devices.Count - 1];
                                                //device.Files[device.Files.Count - 1].Records.Add(record);
                                                device = devices[devices.Count - 1];
                                                device.Files[device.Files.Count - 1].Records.Add(record);
                                            }
                                            else
                                            {
                                                throw new Exception(String.Format(
                                                    "Ошибка в строке {0}. Элемент Record не содержит элемент Value",
                                                    reader.Settings.LineNumberOffset.ToString()));
                                            }
                                        }
                                        else
                                        {
                                            throw new Exception(String.Format(
                                                "Ошибка в строке {0}. Элемент Record содержит элемент недопустимого типа",
                                                reader.Settings.LineNumberOffset.ToString()));
                                        }
                                        break;
                                    }
                            }
                        }
                    } // End of if (reader.NodeType == XmlNodeType.Element)
                } // End of while(reader.Read())
            }
            //catch (XmlException ex)
            //{
            //    if (reader != null)
            //    {
            //        reader.Close();
            //    }

            //    throw;
            //}
            catch //(Exception ex)
            {
                if (reader != null)
                {
                    reader.Close();
                }

                throw;
            }
            finally
            {
                if (reader != null)
                {
                    reader.Close();
                }
            }
            // Создаём сеть из полученных данных
            network = new NetworkController(networkName, null);

            foreach (Device item in devices)
            {
                network.Devices.Add(item);
            }

            return network;
        }
        //---------------------------------------------------------------------------
        /// <summary>
        /// Добавляет регистр входа/вывода в текущее устройство
        /// </summary>
        private void AddHoldingRegister()
        {
            UInt16 address;
            Device device;
            HoldingRegister register;

            device = (Device)_BindingSourceDevicesList.Current;

            for (address = 0; address <= UInt16.MaxValue; address++)
            {
                if (!device.HoldingRegisters.Contains(address))
                {
                    register = new HoldingRegister(address, 0, String.Empty);

                    device.HoldingRegisters.Add(register);
                    _BindingSourceDevicesList.ResetCurrentItem();

                    if (device.HoldingRegisters.Count > 0)
                    {
                        _ToolStripMenuItemRemoveHoldingRegister.Enabled = true;
                    }
                    if (device.HoldingRegisters.Count == UInt16.MaxValue)
                    {
                        _ToolStripMenuItemAddHoldingRegister.Enabled = false;
                    }

                    return;
                }
            }
            throw new InvalidOperationException(
                "Не удалось добавить новый holding register в устройство, все адреса заняты");
        }
Exemple #7
0
        /// <summary>
        /// Создаёт контроллер сети Modbus из файла конфигурации сети
        /// </summary>
        /// <param name="pathToXmlFile">Путь + название файла конфигурации сети *.xml</param>
        /// <param name="pathToXsdFile">Путь + название файла файла схемы для файла конфигурации *.xsd</param>
        /// <returns>Если возникла ошибка возвращается null, если процесс создания
        /// успешно завершён возвращается контроллер сети</returns>
        public static NetworkController Create(String pathToXmlFile,
                                               String pathToXsdFile)
        {
            XmlReaderSettings xmlrdsettings;
            XmlReader         reader;
            NetworkController network;
            Device            device;
            Coil            coil;
            DiscreteInput   dinput;
            HoldingRegister hregister;
            InputRegister   iregister;
            File            file;
            Record          record;
            List <Device>   devices;
            String          networkName;

            networkName = String.Empty;
            devices     = new List <Device>();

            xmlrdsettings = new XmlReaderSettings();
            xmlrdsettings.IgnoreComments   = true;
            xmlrdsettings.IgnoreWhitespace = true;
            xmlrdsettings.Schemas.Add("", pathToXsdFile);
            xmlrdsettings.ValidationType = ValidationType.Schema;
            //xmlrdsettings.ValidationEventHandler +=
            //    new ValidationEventHandler(EventHandler_vr_ValidationEventHandler);
            reader = XmlReader.Create(pathToXmlFile, xmlrdsettings);

            try
            {
                while (reader.Read())
                {
                    if (reader.NodeType == XmlNodeType.Element)
                    {
                        if (!reader.IsEmptyElement)
                        {
                            switch (reader.Name)
                            {
                            case "Network":
                            {
                                if (reader.HasAttributes)
                                {
                                    // Получаем наименование сети
                                    networkName = reader.GetAttribute("Name");
                                    //network.NetworkName = reader.GetAttribute("Name");
                                }
                                else
                                {
                                    throw new Exception(String.Format(
                                                            "Ошибка в строке {0}.Элемент Network не имеет свойства Name",
                                                            reader.Settings.LineNumberOffset.ToString()));
                                }
                                break;
                            }

                            case "Device":
                            {
                                if (reader.HasAttributes)
                                {
                                    device             = new Device(Byte.Parse(reader.GetAttribute("Address")));
                                    device.Description = reader.GetAttribute("Description");
                                    device.Status      = (Status)Enum.Parse(typeof(Status),
                                                                            reader.GetAttribute("Status"));
                                    //network.Devices.Add(device);
                                    devices.Add(device);
                                }
                                else
                                {
                                    throw new Exception(String.Format(
                                                            "Ошибка в строке {0}.Элемент Device не имеет свойств",
                                                            reader.Settings.LineNumberOffset.ToString()));
                                }
                                break;
                            }

                            case "Coil":
                            {
                                if (reader.HasAttributes)
                                {
                                    Boolean value;
                                    UInt16  address = UInt16.Parse(reader.GetAttribute("Address"));

                                    reader.Read();
                                    if (reader.NodeType == XmlNodeType.Element)
                                    {
                                        if (reader.Name == "Value")
                                        {
                                            reader.Read();
                                            value = Boolean.Parse(reader.Value);
                                        }
                                        else
                                        {
                                            throw new Exception(String.Format(
                                                                    "Ошибка в строке {0}. Элемент Coil не содержит элемент Value",
                                                                    reader.Settings.LineNumberOffset.ToString()));
                                        }
                                    }
                                    else
                                    {
                                        throw new Exception(String.Format(
                                                                "Ошибка в строке {0}. Элемент Coil содержит элемент недопустимого типа",
                                                                reader.Settings.LineNumberOffset.ToString()));
                                    }

                                    reader.Read();         // EndElement Value
                                    reader.Read();
                                    if (reader.NodeType == XmlNodeType.Element)
                                    {
                                        if (reader.Name == "Description")
                                        {
                                            reader.Read();
                                            coil = new Coil(address, value, reader.Value);
                                            //network.Devices[network.Devices.Count - 1].Coils.Add(coil);
                                            devices[devices.Count - 1].Coils.Add(coil);
                                        }
                                        else
                                        {
                                            throw new Exception(String.Format(
                                                                    "Ошибка в строке {0}. Элемент Coil не содержит элемент Description",
                                                                    reader.Settings.LineNumberOffset.ToString()));
                                        }
                                    }
                                    else
                                    {
                                        throw new Exception(String.Format(
                                                                "Ошибка в строке {0}. Элемент Coil содержит элемент недопустимого типа",
                                                                reader.Settings.LineNumberOffset.ToString()));
                                    }
                                }
                                else
                                {
                                    throw new Exception(String.Format(
                                                            "Ошибка в строке {0}.Элемент Coil не имеет свойств",
                                                            reader.Settings.LineNumberOffset.ToString()));
                                }
                                break;
                            }

                            case "DiscreteInput":
                            {
                                if (reader.HasAttributes)
                                {
                                    Boolean value;
                                    UInt16  address = UInt16.Parse(reader.GetAttribute("Address"));

                                    reader.Read();
                                    if (reader.NodeType == XmlNodeType.Element)
                                    {
                                        if (reader.Name == "Value")
                                        {
                                            reader.Read();
                                            value = Boolean.Parse(reader.Value);
                                        }
                                        else
                                        {
                                            throw new Exception(String.Format(
                                                                    "Ошибка в строке {0}. Элемент DiscreteInput не содержит элемент Value",
                                                                    reader.Settings.LineNumberOffset.ToString()));
                                        }
                                    }
                                    else
                                    {
                                        throw new Exception(String.Format(
                                                                "Ошибка в строке {0}. Элемент DiscreteInput содержит элемент недопустимого типа",
                                                                reader.Settings.LineNumberOffset.ToString()));
                                    }

                                    reader.Read();         // EndElement Value
                                    reader.Read();
                                    if (reader.NodeType == XmlNodeType.Element)
                                    {
                                        if (reader.Name == "Description")
                                        {
                                            reader.Read();
                                            dinput = new DiscreteInput(address, value, reader.Value);

                                            //network.Devices[network.Devices.Count - 1].DiscretesInputs.Add(dinput);
                                            devices[devices.Count - 1].DiscretesInputs.Add(dinput);
                                        }
                                        else
                                        {
                                            throw new Exception(String.Format(
                                                                    "Ошибка в строке {0}. Элемент DiscreteInput не содержит элемент Description",
                                                                    reader.Settings.LineNumberOffset.ToString()));
                                        }
                                    }
                                    else
                                    {
                                        throw new Exception(String.Format(
                                                                "Ошибка в строке {0}. Элемент DiscreteInput содержит элемент недопустимого типа",
                                                                reader.Settings.LineNumberOffset.ToString()));
                                    }
                                }
                                else
                                {
                                    throw new Exception(String.Format(
                                                            "Ошибка в строке {0}.Элемент DiscreteInput не имеет свойств",
                                                            reader.Settings.LineNumberOffset.ToString()));
                                }
                                break;
                            }

                            case "HoldingRegister":
                            {
                                if (reader.HasAttributes)
                                {
                                    UInt16 value;
                                    UInt16 address = UInt16.Parse(reader.GetAttribute("Address"));

                                    reader.Read();
                                    if (reader.NodeType == XmlNodeType.Element)
                                    {
                                        if (reader.Name == "Value")
                                        {
                                            reader.Read();
                                            value = UInt16.Parse(reader.Value);
                                        }
                                        else
                                        {
                                            throw new Exception(String.Format(
                                                                    "Ошибка в строке {0}. Элемент HoldingRegister не содержит элемент Value",
                                                                    reader.Settings.LineNumberOffset.ToString()));
                                        }
                                    }
                                    else
                                    {
                                        throw new Exception(String.Format(
                                                                "Ошибка в строке {0}. Элемент HoldingRegister содержит элемент недопустимого типа",
                                                                reader.Settings.LineNumberOffset.ToString()));
                                    }

                                    reader.Read();         // EndElement Value
                                    reader.Read();
                                    if (reader.NodeType == XmlNodeType.Element)
                                    {
                                        if (reader.Name == "Description")
                                        {
                                            reader.Read();
                                            hregister = new HoldingRegister(address, value, reader.Value);
                                            //network.Devices[network.Devices.Count - 1].HoldingRegisters.Add(hregister);
                                            devices[devices.Count - 1].HoldingRegisters.Add(hregister);
                                        }
                                        else
                                        {
                                            throw new Exception(String.Format(
                                                                    "Ошибка в строке {0}. Элемент HoldingRegister не содержит элемент Description",
                                                                    reader.Settings.LineNumberOffset.ToString()));
                                        }
                                    }
                                    else
                                    {
                                        throw new Exception(String.Format(
                                                                "Ошибка в строке {0}. Элемент HoldingRegister содержит элемент недопустимого типа",
                                                                reader.Settings.LineNumberOffset.ToString()));
                                    }
                                }
                                else
                                {
                                    throw new Exception(String.Format(
                                                            "Ошибка в строке {0}.Элемент HoldingRegister не имеет свойств",
                                                            reader.Settings.LineNumberOffset.ToString()));
                                }
                                break;
                            }

                            case "InputRegister":
                            {
                                if (reader.HasAttributes)
                                {
                                    UInt16 value;
                                    UInt16 address = UInt16.Parse(reader.GetAttribute("Address"));

                                    reader.Read();
                                    if (reader.NodeType == XmlNodeType.Element)
                                    {
                                        if (reader.Name == "Value")
                                        {
                                            reader.Read();
                                            value = UInt16.Parse(reader.Value);
                                        }
                                        else
                                        {
                                            throw new Exception(String.Format(
                                                                    "Ошибка в строке {0}. Элемент InputRegister не содержит элемент Value",
                                                                    reader.Settings.LineNumberOffset.ToString()));
                                        }
                                    }
                                    else
                                    {
                                        throw new Exception(String.Format(
                                                                "Ошибка в строке {0}. Элемент InputRegister содержит элемент недопустимого типа",
                                                                reader.Settings.LineNumberOffset.ToString()));
                                    }

                                    reader.Read();         // EndElement Value
                                    reader.Read();
                                    if (reader.NodeType == XmlNodeType.Element)
                                    {
                                        if (reader.Name == "Description")
                                        {
                                            reader.Read();
                                            iregister = new InputRegister(address, value, reader.Value);
                                            //network.Devices[network.Devices.Count - 1].InputRegisters.Add(iregister);
                                            devices[devices.Count - 1].InputRegisters.Add(iregister);
                                        }
                                        else
                                        {
                                            throw new Exception(String.Format(
                                                                    "Ошибка в строке {0}. Элемент InputRegister не содержит элемент Description",
                                                                    reader.Settings.LineNumberOffset.ToString()));
                                        }
                                    }
                                    else
                                    {
                                        throw new Exception(String.Format(
                                                                "Ошибка в строке {0}. Элемент InputRegister содержит элемент недопустимого типа",
                                                                reader.Settings.LineNumberOffset.ToString()));
                                    }
                                }
                                else
                                {
                                    throw new Exception(String.Format(
                                                            "Ошибка в строке {0}.Элемент InputRegister не имеет свойств",
                                                            reader.Settings.LineNumberOffset.ToString()));
                                }
                                break;
                            }

                            case "File":
                            {
                                file = new File(UInt16.Parse(reader.GetAttribute("Number")),
                                                reader.GetAttribute("Description"));
                                //network.Devices[network.Devices.Count - 1].Files.Add(file);
                                devices[devices.Count - 1].Files.Add(file);
                                break;
                            }

                            case "Record":
                            {
                                UInt16 number      = UInt16.Parse(reader.GetAttribute("Number"));
                                String description = reader.GetAttribute("Description");
                                // Вычитываем следующий элемент. Это долно быть Value
                                reader.Read();
                                if (reader.NodeType == XmlNodeType.Element)
                                {
                                    if (reader.Name == "Value")
                                    {
                                        reader.Read();
                                        record = new Record(number,
                                                            UInt16.Parse(reader.Value), description);
                                        //device = network.Devices[network.Devices.Count - 1];
                                        //device.Files[device.Files.Count - 1].Records.Add(record);
                                        device = devices[devices.Count - 1];
                                        device.Files[device.Files.Count - 1].Records.Add(record);
                                    }
                                    else
                                    {
                                        throw new Exception(String.Format(
                                                                "Ошибка в строке {0}. Элемент Record не содержит элемент Value",
                                                                reader.Settings.LineNumberOffset.ToString()));
                                    }
                                }
                                else
                                {
                                    throw new Exception(String.Format(
                                                            "Ошибка в строке {0}. Элемент Record содержит элемент недопустимого типа",
                                                            reader.Settings.LineNumberOffset.ToString()));
                                }
                                break;
                            }
                            }
                        }
                    } // End of if (reader.NodeType == XmlNodeType.Element)
                }     // End of while(reader.Read())
            }
            //catch (XmlException ex)
            //{
            //    if (reader != null)
            //    {
            //        reader.Close();
            //    }

            //    throw;
            //}
            catch //(Exception ex)
            {
                if (reader != null)
                {
                    reader.Close();
                }

                throw;
            }
            finally
            {
                if (reader != null)
                {
                    reader.Close();
                }
            }
            // Создаём сеть из полученных данных
            network = new NetworkController(networkName, null);

            foreach (Device item in devices)
            {
                network.Devices.Add(item);
            }

            return(network);
        }