Скорость работы с User Archive WIN CC
5.1
Владимир; 11.10.04
Необходимо организовать архивирование данных, порядка 120000
записей в неделю, данные типа string.
Архив No Communication, записи добавляем скриптом, скорость доходит
временами до 5-6 записей в секунду.
Проблема в том, что запись иедт очень медленно. Но если открыть
User Archive из дерева проекта, или в проекте вызвать User Archive
Table Control, скорость записи увеличивается в несколько раз. В
свойствах проекта на вкладке StartUp приложение CCUsrAcv.exe
указано как загружаемое до старта проекта.
Подскажите, кто сталкивался с такой же ситуацией, что можно сделать
? или вообще отказаться от User Archive м вести запись какими-то
другими способами ?
Re: Скорость работы с User Archive WIN CC
5.1
Макс Прилепский; 11.10.04
User Archive в версии 5.х работает весьма криво. Например, у нас
для версии 5.х существовует практика хранения архивируемых данных
различного характера (в основном, протоколы различных стадий и
операций технологического процесса)в конфигурационной БД проекта.
Запись и чтение данных организованы в проекте WinCC средствами ODK,
штамп времени записи формирует PLC в формате UTC. Далее эти архивы,
необходимые для верхнего уровня, со станций с помощью специально
написанной службы, установленной на верхнем уровне периодически
перекачиваются на верхний уровень и там уже публикуются в виде
web-форм, которые можно отображать на станциях WinCC. Эта же служба
удаляет устаревшие данные из БД станций. БД между станциями не
синхронизируются. Надёжность обеспечивается двумя параллельно
работающими станциями. Если же связи с верхним уровнем не
предусматривается, то следить за количеством записей в архиве и
удалять лишние можно также либо средствами ODK, либо использовать в
С-action объекты, например, ADO. Ниже приведу небольшой пример
использования ADO для чтения данных из таблицы конфигурационной БД
проекта:
BOOL ADOReadTable()
/* объекты объявляются как глобальные переменные вне тела функции
*/
__object *ADO_Conn,*ADO_RSet;
{
char Field1 [100];
char Field2 [100];
if(ADO_RSet!=NULL)
{
__object_delete(ADO_RSet);
ADO_RSet=NULL;
}
if(ADO_Conn!=NULL)
{
__object_delete(ADO_Conn);
ADO_Conn=NULL;
}
ADO_Conn=__object_create("ADODB.Connection");
if(ADO_Conn==NULL)
return FALSE;
ADO_Conn->Open(<Сюда передаётся DSN-имя , полученное ,
например с помощью функции DMGetProjectInformation>);
/* Выполняем запрос из таблицы Glossary конфигурационной БД проекта
*/
ADO_RSet=ADO_Conn->Execute("select * from dba.Glossary order by
M_Code asc",NULL,0x1);
if(ADO_RSet==NULL)
{
ADO_Conn->Close();
__object_delete(ADO_Conn);
return FALSE;
}
ADO_RSet->MoveFirst();
/* Здесь идёт получение строковых полей записей */
while ((!ADO_RSet->eof))
{
strcpy(Field1,ADO_RSet->Fields->Item("DB_Field_1")->value);
strcpy(Field2,ADO_RSet->Fields->Item("DB_Field_2")->value);
и т.п.
ADO_RSet->MoveNext();
}
ADO_RSet->Close();
__object_delete(ADO_RSet);
ADO_RSet=NULL;
ADO_Conn->Close();
__object_delete(ADO_Conn);
ADO_Conn=NULL;
return TRUE;
}<<br>