Экспорт Трендов
Александр Родин, ООО "Нева Электрик"; 15.3.01

Знаю, что можно экспортировать кривые из TagLogging-а в файл формата Excel. Но вот каким образом ?


В Customer Support лежит проектик, в котором данная функция применяется. Но немцы его за так отдавать не хотят. Причем не понятно, толи денег надо (но кому ?), то ли что-то еще.

Очень бы хотелось все-таки узнать, как этот самый экспорт можно выполнить ?

Заранее спасибо.


Re: Экспорт Трендов
Чистяков Дмитрий ОАО СеверСталь; 16.3.01

Это требуется купить Simatic Card.

Более подробно см. http://www.siemens.ru/ad/as/ru/support/s-card.htm
Re: Экспорт Трендов
Никаноров В. - Сименс; 16.3.01

Этот проект можно загрузить при помощи Simatic Card.

Он также будет содержаться на новом диске WinCC5 SP2.
Re: Экспорт Трендов
Alexis; 21.3.01

Александр, если необходимо экспортировать данные из архивов, то чем Вас не устраивает функция TLGBackup? Она может сохранить архив в csv-формате.

Re: Экспорт Трендов
Александр Родин, ООО "Нева Электрик"; 23.3.01

Функция может быть и устраивает, но тогда следующие вопросы:


1. Где можно найти спецификацию на данную функцию ?

2. Какие приложения способны читать формат csv и возможно ли построение графических трендов в этих приложениях ?

Заранее спасибо.
Re: Экспорт Трендов
Alexis; 24.3.01

Описание функции есть в ОДК, если надо то на мыло кину. Правда написано что она только в CSV сохраняет (хотя может это у меня ОДК древний :), но в файле pdertdef.h указывается еще форматы Format DBASE III, Format DIF, Format FoxPro, Format Lotus 123... но их я не пробовал.

А вот так функция сохраняет в CSV:
2001-03-24 10:12:33.052000,0,528384
2001-03-24 10:12:34.053000,0,528384
дата+время , значение , и еще что-то
а CSV и Excel-ем читается...
Re: Экспорт Трендов
Александр Родин, ООО "Нева Электрик"; 25.3.01

Спасибо за информацию.


На самом-то деле было бы интересно как сам по себе вызов функции делается. И если она требует ODK, то где его взять и сколько он будет стоить.

Просто есть уже готовый проект, использующий из опций только Basic Process Control. В нем требуется периодически сохранять накопленные тренды в какое-нибудь место на диске. Для этого написан скрипт, который напрямую копирует файлы архивов. Для копирования используются функции WinAPI. Первый и, иногда, второй вызов этого скрипта происходит нормально. Последующие вызовы вешают Run Time. Вот и пытаюсь найти альтернативные способы.

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

Поэтому буду рад любой помощи.
Заранее спасибо.

Re: Экспорт Трендов
Alexis; 26.3.01

А что за функции используются в том проекте?


А ОДК - это хелп + либы с хедерами для MSVC++. Оказывается это стоит 2500 евро.... В принципе, из состава ОДК интересен только хелп, где содержится описание большинства функций из WinCC-евых dll-ек. Вот... А прототипы функций и так описаны в хэдерах лежащих в каталоге wincc\aplib\ поэтому не вижу "криминала" в использовании внутренних wincc-евых функций в своих приложениях без купленного ОДК....
Так как TagLogging идет в составе WinCC (а не всяких там xxx Process Control) значит необходимые для работы pdertcli.dll и pdertcli.h должны всегда быть.

Ну а алгоритм работы простой:

CMN_ERROR Error;
TLGConnectA(NULL,&Error);
// далее необходимо достать имя архива используя
// BOOL WINAPI TLGEnumArchivsA(DWORD dwArchivTyp,TLG_ENUMTABLES lpfnCallback,LPVOID lpUser,PCMN_ERROR lpError);
// и прописав свою каллбачную функцию типа TLG_ENUMTABLES
// ну и получим имена архивов:
CString arhName="PDE#HD#EBS_PVA#EBSMBTTEMPOIL.FLT";
CString fileName="c:\\data\\"+arhName;
TLG_IO_BACKUP_SELECT ibs;
ibs.sysFrom=... - время от которого начинаем сброс
ibs.sysTo=... - время до куда сбрасываем
ibs.lpszSqlString=NULL;
TLGBackupA(arhName,fileName,&ibs,TLG_BACKUP_EXPORT,TLG_BAKFMT_CSV,&Error);
TLGDisConnectA(&Error);

Вот так вот я и делаю, работает... но выяснилось, что сброс данных с "работающего" архива происходит примерно в десять раз дольше, чем с "заблокированного" архива (что теоретически и правильно). Для блокировки архива используется TLGLockArchivA...
Ну вот вроде и все...

Re: Экспорт Трендов
Александр Родин, ООО "Нева Электрик"; 26.3.01



Re: Экспорт Трендов
Alexis; 26.3.01

Попробовал в настройках архива указать Action for exporting archive свой скрипт типа void archUploads(LPTSTR lpszArchiveName,LPTSTR lpszTagName,DWORD dwNumberOfRecords), дык вот только странно, она имя архива выдает, а имя архивного тэга нет.... у тебя также?

Re: Экспорт Трендов
Александр Родин, ООО "Нева Электрик"; 26.3.01

Выдает и то и другое... С этим проблем не было.

Проблема в другом.

