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

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

   
Автор / Author Тема / Topic: Вызов пользовательской функции
Михаил_Тапилин
Forum Member / Участник форума
Участник № / Member № 1539


Icon 1 отправлено / posted      Профиль для / Profile for Михаил_Тапилин           Редактировать/удалить сообщение / Edit/Delete Post 
Для заполнения таблицы я вызываю пользовательскую функцию несколько раз: функция возвращает массив, и каждый столбец заполняется массивом со своим индексом. Отработка функции занимает довольно существенное время, поэтому сразу заметно, что каждый раз она считается заново (вызвал 3 раза - отчёт формируется в 3 раза дольше). Поскольку функция вызывается без аргументов, я считал, что она будет посчитана 1 раз, а во всех остальных вызовах в шаблоне будет подставлен уже подсчитанный результат. Это не так?
Сообщения / Posts 49 | Из / From: Россия  |  IP / IP: IP адрес / IP address | Report this post to a Moderator
АдАстра. Техподдержка
Administrator
Участник № / Member № 4


Icon 1 отправлено / posted      Профиль для / Profile for АдАстра. Техподдержка           Редактировать/удалить сообщение / Edit/Delete Post 
Сама функция что делает с своем коде - откуда данные для массива берет?
Сообщения / Posts 17335 | Из / From: Россия  |  IP / IP: IP адрес / IP address | Report this post to a Moderator
Михаил_Тапилин
Forum Member / Участник форума
Участник № / Member № 1539


Icon 1 отправлено / posted      Профиль для / Profile for Михаил_Тапилин           Редактировать/удалить сообщение / Edit/Delete Post 
Данные берутся из каналов функцией READVAL за определённый промежуток времени. Сейчас вот так: READVAL(kanal[i], TIME()-10, TIME() );

Для каждой ячейки таблицы функция заново пересчитывается.

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


Icon 1 отправлено / posted      Профиль для / Profile for АдАстра. Техподдержка           Редактировать/удалить сообщение / Edit/Delete Post 
Это действительно так. Он при каждом вызове обращается к МРВ за архивными значениями. При этом буферизация выборки из СПАД производится самим МРВ, поэтому необходимо обратить внимание на сколько возрастает основная и виртуальная память процессе Drawserv.exe в момент формирования отчета. Если они перекрывают в общем объем доступной физической памяти, то начинается торможение, потому как в дело подключается виртуальная память на жестком диске...
Сообщения / Posts 17335 | Из / From: Россия  |  IP / IP: IP адрес / IP address | Report this post to a Moderator
Михаил_Тапилин
Forum Member / Участник форума
Участник № / Member № 1539


Icon 1 отправлено / posted      Профиль для / Profile for Михаил_Тапилин           Редактировать/удалить сообщение / Edit/Delete Post 
Таким образом, если у меня в таблице 4 столбца и 300 строк, то функция будет вызвана 4х300 = 1200 раз. Вот из-за этого-то, наверное, и возникает торможение, а не из-за переполнения памяти. Если функция будет считаться секунду, на заполнение таблицы уйдёт 20 мин (проверка подтвердила - всё так). Это не может не "радовать"...
Ладно, тогда подскажите, как можно соорудить следующую таблицу: одна колонка - время изменения канала, вторая - комментарий, соответствующий значению канала в этот момент (в сущности - значение канала), третья - наименование устройства, соответствующее имени канала. Строки должны быть отсортированы по времени изменения.
Сейчас я сделал так.
В функции формируется массив ссылок на каналы, затем формируется массив, элементами которого являются массивы, сформированные функцией READVAL (канал, время от, время до) для каналов из первого массива. Затем для этих значений формируются массивы времени изменения посредством функции TIME(Архивное значение), и массивы ссылок на каналы.
Затем всё это заносится в три итоговых массива: один содержит времена и даты, второй – соответствующие им значения каналов, третий соответствующие им ссылки на каналы.
Затем я сортирую эти массивы по времени. И в конце делаю все три массива элементами выходного массива. Таким образом, этот массив содержит все необходимые данные для построения нужной таблицы. Жаль, что для каждой ячейки он рассчитывается заново…

Кстати, виртуальная память DrawServ'а в процессе формирования отчёта не изменяется, а используемая процессом память возрастает незначительно.

Нельзя ли как-нибудь "обмануть" сервер документирования, чтобы он не пересчитывал функцию для каждой ячейки? Например, передать значения каналов этой функции в качестве аргумента?

Сообщения / Posts 49 | Из / From: Россия  |  IP / IP: IP адрес / IP address | Report this post to a Moderator
Михаил_Тапилин
Forum Member / Участник форума
Участник № / Member № 1539


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


Icon 1 отправлено / posted      Профиль для / Profile for АдАстра. Техподдержка           Редактировать/удалить сообщение / Edit/Delete Post 
Нет - не имеет... [Неодобрение / Frown]
Сообщения / Posts 17335 | Из / 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