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

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

Древовидный режим

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #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, 13:32
  4. МВА-8 + OPC + MasterSCADA
    от Иван__ в разделе Master SCADA 3
    Ответов: 4
    Последнее сообщение: 24.03.2008, 20:56

Ваши права

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