Exemplo n.º 1
0
        /// <summary>
        /// Синхронизация привязки устройств привязанных к модулю.
        /// Реализовано сразу два типа синхронизации
        /// </summary>
        /// <param name="synchronizingModule">Синхронизируемый модуль</param>
        /// <param name="IOModuleDevices">Устройства для синхронизации</param>
        private void SynchronizeIOModuleDevices(Function synchronizingModule,
                                                Dictionary <int, string> IOModuleDevices)
        {
            DocumentTypeManager.DocumentType circuitDocument =
                DocumentTypeManager.DocumentType.Circuit;
            DocumentTypeManager.DocumentType overviewDocument =
                DocumentTypeManager.DocumentType.Overview;

            foreach (int clamp in IOModuleDevices.Keys)
            {
                string functionalText =
                    SortDevices(IOModuleDevices[clamp]);
                // Конвертируем символ "плюс" обратно.
                functionalText = functionalText.
                                 Replace(SymbolForPlusReplacing, PlusSymbol.ToString());

                string functionalTextWithoutComments =
                    DeleteDevicesComments(functionalText);

                // На электрических схемах при множественной привязке
                // комментарий не пишем.
                SynchronizeDevice(synchronizingModule, clamp,
                                  functionalTextWithoutComments, circuitDocument);

                // На странице "Обзор" при множественной привязке надо писать
                // комментарии.
                SynchronizeDevice(synchronizingModule, clamp, functionalText,
                                  overviewDocument);
            }
        }
Exemplo n.º 2
0
        /// <summary>
        /// Синхронизация привязки к устройству
        /// </summary>
        /// <param name="functionalText">Обновленный функциональный текст
        /// </param>
        /// <param name="clamp">Номер клеммы</param>
        /// <param name="synchronizingDevice">Обновляемое устройство</param>
        private void SynchronizeIOModule(Function synchronizingDevice,
                                         int clamp, string functionalText, bool?isASInterface = false)
        {
            const int SequenceNumbersField = 20;

            // Конвертируем символ "плюс" обратно.
            functionalText = functionalText.
                             Replace(SymbolForPlusReplacing, PlusSymbol.ToString());

            var placedFunctions = synchronizingDevice.SubFunctions.
                                  Where(x => x.IsPlaced == true).ToArray();

            var clampFunction = placedFunctions.
                                Where(x => x.Page.PageType ==
                                      DocumentTypeManager.DocumentType.Circuit).
                                FirstOrDefault(x => x.Properties.
                                               FUNC_ADDITIONALIDENTIFYINGNAMEPART.ToInt() == clamp);

            // Если null - клеммы нет на схеме.
            if (clampFunction != null)
            {
                clampFunction.Properties.FUNC_TEXT = functionalText;
                AddSynchronizedDevice(synchronizingDevice, clamp);
                // Если AS-интерфейс, в доп поле записать нумерацию
                if (isASInterface == true)
                {
                    clampFunction.Properties.
                    FUNC_SUPPLEMENTARYFIELD[SequenceNumbersField] =
                        ASINumbering;
                }
            }
        }
