//First procedure -> procedure TOPCClient.Connect; begin Meldung(0,'TOPCClient.Connect'); SollConnect := TRUE; InternConnect; end; procedure TOPCClient.InternConnect; Var Name, NodeID : String; I,J : Integer; SubscribeChangeClient: TEasyUAClient; MonitoringParameters: _UAMonitoringParameters; MonitoredItemArguments : Array of _EasyUAMonitoredItemArguments; SubscribeArguments: OleVariant; HandleArray: OleVariant; begin InternDisconnect; Meldung(0,'TOPCClient.InternConnect'); try /// OPC UA Server verbinden OPCUAClient := TEasyUAClient.Create(nil); OPCUAClientSPS := TEasyUAClient.Create(nil); OPCUAClientRead := CoEasyUAClient.Create; OPCUAClientSPS.SubscribeDataChange(Url_String,'nsu='+ nsu + ';s=' + S0 ,1000); (*!!!!!Start of commenting out SubscribeChangeClient := TEasyUAClient.Create(nil); SetLength(MonitoredItemArguments,Length(OPCServerItemArray)-NoV_DB100); MonitoringParameters := CoUAMonitoringParameters.Create; MonitoringParameters.SamplingInterval := 1000; for J := NoV_DB100 to Length(OPCServerItemArray)-1 do begin Name := OPCServerItemArray[J].Source + '.' + OPCServerItemArray[J].ItemName; MonitoredItemArguments[J-NoV_DB100] := CoEasyUAMonitoredItemArguments.Create; MonitoredItemArguments[J-NoV_DB100].EndpointDescriptor.UrlString := Url_String; MonitoredItemArguments[J-NoV_DB100].NodeDescriptor.NodeId.ExpandedText := 'nsu='+ nsu + ';s=Local Items.' + Name; MonitoredItemArguments[J-NoV_DB100].MonitoringParameters := MonitoringParameters; end; SubscribeArguments := VarArrayCreate([0, Length(OPCServerItemArray)-NoV_DB100-1], varVariant); for I := 0 to Length(OPCServerItemArray)-NoV_DB100-1 do begin SubscribeArguments[I] := MonitoredItemArguments[I]; end; TVarData(HandleArray).VType := varArray or varVariant; TVarData(HandleArray).VArray := PVarArray( SubscribeChangeClient.SubscribeMultipleMonitoredItems(PSafeArray(TVarData(SubscribeArguments).VArray))); End of commenting out!!!!!*) OPCUAClient.Connect; OPCUAClientSPS.Connect; Connected := TRUE; Meldung(0,'TOPCClient.InternConnect - Done!'); except on E: Exception do begin Meldung(0,'TOPCClient.InternConnect: Connecting to OPC UA Server (FAILED: ' + E.Message + ')'); InternDisconnect; end; end; end; //Second procedure -> Procedure TOPCClient.ReadSPSItems; var ReadVar_vonSPS : Array of OleVariant; AttributeSPSData : UAAttributeData; I: Integer; ItemRead : Boolean; Name : String; ReadOPCUAArguments : Array of _UAReadArguments; OPCUAResult: _UAAttributeDataResult; OPCUAResults: OleVariant; OPCUAArguments : OleVariant; J,K: Cardinal; begin ItemRead := False; try if (Connected) then begin AttributeSPSData := OPCUAClientSPS.Read(Url_String,'nsu='+ nsu + ';s=' + S0); ReadVar_vonSPS := AttributeSPSData.Value; for I := 0 to NoV_DB100-1 do begin OPCServerItemArray[I].Value := ReadVar_vonSPS[I]; OPCServerItemArray[I].ItemQuality := AttributeSPSData.StatusCode; OPCServerItemArray[I].TimeStamp := AttributeSPSData.ServerTimestamplocal; //showmessage('VarNo='+IntToStr(I)+ ' Value=' +VarToStr(OPCServerItemArray[I].Value)+ ' Quality=' + VarToStr(AttributeSPSData.StatusCode) + ' Time=' + VarToStr(AttributeSPSData.ServerTimestamp)); end; (*!!!!!Start of commenting out SetLength(ReadOPCUAArguments,Length(OPCServerItemArray)-NoV_DB100); for J := NoV_DB100 to Length(OPCServerItemArray)-1 do begin Name := OPCServerItemArray[J].Source + '.' + OPCServerItemArray[J].ItemName; ReadOPCUAArguments[J-NoV_DB100] := CoUAReadArguments.Create; ReadOPCUAArguments[J-NoV_DB100].EndpointDescriptor.UrlString := Url_String; ReadOPCUAArguments[J-NoV_DB100].NodeDescriptor.NodeId.ExpandedText := 'nsu='+ nsu + ';s=Local Items.' + Name; end; OPCUAArguments := VarArrayCreate([0, Length(OPCServerItemArray)-NoV_DB100-1], varVariant); for I := 0 to Length(OPCServerItemArray)-NoV_DB100-1 do begin OPCUAArguments[I] := ReadOPCUAArguments[I]; end; TVarData(OPCUAResults).VType := varArray or varVariant; TVarData(OPCUAResults).VArray := PVarArray(OPCUAClientRead.ReadMultiple( PSafeArray(TVarData(OPCUAArguments).VArray))); // Writing the results in Delphi internal Array for K := VarArrayLowBound(OPCUAResults, 1) to VarArrayHighBound(OPCUAResults, 1) do begin OPCUAResult := IInterface(OPCUAResults[K]) as _UAAttributeDataResult; OPCServerItemArray[NoV_DB100+K].Value := OPCUAResult.AttributeData.value; OPCServerItemArray[NoV_DB100+K].ItemQuality := OPCUAResult.AttributeData.StatusCode; OPCServerItemArray[NoV_DB100+K].TimeStamp := OPCUAResult.AttributeData.ServerTimestamplocal; end; End of commenting out!!!!!*) end else begin Meldung(0,'TOPCClient.ReadSPSItems: ' + ' (Not connected to the OPC UA Server!)'); end; except on E: Exception do begin Meldung(0,'TOPCClient.ReadSPSItems - Exception: ' + E.Message); end; end; end;