Таймер замедляет работу программы
Модератор: Модераторы
Таймер замедляет работу программы
Используется пакет PascalSCADA. По таймеру в modbus-узел посылаются время и дата ежесекундно. Но прога становится сильно неповоротливой, вкладки не откликаются. Сделал таймер enabled=false стало нормально откликаться и пр. Как решить проблему. Поможет ли многопоточность?
Ежесекундно или ежемилисикундно?
qivi писал(а):Ежесекундно или ежемилисикундно?
Ежесекундно и ежестасекундно
Application.ProcessMessages; добавить.
Но если у вас несколько устройств на линии RS-485, так время отклика может быть до 250 мс на одно устройство (зависит от пропускной способности линии). Так, что вполне может быть, что за одну секунду таймер не выполниься.
Если у вас у PLCTag свойства AutoRead, AutoWrite настроены на True, тогда создаеться поток, который атоматически обрабатывает запросы. HMIEdit или HMILabel подключаете к PLCTag и данные читаються или записываться автоматически.
Для обработки в таймере вам необходим такой код:
в Thread.Execute:
В случае с таймером нельзя забывать, что он не гарантирует обработку за Time.
Но если у вас несколько устройств на линии RS-485, так время отклика может быть до 250 мс на одно устройство (зависит от пропускной способности линии). Так, что вполне может быть, что за одну секунду таймер не выполниься.
Если у вас у PLCTag свойства AutoRead, AutoWrite настроены на True, тогда создаеться поток, который атоматически обрабатывает запросы. HMIEdit или HMILabel подключаете к PLCTag и данные читаються или записываться автоматически.
Для обработки в таймере вам необходим такой код:
Код: Выделить всё
i:=0;
repeat
PLCTagNumber1.Read;
inc(i);
if i=<кол. попыток> then begin
//обработка таймаута
break;
end;
Application.ProcessMessages; //обеспечит реакцию приложения на действия пользователя //используеться когда быстродействие не так важно, иначе поток
until PLCTagNumber1.LastAsyncStatusRead=ioOk;
в Thread.Execute:
Код: Выделить всё
i:=0;
repeat
PLCTagNumber1.Read;
inc(i);
if i=<кол. попыток> then begin
//обработка таймаута
break;
end;
until PLCTagNumber1.LastAsyncStatusRead=ioOk;
В случае с таймером нельзя забывать, что он не гарантирует обработку за Time.
magnuz писал(а):Используется пакет PascalSCADA. По таймеру в modbus-узел посылаются время и дата ежесекундно. Но прога становится сильно неповоротливой, вкладки не откликаются. Сделал таймер enabled=false стало нормально откликаться и пр. Как решить проблему. Поможет ли многопоточность?
у меня лично работа с модбасом вынесено в отдельный поток.
