Для работы с OPC-серверами в Delphi использовал импорт библиотеки типов
(для OPC DA - OPCDAAuto.dll и gbda_aut.dll) - весьма успешно.
Сейчас почти полностью перешел на Lazarus, в котором нет поддержки
импорта библиотеки типов.
Для того, чтобы обратиться к OPCDAAuto.dll использую OLE-объект.
Пример синхронного чтения данных:
Код:
var
opcServer, opcGroup, opcItem1: variant;
isConnected: boolean = False;
procedure TForm1.Button1Click(Sender: TObject);
begin
if not isConnected then
begin
try
opcServer := CreateOleObject('OPC.Automation');
opcServer.Connect('Advantech.ADAM.1');
opcGroup := opcServer.OPCGroups.Add('TestGroup');
opcItem1 := opcGroup.OPCItems.AddItem('Simulation.Group1.Tag1', 1);
isConnected := True;
Label1.Caption := 'Connected';
except
on E: Exception do
ShowMessage(E.ClassName + ': ' + UTF8Encode(E.Message));
end;
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
if isConnected then
begin
try
opcItem1.Read(1);
Label2.Caption := VarToStr(opcItem1.Value);
except
on E: Exception do
ShowMessage(E.ClassName + ': ' + UTF8Encode(E.Message));
end;
end;
end;
Этот код будет работать и в Delphi (конечно, без UTF8Encode).
Однако, не могу понять, как делать асинхронное чтение через созданный OLE-объект.
Необходимо обрабатывать событие DataChange из DIOPCGroupEvent, но как это сделать в OLE?
В общем, вопрос следующий:
Как создать в Delphi обработчик события OLE-объекта, полученного с помощью CreateOleObject?