Нужно в АРМе построить список сработавших сигнализаций.
В модели есть список на элементы wdDInFail. Как в АРМе обратиться к этому списку, чтобы проверить состояние сигнализаций.
ОРС, списки
-
- Сообщения: 465
- Зарегистрирован: 18 ноя 2004, 17:45
- Откуда: Компания ДЭП
- Контактная информация:
-
- Сообщения: 465
- Зарегистрирован: 18 ноя 2004, 17:45
- Откуда: Компания ДЭП
- Контактная информация:
У пользовательской привязки можно динамически менять OPCName, после смены происходит Reconnect. Если знать колличество элементов то можно весь массив пробегать.
Последний раз редактировалось Тех. поддержка 16 фев 2005, 12:01, всего редактировалось 1 раз.
С уважением
Компания ДЭП
Москва, Голубинская ул., 10
+7 (495) 995-00-12
Компания ДЭП
Москва, Голубинская ул., 10
+7 (495) 995-00-12
Евгений, можно ли в какой-либо массив получить список имеющихся имен OPCName? Насколько длительна операция Reconnect? т.е. если пробегать 1000-2000 сигналов система не "притормозит"?
Евгений, мне все-таки не совсем понятно: тип КП содержит тип Fail - групповая сигнализация кп. Я так понимаю, что модель пробегает по имеющемуся в нем списку параметров (у меня они типа wdDInFail) и если находит сработавшую сигнализацию выс тавляет Fail. Почему из программы АРМа также нельзя обратиться к этому списку (спискам), пробежать по нему и взять сработавшие сигналы?
Евгений, мне все-таки не совсем понятно: тип КП содержит тип Fail - групповая сигнализация кп. Я так понимаю, что модель пробегает по имеющемуся в нем списку параметров (у меня они типа wdDInFail) и если находит сработавшую сигнализацию выс тавляет Fail. Почему из программы АРМа также нельзя обратиться к этому списку (спискам), пробежать по нему и взять сработавшие сигналы?
-
- Сообщения: 465
- Зарегистрирован: 18 ноя 2004, 17:45
- Откуда: Компания ДЭП
- Контактная информация:
Пример класса, который получает список имен и создает на них пользовательские привязки. Вставьте в код и создайте объект класса А. В конструктор класса передается указатель на объект 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;
}
};
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
Компания ДЭП
Москва, Голубинская ул., 10
+7 (495) 995-00-12
-
- Сообщения: 465
- Зарегистрирован: 18 ноя 2004, 17:45
- Откуда: Компания ДЭП
- Контактная информация:
Вам нужна последняя версия компонентов
( www.dep.ru/downloads/pub/OPCComponents2.1.0.1.rar )
( www.dep.ru/downloads/pub/OPCComponents2.1.0.1.rar )
С уважением
Компания ДЭП
Москва, Голубинская ул., 10
+7 (495) 995-00-12
Компания ДЭП
Москва, Голубинская ул., 10
+7 (495) 995-00-12
-
- Сообщения: 465
- Зарегистрирован: 18 ноя 2004, 17:45
- Откуда: Компания ДЭП
- Контактная информация:
Небольшое исправление в самом классе. Также в файле где описан данный класс должен быть подключен "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;
}
};
Далее в коде пишите 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
Компания ДЭП
Москва, Голубинская ул., 10
+7 (495) 995-00-12
Евгений, класс заработал. Только не совсем так, как хотелось бы.
Строка:
Root->OPCName = "Item\\..\\List";
Если в Name подставить тип группы ("KP1") - возвращается список элементов типа,
если групповую тревогу ("KP1\\Fail") - длина списка = 2 (List и Control),
а если собственно список ("KP1\\Fail\\List") - длина списка = 0,
т.е. к списку обратиться не удалось.
Евгений, что я делаю не так?
Строка:
Root->OPCName = "Item\\..\\List";
Если в Name подставить тип группы ("KP1") - возвращается список элементов типа,
если групповую тревогу ("KP1\\Fail") - длина списка = 2 (List и Control),
а если собственно список ("KP1\\Fail\\List") - длина списка = 0,
т.е. к списку обратиться не удалось.
Евгений, что я делаю не так?
-
- Сообщения: 465
- Зарегистрирован: 18 ноя 2004, 17:45
- Откуда: Компания ДЭП
- Контактная информация:
-
- Сообщения: 465
- Зарегистрирован: 18 ноя 2004, 17:45
- Откуда: Компания ДЭП
- Контактная информация:
Пришлите на mail@dep.ru исходники модели.
Ну можно и проект билдера если не сложно, я посмотрю.
Ну можно и проект билдера если не сложно, я посмотрю.
С уважением
Компания ДЭП
Москва, Голубинская ул., 10
+7 (495) 995-00-12
Компания ДЭП
Москва, Голубинская ул., 10
+7 (495) 995-00-12