Форум TRACE MODE: техническая поддержка   
мой профиль / my profile авторизация / login | регистрация / register | поиск / search | часто задаваемые вопросы / faq | начало / forum home

  Следующая старая тема / next oldest topic   Следующая новая тема / next newest topic
» Форум TRACE MODE: техническая поддержка » ТЕХНИЧЕСКАЯ ПОДДЕРЖКА / TECHNICAL SUPPORT TRACE MODE 5 » Операторский интерфейс / HMI » Про ActiveX, интерфейсы и Trace Mode.

   
Автор / Author Тема / Topic: Про ActiveX, интерфейсы и Trace Mode.
Антон Рассказов
Junior Member / Новичок
Участник № / Member № 984


Icon 1 отправлено / posted      Профиль для / Profile for Антон Рассказов           Редактировать/удалить сообщение / Edit/Delete Post 
Здравствуйте, уважаемые участники форума!

[А-а! / Eek!]

Предлагаю вашему вниманию тему для обсуждения. Кто брался писать ActiveX при помощи предлагаемых custom-интерфейсов??? А при помощи "Новых интерфейсов для ActiveX'ов, работающих в среде РПД и др. гр. консолей"??? Ну приступим...

Немного в разнобой, уж извиняйте...

А надо то всего свой Alarm Viewer, с кое какими расширениями. Вот через что пришлось пройти...

Первое, что мне бросилось в глаза так это строка в описании дуальных интерфейсов: "3. Разработанные на основе описываемых здесь интерфейсов компоненты менее эффективны,
чем компоненты, написанные на С++ с использованием ранее опубликованных
custom-интерфейсов как по быстродействию так и по памяти".
Отлично, верю, да и это очевидно! Естественно, я сразу рванул в направлении перекопа документации на предмет описания библиотеки типов для custom-интерфейсов. Что нащёл: idl есть, пример типа тоже есть... А описание, т.е. idl выложили и пример и всё? То что по 3 строчки на метод в IDL написанно? Это называется "опубликованно"? Ладно, не впервой. Можно и поковыряться. Далее всё как в сказке, чем дальше тем страшней... Cтандартный компонент Trace Mode Alarm Viewer реализует 2 интерфейса из библиотеки в tm5proxy.dll(!), а именно: IChInfo и ItmEventClient. Однако в предлагаемом примере (Spin.dsp) нет и речи про tm5proxy.dll - все необходимые интерфейсы определенны в tmaux.idl и tmxlib.idl. Таким образом обнаруженно 3 dll, где в библиотеке типов встречается описание IChInfo: tm5proxy.dll, Tmxlib.dll и наконец tmxauxdsp.dll (видимо какая-то диспетчерская оплётка на интерфейсы?). Определение ItmEventClient удалось импортировать из DrawServ.exe. Там поболее определений интерфейсов, однако опять странности. Есть, например, определение интерфейса ItmChBrowser и ItmChBrowserEx, которые встречались нам в tmxaux.idl, но нет определения IChInfo. Проанализировав вышесказанное, я пришёл к выводу, что говорить, как в пресс релизе на TM5: "Программа имеет открытый коммуникационный интерфейс..." пока рановато. Кроме того, создалось впечатление, что Adastra, может и не преднамеренно, но всё же предпочитает умалчивать некоторую информацию, которая могла бы позволить сторонним разработчикам разрабатывать новые компоненты и расширять в полной мере возможности Trace Mode. [Мысли вслух] Консоль тревог за деньги продаётся, а теперь каждый студент сядет и свою, ни чем ни хуже сделает... [конец Мыслей вслух] Переварив всё это, было решёно писать компонент на Дельфях, чтоб всю ту кухню не разгребать. К слову говоря: Делфи уже давно, в отличии от Бейсика, позваляет реализовавать COM компоненты, на основе custom интерфейсов. Однако настойчиво рекомендуется использовать интерфейсы из rtmd.idl. Ладно начали пробовать. В нашем распоряжении целых 2 интерфейса IDtmRtmData и IDtmRtmClient. Согласно инструкции нам нафиг не нужен IDtmRtmData, т.к. значения каналов нас не интересуют, нужны только события. И так необходимо просто реализовать IDtmRtmClient и мы счастливы. Но сами знаете - не так всё просто получается на самом деле. Зачем мне нужна привязка к какому-то каналу, если мне всё равно нужна только строка события приходящая в OnAlarm? Для того чтобы на каждом цыкле пересчёта БК получать callback на onTagsValsChanged? Есть ещё один мистический метод OnRun, вызывается только у тех компонентов, которые находятся на стартовом экране. Если их нет на нём, то и ни одного вызова OnRun не происходит. Метод OnAlarm вызывается ТОЛЬКО при использовании графической консоли Net Link Lite. В РПД OnAlarm не вызывается вообще, в том числе и в "родных примерах (TmDelCtl, TmVBCtl)". Кроме того как мне узнать текущего оператора? Или быть хотя бы уведомлённым об его смене? Изучив подробнее интерфейс IDtmRtmData, я заметил следующую штуку - метод listObject действительно перечислит мне только идентификаторы объектов, каналов, атрибутов. Однако в файле rtmdata.h гораздо больше констант чем для обзора объектов каналов или атрибутов. Например:
// Group definitions for object browsing
#define RTM_GROUP_OBJECTS 0x01 // enum objects IDs
#define RTM_GROUP_CHANNELS 0x02 // enum channels IDs by object
#define RTM_GROUP_CHAN_ATTRS 0x03 // enum attributes by channel ID
#define RTM_GROUP_CHAN_ARCH_ATTRS 0x04 // the same as previous, but only archived
#define RTM_GROUP_CAT_ATTRS 0x05 // enum attributes by category flags
Сравните константы: какие в примере и какие в rtmdata.h. Судя по всему заложен доступ и к инфе о текущем проекте, и к инфе о текущем пользователе, и так далее. Но вся дельфийская кухня работает только для объектов, каналов, атрибутов. У меня достучаться до других штук, например до
//////////////
// attribute class: SESSION

#define RTM_ATTR_SESSION_SCREEN_RIGHTS 0x060001L // screen rights mask
#define RTM_ATTR_SESSION_T_LAST_ALARM 0x060002L // time of the last alarm
не вышло. Опять мысль, что либо специально зарубили, либо по лени не сделали... Теперь самый цымус! Посоветуйте мне, что покрутить и куда посмотреть, а то TraceMode выдаёт мне штук 30 (по разному) алярмов, а потом начинает расти очередь на отображение и TraceMode, перестаёт уведомлять даже "родной" Event Viewer. Ну и DrawServ приходится сносить диспечтером задач. Ещё не упомянул я про поведение гр. консоли. при её закрытии. Было на эту тему минимум 2 топика. Ответ так и не получен. А именно, исследования показали, что гр. консоль как то криво дёргает addRef и release компонента, вследствии чего не вызывается деструктор...
Уффф. Наверняка что то забыл. Пока разгребать всем хватит.

Так, что скажет Adastra Technical Support?
И вы уважаемые посетители форума?

Что делать со все этой бедой? [crazy / сумасшедший]

С наилучшими пожеланиями, Антон.

Сообщения / Posts 5 | Из / From: Россия  |  IP / IP: IP адрес / IP address | Report this post to a Moderator
АдАстра. Техподдержка
Administrator
Участник № / Member № 4