Exemplo n.º 3
0
        /// <summary>
        /// Синхронизация нового проекта
        /// </summary>
        /// <param name="deviceConnections">Объекты для обновления.
        /// Первый ключ - устройство ввода-вывода,
        /// второй - привязанные устройства</param>
        /// <param name="functions">Функции обновляемых объектов</param>
        private void SynchronizeAsNewProject(Dictionary <string, string>
                                             deviceConnections, Function[] functions)
        {
            foreach (string key in deviceConnections.Keys)
            {
                string deviceVisibleName = key.Substring(
                    0, key.IndexOf(ChannelPostfix));
                var synchronizingDevice = functions.
                                          FirstOrDefault(x => x.VisibleName.
                                                         Contains(deviceVisibleName));

                if (synchronizingDevice == null)
                {
                    continue;
                }

                string clampNumberAsString = key.Remove(0,
                                                        key.IndexOf(ChannelPostfix) + ChannelPostfixSize);

                // Если нет пневмоострова Y - то синхронизация ничем
                // не отличается от старого проекта.
                if (!deviceConnections[key]
                    .Contains(Device.DeviceManager.ValveTerminalName))
                {
                    var connections = new Dictionary <string, string>();
                    connections[key] = deviceConnections[key];
                    SynchronizeAsOldProject(connections, functions);
                }
                else
                {
                    var bindedDevices = deviceConnections[key].
                                        Split(PlusSymbol).
                                        FirstOrDefault(x => x
                                                       .Contains(Device.DeviceManager.ValveTerminalName))
                                        .Insert(0, PlusSymbol.ToString());
                    var clamp = Convert.ToInt32(clampNumberAsString);
                    // Синхронизация пневмоострова.
                    SynchronizeIOModule(synchronizingDevice, clamp,
                                        bindedDevices);

                    // Синхронизация устройств привязанных к пневмоострову.
                    Dictionary <int, string> bindedIOModuleDevices =
                        GetValveTerminalDevices(deviceConnections[key]);
                    deviceVisibleName = GetValveTerminalFunctionName(
                        deviceConnections[key]);
                    var synchronizingIOModuleDevice = functions.
                                                      FirstOrDefault(x => x.Name.Contains(
                                                                         deviceVisibleName));
                    SynchronizeIOModuleDevices(synchronizingIOModuleDevice,
                                               bindedIOModuleDevices);
                }
            }
        }
Exemplo n.º 4
0
        /// <summary>
        /// Получение устройств, привязанных к пневмоострову.
        /// </summary>
        /// <param name="functionalText">Функциональный текст
        /// пневмоострова, к которому привязано устройство</param>
        /// <returns></returns>
        private Dictionary <int, string> GetValveTerminalDevices
            (string functionalText)
        {
            const string ClampNumberParameter = "R_VTUG_NUMBER";

            string[] devicesArray         = functionalText.Split(PlusSymbol);
            var      valveTerminalDevices = new Dictionary <int, string>();

            foreach (string deviceString in devicesArray)
            {
                if (string.IsNullOrEmpty(deviceString) ||
                    string.IsNullOrWhiteSpace(deviceString) ||
                    deviceString
                    .Contains(Device.DeviceManager.ValveTerminalName))
                {
                    continue;
                }

                string deviceName = Regex.Match(deviceString.
                                                Insert(0, PlusSymbol.ToString()),
                                                Device.DeviceManager.DeviceNamePattern).Value;
                Device.IODevice device = Device.DeviceManager.
                                         GetInstance().GetDevice(deviceName);
                string clampNumber = device.GetRuntimeParameter(
                    ClampNumberParameter);
                var clamp = Convert.ToInt32(clampNumber);

                if (valveTerminalDevices.ContainsKey(clamp))
                {
                    valveTerminalDevices[clamp] += deviceString.
                                                   Insert(0, PlusSymbol.ToString());
                }
                else
                {
                    valveTerminalDevices.Add(clamp, deviceString.
                                             Insert(0, PlusSymbol.ToString()));
                }
            }

            return(valveTerminalDevices);
        }
