Pokazywanie postów oznaczonych etykietą programowanie rozporszone. Pokaż wszystkie posty
Pokazywanie postów oznaczonych etykietą programowanie rozporszone. Pokaż wszystkie posty

czwartek, 1 grudnia 2011

[RX 3] Reactive Extensions pierwszy kontakt z kodem (czyli artykułu cz. 3) [PL]

W ramach serii postów dotyczących Reactive Extensions przyjrzeliśmy się już problemom związanych z asynchronicznością oraz przyjrzeliśmy się bliżej kolekcjom i wzorcu obserwatora (IObserver, IObservable). W tym wpisie zobaczymy pierwszy przykład kodu wykorzystującego RX.

środa, 30 listopada 2011

[RX 2] Kolekcje, to podstawa, czyli wprowadzenia do Reactive Extensions część 2 [PL]

W ramach kontynuacji tematyki związanej z Reactive Extensions (RX)przyjrzyjmy się elementom, które stoją u podstaw ich działania, czyli kolekcjom i wzorcowi Obserwator.
W poprzedniej części artykułu poznaliśmy cel przyświecającym twórcom Reactive Extensions (RX) jak i skąd można pobrać wspomniane rozszerzenia. Skoro już mamy zainstalowane Reactive Extensions (Rx), zacznijmy przyglądać się jego możliwością.

poniedziałek, 28 listopada 2011

[RX 1] Wprowadzenie do Reactive Extensions (RX) dla .NET - cz.1 [PL]

Jako że nie dawno przedstawiłem na spotkaniu Łódzkiej grupy profesjonalistów IT & .NET prezentację poświęconą „Wprowadzenie do Reactive Extensions (RX) dla .NET” (patrz informacja: Zapraszam na prezentację: "Wstęp do Reactive Extensions dla .NET (RX)" oraz Prezentacja i kod ze spotkania pt.: "Wprowadzenie do Reactive Extensions (RX) dla .NET" [PL]). Postanowiłem czytelnikom bloga „Programowanie i Technologie” również przybliżyć temat Reactive Extensions, więc jeżeli zdarzyło Ci się tworzyć aplikacje, które wykorzystywały wywołania asynchroniczne. Te asynchroniczne wywołania sprawiły problemy. Wolałbyś otrzymywać dane, zamiast o każdą daną się dopraszać. Znasz LINQ i nie zawahasz się go użyć w szerszym zakresie, to z pewnością powinienieś poznać bliżej Reactive Extensions (RX). Zapraszam do przeczytania pierwszej części serii postów poświęconych RX.

wtorek, 1 listopada 2011

Zapraszam na prezentację: "Wstęp do Reactive Extensions dla .NET (RX)" [PL]

Czy zdarzyło Ci się tworzyć aplikacje, które wykorzystywały wywołania asynchroniczne? Czy, wywołania asynchroniczne sprawiły problemy? Czy wolałbyś otrzymywać dane zamiast o każdą daną się dopraszać? Czy znasz LINQ i nie zawahasz się go użyć w szerszym zakresie?
Jeżeli odpowiedź na większość z postawionych tu pytań jest twierdząca to powinieneś poznać bliżej Reactive Extensions.

wtorek, 5 kwietnia 2011

Dobra lektura (w j. angielskim) o wątkach w C# [PL]

To nic specjalnie odkrywczego, ale informacja dla tych, którzy chcieliby poczytać o programowaniu wielowątkowym w C# (i dla mnie bym nie musiał kolejny raz „googlać” tego linku) polecam przeczytanie książki „Threading in C#” autorstwa Joseph Albahari. Dostępnej (w języku angielskim) jako plik pdf i pod adresem: http://www.albahari.com/threading/.

wtorek, 14 września 2010

Chmury nad Łódzką Grupą Profesjonalistów IT & .NET! [PL]

W tytule posłużyłem się lekko (co mam nadzieję nikogo nie urazi) tytułem innej wiadomości, którą przeczytałem ostatnio na CodeGuru: "Chmury nad WSS i CodeGuru!", ale muszę przyznać, że tytuł mi się spodobał, a poza tym treść objęta wspomnianym wpisem również wydaje się ciekawa, więc zobaczcie i sprawdźcie.

Przejdę jednak do konkretów, a mianowicie do związków z Łódzką Grupą Profesjonalistów IT & .NET:

Mianowicie 30-go września 2010 (czwartek) odbędzie się pierwsze spotkanie w tym sezonie. Na dzień dobry, Tomasz Kopacz (z Microsoft Polska) zaprezentuje sesję o pisaniu i projektowaniu aplikacji dla chmury (na przykładzie Azure).


Zapowiada się ciekawie! Do zobaczenia!

środa, 26 maja 2010

Integracja systemów informatycznych [PL]

Promuj
Przeczytałem niedawno artykuł Bartka Szafko pod tytułem: „Integracja systemów”, ponieważ w firmie w której pracuję (CAS), często mamy do czynienia z integracją systemów, dlatego postanowiłem dorzucić do tego tematu swoje trzy grosze.
Jak integrować systemy informatyczne? Na co należy zwracać uwagę? Czego unikać? Jaką architekturę wybrać?

środa, 19 maja 2010

Bezpieczne wykorzystanie obcych assembly (C# .NET 2.0 – 3.5) [PL]

Promuj
.NET Framework pozwala na łatwe wczytywanie, uruchamianie i wykorzystywanie obcych assembly. Należy jednak pamiętać, że nie wolno mieć pełnego zaufania do cudzego kodu. Ma to jeszcze większe znaczenie gdy dopuszczamy sytuację, w której pozwalamy na wykonywanie kodu, którego nigdy nie testowaliśmy, z którym nigdy nie mieliśmy do czynienia. Oczywiście w takim przypadku otrzymujemy bardzo dobre wsparcie ze strony .NET Framework, a mianowicie obsługę tzw. Domen aplikacji.

piątek, 26 lutego 2010

OPC Xi (OPC Express Interface) - prezetnacja/filmik do obejrzenia [PL]

Promuj
Jakiś czas temu pisałem już na temat nowej technologii pod nazwą OPC eXpress Interface (OPC XI), czyli technologii którą w uproszczeniu określić można jako OPC po WCF'ie lub pełniejsze wejście OPC na platformę .NET. Jakiś czas temu pojawił się jeszcze film - prezentacja nagrana podczas webinar'u prowadzonego przez  OPC Training Institute, dostępna jest ona do pobrania z tego adres (wymagana darmowa rejestracja): http://www.opcti.com/opcxi.aspx.

środa, 20 stycznia 2010

Web Parts - w ASP.NET (przykłady w C# (Csharp)) [PL]

Promuj

Web Parts są kolejnym  (po Master Pages i Themes) mechanizmem dostępnym w ASP.NET pozwalającym użytkownikowi na dostosowanie witryny do własnych potrzeb.

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.

środa, 28 października 2009

OPC Client .NET (cz.2 Implementacja) [PL]

Promuj

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? :)

Promuj

wtorek, 27 października 2009

OPC Client .NET (część 1. Przygotowania) [PL]

Promuj

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.

Promuj

Posty powiązane / Related posts