This is topic DDE-обмен с Delphi in forum Работа в MS Windows (ODBC/DDE/OPC/NET) / Working under MS Windows at Форум TRACE MODE: техническая поддержка.


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

Posted by Валентин Ницкий (Участник № / Member № 479) on :
 
День добрый!
Объясните, пожалуйста, следующую ситуацию:
Win-приложением (Delphi) раз в 5 сек. осуществляется DDE-опрос трех каналов
(в режиме Request) при этом суммарное время опроса достигает 1.5 сек.
(Время опроса увеличивается с увеличением кол-ва каналов, например, для пяти составляет 2.5 сек.)
В то же время, если опрос осуществлять по схеме RTM - Excel - Delphi, он происходит мгновенно независимо от кол-ва опрашиваемых каналов.
В чем тут дело?
 
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
 
А как Вы реализовали опрос по DDE в приложении на Delphi?
 
Posted by Валентин Ницкий (Участник № / Member № 479) on :
 
А как Вы реализовали опрос по DDE в приложении на Delphi?

Естественно, через DdeClientConv: SetLink('RTM1','GET') и RequestData(Chanel.Text) (по событию OnTimer с частотой 5 сек.).
 
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
 
И он каждый раз инициализирует указатель на сервер и топик через SetLink('RTM1','GET')?
Попробуйте делать это один раз, а в цикле таймера только опрашивать сервер по RequestData(Chanel.Text).
 
Posted by Валентин Ницкий (Участник № / Member № 479) on :
 
И он каждый раз инициализирует указатель на сервер и топик через SetLink('RTM1','GET')?
Попробуйте делать это один раз, а в цикле таймера только опрашивать сервер по RequestData(Chanel.Text).

Так и есть.
В цикле таймера опрашивается только сервер по RequestData(Chanel.Text).
 
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
 
###
Нам необходимо время на проверку данной ситуации. Ответ мы сообщим позже в форум и на Ваш E-mail.
 
Posted by Валентин Ницкий (Участник № / Member № 479) on :
 
Нам необходимо время на проверку данной ситуации. Ответ мы сообщим позже в форум и на Ваш E-mail.

Я, конечно, извиняюсь, но когда же будет ответ?
Хотелось бы скорее...
 
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
 
Срок к сожалению уточнить пока нельзя - у нас нет специалистов на Delphi для быстрой проверки данной ситуации.
Если это возможно - не могли бы Вы прислать нам код Вашего приложения для проверки данной ситуации? А также сообщить - какую версию Delphi вы используете?
 
Posted by Валентин Ницкий (Участник № / Member № 479) on :
 
Почтой отправить не удалось. (Не пропускает прокси сервер)
Высылаю фрагмент кода...
Обработчик нажатия кнопки "Связь":
If not Client.SetLink('RTM1','Get') or not Client.OpenLink
Then Application.MessageBox('Невозможно установить связь!', 'ОШИБКА!',MB_ICONERROR)
Else
begin
Button1.Enabled:=False; //Запрет нажатия кнопки "Связь"
AssignFile(DataFile,'Chanel.txt');
Rewrite(DataFile);//Открытие файла для записи запрашиваемых данных
Timer1.Enabled:=True;//Запуск таймера
end
Обработчик события OnTimer (цикл срабатывания 1сек.):
var
InfoKalor,InfoPr,InfoDom:PChar;
s,s1,s2:String;
begin
InfoKalor:=Client.RequestData(Chanel.Text);
InfoPr:=Client.RequestData(Edit1.Text);
InfoDom:=Client.RequestData(Edit2.Text);
s:=StrPas(InfoKalor); s1:=StrPas(InfoPr); s2:=StrPas(InfoDom);
WriteLn(DataFile,TimeToStr(Now),' ',S,' ',S1,' ',S2);
end;
P.S. Delphi 6.0 (Build 6.163); TM - 5.07 Base Editional
P.P.S. Попутно еще вопрос: отсутствует oddsetup.exe в связи с чем не устанавливается
драйвер ODBC (siadsql.dll в каталоге ТМ есть), что делать?
 
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
 
