Скорость работы с 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>