W poprzedniej części opisałem czynności przygotowawcze, teraz napiszemy trochę kodu :).
Na początku należy dodać referencję do projektu w Visual Studio:
Teraz wskazujemy serwis (wpisując jego adres: http://localhost/CAS.OPCWSDataAccess/OPCAdvancedDataAccess.asmx):
Wpisujemy jeszcze nazwę naszej referencji, klikamy na "Add Reference" i referencja powinna nam się pojawić w naszym Solution:
Teraz wykorzystamy dwie funkcje: GetAvailiableItems (zwracającą dostępne w serwerze elementy) oraz GetValue_OneItem (odczytującą wartość wybranego elementu). Informacje na temat innych wywołań dostępne są tutaj: http://www.commsvr.com/DataPorter/Index.aspx?topic=html/3bddf5c3-5d5a-4569-85db-fcdc52a1b34a.htm. Poniższe dwa rysunki pokazują efekt wykonania tych dwóch funkcji przy pomocy wspomnianej wcześniej strony debugger'a.
GetAvailiableItems:
GetValue_OneItem:
Oczywiście my wywołamy te dwie funkcje z poziomu C#. W tym celu należy najpierw wykonać połączenie: OPCAdvancedDataAccess.OPCAdvancedDataAccess opcDA = new OPCAdvancedDataAccess.OPCAdvancedDataAccess(). Później można pobrać listę elementów jako tablicę stringów: string[] items = opcDA.GetAvailiableItems(). Oraz można pobrać wartość dla jednego z elementów tablicy: OPCAdvancedDataAccess.ItemValue val = opcDA.GetValue_OneItem( items[ 0 ] ).
Ostatecznie kod prostej funkcji nawiązującej połączenie, pobierającej i wyświetlającej listę dostępnych elementów oraz wartość pierwszego dostępnego elementu, wygląda następująco:
static void Main( string[] args ) { //connecting to remote object OPCAdvancedDataAccess.OPCAdvancedDataAccess opcDA = new OPCAdvancedDataAccess.OPCAdvancedDataAccess(); // getting availiable item list string[] items = opcDA.GetAvailiableItems(); //displaing the list Console.WriteLine("Item List:"); foreach ( string item in items ) Console.WriteLine( item ); //reading a value of the first item (#0) OPCAdvancedDataAccess.ItemValue val = opcDA.GetValue_OneItem( items[ 0 ] ); Console.WriteLine( "---------------------" ); Console.WriteLine( "Value of item {0}", items[ 0 ] ); Console.WriteLine( "value={0}", val.Value ); Console.WriteLine( "quality={0}", val.Quality.QualityBits ); Console.WriteLine( "timestamp={0}", val.Timestamp ); //waiting for enter Console.WriteLine( "[Press Enter]" ); Console.ReadLine(); }
I daje w efekcie:
Item List: CAS.CommServer.OPC.Da.Server/Registers/PLC/R/108 CAS.CommServer.OPC.Da.Server/Flags/PLC/F/102 CAS.CommServer.OPC.Da.Server/Generator/PLC/G/000 CAS.CommServer.OPC.Da.Server/Generator/PLC/G/001 CAS.CommServer.OPC.Da.Server/Generator/PLC/G/002 CAS.CommServer.OPC.Da.Server/Flags/PLC/F/101 CAS.CommServer.OPC.Da.Server/Registers/PLC/R/101 CAS.CommServer.OPC.Da.Server/Registers/PLC/R/100 CAS.CommServer.OPC.Da.Server/Flags/PLC/F/105 CAS.CommServer.OPC.Da.Server/Registers/PLC/R/107 CAS.CommServer.OPC.Da.Server/Flags/PLC/F/100 CAS.CommServer.OPC.Da.Server/Flags/PLC/F/109 CAS.CommServer.OPC.Da.Server/Flags/PLC/F/103 CAS.CommServer.OPC.Da.Server/Registers/PLC/R/106 CAS.CommServer.OPC.Da.Server/Registers/PLC/R/104 CAS.CommServer.OPC.Da.Server/Flags/PLC/F/108 CAS.CommServer.OPC.Da.Server/Registers/PLC/R/105 CAS.CommServer.OPC.Da.Server/Flags/PLC/F/106 CAS.CommServer.OPC.Da.Server/Registers/PLC/R/110 CAS.CommServer.OPC.Da.Server/Registers/PLC/R/103 CAS.CommServer.OPC.Da.Server/Registers/PLC/R/109 CAS.CommServer.OPC.Da.Server/Registers/PLC/R/102 CAS.CommServer.OPC.Da.Server/Flags/PLC/F/107 CAS.CommServer.OPC.Da.Server/Flags/PLC/F/104 --------------------- Value of item CAS.CommServer.OPC.Da.Server/Registers/PLC/R/108 value=170 quality=good timestamp=2009-08-12 15:17:04 [Press Enter]
Proste prawda? :)
Super wpis
OdpowiedzUsuń