This is topic Производительность? in forum TRACE MODE 6 бесплатная Базовая версия / TRACE MODE 6 free Base version at Форум TRACE MODE: техническая поддержка.
Здравствуйте, в проекте отображаю запрошенные с устройства данные по 8-ми каналам FLOAT в ГЭ "Текст". В проекте уже чуть более 50-ти каналов (из них 9 программ и 9 всплывающих экранов). В одной из программ реализовал перевод единиц измерения в схожие размерности (именно программа, так как требуется перевод в относительные единицы(дБ), где в атрибут "Множитель" не могу отправить формулу). До недавнего времени перевод единиц работал корректно и без задержек(проверял последний раз когда в проекте было около 30 каналов). Теперь же при нажатии на кнопку, по которой я передаю в программу число, в зависимости от которого выполняется та или иная функция в программе, я наблюдаю в панели МРВ, что реальное значение изменилось как и должно (например входное - 0.5, а реальное - 50), но при этом в ГЭ "Текст", к которым привязаны аргументы экрана, которые в свою очередь привязаны к "Реальному значению" каналов, по которым я передаю значения измерений с устройства, отображают всё те же 0.5 как и до нажатия кнопки. Через некоторое время (пол минуты, минута или две) изменение всё таки происходит и далее, при смене размерностей, таких задержек нет. Выше описанное происходит при стандартных настройках "Пересчет" (Период - 10, Разрешение - 0.055) в узле. Если выставить более долгий цикл монитора (Период - 10, Разрешение - 0.5), то изменения происходят своевременно, но такое время ожидания изменений меня не устраивает. На моём компьютере всего 2Гб ОЗУ может из-за этого проблема?
Posted by Nico (Участник № / Member № 5342) on :
или в программе что долго работает
Posted by vg (Участник № / Member № 8172) on :
Да. Разнёс программу на две более простые, стало получше. Существуют рекомендации по объёму/нагрузке программы? Я так понимаю, что лучше всегда стараться пользоваться встроенными средствами и использовать программирование только в крайних случаях, и то, используя несложные алгоритмы.
Posted by Nico (Участник № / Member № 5342) on :
-можно писать достаточно сложные программы
Posted by vg (Участник № / Member № 8172) on :
Что тогда может долго работать в несложной программе? У меня написано 3 простых функциональных блока, которые я вызываю суммарно 32 раза (8, 16 и 8 соответственно), передавая туда от 3-х до 8-ми аргументов (включая глобальные переменные). Понятно, что из-за этих 32-х раз и тормозит, потому и спросил об ограничениях. В любом случае благодарю за ответы.
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
quote:Отправитель / Originally posted by vg: На моём компьютере всего 2Гб ОЗУ может из-за этого проблема?
Проблема не в имеющихся ресурсах, а в их использовании. Эти 2ГБ используются не только Trace Mode 6, но и самой Операционной Системой, запущенными ей службами и приложениями.
Ограничений в выполнении программы нет.
Принципиально одна программа с 32 операциями и тридцать две программы с 1 операцией каждая будут выполняться одно и тоже время. Так как ресурсы на их выполнение необходимы примерно одни.
Posted by vg (Участник № / Member № 8172) on :
Posted by Nico (Участник № / Member № 5342) on :
- из 2 Гб один резервируется для ОС - для автоперевода из одних единиц в другие желательно использовать программу как закон трансляции - да и саму программу всегда можно написать неоптимально
Posted by vg (Участник № / Member № 8172) on :
Спасибо за подробные ответы
Posted by vg (Участник № / Member № 8172) on :
Здравствуйте, делаю тестовый проект на большое количество каналов (пока что около 4500).
Создал базовый интерфейс, создал источники и каналы для отображения считываемых данных. Всё работало нормально.
Далее написал довольно объёмный(но менее 4КБ для аргументов) шаблон программы для "задержки индикации" (то есть изменение индикации ячейки только в случае нахождения значения в определённой "зоне" некоторое количество времени), который вызывается в проекте 84 раза.
После этого при запуске МРВ стало появляться сообщение "Calc loop is big(t)" на постоянной основе. Понятно, что машина не справляется с задачей в отведённый цикл пересчёта, но загруженность не предельная (ЦП максимум до 30%, памяти выделяется на 300Mb больше: с 3.4GB до 3.7Gb).
Intel Core i3-4170 @ 3,7GHz Оперативная память 8Gb
Могу выслать Вам проект? Не понимаю как это исправить. Воспроизведётся ли у Вас эта проблема?
Posted by Nico (Участник № / Member № 5342) on :
-посмотреть сколько времени выполняется программа -есть сильное подозрение что в программе используется цикл ожидания по времени
Posted by vg (Участник № / Member № 8172) on :
Если судить по 45-му атрибуту канала CALL.Program, то между изменениями значения атрибута происходит 3-4 секунды. Если по переменным Calc_Loop или Calculate_Cycle, то они стабильно возвращают значения больше 3000(3100-3300).
В программе создана глобальная переменная, которая увеличивается на 1 каждый цикл пересчёта. Также написан функциональный блок, в котором есть 3 цикла WHILE по 10 итераций каждый. Всё остальное в программе if-else.
Posted by vg (Участник № / Member № 8172) on :
Проблема была в размере созданных глобальных массивов (во вкладке "Глобальные переменные"). Уменьшив их размер до 1000, переменные Calc_Loop или Calculate_Cycle стали показывать значения не более 600.
Posted by Nico (Участник № / Member № 5342) on :
-программа для задержки реализуется гораздо проще -попробуйте все-таки использовать стандартно встроенные решения, а не создавать собственные -для задержки реакции очень просто и быстро использовать период пересчета