Icon 2 отправлено / posted      Профиль для / Profile for АдАстра. Техподдержка           Редактировать/удалить сообщение / Edit/Delete Post 
1. Нужно использовать только документированные интерфейсы и структуры данных.
2. Написанию custom-интерфейсов на Дельфи МЫ не препятствуем.
3. Тревоги в РПД недоступны - это норма. Нужно проверять либо в Профайлере, либо в МРВ (а также в консолях).
4. OnAlarm в 5.15 вызывается, даже если компонент не привязан к каналу.
5. Деструктор действительно не вызывается - это ошибка, к 5.15 поправить не успели.
6. Если медленно обрабатывать тревоги при быстром темпе их поступления, то описанная ситуация возможна. Вероятно надо увеличить размер очереди...
7. OnRun вызывается, если запущен пересчет и создается окно компонента (или наоборот). Считайте фичей. [Улыбка / Smile]

Сообщения / Posts 17083 | Из / From: Россия  |  IP / IP: IP адрес / IP address | Report this post to a Moderator
ilya
Forum Professor / Завсегдатай форума
Участник № / Member № 469


Icon 9 отправлено / posted      Профиль для / Profile for ilya           Редактировать/удалить сообщение / Edit/Delete Post 
Отвлечемся пока от ItmRtmClient и ItmRtmData. Берем ActiveForm в Delphi, компилируем, и регистрируем его в системе. Вставляем его в РПД.

