/// <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> /// Создаёт конфигурацию сети на основе CAN-сети /// </summary> private void Init(NetworkController network) { network.Devices.Clear(); List<CAN.ApplicationLayer.Network.Devices.DeviceBase> canDevices = new List<NGK.CAN.ApplicationLayer.Network.Devices.DeviceBase>(); CAN.ApplicationLayer.Network.Master.NetworksManager canNetworkManager = CAN.ApplicationLayer.Network.Master.NetworksManager.Instance; // Создаём таблицу CAN-сетей _CanNetworksTable = new Dictionary<string, int>(canNetworkManager.Networks.Count); foreach (CAN.ApplicationLayer.Network.Master.NetworkController controller in canNetworkManager.Networks) { _CanNetworksTable.Add(controller.Description, canNetworkManager.Networks.IndexOf(controller)); } // Получаем список CAN устройств из всех сетей foreach (CAN.ApplicationLayer.Network.Master.NetworkController controller in canNetworkManager.Networks) { canDevices.AddRange(controller.Devices); } // Создаём slave-устройства и добавляем его в Modbus-сеть _DeviceKCCM = CreateKCCM(1); _DeviceKCCM.InputRegisters[KCCM.InputRegister.SoftwareVersion].Value = new ProductVersion(new Version(1, 0)).TotalVersion; //TODO _DeviceKCCM.InputRegisters[KCCM.InputRegister.HardwareVersion].Value = new ProductVersion(new Version(1, 0)).TotalVersion; //TODO _DeviceKCCM.InputRegisters[KCCM.InputRegister.TotalDevices].Value = System.Convert.ToUInt16(canDevices.Count); network.Devices.Add(_DeviceKCCM); File mDevice; ushort i = 1; foreach (NGK.CAN.ApplicationLayer.Network.Devices.DeviceBase device in canDevices) { switch(device.DeviceType) { case NGK.CAN.ApplicationLayer.Network.Devices.DeviceType.KIP_BATTERY_POWER_v1: { mDevice = CreateKIP01(); // Создаём пустое устройство нужного типа // Инициализируем его mDevice.Number = i++; mDevice.Records[KIP9811Address.VisitingCard.HardwareVersion].Value = ((ProductVersion)device.GetObject(KIP9811v1.Indexes.hw_version)).TotalVersion; mDevice.Records[KIP9811Address.VisitingCard.SoftwareVersion].Value = ((ProductVersion)device.GetObject(KIP9811v1.Indexes.fw_version)).TotalVersion; mDevice.Records[KIP9811Address.VisitingCard.SerialNumberHigh].Value = System.Convert.ToUInt16(device.GetObject(KIP9811v1.Indexes.serial_number1)); mDevice.Records[KIP9811Address.VisitingCard.SerialNumberMiddle].Value = System.Convert.ToUInt16(device.GetObject(KIP9811v1.Indexes.serial_number2)); mDevice.Records[KIP9811Address.VisitingCard.SerialNumberLow].Value = System.Convert.ToUInt16(device.GetObject(KIP9811v1.Indexes.serial_number3)); mDevice.Records[KIP9811Address.VisitingCard.CRC16].Value = 0; //TODO (сделать рассчёт CRC16) mDevice.Records[KIP9811Address.ServiceInformation.NetworkNumber].Value = System.Convert.ToUInt16(_CanNetworksTable[device.Network.Description]); mDevice.Records[KIP9811Address.ServiceInformation.NetwrokAddress].Value = System.Convert.ToUInt16(device.NodeId); mDevice.Records[KIP9811Address.ServiceInformation.ConectionStatus].Value = 0; // 0-норма 1-ошибка break; } case NGK.CAN.ApplicationLayer.Network.Devices.DeviceType.KIP_MAIN_POWERED_v1: { throw new NotImplementedException(); } default: { throw new NotSupportedException(); } } // Добавляем устройство _DeviceKCCM.Files.Add(mDevice); // Создаём для него контекст для данного устройства _Context.Add(new ModbusAdapterContext(device, mDevice)); } }
/// <summary> /// /// </summary> public ModbusServiceAdapter() { _Context = new List<ModbusAdapterContext>(); // Создаём единственную сеть Modbus для работы // сверхним уровнем // Получаем настройки из файла конфигурации приложения NameValueCollection settings = ConfigurationManager.AppSettings; string portName = settings["PortName"]; int baudRate = int.Parse(settings["BaudRate"]); Parity parity = (Parity)Enum.Parse(typeof(Parity), settings["Parity"]); int dataBits = int.Parse(settings["DataBits"]); StopBits stopBits = (StopBits)Enum.Parse(typeof(StopBits), settings["StopBits"]); _Connection = new ComPort(portName, baudRate, parity, dataBits, stopBits); _Network = new NetworkController("ModbusNetwork", _Connection); NetworksManager.Instance.Networks.Add(_Network); // Конфигурацию на основе Init(_Network); // Запускаем таймер _Timer = new Timer(); _Timer.AutoReset = true; _Timer.Interval = 1000; _Timer.Elapsed += new ElapsedEventHandler(EventHandler_Timer_Elapsed); _Timer.Start(); }
/// <summary> /// Метод вызывается при старте ПО, ищет xml-файл конфигурации, проверяет /// его по xsd-схеме и если всё нормально создаёт сеть. Если не удалось /// произвести данную операцию, пользователю предлагается создать новую /// сеть или завершить программу /// </summary> /// <param name="pathToXmlConfigFile">Путь к файлу конфигурации сети</param> private NetworkController LoadNetworkConfiguration(String pathToXmlConfigFile) { NetworkController network = null; string path = pathToXmlConfigFile; try { network = NetworkController.Create(path, Application.StartupPath + @"\config.xsd"); } catch (Exception ex) { DialogResult result = MessageBox.Show(this, "При загрузке файла конфигурации сети возникла ошибка: " + ex.Message + " Создать новую сеть или выйти из приложения?", "Ошибка", MessageBoxButtons.YesNo, MessageBoxIcon.Error); if (result == DialogResult.Yes) { // Создаём новую пустую сеть network = new NetworkController(); } else { // Завершаем приложение Application.Exit(); } } return network; }
/// <summary> /// Устанавливает сеть как текущую для работы программы /// </summary> /// <param name="network"></param> private void SetCurrentNetwork(NetworkController network) { if (_Network != null) { if (_Network.Status == Status.Running) { throw new InvalidOperationException( "Невозможно сменить рабочую сеть, текущая сеть имеет активное состояние"); } } if (network == null) { _Network = network; _ToolStripMenuItemNetwork.Enabled = false; _ToolStripMenuItemFileSave.Enabled = false; _ToolStripMenuItemFileSaveAs.Enabled = false; _BindingSourceDevices.DataSource = null; } else { // Устанавливаем новую сеть в качестве текущей _Network = network; _Network.Connection = _SerialPort; _Network.DevicesListWasChanged += new EventHandler(EventHandler_Network_DevicesListWasChanged); _Network.NetworkErrorOccurred += new NetworkErrorOccurredEventHandler(EventHandler_Network_NetworkErrorOccurred); _ToolStripMenuItemFileSave.Enabled = true; _ToolStripMenuItemFileSaveAs.Enabled = true; _ToolStripMenuItemNetwork.Enabled = true; // Разрешаем редакитрование сети _ToolStripMenuItemNetworkEdit.Enabled = true; _ToolStripButtonStart.Enabled = true; _ToolStripButtonStop.Enabled = false; _DataGridViewCoils.DataSource = null; _DataGridViewDiscretesInputs.DataSource = null; _DataGridViewFiles.DataSource = null; _DataGridViewHoldingRegisters.DataSource = null; _DataGridViewInputRegisters.DataSource = null; _DataGridViewRecords.DataSource = null; _BindingSourceDevices.DataSource = null; _BindingSourceDevices.DataSource = Network.Devices; _DataGridViewCoils.DataSource = _BindingSourceDevices; _DataGridViewDiscretesInputs.DataSource = _BindingSourceDevices; _DataGridViewFiles.DataSource = _BindingSourceDevices; _DataGridViewHoldingRegisters.DataSource = _BindingSourceDevices; _DataGridViewInputRegisters.DataSource = _BindingSourceDevices; } // Отображаем текущую сеть сеть ShowNetwork(ref _TreeViewNetwork, ref _Network); // Отображем статусную строку SetPathToFileNetworkConfigToStatusStrip(_PathToFileNetworkConfig); SetSerialPortSettingToStatusStrip(_SerialPort); return; }
/// <summary> /// Метод запускает форму для редактирования сети Modbus /// </summary> /// <param name="network">Сеть Modbus</param> private void EditNetwork(NetworkController network) { DialogResult result; if (_Network != null) { if (_Network.Connection != null) { if (_Network.Connection.IsOpen) { result = MessageBox.Show(this, "Соединение активно, остановить и продолжить редактирование сети ?", "Внимание", MessageBoxButtons.YesNo, MessageBoxIcon.Warning); if (result == DialogResult.Yes) { this._Network.Stop(); // Останавливаем сетевой контроллер } else { return; } } } // Вызываем форму для редактирования сети Modbus.OSIModel.ApplicationLayer.Slave.Dialogs.EditNetworkControllerDialog dialog = new Modbus.OSIModel.ApplicationLayer.Slave.Dialogs.EditNetworkControllerDialog(); dialog.Network = _Network; result = dialog.ShowDialog(); ShowNetwork(ref _TreeViewNetwork, ref _Network); } return; }
/// <summary> /// Метод отображает устройства сети в элементе control; /// </summary> /// <param name="control">Элемент для отображения списка устройств в сети</param> /// <param name="network">Сеть Modbus</param> private void ShowNetwork(ref TreeView control, ref NetworkController network) { TreeNode node; if (control == null) { return; } else { control.Nodes.Clear(); if (network == null) { control.Enabled = false; } else { control.Enabled = true; control.ShowNodeToolTips = true; node = new TreeNode(); node.Name = "NodeRoot"; node.Text = network.NetworkName; node.ToolTipText = "Наименование сети Modbus"; control.Nodes.Add(node); control.TopNode = node; if (network.Devices.Count > 0) { control.TopNode.Checked = true; foreach (Device device in network.Devices) { node = new TreeNode(); node.Name = "Node 0x" + device.Address.ToString("X2"); node.Text = "Устройство 0x" + device.Address.ToString("X2"); node.ToolTipText = device.Description; if (device.Status == Common.Controlling.Status.Running) { node.Checked = true; } else { // если есть хотя бы одно остановленное устройво // то снимаем галочку с корневого элемента control.TopNode.Checked = false; } node.Tag = device; control.TopNode.Nodes.Add(node); } } else { control.TopNode.Checked = false; } control.ExpandAll(); control.SelectedNode = control.TopNode; } } return; }
/// <summary> /// Обработчик события выбора меню "Создать" /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void EventHandler_ToolStripMenuItemNewFile_Click( object sender, EventArgs e) { // Создаём новую сеть // Если текущая сеть != null, то спрашиваем пользователя хочет ли он // сохранить текущую конфигурацию. NetworkController network = new NetworkController(); SetCurrentNetwork(network); return; }
/// <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> /// Метод устанавливает владелца данного объекта. Метод вызывается владельцем /// при добавлении данного устройства в свой список. А так же, вызывается при /// удалении данного устройства из своего списка. При этом поле обнуляется (null) /// </summary> /// <param name="owner">Будующий владелец данного устройства</param> internal void SetOwner(NetworkController owner) { if (_NetworkController == null) { _NetworkController = owner; } else { if (owner == null) { // Осовбождаем владельца, теперь устройство свободно _NetworkController = null; } else { // Если контроллер сети, которой принадлежит данное устройство // устанавливаемой, тогда ничего не делаем. // Здесь нет ошибки. В противном случае, генерируем исключение if (Equals(owner) == false) { throw new InvalidOperationException( "Данное modbus-устройство уже принадлежит другому контроллеру сети"); } } } }