Przez ostatnie pół miesiąca na blogu była cisza... ale już z urlopu w górach wróciłem i wkrótce pojawią się jakieś nowe (mam nadzieję że ciekawe) wpisy.
Pozdrowienia dla wszystkich!
(czyli C#, .NET, integracja, OPC, OPC UA i inne)
Przez ostatnie pół miesiąca na blogu była cisza... ale już z urlopu w górach wróciłem i wkrótce pojawią się jakieś nowe (mam nadzieję że ciekawe) wpisy.
Pozdrowienia dla wszystkich!
OPC Unified Architecture (OPC UA) jest niezależnym platformowo standardem, przy pomocy którego wiele różnych rodzajów systemów może się komunikować. Wiadomości wymieniane pomiędzy klientami i serwerami mogą być przesyłane z wykorzystaniem różnego rodzajów sieci. OPC UA zostało stworzone aby wymiana danych odbywała się w sposób wydajny, bezpieczny, odporny na ataki i zapewniającą wzajemną identyfikację klienta i serwera.
Na tym blogu pojawiło się już wiele wpisów na temat tej technologii, chciałbym jednak (aby usprawnić nawigację), przypomnieć te wpisy, od których warto zacząć, by zapoznać się z tą technologią. W tym celu przygotowałem listę ciekawszych wpisów dotyczących OPC Unified Architecture (OPC UA).
Artykuł: OPC Unified Architecture (OPC UA), czyli krok na przód:
Artykuł: Infrastruktura komunikacyjno-usługowa OPC Unified Architecture (OPC UA):
Profile w OPC Unified Architecture (OPC UA).
Dodatkowe materiały
Życzę wszystkim miłej lektury.
Historia posta:
Już niedługo wrzesień, a w nim odbędą się dwa wydarzenia związane z technologią OPC:
Chciałbym również poinformować, że w tym roku firma CAS (w tym ja ;) ) kolejny raz wybiera się na "Interoperability Workshop".
Ostatnio w ramach tego bloga pojawiło się trochę wpisów na temat formatu Open XML, tworzenia dokumentów dla Word (docx), języka WordProcessingML, tym razem postanowiłem przedstawić spis wspomnianych artykułów:
Wiem że te wpisy nie wyczerpują wszystkich zagadnień, a nawet można je nazwać zaledwie rzutem oka na ten temat, ale przy pomocy tego posta chciałbym usprawnić nawigację po tym blogu, tak aby łatwiej można było odnaleźć potrzebne informacje
Zapraszam do lektury!
Czy zdarzyło wam się, że trzeba było zajrzeć co zawiera instalator typu MSI, bez instalowania danego produktu? Mnie tak, a rozwiązanie okazało się bardzo proste. Wiem że to co za chwilę napiszę znajduje się na innych blogach, ale aby ułatwić moim czytelnikom (i sobie ;) ) możliwość skorzystania z tego sposobu, postanowiłem podać tą receptę również na tym blogu.
Do wypakowania plików zawartych w pliku .msi wystarczy w linii komend wpisać:
msiexec /a Path_to_MSI_file /qb TARGETDIR=Extraction_directory
Na przykład, gdy chcemy wypakować pliki z c:\myinstaller.msi do katalogu c:\myinstaller_content (katalog musi istnieć przed wykonaniem komendy), należy wpisać:
msiexec /a c:\myinstaller.msi /qb TARGETDIR=c:\myinstaller_content
Proste prawda?
P.S. wiem że są również inne narzędzia np. Less MSIérables, ale ponieważ to proste rozwiązanie wykonuje akurat to, co potrzebuję, więc po co sięgać po bardziej skompilowane rozwiązania?
Ostatnio (6-go sierpnia 2009) na wortalu OPC Programmers' Connection pojawily się nowe strony dotyczące nowego standardu OPC Unified Architecture (OPC UA):
Zapraszam do odwiedzenia i zapoznania się z dostępnymi tam zasobami. Zwłaszcza z narzędziem (które współtworzę i o którym już wspominałem na tym blogu): OPC UA Address Space Model Designer (dostępnym w dziale: "Free UA Utilities"):
Supplier |
Product | Notes |
UA Model Designer | A powerful tool for creating, displaying and editing OPC UA models that are compatible with the OPC Unified Architecture address space concept. |
"Na lewo, na prawo, w górę i w dół..." :-) - tym zabawowo(weselnym) akcentem zacznę tego posta, który ... dotyczyć będzie kolejnych zagadnień związanych z Open XML Format SDK.
A dlaczego? Gdyż chciałbym zająć się wyrównaniem tekstu: do lewej, do prawej, do środka, i wyjustowany.
Jak można więc ustawiać wyrównanie tekstu? W tym celu należy ustawić odpowiednie właściwości paragrafu dla stylu, który chcemy zmienić lub paragrafu w którym chcemy ustawić wyrównanie. Wykorzystujemy więc właściwość Justification klasy ParagraphProperties, której należy nadać wartość wchodzącą w skład elementu wyliczeniowego: JustificationValues Enumeration, o następujących elementach:
Zakończmy więc teorię i przejdźmy do kodu, który będzie krótki i łatwy. Zakładając że na przykład chcemy wycentrować dany tekst (w paragrafie, bądź przy użyciu stylu) wystarczy wykonać następujący kod:
paragraph_or_style.Append( new ParagraphProperties( new Justification() { Val = JustificationValues.Center } ) );
Kod ten powoduje dodanie do dokumentu, napisanego w WordProcessingML, następującego kodu XML:
<w:jc w:val="center"/>
Tutaj ważna jest jeszcze jedna kwestia, a mianowicie odpowiednie formatowanie powinno być dodane do elementu paragrafu na początku i koniecznie przed dodaniem do niego tekstu, czyli np. oczekiwany efekt uzyskamy wykonując kod:
Paragraph paragraph = new Paragraph(); Run run_paragraph = new Run(); // we want to put that text into the output document Text text_paragraph = new Text( "Hello World!" ); //Append elements appropriately. run_paragraph.Append( text_paragraph ); paragraph.Append( new ParagraphProperties( new Justification() { Val = JustificationValues.Center } ) ); paragraph.Append( run_paragraph );
Natomiast tekst nie zostanie sformatowany, gdy do paragrafu najpierw został by dodany element Run, a dopiero później ParagraphProperties
Chciałbym powrócić do tematyki związanej z tworzeniem dokumentów aplikacji MS Word (docx) zgodnych z formatem OpenXML z wykorzystniem pakietu Open XML Format SDK 2.0 i zająć się zawartością tworzonych dokumentów a dokładnie dokumentów napisanych w XML'u zgodnym z "językiem" WordProcessingML.
Na początek zobaczmy jak wygląda proste "Hello World!" (przykładowy kod funkcji generującej taki dokument jest: tutaj)
<?xml version="1.0" encoding="utf-8"?> <w:document xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"> <w:body> <w:p> <w:r> <w:t>Hello World!</w:t> </w:r> </w:p> </w:body> </w:document>
Jak widać w powyższym kodzie XML widać duże powiązanie pomiędzy kodem napisanym w C#, a powyższym. Zadeklarowany jest dokument (document = WordprocessingDocument) wewnąrz którego jest część Body (body), w niej znajduje się paragraf (p = Paragraph) z elementem typu Run (r) i odpowiednim tekstem (t = Text).
W przypadku styli (przykładowy kod funkcji tutaj), generowane są dwa pliki, jeden zawierający definicję stylu:
<?xml version="1.0" encoding="utf-8"?> <w:styles xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"> <w:style w:styleId="MyHeading1"> <w:name w:val="My Heading 1" /> <w:basedOn w:val="Heading1" /> <w:next w:val="Normal" /> <w:rPr> <w:color w:val="FF0000" /> <w:rFonts w:ascii="Arial" /> <w:b /> <w:sz w:val="28" /> </w:rPr> </w:style> </w:styles>
oraz drugi z definicją z konkretnym dokumentem:
<?xml version="1.0" encoding="utf-8"?> <w:document xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"> <w:body> <w:p> <w:pPr> <w:pStyle w:val="MyHeading1" /> </w:pPr> <w:r> <w:t>This is Heading</w:t> </w:r> </w:p> </w:body> </w:document>
Jak widać w tym przypadku otrzymujemy kod WordProcessingML bardzo podobny do tego z poprzedniego przykładu, jednak dodana została specjalna właściwość (pPr = ParagraphProperties), w której został wybrany odpowiedni styl (pStyle = ParagraphStyleId), który jest zdefiniowany w innym pliku.
Ostatni przykład dotyczyć będzie tabeli (której tworzący ją kod jest tutaj):
<?xml version="1.0" encoding="utf-8" ?> <w:document xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"> <w:body> <w:tbl> <w:tblpr> <w:tblborders> <w:top w:val="single" /> <w:left w:val="single" /> <w:bottom w:val="single" /> <w:right w:val="single" /> <w:insideh w:val="single" /> <w:insidev w:val="single" /> </w:tblborders> </w:tblpr> <w:tr> <w:tc> <w:p> <w:r> <w:t>Multiplication table</w:t> </w:r> </w:p> <w:tcpr> <w:gridspan w:val="11" /> </w:tcpr> </w:tc> </w:tr> <w:tr> <w:tc> <w:p> <w:r> <w:t>*</w:t> </w:r> </w:p> </w:tc> <w:tc> <w:p> <w:r> <w:t>1</w:t> </w:r> </w:p> </w:tc> <!—- many cells and rows declarations --> </w:tr> </w:tbl> </w:body> </w:document>
Czyli mamy tutaj takie elementy jak tabela (tbl = Table ) z odpowiednimi właściwościami (tblpr = TableProperties ) i ramkami (tblborders = TableBorders ), w której znajdują się wiersze (tr = TableRow ) i kolumny (tc = TableCell ).
Jak widać na powyższych przykłach jest duży związek pomiędzy wykorzystywanymi elementami pakietu Open Document Format SDK a konkretnym elementami zapisywanymi w języku WordProcessingML, dlatego jeżli nie wiemy jak coś przygotować przy pomocy SDK, można zawsze przygotować odpowiedni plik przy pomocy edytora tekstu (np. Word), a następnie sprawdzić, co rzeczywiście zostało w nim utworzone (jeżeli ktoś nie wie jak to zrobić, to zapraszam do przeczytania posta:Kierunek: w głąb formatu "docx".
Wczoraj opublikowany został kolejny numer oficjalnego newslettera OPC Foundation, czyli OPConnect. Wydanie jak zawsze dostępne jest na stronach AutomationWorld: http://www.automationworld.com/newsletters/opc-08-03-09.html (linki do numerów archiwalnych można znaleźć na stronach OPC Foundation: http://www.opcfoundation.org/Default.aspx/02_news/02_newsletters.asp).
W najnowszym numerze, oprócz artykułów dot. aktualnego standardu OPC Classic, można również znaleźć dwa na temat nowej wersji OPC jaką jest OPC Unified Architecture (OPC UA):
Zapraszam do lektury.
Jakiś czas temu pisałem, że część dokumentacji wchodzących w skład specyfikacji nowego standardu: OPC Unified Archtecture (OPC UA) zostały wreszcie opublikowane jako "released":http://maciej-progtech.blogspot.com/2009/02/specyfikacje-opc-unified-architecture.html oraz http://maciej-progtech.blogspot.com/2009/04/opc-unified-architecture-opc-ua-pakiety.html.
Teraz pojawiła się kolejna nowość: ostatnio (2009-07-31) również pakiet SDK dla OPC Unified Architecture (OPC UA) wreszcie uzyskał status released, dzięki temu dostępny został jego kod źródłowy.Pakiet jest dostępny na stronach OPC Foundation w dziale "downloads":
http://www.opcfoundation.org/Downloads.aspx?CI=288
(pliki mogą pobrać tylko członkowie OPC Foundation - OPC Foundation Corporate Members only).
Pakiet SDK zawiera wsparcie dla C/C++ oraz .NET, dokumentacja do pakietu jest dostępna online pod adresem: http://opcfoundation.org/uasdk/Help/ oraz plik "Readme" tutaj: http://www.opcfoundation.org/DownloadFile.aspx/UA%20Software/OPC%20UA%20SDK%201.00%20Readme%20250.1.rtf?RI=596
Dla tych którzy chcą zapoznać się z możliwościami pakietu (oraz z samą technologią OPC Unified Architecture), polecam obejrzenie filmu (z dość nowego webinar'u (2009-07-29)):
(gdyby ktoś miał problem z odtwarzaniem filmu należy zainstalować GoToMeeting Codec).
Można również zapoznać się z moimi artykułami: