czwartek, 1 grudnia 2011
[RX 3] Reactive Extensions pierwszy kontakt z kodem (czyli artykułu cz. 3) [PL]
środa, 30 listopada 2011
[RX 2] Kolekcje, to podstawa, czyli wprowadzenia do Reactive Extensions część 2 [PL]
poniedziałek, 28 listopada 2011
[RX 1] Wprowadzenie do Reactive Extensions (RX) dla .NET - cz.1 [PL]
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]
wtorek, 11 stycznia 2011
Software Developer's Journal 2/2011 [PL]
Jakiś czas temu został opublikowany kolejny numer Software Developer's Journal 2/2011.
wtorek, 14 września 2010
Chmury nad Łódzką Grupą Profesjonalistów IT & .NET! [PL]
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]
środa, 19 maja 2010
Bezpieczne wykorzystanie obcych assembly (C# .NET 2.0 – 3.5) [PL]
piątek, 26 lutego 2010
OPC Xi (OPC Express Interface) - prezetnacja/filmik do obejrzenia [PL]
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]
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]
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.




















