Здравствуйте, Михаил.
Получение данных можно организовать и по таймеру, и как бесконечный цикл с задержкой - как угодно.
Главное - это время, передаваемое в качестве параметра методу GetData:
Как сказано в документации

, время должно быть не больше CurrentTime по этому каналу, не меньше 0 и не меньше размера хранимых в буфере данных.
В случае вычисления времени как mytime := mytime + 1 оно легко может не попасть в этот диапазон: на обработку таймера тратится время, плюс время по каналу может отставать или спешить. В Вашем случае времена совпали при запуске программы, поскольку при вызове ConnectVrtCh время по всем каналам сбрасывается в 0. Однако после вызова Connect CurrentTime может возвращать любое число.
Лучше сделать как-то так:
Код
procedure TForm1.Timer1Timer(Sender: TObject);
var
num: Integer;
begin
if Srv1.CurrentTime(0)>mytime then
begin
num := (Srv1.CurrentTime(0)-mytime)*Srv1.Frequency(0);
if num > 200 then
num := 200;
mytime:=Srv1.CurrentTime(0);
Srv1.GetData(0,0,mytime,num,ff[0]);
b[1]:=0;
for i:=0 to num do
begin
b[1]:=b[1]+ff[i];
end;
b[1]:=b[1]/num;
end;
Srv1.NumFileUsed(0);
end;
В таком виде должно работать при соединении через Connect(). Можно по таймеру, можно сделать бесконечный цикл, добавив задержку.
Последняя строчка нужна только для случая, когда Ваша программа обрабатывает записанный сигнал, работая совместно с Воспроизведением Сигналов /catalog/programs/zetlab/reader.php.
По поводу зависания: попробуйте поставить небольшую задержку между form1.SRV1.SetDigOutput(0,26);
Возможно, причина в том, что 2 команды перекрываются