Показано с 1 по 9 из 9

Тема: MasterSCADA и структура OPC-переменных

  1. #1
    Пользователь
    Регистрация
    04.11.2013
    Адрес
    Минск, Беларусь
    Сообщений
    26

    По умолчанию MasterSCADA и структура OPC-переменных

    В MasterSCADA в дереве Системы у OPC-сервера можно структурировать данные - создавать группы OPC-переменных.

    При этом выполняются только добавление и удаление OPC-переменных,
    а наименование переменных совпадает с наименованием OPC-переменных в программе OPC-сервера.

    В MasterSCADA в дереве Системы для OPC-серверов нет возможности:
    - изменить наименование группы,
    - копировать/дублировать созданные группы,
    - присвоить наименования переменным в группе,
    - изменить привязку OPC-переменной в группе к другой переменной в программе OPC-сервера.

    В результате, когда в процессе разработки системы надо изменить структуру OPC-переменных или
    дублировать объект (у которого может быть несколько сотен OPC-переменных),
    приходится в дереве Системы проекта MasterSCADA заново поэлементно создавать всю структуру OPC-переменных.

    Это трудоемко и чревато ошибками.

    При этом совместная работа над проектом дерева Системы в части OPC-переменных может быть организована только последовательно,
    неудобно изменение работающих проектов под меняющиеся требования, ограничиваются возможности развития проектов и вообще типизации проектов.

    Вопрос:
    Есть какие-нибудь инструменты для копирования и редактирования
    групп OPC-переменных MasterSCADA? Или инструменты экспорта-импорта ветки
    дерева Системы с OPC-сервером в общепринятый формат для редактирования?

    Интересует инстументарий именно для MasterSCADA, а не предложения по изменению структуры переменных в программе OPC-сервера и
    использованию "Вставить-Все переменные и группы".

  2. #2

    По умолчанию

    Править ОРС группы и теги нельзя. Поэтому нужно искать способы работы в дереве объектов.
    Например если вы меняете структуру дерева системы, то можно вырезать дерево объектов в буфер, а после правки дерева - вставить из буфера. Появится окно восстановления внешних связей, где можно будет исправить не найденные связи.
    Также можно рассмотреть использование сервиса внешних связей.
    Спасибо.

  3. #3
    Пользователь
    Регистрация
    04.11.2013
    Адрес
    Минск, Беларусь
    Сообщений
    26

    По умолчанию

    Возможности редактирования дерева Объектов и использования сервиса внешних связей понятны, но вопрос не про них, а о дереве Системы.

    Цитата Сообщение от SCADAMaster Посмотреть сообщение
    Править ОРС группы и теги нельзя.
    Печаль
    Ставить крест на больших проектах в MasterSCADA?

  4. #4

    По умолчанию

    Пока что это никому не мешало.
    Мы для этого и делали экспорт-импорт во внешних связях - чтобы можно было быстро исправлять связи с деревом системы. Поэтому почему вам хочется лезть в дерево системы нам непонятно - меняя пути и порождая несоответствия со структурой ОРС вы его просто запутаете так, что потом сами не разберетесь.
    Спасибо.

  5. #5
    Пользователь
    Регистрация
    04.11.2013
    Адрес
    Минск, Беларусь
    Сообщений
    26

    По умолчанию

    Цитата Сообщение от SCADAMaster Посмотреть сообщение
    Пока что это никому не мешало.
    Сомневаюсь.
    Рад за тех, кому не мешает.

    Цитата Сообщение от SCADAMaster Посмотреть сообщение
    ... почему вам хочется лезть в дерево системы нам непонятно ...
    Потому-что
    В результате, когда в процессе разработки системы надо изменить структуру OPC-переменных или
    дублировать объект (у которого может быть несколько сотен OPC-переменных),
    приходится в дереве Системы проекта MasterSCADA заново поэлементно создавать всю структуру OPC-переменных.

    Это трудоемко и чревато ошибками.

    При этом совместная работа над проектом дерева Системы в части OPC-переменных может быть организована только последовательно,
    неудобно изменение работающих проектов под меняющиеся требования, ограничиваются возможности развития проектов и вообще типизации проектов.
    Цитата Сообщение от SCADAMaster Посмотреть сообщение
    ...меняя пути и порождая несоответствия со структурой ОРС вы его просто запутаете так, что потом сами не разберетесь.
    Не выстраивая структуру OPC-переменных, действительно просто запутаться.
    Отсюда и возник исходный вопрос.

  6. #6

    По умолчанию

    Цитата Сообщение от Alexander S Посмотреть сообщение
    В результате, когда в процессе разработки системы надо изменить структуру OPC-переменных или дублировать объект (у которого может быть несколько сотен OPC-переменных), приходится в дереве Системы проекта MasterSCADA заново поэлементно создавать всю структуру OPC-переменных.

    Это трудоемко и чревато ошибками.
    Цитата Сообщение от Alexander S Посмотреть сообщение
    Есть какие-нибудь инструменты для копирования и редактирования групп OPC-переменных MasterSCADA? Или инструменты экспорта-импорта ветки дерева Системы с OPC-сервером в общепринятый формат для редактирования?
    Допустим будет инструмент который позволил бы выполнить экспорт-импорт группы ОРС переменных. А что дальше?
    Все равно их нужно будет создавать в ОРС сервере, и при импорте указывать какая переменная какой реальной ОРС переменной будет соотносится. При этом может получится так что структура будет полностью отличаться от ОРС что приведет к путанице. И опять таки - в чем отличие от простой вставки переменных и групп? И если изменится структура дерева системы, то как расставлять связи?

    Может вы лучше опишите пошагово конкретный сценарий который вы хотите сделать, проблемы которые сейчас при этом возникают, и как вы видите решение этих проблем?
    Спасибо.

  7. #7
    Пользователь
    Регистрация
    04.11.2013
    Адрес
    Минск, Беларусь
    Сообщений
    26

    По умолчанию

    Цитата Сообщение от SCADAMaster Посмотреть сообщение
    ...может получится так что структура будет полностью отличаться от ОРС что приведет к путанице...
    К путанице не приведет, когда исходная структура параметров "плоская" (одноуровневая), т.е. ее фактически нет, а параметров много (несколько сотен, представьте как они выглядят в MasterSCADA в дереве Системы). В этом случае введение структуры облегчает понимание и упрощает работу с параметрами.

    Цитата Сообщение от SCADAMaster Посмотреть сообщение
    ...опишите пошагово конкретный сценарий который вы хотите сделать...
    Есть проект в котором есть Объект1. Отлажен. Работает.
    Необходимо в в проект внести изменение - добавить точно такой-же, но уже Объект2.

    Прежде чем делать в проекте MasterSCADA копирование объекта (в дереве Объектов) и использовать сервис внешних связей, необходимо, чтобы в
    дереве Системы уже были созданы OPC-переменные нового Объекта2.

    Сначала в перечне тегов программы OPC-сервера создается копия параметров исходного объекта, они отличаются полем адреса.

    Например, имена тегов Объекта1 вида:
    K03:PLC_LINK
    K03:diVT_TIME_PUSK

    а для Объекта2:
    K04:PLC_LINK
    K04:diVT_TIME_PUSK

    В MasterSCADA в дереве Системы OPC-параметры Объекта1 имеют полные имена вида:
    OP1.OPC.PLC1.Контроль.K03:PLC_LINK
    OP1.OPC.PLC1.Управление.Параметры.ПриПуске.K03:diV T_TIME_PUSK

    а для Объекта2 они будут иметь (должны получить) имя вида:
    OP1.OPC.PLC2.Контроль.K04:PLC_LINK
    OP1.OPC.PLC2.Управление.Параметры.ПриПуске.K04:diV T_TIME_PUSK

    где
    OP1.OPC - компьютер и подключенный OPC-сервер,
    PLC1 и PLC2 - созданная в дереве Системы иерархия групп OPC-параметров Объекта1 и Объекта2,

    а сами группы:
    PLC1.Контроль
    PLC1.Управление.Параметры.ПриПуске
    PLC2.Контроль
    PLC2.Управление.Параметры.ПриПуске

    Для начала хотелось бы в MasterSCADA иметь возможность сделать копию структуры OPC-параметров исходного объекта (PLC1 в PLC2) и
    изменить адресную часть в имени тега (K03 на K04).

    Сейчас такое копирование и редактирование невозможно.

  8. #8

    По умолчанию

    Кстати,да.Alexander S прав. вовсяких западных скадах такое возможно. PcVue например французкая

  9. #9
    Пользователь
    Регистрация
    04.11.2013
    Адрес
    Минск, Беларусь
    Сообщений
    26

    По умолчанию "Спасение утопающих - дело рук самих утопающих." (с) Ильф и Петров

    В завершение темы. Для MasterSCADA нашел следующее:
    - скрипт "Группировка OPC переменных" в библиотеке палитры MasterSCADA,
    - скрипт добавления тегов в OPC http://www.owen.ru/forum/showthread.php?t=20731,
    - скрипт создания списка сообщений http://www.owen.ru/forum/showthread....11806&page=198,
    - скрипт изменения пути к OPC-серверу http://www.owen.ru/forum/showthread.php?t=18107.

    На их основе написаны 2 скрипта для MasterSCADA - экспорт в файл и импорт из файла групп OPC-переменных проекта (включая подгруппы).

    При копировании структуры OPC-переменных файл импорта делается из файла экспорта изменением полей "наименование" и "ID" OPC-переменных.
    Для редактирования файлов можно использовать Excel.

    Скрипты работают в MasterSCADA текущей версии 3.6.
    Код скрипта экспорта:
    PHP код:
    /*
    Копирование группы OPC-переменных с вложенными подгруппами
    из проекта MasterSCADA в файл

    OPC-сервер указывается в
        var OPCitem = ...
    Группа указывается в
           var group = ...
    Путь сохранения файла указывается в
        const string filename = ...

    Работает в DT: для выполнения нажмите на кнопку DoAction
    */

    using System;
    using System.IO;
    using System.Text;
    //using System.Linq;
    //using System.Collections.Generic;
    //using System.Windows.Forms;

    //using FB;
    using MasterSCADA.Hlp;
    using MasterSCADALib;
    using MasterSCADA.Script.FB;
    //using MasterSCADA.Documents;

    public partial class ФБ ScriptBase
    {    
        
    //указываем файл
        
    const string filename = @"C:\test1.csv";

        public 
    override void DoAction()
        {
            
    StreamWriter writeFile = new StreamWriter(filenamefalse
                                        
    Encoding.GetEncoding("windows-1251"));

            
    //указываем OPC-сервер
            
    var OPCitem HostFB.TreeItemHlp.Project.SystemTreeRootItem.
                                
    Childs[0].TreeItemHlp.        //компьютер
                                
    Childs[0].TreeItemHlp;        //OPC-сервер
            
    var OPC = (IOPCControl)OPCitem.FBObject;

            
    Message("OPC: " OPCitem.FullName);
            
    int idxOPCnameEnd OPCitem.FullName.Length 1;

            
    //указываем группу для копирования
               
    var group OPCitem.Childs[2].TreeItemHlp    //група уровня 1
    //                    .Childs[1].TreeItemHlp            //подгрупа уровня 2
    //                       .Childs[0].TreeItemHlp            //подгрупа уровня 3 ...
                        
    ;
            
    Message("Group: " group.DisplayName);
            
               
    //собственно копирование
            
    group.NavigateChilds(delegate(ITreeObjectHlp item)
                {
                    var 
    item2 item as ITreePinHlp;
                    
                    
    //полное наименование OPC-переменной
                    
    string itemName item2.FullName.Substring(idxOPCnameEnd);
                    
    Message(itemName);
                    if (
    itemName.EndsWith("$")) return true;

                    
    //ID переменной в OPC-сервере
                    
    string itemID OPC.GetItemID(itemName);

                    
    //тип OPC-переменной
                    
    int itemType OPC.GetItemValueType(itemName);
    //              int itemType = item2.NativeValueType;
                    // =2 - int16
                    // =3 - int32
                    // =4 - float32
                    // =11 - bool
                    
                    //режим доступа к OPC-перемееной
                    
    int itemMode OPC.GetItemMode(itemName);
                    
    // =0    - read
                    // =1    - write
                    // =2    - read+write

                    
    writeFile.WriteLine(string.Format("{0};{1};{2};{3}"
                                    
    itemName,
                                    
    itemID,
                                    
    itemType.ToString(),
                                    
    itemMode.ToString()));
                    return 
    true;
                },
                
    TreeItemMask.Variablefalse);

               
    writeFile.Close();
        }

    Код скрипта импорта:
    PHP код:
    /*
    Вставка групп OPC-переменных с вложенными подгруппами
    из файла в проект MasterSCADA

    Путь к файлу указывается в
        const string filename = ...
    OPC-сервер указывается в
        var OPCitem = ...

    Работает в DT: для выполнения нажмите на кнопку DoAction
    */

    using System;
    using System.IO;
    using System.Text;
    //using System.Linq;
    //using System.Collections.Generic;
    //using System.Windows.Forms;

    //using FB;
    using MasterSCADA.Hlp;
    using MasterSCADALib;
    using MasterSCADA.Script.FB;
    //using MasterSCADA.Documents;

    public partial class ФБ ScriptBase
    {    
        const 
    char sep '.';    //символ разделителя наименований групп и переменных
        
        //указываем файл
        
    const string filename = @"C:\test2.csv";
        
        public 
    override void DoAction()
        {
            
    StreamReader readFile = new StreamReader(filenameEncoding.GetEncoding("windows-1251"));

            
    //указываем OPC-сервер
            
    var OPCitem HostFB.TreeItemHlp.Project.SystemTreeRootItem.
                                
    Childs[0].TreeItemHlp.        //компьютер
                                
    Childs[0].TreeItemHlp;        //OPC-сервер
            
    var OPC = (IOPCControl)OPCitem.FBObject;

            
    Message(OPCitem.FullName);

            
    OPC.LockRefresh(true);               

            
    //добавляются новые группы и переменные
            
    while(!readFile.EndOfStream)
            {
                
    string str readFile.ReadLine();
                
    Message(str);

                
    string[] parts str.Split(';');
                  if (
    parts.Length != 4)
                  {
                      
    Message("Ошибка 01: Неправильный формат строки");
                      continue; 
    //не разбирать
                  
    }

                
    int itemType Int32.Parse(parts[2]);
                
    int itemMode Int32.Parse(parts[3]);

                   
    string[] subs parts[0].Split(sep);                    
                
    string path string.Empty;

                
    //добавление несуществующих групп                    
                
    for (int j=0j<subs.Length-1j++)
                {                              
    //                Message(subs[j] + " path=" + path);
                    
                    
    if (OPCitem.HasChild(path subs[j])==false)
                    {    
                         if (
    path==string.Empty)
                         {
                             
    OPC.AddGroup(pathsubs[j]);
                         }
                           else
                           {    
    // используется path без заключительного sep
                               
    OPC.AddGroup(path.Remove(path.Length-1,1), subs[j]);
                           }

                           
    OPC.LockRefresh(false);
                           
    OPC.LockRefresh(true);
                    }
                    
    path path subs[j] + sep;                        
                }

                
    //вставка OPC-переменной в группу 
                  
    OPC.AddItemToGroupEx(
                      
    subs[subs.Length-1],                // Item
                      
    path.Remove(path.Length-1,1),        // Group
                      
    "",                                    // AccessPath
                      
    parts[1],                            // ItemID
                      
    false                                // checkExistence
                      
    );

                
    //полное наименование OPC-переменной
                
    var itemName path subs[subs.Length-1];

                
    //тип OPC-переменной
                
    OPC.SetItemValueType(itemNameitemType);
                
    //режим доступа к OPC-переменной
                
    OPC.SetItemMode(itemNameitemMode);
            }

            
    OPC.LockRefresh(false);
            
    OPCitem.ApplyChange();       

               
    readFile.Close();
        }

    Во вложении тест-проект со скриптами и примеры файлов экспорта-импорта.

    Что скрипты не делают или делают неправильно:
    - не сохраняется относительное положение в группе переменных и входящих подгрупп (подгруппы становятся выше переменных),
    решение - исправить вручную в MasterSCADA или сразу придерживаться соответствующего взаимного расположения подгрупп и переменных;
    - неправильно формируются группы для массивов OPC-переменных,
    решение - пересоздать массивы вручную в MasterSCADA.

    Совет. Делайте резервное копирование проекта MasterSCADA при использовании скриптов и copy/paste больших объектов.

    Пользоваться тому, кто понимает, что делает и зачем.

    Всем спасибо.
    Вложения Вложения

Похожие темы

  1. Ответов: 13
    Последнее сообщение: 10.02.2019, 20:05
  2. masterscada и opc hda ce303
    от Dmitrijb в разделе Master SCADA 3
    Ответов: 10
    Последнее сообщение: 23.07.2015, 22:06
  3. OPC INSAT+MasterScada V3.6
    от colorprint2008 в разделе Сетевые технологии
    Ответов: 10
    Последнее сообщение: 03.01.2014, 14:32
  4. МВА-8 + OPC + MasterSCADA
    от Иван__ в разделе Master SCADA 3
    Ответов: 4
    Последнее сообщение: 24.03.2008, 20:56

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •