ОРС, списки

Общие вопросы по оборудованию и программному обеспечению Компании ДЭП
Svale
Сообщения: 62
Зарегистрирован: 23 дек 2004, 11:58
Откуда: Мурманск

Сообщение Svale » 14 фев 2005, 17:04

Нужно в АРМе построить список сработавших сигнализаций.
В модели есть список на элементы wdDInFail. Как в АРМе обратиться к этому списку, чтобы проверить состояние сигнализаций.

Тех. поддержка
Сообщения: 465
Зарегистрирован: 18 ноя 2004, 17:45
Откуда: Компания ДЭП
Контактная информация:

Сообщение Тех. поддержка » 15 фев 2005, 17:04

Создать "пользовательские привязки" на элементы списка.
С уважением
Компания ДЭП
Москва, Голубинская ул., 10
+7 (495) 995-00-12

Svale
Сообщения: 62
Зарегистрирован: 23 дек 2004, 11:58
Откуда: Мурманск

Сообщение Svale » 15 фев 2005, 17:34

Евгений, а если элементов списка много? нельзя ли сделать привязку не на каждый элемент в отдельности а на весь список в целом? (и далее в цикле выбрать сигналы с нужным состоянием)

Тех. поддержка
Сообщения: 465
Зарегистрирован: 18 ноя 2004, 17:45
Откуда: Компания ДЭП
Контактная информация:

Сообщение Тех. поддержка » 15 фев 2005, 18:16

У пользовательской привязки можно динамически менять OPCName, после смены происходит Reconnect. Если знать колличество элементов то можно весь массив пробегать.
Последний раз редактировалось Тех. поддержка 16 фев 2005, 12:01, всего редактировалось 1 раз.
С уважением

Компания ДЭП

Москва, Голубинская ул., 10

+7 (495) 995-00-12

Гость

Сообщение Гость » 16 фев 2005, 09:13

Евгений, можно ли в какой-либо массив получить список имеющихся имен OPCName? Насколько длительна операция Reconnect? т.е. если пробегать 1000-2000 сигналов система не "притормозит"?

Евгений, мне все-таки не совсем понятно: тип КП содержит тип Fail - групповая сигнализация кп. Я так понимаю, что модель пробегает по имеющемуся в нем списку параметров (у меня они типа wdDInFail) и если находит сработавшую сигнализацию выс тавляет Fail. Почему из программы АРМа также нельзя обратиться к этому списку (спискам), пробежать по нему и взять сработавшие сигналы?

Тех. поддержка
Сообщения: 465
Зарегистрирован: 18 ноя 2004, 17:45
Откуда: Компания ДЭП
Контактная информация:

Сообщение Тех. поддержка » 16 фев 2005, 18:09

Пример класса, который получает список имен и создает на них пользовательские привязки. Вставьте в код и создайте объект класса А. В конструктор класса передается указатель на объект TdepOPCDesigner вашей формы.

class A
{
TdepOPCDesigner* Des;
TdepUserItem* Root; // Соотвествует списку в модели
TList* Items; // Список элементов списка в модели

void __fastcall depUserItemChange(TObject *Sender,
AnsiString AFullNameItem, Variant Value, TdepOPCQuality Quality)
{
//
}
void __fastcall depUserItemConnected(TObject *Sender,
AnsiString AFullNameItem, bool AConnected)
{
TStringList* s1 = new TStringList;*s2 = new TStringList;
if (Sender==Root)
{
if (AConnected)
// Root соединился(то есть установлено соединение с сервером
// и в сервере есть элемент с именем Root->OPCName)
{
// Получаем список имен, содержащихся в Root
Des->GetNames(NULL,Root->OPCName,s1,true,true);
// Получаем список полных OPC имен, содержащихся в Root
Des->GetItemsIDs(NULL,Root->OPCName,s1,s2);
for(int i=0;i<s2->Count;i++)
{
TdepUserItem* u = Des->AddNewUserItem();
Items->Add(u);
u->OnItemChange = depUserItemChange;
u->OnItemConnected = depUserItemConnected;
u->OPCName = s2->Strings[i];
}
} else {
// При отсоединении освобождаем список, потому что
// в следующий раз он может быть другим
for(int i=0;i<Items->Count;i++)
delete (TdepUserItem*)Items[i];
Items->Clear();
}
}
delete s1;
delete s2;
}

A(TdepOPCDesigner* d)
{
Des = d;
Items = new TList;
Root = Des->AddNewUserItem();
Root->OnItemChange = depUserItemChange;
Root->OnItemConnected = depUserItemConnected;
Root->OPCName = "Item\\..\\List"; // Полное OPC имя списка элементов
}
~A()
{
// Root удалять не обязательно, так как
// Des сам его удалит
for(int i=0;i<Items->Count;i++)
delete (TdepUserItem*)Items[i];
delete Items;
}
};
С уважением

Компания ДЭП

Москва, Голубинская ул., 10

+7 (495) 995-00-12

Svale
Сообщения: 62
Зарегистрирован: 23 дек 2004, 11:58
Откуда: Мурманск

Сообщение Svale » 17 фев 2005, 09:39

При компиляции:
"GetNames" is not a member of "TdepOPCDesigner",
"GetItemsIDs" is not a member of "TdepOPCDesigner".

Тех. поддержка
Сообщения: 465
Зарегистрирован: 18 ноя 2004, 17:45
Откуда: Компания ДЭП
Контактная информация:

Сообщение Тех. поддержка » 17 фев 2005, 16:27

Вам нужна последняя версия компонентов
( www.dep.ru/downloads/pub/OPCComponents2.1.0.1.rar )
С уважением

Компания ДЭП

Москва, Голубинская ул., 10

+7 (495) 995-00-12

Svale
Сообщения: 62
Зарегистрирован: 23 дек 2004, 11:58
Откуда: Мурманск

Сообщение Svale » 19 фев 2005, 12:02

Cannot cast from "TList" to "TDepUserItem *"
Возникает на освобождении списка.

Евгений, если возможно не могли бы Вы привести пример использования данного класса.

P.S. К сожалению мои знания Си пока не позволяют свободно обращаться с классами.

Тех. поддержка
Сообщения: 465
Зарегистрирован: 18 ноя 2004, 17:45
Откуда: Компания ДЭП
Контактная информация:

Сообщение Тех. поддержка » 28 фев 2005, 17:32

Небольшое исправление в самом классе. Также в файле где описан данный класс должен быть подключен "depOPCdesigner.h".

Далее в коде пишите A* qqq = new A(depOPCdesigner);
qqq-> .......


class A
{
public:
TdepOPCDesigner* Des;
TdepUserItem* Root; // Соотвествует списку в модели
TList* Items; // Список элементов списка в модели

void __fastcall depUserItemChange(TObject *Sender,
AnsiString AFullNameItem, Variant Value, TdepOPCQuality Quality)
{
//
}
void __fastcall depUserItemConnected(TObject *Sender,
AnsiString AFullNameItem, bool AConnected)
{
TStringList* s1 = new TStringList,*s2 = new TStringList;
if (Sender==Root)
{
if (AConnected)
// Root соединился(то есть установлено соединение с сервером
// и в сервере есть элемент с именем Root->OPCName)
{
// Получаем список имен, содержащихся в Root
Des->GetNames(NULL,Root->OPCName,s1,true,true);
// Получаем список полных OPC имен, содержащихся в Root
Des->GetItemsIDs(NULL,Root->OPCName,s1,s2);
for(int i=0;i<s2->Count;i++)
{
TdepUserItem* u = Des->AddNewUserItem();
Items->Add(u);
u->OnItemChange = depUserItemChange;
u->OnItemConnected = depUserItemConnected;
u->OPCName = s2->Strings[i];
}
} else {
// При отсоединении освобождаем список, потому что
// в следующий раз он может быть другим
for(int i=0;i<Items->Count;i++)
delete (TdepUserItem*)Items->Items[i];
Items->Clear();
}
}
delete s1;
delete s2;
}

A(TdepOPCDesigner* d)
{
Des = d;
Items = new TList;
Root = Des->AddNewUserItem();
Root->OnItemChange = depUserItemChange;
Root->OnItemConnected = depUserItemConnected;
Root->OPCName = "Item\\..\\List"; // Полное OPC имя списка элементов
}
~A()
{
// Root удалять не обязательно, так как
// Des сам его удалит
for(int i=0;i<Items->Count;i++)
delete (TdepUserItem*)Items->Items[i];
delete Items;
}
};
С уважением

Компания ДЭП

Москва, Голубинская ул., 10

+7 (495) 995-00-12

Svale
Сообщения: 62
Зарегистрирован: 23 дек 2004, 11:58
Откуда: Мурманск

Сообщение Svale » 02 мар 2005, 17:51

Евгений, класс заработал. Только не совсем так, как хотелось бы.
Строка:
Root->OPCName = "Item\\..\\List";

Если в Name подставить тип группы ("KP1") - возвращается список элементов типа,
если групповую тревогу ("KP1\\Fail") - длина списка = 2 (List и Control),
а если собственно список ("KP1\\Fail\\List") - длина списка = 0,

т.е. к списку обратиться не удалось.

Евгений, что я делаю не так?

Тех. поддержка
Сообщения: 465
Зарегистрирован: 18 ноя 2004, 17:45
Откуда: Компания ДЭП
Контактная информация:

Сообщение Тех. поддержка » 03 мар 2005, 16:52

А если OPC проводником посмотреть элемент "KP1\\Fail\\List", у него есть дочерние элементы ?
С уважением

Компания ДЭП

Москва, Голубинская ул., 10

+7 (495) 995-00-12

Svale
Сообщения: 62
Зарегистрирован: 23 дек 2004, 11:58
Откуда: Мурманск

Сообщение Svale » 04 мар 2005, 08:52

Да, в списке 62 элемента типа wdDInFail.
Если скажете куда, скину картинки с экранов Модели и ОРС проводника.

Тех. поддержка
Сообщения: 465
Зарегистрирован: 18 ноя 2004, 17:45
Откуда: Компания ДЭП
Контактная информация:

Сообщение Тех. поддержка » 04 мар 2005, 11:12

Пришлите на mail@dep.ru исходники модели.
Ну можно и проект билдера если не сложно, я посмотрю.
С уважением

Компания ДЭП

Москва, Голубинская ул., 10

+7 (495) 995-00-12

Svale
Сообщения: 62
Зарегистрирован: 23 дек 2004, 11:58
Откуда: Мурманск

Сообщение Svale » 04 мар 2005, 15:33

Отправил