-
АвторТема
-
10.09.2016 в 13:29 #48502
Добрый день! У меня вопрос к разработчикам. Я уже спрашивал на форуме (тема Zet-220 подвисает -https://www.zetms.ru/support/NewForum.php?PAGE_NAME=read&FID=2&TID=132) почему время от времени Zet-220 виснет, причем второй экземпляр модуля абсолютно идентично подвисает. Но ответа так и не дождался.
Может есть хоть какое-нибудь предположение о причинах сброса АЦП? Привык уже к вашей продукции, неохота на полпути менять производителя и заново все настраивать, переписывать.Да и новые установки делать все же хотелось бы с вашими модулями. -
АвторТема
-
АвторОтветы
-
10.09.2016 в 13:29 #48503
Уважаемый, Михаил!
Мы с такой проблемой подвисания не сталкивались. Для того, чтобы с этим бороться необходимо у себя создать аналогичную ситуацию. Расскажите как можно подробнее в какой момент это происходит. Какая ОС на компьютере установлено? Какими параметрами обладает компьютер? Какое обновление программ установлено? Когда был изготовлен прибор? В каких условиях работает? Что нажимаете перед его зависанием? Если может быть что-то слишком долго работает и после этого зависает? Помогите нам разобраться с этой ситуцией.
10.09.2016 в 13:30 #48504АЦП-ЦАП ZET-220 №192 март 2010
АЦП-ЦАП ZET-220 №247 окрябрь 2010
Операционная система: лицензионная Windows XP Service Pack3.
Компьютер: AMD Athlon64(X2)Dual Core Processor 3800+ 2.01ГГц, 2.87ГБ ОЗУ.
Ваше программное обеспечение: ZETLAB Version 4 Windows Vista Compatible. Build Date: 4-10-2009
Перед зависанием ничего не нажимается. Процесс длительный, просто наблюдаем за изменением показаний датчиков.В программе реализована процедура считывания данных с нескольких каналов (от 3 до 7) работающих с частотой дискретизации 200 ГЦ (ранее уже писал фрагмент кода).Условия работы — лаборатория, но вибраций,пыли и мощных электромагнитых полей нет. Время зависания от начала запуска программы может быть различным. (может проработать 20 мин., и вообще достать с перезагрузками, а может и целый день без проблем проработать). Пару раз вместе с АЦП зависала и клавиатура. По показаниям в Диспетчере задач — перегрузки системы нет, ресурсов хватает. Других программ во время работы модуля не запускаю.10.09.2016 в 13:30 #48505Здравствуйте, Михаил!
Есть вероятность, что проблема в чипсете или USB драйвере. Есть у Вас возможность проверить работу устройства на другом компьютере?
10.09.2016 в 13:30 #48506Да, есть такая возможность. Попробую. Под Вистой можно запускать или XP обязательно?
10.09.2016 в 13:30 #48507Можно и под вистой…
10.09.2016 в 13:31 #48508Здравствуйте. Спасибо за совет. На ноутбуке все нормально работает без сбоев несколько дней, хотя и слабее он значительно. Правда небольшая заминка произошла. На ноутбуке часы опаздывают от модуля за секунду на 0.02сек. Соответственно сигнал начинает запаздывать. Если вместо:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
if Srv1.CurrentTime(0)>mytime then
begin
Srv1.GetData(0,0,mytime,200,ff[0]);
mytime:=mytime+1;
b[1]:=0;
for i:=0 to 199 do
begin
b[1]:=b[1]+ff[i];
end;
b[1]:=b[1]/200;
end;
end;я запишу:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
if Srv1.CurrentTime(0)>mytime then
begin
Srv1.GetData(0,0,mytime,200,ff[0]);
mytime:=Srv1.CurrentTime(0);
b[1]:=0;
for i:=0 to 199 do
begin
b[1]:=b[1]+ff[i];
end;
b[1]:=b[1]/200;
end;
end;т.е. буду ‘привязываться’ к времени модуля — то ошибки не будет?
И еще, не совсем понял почему здесь нужно включать виртуальный канал, а не ‘физический’ на модуле? И достаточно ли включать один виртуальный канал для снятия сигнала с нескольких каналов модуля?10.09.2016 в 13:31 #48509Здравствуйте, Михаил!
С какой частотой у Вас возникает прерывание от таймера и как Вы измеряете задержку? Что значит включать виртуальный канал?
10.09.2016 в 13:31 #48510Таймер в программе настроен на прерывание 1000ms, то есть ровно одна секунда. В модуле я так понял свои часы, а частота дискретизации и прочие параметры привязаны к ним. CurrentTime, в частности показывает это время модуля. Задержку определяю просто: вывожу через edit1 currenttime любого из каналов. А через edit2 вывожу значение mytime, которое увеличивается на единицу по событию TForm1.Timer1Timer. Наблюдаю постепенное нарастание, разницы в этих временах, которые в начальный момент времени синхронизированы.
Включаю виртульный канал вызовом метода ConnectVrtCh(NumChan), где NumChan-количество виртульных каналов. Просто я не понял, почему нужно писать SRV1.ConnectVrtCh(0), а не просто SRV1.Connect. В первом случае при вызове метода GetData все путем, а во втором возникает ошибка…(сейчас уже не вспомню какая).Извините за глупый вопрос.10.09.2016 в 13:31 #48511Здравствуйте, Михаил!
Поскольку вы опрашиваете данные через таймер, а таймер и метод CurrentTime абсолютно между собой не как не связаны, то ваши расхождения по времени не выглядят удивительными. Таймер — это низкоприоритетный поток, поэтому каждый раз прибавляя 1 секунду при его срабатывании нельзя быть уверенным что прошла именно 1 секунда. Лучше пользоваться запоминанием предыдущего значения CurrentTime и сравнивать это значение с текущим, но опрос можно делать и по таймеру.
К вам вопрос: зачем вам нужен виртуальный канал?10.09.2016 в 13:31 #48512То есть организовать вроде бесконечного цикла в котором опрашивается только Currenttime. И таким образом вообще не связываться ни с каким таймером? Попробую. Виртуальный канал вообще мне не нужен, просто, как я указывал ранее, если вызывать метод SRV1.Connect, то на GetData возникает ошибка EAccessViolation, а если вызывать метод SRV1.ConnectVrtCh(0), то по GetData нормально считываются показания. Просто был вынужден так написать, вот и возник попутно вопрос, почему так.
По поводу подвисания АЦП на одном из компьютеров. Чаще всего происходит зависание после записи числа в порт. То есть при записи в порт, допустимbegin
form1.SRV1.SetDigOutput(0,26);
form1.SRV1.SetDigOutput(0,27);end;
с некоторой долей вероятности подвисает.10.09.2016 в 13:34 #48514Здравствуйте, Михаил.
Получение данных можно организовать и по таймеру, и как бесконечный цикл с задержкой — как угодно.
Главное — это время, передаваемое в качестве параметра методу 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 команды перекрываются -
АвторОтветы
Для ответа в этой теме необходимо авторизоваться.