This is topic Вызов пользовательской функции in forum Документирование в TRACE MODE / Data Documentation in Trace Mode at Форум TRACE MODE: техническая поддержка.


To visit this topic, use this URL:
http://forum.adastra.ru/ultimatebb.php/ubb/get_topic/f/9/t/000066.html

Posted by Михаил_Тапилин (Участник № / Member № 1539) on :
 
Для заполнения таблицы я вызываю пользовательскую функцию несколько раз: функция возвращает массив, и каждый столбец заполняется массивом со своим индексом. Отработка функции занимает довольно существенное время, поэтому сразу заметно, что каждый раз она считается заново (вызвал 3 раза - отчёт формируется в 3 раза дольше). Поскольку функция вызывается без аргументов, я считал, что она будет посчитана 1 раз, а во всех остальных вызовах в шаблоне будет подставлен уже подсчитанный результат. Это не так?
 
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
 
Сама функция что делает с своем коде - откуда данные для массива берет?
 
Posted by Михаил_Тапилин (Участник № / Member № 1539) on :
 
Данные берутся из каналов функцией READVAL за определённый промежуток времени. Сейчас вот так: READVAL(kanal[i], TIME()-10, TIME() );

Для каждой ячейки таблицы функция заново пересчитывается.
 
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
 
Это действительно так. Он при каждом вызове обращается к МРВ за архивными значениями. При этом буферизация выборки из СПАД производится самим МРВ, поэтому необходимо обратить внимание на сколько возрастает основная и виртуальная память процессе Drawserv.exe в момент формирования отчета. Если они перекрывают в общем объем доступной физической памяти, то начинается торможение, потому как в дело подключается виртуальная память на жестком диске...
 
Posted by Михаил_Тапилин (Участник № / Member № 1539) on :
 
Таким образом, если у меня в таблице 4 столбца и 300 строк, то функция будет вызвана 4х300 = 1200 раз. Вот из-за этого-то, наверное, и возникает торможение, а не из-за переполнения памяти. Если функция будет считаться секунду, на заполнение таблицы уйдёт 20 мин (проверка подтвердила - всё так). Это не может не "радовать"...
Ладно, тогда подскажите, как можно соорудить следующую таблицу: одна колонка - время изменения канала, вторая - комментарий, соответствующий значению канала в этот момент (в сущности - значение канала), третья - наименование устройства, соответствующее имени канала. Строки должны быть отсортированы по времени изменения.
Сейчас я сделал так.
В функции формируется массив ссылок на каналы, затем формируется массив, элементами которого являются массивы, сформированные функцией READVAL (канал, время от, время до) для каналов из первого массива. Затем для этих значений формируются массивы времени изменения посредством функции TIME(Архивное значение), и массивы ссылок на каналы.
Затем всё это заносится в три итоговых массива: один содержит времена и даты, второй – соответствующие им значения каналов, третий соответствующие им ссылки на каналы.
Затем я сортирую эти массивы по времени. И в конце делаю все три массива элементами выходного массива. Таким образом, этот массив содержит все необходимые данные для построения нужной таблицы. Жаль, что для каждой ячейки он рассчитывается заново…

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

Нельзя ли как-нибудь "обмануть" сервер документирования, чтобы он не пересчитывал функцию для каждой ячейки? Например, передать значения каналов этой функции в качестве аргумента?
 
Posted by Михаил_Тапилин (Участник № / Member № 1539) on :
 
Видимо, задача не имеет решения.
 
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
 
Нет - не имеет... [Неодобрение / Frown]
 


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



Powered by Infopop Corporation
UBB.classic™ 6.7.2