1) Вы указали, что опрос ведется раз в 5 секунд по таймеру и в то же время в листинге Вашей программы сказано, что таймер обрабатывается 1 раз в секунду. Какой все же период обработки 5 или 1 сек.?
2) Что передается в идентификаторах "Chanel.Text", "Edit1.Text" и "Edit2.Text"?

Относительно oddsetup.exe - теперь регистрация драйвера ODBC производится в утилите регистрации tmreg.exe - в соответствующем разделе.
 
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
 
Попробуйте следующий код заключить в процедуру и выполнить без использования таймера (например, по нажатию кнопки), и засечь время на входе и выходе из данной процедуры. Есть предположение, что проблема в таймере Delphi.
code:
var
InfoKalor,InfoPr,InfoDom:PChar;
s,s1,s2:String;
begin
InfoKalor:=Client.RequestData(Chanel.Text);
InfoPr:=Client.RequestData(Edit1.Text);
InfoDom:=Client.RequestData(Edit2.Text);
s:=StrPas(InfoKalor); s1:=StrPas(InfoPr); s2:=StrPas(InfoDom);
WriteLn(DataFile,TimeToStr(Now),' ',S,' ',S1,' ',S2);
end;


 
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
 
Попробуйте выключать таймер во время обмена по DDE следующим образом:
code:
 
If not Client.SetLink('RTM1','Get') or not Client.OpenLink

// НОВАЯ ПРОЦЕДУРА
Procedure RequestTMData;
var
InfoKalor,InfoPr,InfoDom:PChar;
s,s1,s2:String;
endoftimer:boolean;
begin
InfoKalor:=Client.RequestData(Chanel.Text);
InfoPr:=Client.RequestData(Edit1.Text);
InfoDom:=Client.RequestData(Edit2.Text);
s:=StrPas(InfoKalor); s1:=StrPas(InfoPr); s2:=StrPas(InfoDom);
WriteLn(DataFile,TimeToStr(Now),' ',S,' ',S1,' ',S2);
endoftimer:=true;
end;

//ОСНОВНАЯ ПРОГРАММА - ОБРАБОТКА КНОПКИ "СВЯЗЬ":
begin
Button1.Enabled:=False; //Запрет нажатия кнопки "Связь"
AssignFile(DataFile,'Chanel.txt');
Rewrite(DataFile);//Открытие файла для записи запрашиваемых данных
endoftimer:=true;
Timer1.Enabled:=True;//Запуск таймера
end


//ОБРАБОТЧИК СОБЫТИЙ OnTimer:
If endoftimer then
begin
endoftimer:=false;
RequestTMData;
end;
end;


 
Posted by Валентин Ницкий (Участник № / Member № 479) on :
 
Здравствуйте!
1) Что касается периода опроса - это не принципиально, пусть будет 1 сек.;
2) В свойствах "*.Text" передаются имена каналов;
3) Попробовал на ТМ 5.10 (и по таймеру и по кнопке) ситуация следующая:
Время запроса/Длительность запроса, мс
15:31:39 110
15:31:40 210
15:31:41 310
15:31:42 411
15:31:43 511
15:31:44 60
15:31:45 161
15:31:46 260
15:31:47 361
15:31:48 460
15:31:49 10
15:31:50 110
15:31:51 210
15:31:52 311
15:31:53 410
15:31:54 511
15:31:55 60
15:31:56 160
15:31:57 260
15:31:58 361
15:31:59 460
15:32:00 10
Таким образом время запроса уменьшилось (кстати, теперь оно не зависит от количества каналов, но по-прежнему - обратите внимание! - меняется циклически), но в варианте "RTM-Excel-Delphi" оно равно 0! (изредка наблюдается 10мс)
Могу предположить, что от таймера Delphi ничего не зависит...
 
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
 
Что касается цикличности - вполне объяснимо, дело в том, что обработкой запросов DDE сервер ТМ занимается по циклам пересчета базы узла. У Вас наверно для МРВ стоят стандартные 550 мс - это видно, из Ваших результатов - не один таймаут не превышает значение 550 мс. Попробуйте увеличить скорость пересчета в ТМ.
 


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



Powered by Infopop Corporation
UBB.classic™ 6.7.2