Exemple #1
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>
        /// Создаёт конфигурацию сети на основе 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();
        }
Exemple #4
0
        /// <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;
        }
Exemple #5
0
        /// <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;
        }
Exemple #6
0
        /// <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;
        }
Exemple #7
0
        /// <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;
        }
Exemple #8
0
 /// <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;
 }
Exemple #9
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);
        }
Exemple #10
0
 /// <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-устройство уже принадлежит другому контроллеру сети");
             }
         }
     }
 }