1. Когда в проекте работает только TagLogging, т.е. нет динамической обработки графики, все пишется замечательно.

2. Если переносим этот скрипт в проект, где есть работа с графическим интерфейсом (смена кадров, обработка нажатия кнопок, вывод значения внешних тагов и т.д.) проект виснет напрочь.

Уже второй месяц бьюсь...

Попутно вопрос:
Там где было указание времени начала и конца записи в TLGBackup. В каком виде давать этот параметр ? В доках стоит тип SYSTEMTIME. Это что, получается оно в миллисекундах от какого-то нулевого времени должно высчитываться ?
И еще. Если мне надо автоматом за фиксированные промежутки писать, то откуда тогда этот параметр брать ?
Re: Экспорт Трендов
Alexis; 27.3.01

Ну то что виснет это и понятно, графика в WinCC - вещь довольно ресурсоемкая (особенно с использованием split-а). Я уже говорил, что при незаблокированном архиве экспорт данных довольно длителен... Пример - цикличный получасовой посекундный архив (в архиве 80 тэгов), сброс 15-ти минутного окна на работающем архиве происходит примерно за 10 минут :) а при заблокированном архиве сброс занимает менее минуты.... (сброс данных осуществляется внешним приложением)

Я просто уверен, что при реализации такого сброса через внутренние скрипты, GlobalScript просто подвиснет...
SYSTEMTIME согласно MSDN - это:
typedef struct _SYSTEMTIME {
WORD wYear;
WORD wMonth;
WORD wDayOfWeek;
WORD wDay;
WORD wHour;
WORD wMinute;
WORD wSecond;
WORD wMilliseconds;
} SYSTEMTIME;
Ну а взять текущее время можно GetSystemTime...
Либо используй MFC-шные классы CTime и CTimeSpan
Например:
CTime curTime=CTime::GetCurrentTime();
CTimeSpan span20min(0,0,20,0);
CTime sTime20=curTime-span20min;
TLG_IO_BACKUP_SELECT tbs;
curTime.GetAsSystemTime(tbs.sysTo);
sTime20.GetAsSystemTime(tbs.sysFrom);
- ну вот и получили временное окно за прошедшие двадцать минут.
Re: Экспорт Трендов
Никаноров В. - Сименс; 27.3.01

С использованием TlgBuckup непосредственно из GlobalScript экспорт архивов (незаблокированных) происходит очень быстро. Никаких подвисаний нет.

См. проект на CustomerSupport.
Re: Экспорт Трендов
Александр Родин, ООО "Нева Электрик"; 27.3.01

А вот такой вопрос.


Если в архиве больше одной переменной, то каллбачная функция возвращает только строку с именем последней. А как тогда получить остальные ?

Или я не так что-то понял ?...

Заранее спасибо.
Re: Экспорт Трендов
Alexis; 27.3.01

Каллбачная функция вызывается для каждой переменной, т.е. внутри нее надо либо сохранять информацию в какой-либо динамически увеличивающийся массив, либо сразу использовать полученное имя переменной.


Кстати, может кто-нибудь поделится проектом который лежит на сайте Siemens-а "The sample project "Export.exe" calls the TLGBackupA function several times." (Entry ID: 3008467 )
А то господин Никаноров говорит что "с использованием TlgBuckup непосредственно из GlobalScript экспорт архивов (незаблокированных) происходит очень быстро...." - хотелось бы проверить...
Re: Экспорт Трендов
Александр Родин, ООО "Нева Электрик"; 27.3.01

Я так и предполагал... %)


А проектом могут на самом Сименсе поделиться... Он на новом диске с WinCC будет.

В принципе, емыл в имени действующий ?.. ;)
Re: Экспорт Трендов
Alexis; 27.3.01

Мэйл действующий, за проект буду очень признателен.

А что за новый диск? в смысле WinCC 5.0 SP2?
Re: Экспорт Трендов
Александр Родин, ООО "Нева Электрик"; 27.3.01

А проектик-то так себе... Ничего нового. Все что там есть, уже обсуждено и применено... %)

Тем не менее, хвала Сименсу... :)

Про диск говорили, что это новый с WinCC 5.0 SP2.
Это который под Win2K живет.

Re: Экспорт Трендов
Alexis; 28.3.01

Спасибо за проект.

Если это тот проект, про который господин Никаноров говорил, что экспорт происходит очень быстро - дык это действительно так :) там ведь всего три архивируемых переменных...

Теоретически можно попробовать еще функцию DBExport из db.dll (набор этих DB функций позволяет достучаться до любой внутренней таблицы WinCC). Попробовал - работает, но скорость еще не оценивал.
Re: Экспорт Трендов
Александр Родин, ООО "Нева Электрик"; 28.3.01

У меня и на TLGBackup мой проект пару раз завис. Но я кажется достучался из-за чего это. Действительно скрипты. Причем ладно бы работа с файловой системой. ХА ! Зависает стабильно на операциях обработки строк. Например strcat. Особливо, если сращиваются две строки одна из которых взята с помощью GetTagChar. Выход пришел с присланным проектом (опять же, Хвала Сименсу :). Там строки кататинируются при помощи sprintf. Так что вот. Может теперь и старый вариант экспорта заработает... %)


ЗЫ: А пообщались неплохо. Максимум информации за столь короткое время. :) Не хотелось бы становиться навязчивым, но с Сименса проставка за повышенный трафик... :)