piątek, 20 lipca 2012
OPC dla Androida? [PL]
sobota, 7 stycznia 2012
Dostęp do danych procesowych [PL]
Ostatnio byłem zapytany i kilka rozwiązań związanych z dostępem do danych procesowych oraz z przekazywaniem danych z różnego rodzaju aplikacji do sterowników przemysłowych. Przyjrzyjmy się, jakie są możliwe podejścia, do wspomnianych problemów.
poniedziałek, 21 grudnia 2009
OPC Client .NET (w języku C# (csharp)) [PL]
Zapraszam wszystkich do przeczytania serii postów poświęconych dostępowi do danych w OPC przy pomocy kodu w C# na platformie .NET. Przedstawione przykłady zawierają gotowe do wykorzystania aplikacje i kod źródłowy. Artykuł został podzielony na następujące części:
- Teoria: Implementacja klienta OPC w C# - artykuł wprowadzający, bedącym częścią serii "OPC, DCOM, .NET i C# w jednym stali domu"
- Przygotowania
- Implementacja
- OPC klient z linii poleceń (przykład C# .NET)
- OPC klient z linii poleceń (gotowa aplikacja i kod w C#)
Życzę wszystkim dobrej lektury, a zainteresowanych tematem zapraszam do dyskusji i komentowania treści.
niedziela, 20 grudnia 2009
OPC klient z linii poleceń (gotowa aplikacja i kod w C#) [PL]
W poprzedniej części opisałem jak stworzyć aplikację klienta OPC z linii poleceń (OPC command-line client), czyli aplikację która ma za zadanie odczytywać dane serwera OPC i udostępniać je jako standardowa aplikacja pracująca w "linii poleceń" systemu Windows. Dzięki temu będziemy mogli za pomocą argumentów podawać co chcemy otrzymać, a rezultat zostanie przekazany do standardowego wyjścia, czyli domyślnie na ekran. Dzisiaj zapraszam do pobrania kodu wraz z gotową aplikacją: tutaj do pobrania.
niedziela, 13 grudnia 2009
OPC klient z linii poleceń (przykład C# .NET) [PL]
Jakiś czas temu zacząłem cykl poświęcony implementacji klienta OPC (Cz. 1. Przygotowania, Cz. 2. Implementacja), w tym post'cie chciałbym wrócić do tematu i przedstawić przykład gotowego programu, który realizuje opisywane możliwiści:
Klient OPC z linii poleceń (OPC command-line client)
środa, 28 października 2009
OPC Client .NET (cz.2 Implementacja) [PL]
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? :)
wtorek, 27 października 2009
OPC Client .NET (część 1. Przygotowania) [PL]
Jakiś czas temu w post'cie pt. "Implementacja klienta OPC w C#" spróbowałem naświetlić podstawowe zagadnienia związane z implementacją klienta OPC na platformie .NET. Nie jest to proste zagadnienie, a do tego poza dobrą znajomością programowania opartego o DCOM należy mieć dostęp do specyfikacji standardu OPC. W tym artykule chciałbym wskazać pewną alternatywę, a mianowicie pokazać jak można dostać się do danych w OPC z poziomu platformy .NET (przykład w C#) bez implementacji pełnego klienta OPC. W tym celu zostanie wykorzystane dodatkowe oprogramowanie: DataPorter, które posiada funkcjonalność klienta OPC oraz zapewnia dostęp do odczytywanych przez niego danych poprzez WebSerwis. W prezentowanym tutaj przykładzie nie zostanie napisany "prawdziwy klient OPC", gdyż zostanie wykorzystane kompletne oprogramowanie klienta, zamierzam natomiast pokazać jak przy pomocy prostego programiku można dostać się do danych z OPC. Niniejszy artykuł może być również ciekawy dla osób, które chcą poznać przykład wykorzystania jakiegoś WebSerwisu z poziomu .NET (oczywiście nie piszę tu o WebSerwisie w rozumieniu serwisów w formie stron internetowych, a o serwisach opartych o SOAP i technologie WS-*)
Oprogramowanie DataPorter jest dostępne w pełni funkcjonalnej wersji demonstracyjnej (ograniczonej czasowo) na stronie: http://www.commsvr.com/DownloadCenter/ProductSoftware/PR2605DataPorter_Software.aspx (wymagana jest darmowa rejestracja). Instalowane jest z domyślną konfiguracją, w której podłącza się one do oprogramowania serwera OPC: CommServer. Opis domyślnej konfiguracji dostępny jest tutaj: http://www.commsvr.com/Products/DataPorterDescription/DataPortersampleconfiguration/tabid/320/language/en-US/Default.aspx. Pokazany w tym artykule przykład używa oprogramowania CommServer, dlatego warto je również zainstalować (jak to zrobić?). Przed przystąpieniem do dalszych ćwiczeń warto, w tym miejscu sprawdzić wspólne działanie CommServer'a i DataPorter'a (w przypadku jakichś problemów polecam odwiedzenie e-manuala DataPorter'a, dostępnego tutaj: http://www.commsvr.com/DataPorter/Index.aspx
Po pomyślnym zweryfikowaniu działania DataPorter'a i CommServer'a należy zainstalować dodatek do DataPorter'a udostępniający WebSerwisy (uwaga wcześniej należy mieć zainstalowany IIS, zintegrowany z platformą .NET 2.0). Dodatek znajduje się w katalogu DataPortera w następującej lokalizacji:
"%programfiles%\CAS\DataPorter\AdditionalSetup\CAS.OPCWSDataAccess\setup.exe"
Po instalacji dodatku i wpisaniu w przeglądarkę internetową adresu: http://localhost/CAS.OPCWSDataAccess/OPCAdvancedDataAccess.asmx, oczom powinien się okazać obraz podobny do poniższego:
Jest to strona generowana w sposób automatyczny przez serwer IIS na podstawie WebSerwisu i umożliwiająca jego debugowanie (uwaga: ta strona dostępna jest tylko na lokalnej maszynie - tzn. tylko na tym komputerze, na którym zainstalowany jest WebSerwis).
Dla takiego WebSerwisu można pobrać i odczytać jego definicję zapisaną w języku WSDL. W tym celu należy do przedstawionego wyżej adresu dopisać "?wsdl" lub kliknąć na odpowiedni odnośnik na wspomnianej autogenerowanej stronie.
W następnej części zaprezentuję jak obsłużyć taki WebSerwis z poziomu C# i .NET, czyli w konsekwencji jak dostać się do danych w OPC.