Далее, нам надо будет отлаживать наш ActiveX, и поэтому пробуем запустить picrt.exe c ActiveX-ом под Delphi. Появляется “access violation”(именно при запуске из под Delphi). Начинаем искать виновных. Может виноват я как программист? Но я пока еще не написал ни строчки. Может виноват Delphi? Вставляем наш ActiveX в другие среды Internet Explorer (html-страницу), приложение на VB и С++, и запускаем их под Delphi – все нормально запускается и отлаживается. Виновный найден – Trace Mode. Это потом я случайно вычитал в форуме (топик ТЕХНИЧЕСКАЯ ПОДДЕРЖКА/Мониторы Реального Времени/Проблемы с графикой
http://forum.adastra.ru/ubb/ultimatebb.php?ubb=get_topic;f=5;t=000065#000003), про default.pal. Скопировал куда надо – заработало, но время потеряно.

Далее: запустили, отлаживаем, но постоянно выскакивает ошибка EOleSysError “член группы не найден”(именно при запуске из под Delphi). Вроде бы на работу ActiveX-а не влияет, но мешает сильно. Начинаем искать виновных. Может виноват я как программист? Но я пока еще не написал ни строчки. Может виноват Delphi? Вставляем наш ActiveX в другие среды Internet Explorer (html-страницу), приложение на VB и С++, и запускаем их под Delphi – все нормально запускается и ни каких ошибок. Виновный найден – Trace Mode. Писал в техподдержку но внятного ответа не получил. Сам найти причину возникновения этой ошибки не смог.

Запустим picrt.exe c нашим ActiveX-ом просто в OC и нажмем кнопку “обновить графику”. Увидим “access violation”.

Спрашивается: неужели при создании примера ActiveX компонента на Delphi, который поставляется c Trace Mode, разработчики не сталкивались с этими проблемами? Как же тогда отлаживался этот пример?

Теперь про ItmRtmClient и метод onAlarm. При его использовании тает свободная память в системе ( топик ТЕХНИЧЕСКАЯ ПОДДЕРЖКА/Редактор Представления Данных/метод onAlarm http://forum.adastra.ru/ubb/ultimatebb.php?ubb=get_topic;f=3;t=000111 ) эта “фича” устранена?

А вот топик от 20.09.2001: ТЕХНИЧЕСКАЯ ПОДДЕРЖКА/ Редактор Представления Данных / Ошибка в доп. интерфейсе для ActiveX ( http://forum.adastra.ru/ubb/ultimatebb.php?ubb=get_topic;f=3;t=000023 ) . Сегодня 11.06.2004. Если не ошибаюсь метод onTagsValsChanged вызывается сервером на КАЖДОМ ЦИКЛ ПЕРЕСЧЕТА СИСТЕМЫ ДЛЯ КАЖДОЙ ПРИВЯЗКИ до сих пор.

Мое впечатление: для Trace Mode можно писать ActiveX компоненты на Delphi (про С++ и VB ничего сказать не могу), но пока нерешенных проблем море и решать их не спешат! А поначалу все казалось таким заманчивым: берем: любимый Delphi и ваяем на нем для Trace Mode свои модули. На практике оказалось все не так радужно…

Тестировалось все это на Delphi5-7 Trace Mode 5.12.

На 10-й конференции уважаемый Роман Бузинов сказал с трибуны, что в TM6 дальнейшего развития интерфейсов для ActiveX компонентов не будет. Жаль…

Сообщения / Posts 216 | Из / From: Россия  |  IP / IP: IP адрес / IP address | Report this post to a Moderator
TheBug(R)
Junior Member / Новичок
Участник № / Member № 275


Icon 1 отправлено / posted      Профиль для / Profile for TheBug(R)           Редактировать/удалить сообщение / Edit/Delete Post 
Я бы добавил, что к сожалению, до сих пор нет нормального решения проблемы со звуковой сигнализацией на НетЛинк Лайтах. Написание ActiveX спасает отчасти. Его приходится копировать на все экраны, что мягко говоря идеологически не правильно.
Сообщения / Posts 14 | Из / From: Россия  |  IP / IP: IP адрес / IP address | Report this post to a Moderator
АдАстра. Техподдержка
Administrator
Участник № / Member № 4


Icon 2 отправлено / posted      Профиль для / Profile for АдАстра. Техподдержка           Редактировать/удалить сообщение / Edit/Delete Post 
1. В 5.15 при вызове on anAlarm память более не растет.
2. Значения при вызове onTagsValsChanged действительно передаются по одному. Это так и будет.
3. По поводу запуска PicRT ил среды Delphi - по этому поводу были похожие сообщения и от других программистов, которые работают под Delphi. Однако - с чего Вы решили, что дело в ТМ? Ведь под средой MVS, например, все это отлично работает - может всетаки дело в Delphi?

Сообщения / Posts 17083 | Из / From: Россия  |  IP / IP: IP адрес / IP address | Report this post to a Moderator
ilya
Forum Professor / Завсегдатай форума
Участник № / Member № 469


Icon 1 отправлено / posted      Профиль для / Profile for ilya           Редактировать/удалить сообщение / Edit/Delete Post 
quote:
Однако - с чего Вы решили, что дело в ТМ? Ведь под средой MVS, например, все это отлично работает - может всетаки дело в Delphi?
Почему я так решил - см. внимательно мое предыдущее сообщение: потому что компонент тестировался в д.р. средах (эти приложения c компонентом запускались из под Delphi) и нигде проблем не возникало.

А что скажете по поводу возникновения "access violation", при нажатии на кнопку "обновить графику"?

Сообщения / Posts 216 | Из / From: Россия  |  IP / IP: IP адрес / IP address | Report this post to a Moderator
АдАстра. Техподдержка
Administrator
Участник № / Member № 4


Icon 1 отправлено / posted      Профиль для / Profile for АдАстра. Техподдержка           Редактировать/удалить сообщение / Edit/Delete Post 
1) От того, что Вы тестировали в других средах компонент еще ничего не значит, что в ТМ ошибка. Среда MS Visual Studio запускает PicRT без проблем, а Delphi почему-то не может, поэтому напрашивается вывод - может Delphi как-то не так его грузит и в нем что-то не так?

2) По поводу "access violation" - нужен проект чтобы воспроизвести ситуацию.

Сообщения / Posts 17083 | Из / From: Россия  |  IP / IP: IP адрес / IP address | Report this post to a Moderator
ilya
Forum Professor / Завсегдатай форума
Участник № / Member № 469


Icon 1 отправлено / posted      Профиль для / Profile for ilya           Редактировать/удалить сообщение / Edit/Delete Post 
1). [Неодобрение / Frown] Так мы с Вами не договоримся. Фразы: “может Delphi как-то не так его грузит и в нем что-то не так?” проблему не решают. Может и в Delphi проблема, а может и нет. Поскольку Вы разработчики контейнера и Вы поставляете с TM примера ActiveX на Delphi, может Вы и разберетесь, и расставите все точки над “i”. Мне это не удалось. У Вас в руках код контейнера и код ActiveX-а, у меня - только ActiveX-а. А пока на лицо такой факт: берем Delphi и д.р. среды ( много других сред! ) – проблем нет, берем Delphi и TM – проблемы есть.