Exemplo n.º 5
0
        /// <summary>
        /// Сортировка устройств для корректного отображения.
        /// </summary>
        /// <param name="devices">Устройства для сортировки</param>
        /// <returns></returns>
        private string SortDevices(string devices)
        {
            var devicesMatches = Regex.Matches(devices,
                                               Device.DeviceManager.DeviceNamePattern);

            if (devicesMatches.Count <= MinimalDevicesCountForCheck)
            {
                return(devices);
            }

            // valveTerminal - для вставки VTUG в старых проектах первым.
            Device.Device valveTerminal = null;
            var           devicesList   = new List <Device.Device>();

            foreach (Match match in devicesMatches)
            {
                Device.Device device = Device.DeviceManager.GetInstance().
                                       GetDevice(match.Value);
                if (device.DeviceType != Device.DeviceType.DEV_VTUG)
                {
                    devicesList.Add(device);
                }
                else
                {
                    valveTerminal = device;
                }
            }

            devicesList.Sort(DevicesComparer);

            if (valveTerminal != null)
            {
                devicesList.Insert(0, valveTerminal);
            }

            var sortedDevices = "";

            foreach (Device.Device device in devicesList)
            {
                if (device.Description.Contains(PlusSymbol))
                {
                    // Заменяем символ плюс в комментарии, что бы не было
                    // конфликтов. Потом вернем обратно.
                    string replacedDeviceDescription = device.Description.
                                                       Replace(PlusSymbol.ToString(), SymbolForPlusReplacing);
                    sortedDevices += device.EPlanName +
                                     CommonConst.NewLineWithCarriageReturn +
                                     replacedDeviceDescription +
                                     CommonConst.NewLineWithCarriageReturn;
                }
                else
                {
                    sortedDevices += device.EPlanName +
                                     CommonConst.NewLineWithCarriageReturn +
                                     device.Description +
                                     CommonConst.NewLineWithCarriageReturn;
                }
            }

            return(sortedDevices);
        }
Exemplo n.º 6
0
        /// <summary>
        /// Добавление данных привязки конкретного модуля
        /// </summary>
        /// <param name="channel">Канал устройства</param>
        /// <param name="device">Устройство</param>
        /// <param name="deviceConnections">Словарь с собранными данными
        /// привязок устройств</param>
        /// <param name="deviceFunctions">Главные функции устройств для
        /// поиска обновленных данных</param>
        private void CollectModuleData(Device.IODevice device,
                                       Device.IODevice.IOChannel channel, Function[] deviceFunctions,
                                       ref Dictionary <string, string> deviceConnections)
        {
            const string IOModulePrefix    = "A";
            const string ASInterfaceModule = "655";

            string deviceVisibleName = IOModulePrefix + channel.FullModule;
            var    deviceFunction    = deviceFunctions.
                                       FirstOrDefault(x => x.VisibleName.Contains(deviceVisibleName));

            if (deviceFunction == null)
            {
                return;
            }

            deviceVisibleName += ChannelPostfix + channel.PhysicalClamp.
                                 ToString();
            string functionalText   = device.EPlanName;
            string devicePartNumber = deviceFunction.ArticleReferences[0]
                                      .PartNr;

            // Для модулей ASi не нужно добавлять комментарии
            // к имени устройств.
            if (!devicePartNumber.Contains(ASInterfaceModule))
            {
                if (device.Description.Contains(PlusSymbol))
                {
                    // Так как в комментариях может использоваться знак
                    // "плюс", то заменим его на какую-то константу,
                    // которую при обновлении функционального текста
                    // преобразуем обратно.
                    string replacedDeviceDescription = device.Description.
                                                       Replace(PlusSymbol.ToString(),
                                                               SymbolForPlusReplacing);
                    functionalText += CommonConst.NewLineWithCarriageReturn +
                                      replacedDeviceDescription;

                    if (!string.IsNullOrEmpty(channel.Comment))
                    {
                        functionalText += CommonConst.NewLineWithCarriageReturn +
                                          channel.Comment;
                    }
                }
                else
                {
                    functionalText += CommonConst.NewLineWithCarriageReturn +
                                      device.Description;

                    if (!string.IsNullOrEmpty(channel.Comment))
                    {
                        functionalText += CommonConst.NewLineWithCarriageReturn +
                                          channel.Comment;
                    }
                }

                if (IsPhoenixContactIOLinkModule(devicePartNumber) &&
                    device.Channels.Count > 1)
                {
                    functionalText += CommonConst.NewLineWithCarriageReturn +
                                      ApiHelper.GetChannelNameForIOLinkModuleFromString(
                        channel.Name);
                }
            }
            else
            {
                functionalText += WhiteSpace;
            }

            if (deviceConnections.ContainsKey(deviceVisibleName))
            {
                deviceConnections[deviceVisibleName] += functionalText;
            }
            else
            {
                deviceConnections.Add(deviceVisibleName, functionalText);
            }
        }