Function TOPCClient.WriteItemValue(Name: String; ItemValue: Variant): Boolean; var NodeElement_LDSSPS, NodeElement_LDSWinCC, NodeElement_LDSIntern: _UANodeElement; NodeElements_LDSSPS, NodeElements_LDSWinCC, NodeElements_LDSIntern: _UANodeElementCollection; NodeElementEnumerator_LDSSPS, NodeElementEnumerator_LDSWinCC, NodeElementEnumerator_LDSIntern: IEnumVariant; Element_LDSSPS, Element_LDSWinCC, Element_LDSIntern : OleVariant; ItemFound_LDSSPS, ItemFound_LDSWinCC, ItemFound_LDSIntern : Boolean; Count: Cardinal; label ExitLDSSPSLoop, ExitLDSWinCCLoop, ExitLDSInternLoop; begin Result := False; ItemFound_LDSSPS := False; ItemFound_LDSWinCC := False; ItemFound_LDSIntern:= False; OPCUAClient.connect; try if (not (OPCUAClient = nil) ) then begin if not(ItemFound_LDSSPS) then begin NodeElements_LDSSPS := OPCUAClient.BrowseDataNodes(URL_String,'nsu='+ nsu + ';s=' + S1); NodeElementEnumerator_LDSSPS := NodeElements_LDSSPS.GetEnumerator; while (NodeElementEnumerator_LDSSPS.Next(1, Element_LDSSPS, Count) = S_OK) do begin NodeElement_LDSSPS := IUnknown(Element_LDSSPS) as _UANodeElement; if (Name = NodeElement_LDSSPS.BrowseName.ToString) then begin OPCUAClient.WriteValue(URL_String,NodeElement_LDSSPS.NodeId.ToString,ItemValue); Result := True; ItemFound_LDSSPS := True; Goto ExitLDSSPSLoop; end; end; end; ExitLDSSPSLoop: if not(ItemFound_LDSSPS) then begin NodeElements_LDSWinCC := OPCUAClient.BrowseDataNodes(URL_String,'nsu='+ nsu + ';s=' + S2); NodeElementEnumerator_LDSWinCC := NodeElements_LDSWinCC.GetEnumerator; while (NodeElementEnumerator_LDSWinCC.Next(1, Element_LDSWinCC, Count) = S_OK) do begin NodeElement_LDSWinCC := IUnknown(Element_LDSWinCC) as _UANodeElement; if (Name = NodeElement_LDSWinCC.BrowseName.ToString) then begin OPCUAClient.WriteValue(URL_String,NodeElement_LDSWinCC.NodeId.ToString,ItemValue); Result := True; ItemFound_LDSWinCC := True; Goto ExitLDSWinCCLoop; end; end; end; ExitLDSWinCCLoop: if not(ItemFound_LDSWinCC or ItemFound_LDSSPS) then begin NodeElements_LDSIntern := OPCUAClient.BrowseDataNodes(URL_String,'nsu='+ nsu + ';s=' + S3); NodeElementEnumerator_LDSIntern := NodeElements_LDSIntern.GetEnumerator; while (NodeElementEnumerator_LDSIntern.Next(1, Element_LDSIntern, Count) = S_OK) do begin NodeElement_LDSIntern := IUnknown(Element_LDSIntern) as _UANodeElement; if (Name = NodeElement_LDSIntern.BrowseName.ToString) then begin OPCUAClient.WriteValue(URL_String,NodeElement_LDSIntern.NodeId.ToString,ItemValue); Result := True; ItemFound_LDSIntern := True; Goto ExitLDSInternLoop; end; end; end; ExitLDSInternLoop: if not(ItemFound_LDSWinCC or ItemFound_LDSSPS or ItemFound_LDSIntern) then begin Meldung(0,'TOPCClient.WriteItemValue: Item "' +Name+ '" is not available on OPCUA Server!'); end; end else begin Meldung(0,'TOPCClient.WriteItemValue - Exception: OPCUA Connection Failed'); end; except on E: Exception do begin Meldung(1,'TOPCClient.WriteItemValue - Exception: ' + E.Message); end; end; end; // ----------------------------------------------------------------------------- // WriteItem - Write OPCUA Item // ----------------------------------------------------------------------------- function TOPCClient.WriteItem(Name: String; ItemValue: Variant): Boolean; var I : Integer; ItemFound: Boolean; label GotoLabel; begin Result := FALSE; ItemFound := False; try for I := 0 to Length(OPCServerItemArray)-1 do begin if (AnsiMatchStr(Name, OPCServerItemArray[I].ItemName)) then begin OPCServerItemArray[I].Value := ItemValue; ItemFound := True; Meldung(0,'TOPCClient.WriteItem: ' + Name + ' (ITEM FOUND)'); Goto GotoLabel; end else if (not (AnsiMatchStr(Name, OPCServerItemArray[I].ItemName))and (I < (Length(OPCServerItemArray)-1))) then begin Meldung(1,'TOPCClient.WriteItem: ' + Name + ' (SEARCHING ITEM...)'); end else if (not (AnsiMatchStr(Name, OPCServerItemArray[I].ItemName))and (I =(Length(OPCServerItemArray)-1))) then begin Meldung(0,'TOPCClient.WriteItem: ' + Name + ' (**********ITEM NOT FOUND**********)'); end; end; GotoLabel: if (ItemFound) then begin WriteItemValue(Name, ItemValue); if (WriteItemValue(Name,ItemValue) = True) then begin Result := TRUE; Meldung(0,'TOPCClient.WriteItem: ' + Name + ' (Succeeded)'); end else begin Meldung(0,'TOPCClient.WriteItem: ' + Name + ' (FAILED)'); InternDisconnect; exit; end; end; except on E: Exception do begin Meldung(0,'TOPCClient.WriteItem - Exception: ' + E.Message); end; end; end;