2). Высылаю два проекта. Похоже закономерность такая: в проекте с нагруженной графикой (архив Error.zip, узел “Disp”, экран “Звук”) ошибка есть, с простой (архив “WithoutError.zip”) - нет. Отправил на forum@adastra.ru

Сообщения / Posts 216 | Из / From: Россия  |  IP / IP: IP адрес / IP address | Report this post to a Moderator
АдАстра. Техподдержка
Administrator
Участник № / Member № 4


Icon 5 отправлено / posted      Профиль для / Profile for АдАстра. Техподдержка           Редактировать/удалить сообщение / Edit/Delete Post 
Какой Delphi используете?
Сообщения / Posts 17083 | Из / From: Россия  |  IP / IP: IP адрес / IP address | Report this post to a Moderator
ilya
Forum Professor / Завсегдатай форума
Участник № / Member № 469


Icon 1 отправлено / posted      Профиль для / Profile for ilya           Редактировать/удалить сообщение / Edit/Delete Post 
Delphi6 Trace Mode 5.12
Сообщения / Posts 216 | Из / From: Россия  |  IP / IP: IP адрес / IP address | Report this post to a Moderator
АдАстра. Техподдержка
Administrator
Участник № / Member № 4


Icon 5 отправлено / posted      Профиль для / Profile for АдАстра. Техподдержка           Редактировать/удалить сообщение / Edit/Delete Post 
ActiveX, который прислали - окуда брали?
Это он "валит" систему при обновлении графики, без него все работает нормально. [Вращающиеся глаза / Roll Eyes]

Сообщения / Posts 17083 | Из / From: Россия  |  IP / IP: IP адрес / IP address | Report this post to a Moderator
ilya
Forum Professor / Завсегдатай форума
Участник № / Member № 469


Icon 1 отправлено / posted      Профиль для / Profile for ilya           Редактировать/удалить сообщение / Edit/Delete Post 
1)С помощью Delphi сделал. На ActiveX-e это написано.
2)В том то и дело, что с любым ActiveX компонентом созданным в Delphi возникает такая проблема. Причем не вовсех проектах Trace Mode, а в проектах с навороченной графикой. Для илюстрации этого Вам отправлено два примера.

Сообщения / Posts 216 | Из / From: Россия  |  IP / IP: IP адрес / IP address | Report this post to a Moderator
АдАстра. Техподдержка
Administrator
Участник № / Member № 4


Icon 2 отправлено / posted      Профиль для / Profile for АдАстра. Техподдержка           Редактировать/удалить сообщение / Edit/Delete Post 
Извините за задержку, но большее время ушло на то, чтобы найти нужную Delphi...

Итак - глюк однозначно в самой Delphi и только 6-й версии. Пробовали на Delphi6 - стабильно падает, даже если вообще не ActiveX писать.
А вот в Delphi7 - все отлично работает и ничего не валится. [clever / умный]
Используйте 7-й версию.

Сообщения / Posts 17083 | Из / From: Россия  |  IP / IP: IP адрес / IP address | Report this post to a Moderator
   

   Закрыть тему / Close Topic   Feature Topic   Переместить топик / Move Topic   Удалить топик / Delete Topic Следующая старая тема / next oldest topic   Следующая новая тема / next newest topic
 - Printer-friendly view of this topic
Перейти к / Hop To


Новости АСУ ТП / News | SCADA / HMI | Обучение / Trainings | Свяжитесь с нами / Contact Us



Powered by Infopop Corporation
UBB.classic™ 6.7.2