PDA

Просмотр полной версии : MasterSCADA и структура OPC-переменных



Alexander S
02.09.2015, 12:29
В MasterSCADA в дереве Системы у OPC-сервера можно структурировать данные - создавать группы OPC-переменных.

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

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

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

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

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

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

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

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

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


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

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

Alexander S
02.09.2015, 17:07
Пока что это никому не мешало.Сомневаюсь.
Рад за тех, кому не мешает.


... почему вам хочется лезть в дерево системы нам непонятно ...Потому-что


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

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

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


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

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

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




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

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

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

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


...опишите пошагово конкретный сценарий который вы хотите сделать...
Есть проект в котором есть Объект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).

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

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

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

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

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

Скрипты работают в MasterSCADA текущей версии 3.6.


/*
Копирование группы 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(filename, false,
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.Variable, false);

writeFile.Close();
}
}

/*
Вставка групп 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(filename, Encoding.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=0; j<subs.Length-1; j++)
{
// Message(subs[j] + " path=" + path);

if (OPCitem.HasChild(path + subs[j])==false)
{
if (path==string.Empty)
{
OPC.AddGroup(path, subs[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(itemName, itemType);
//режим доступа к OPC-переменной
OPC.SetItemMode(itemName, itemMode);
}

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

readFile.Close();
}
}
Во вложении тест-проект со скриптами и примеры файлов экспорта-импорта.

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

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

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

Всем спасибо.